]> xenbits.xensource.com Git - people/dwmw2/xen.git/commitdiff
x86/vvmx: Fix the use of RDTSCP when it is intercepted at L0
authorAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 25 Nov 2019 15:15:04 +0000 (16:15 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 25 Nov 2019 15:15:04 +0000 (16:15 +0100)
Linux has started using RDTSCP as of v5.1.  This has highlighted a bug in Xen,
where virtual vmexit simply gives up.

  (XEN) d1v1 Unhandled nested vmexit: reason 51
  (XEN) domain_crash called from vvmx.c:2671
  (XEN) Domain 1 (vcpu#1) crashed on cpu#2:

Handle RDTSCP in the virtual vmexit hander in the same was as RDTSC
intercepts.

Reported-by: Sarah Newman <srn@prgmr.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Tested-by: Chris Brannon <cmb@prgmr.com>
Reviewed-by: Wei Liu <wl@xen.org>
master commit: 9257c218e56e9902b78662e5852d69329b9cc204
master date: 2019-10-23 16:43:48 +0100

xen/arch/x86/hvm/vmx/vvmx.c

index a5fb4425390d6fcd4b11917023b691d937c7b535..1297dc20b8ef3b4ae5ba7d65da0ed1affeed5da1 100644 (file)
@@ -2483,6 +2483,7 @@ int nvmx_n2_vmexit_handler(struct cpu_user_regs *regs,
             nvcpu->nv_vmexit_pending = 1;
         break;
     case EXIT_REASON_RDTSC:
+    case EXIT_REASON_RDTSCP:
         ctrl = __n2_exec_control(v);
         if ( ctrl & CPU_BASED_RDTSC_EXITING )
             nvcpu->nv_vmexit_pending = 1;
@@ -2493,6 +2494,8 @@ int nvmx_n2_vmexit_handler(struct cpu_user_regs *regs,
              * avoiding changing guest_tsc and messing up timekeeping in L1
              */
             msr_split(regs, hvm_get_guest_tsc(v) + get_vvmcs(v, TSC_OFFSET));
+            if ( exit_reason == EXIT_REASON_RDTSCP )
+                regs->rcx = hvm_msr_tsc_aux(v);
             update_guest_eip();
 
             return 1;