|
@@ -93,11 +93,14 @@ static int query_hypervisor_info(void)
|
|
|
*/
|
|
|
static u64 do_hypercall(u64 control, void *input, void *output)
|
|
|
{
|
|
|
-#ifdef CONFIG_X86_64
|
|
|
- u64 hv_status = 0;
|
|
|
u64 input_address = (input) ? virt_to_phys(input) : 0;
|
|
|
u64 output_address = (output) ? virt_to_phys(output) : 0;
|
|
|
void *hypercall_page = hv_context.hypercall_page;
|
|
|
+#ifdef CONFIG_X86_64
|
|
|
+ u64 hv_status = 0;
|
|
|
+
|
|
|
+ if (!hypercall_page)
|
|
|
+ return (u64)ULLONG_MAX;
|
|
|
|
|
|
__asm__ __volatile__("mov %0, %%r8" : : "r" (output_address) : "r8");
|
|
|
__asm__ __volatile__("call *%3" : "=a" (hv_status) :
|
|
@@ -112,13 +115,13 @@ static u64 do_hypercall(u64 control, void *input, void *output)
|
|
|
u32 control_lo = control & 0xFFFFFFFF;
|
|
|
u32 hv_status_hi = 1;
|
|
|
u32 hv_status_lo = 1;
|
|
|
- u64 input_address = (input) ? virt_to_phys(input) : 0;
|
|
|
u32 input_address_hi = input_address >> 32;
|
|
|
u32 input_address_lo = input_address & 0xFFFFFFFF;
|
|
|
- u64 output_address = (output) ? virt_to_phys(output) : 0;
|
|
|
u32 output_address_hi = output_address >> 32;
|
|
|
u32 output_address_lo = output_address & 0xFFFFFFFF;
|
|
|
- void *hypercall_page = hv_context.hypercall_page;
|
|
|
+
|
|
|
+ if (!hypercall_page)
|
|
|
+ return (u64)ULLONG_MAX;
|
|
|
|
|
|
__asm__ __volatile__ ("call *%8" : "=d"(hv_status_hi),
|
|
|
"=a"(hv_status_lo) : "d" (control_hi),
|