[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] Xen Introspection, KPTI, and CR3 bit 63 leads to guest VMENTRY failures during introspection



On 24/01/2018 22:31, Bitweasil . wrote:
> I've recently discovered that if you attempt to use introspection to
> capture CR3 changes with the new KPTI enabled kernels, the guest dies
> shortly after the start of introspection with failed VM entry due to
> invalid guest state.
>
> I believe the invalid state here is the high bit being set in CR3 -
> while this is how one indicates that PCID should not invalidate the
> various page table caches, introspection leads to this being set in
> the VMCS, which appears to be wrong.
>
> With the XenServer 4.7.1 code base (which is my working code base at
> the moment), I have not found a way around this, as the
> vm_event_set_registers function (xen/arch/x86/vm_event.c) does not set
> the CR3 value, and vm_event_register_write_resume only allows
> inhibiting the write, not writing a modified value.
>
> I've attempted several ways to work around this with a livepatch, and
> have not (yet) been successful.
>
> Masking at the top of hvm_set_cr3 allows the guest to continue, but
> appears to do the wrong thing with regards to the guest (tasks begin
> dying quickly from invalid opcode errors).
>
> In any case, Andrew mentions that this appears to still be an issue in
> staging, so this likely needs addressing.  At this point in time, I
> believe guests with KPTI enabled cannot be introspected if that
> introspection involves capturing CR3 changes.
>
> Please let me know if you need any more details on this issue!

Just as an FYI to people reading this, that is actually XenServer 7.1's
hypervisor which is Xen 4.7.1-based but the fact that the HVM CR3 code
has little-to-no clue about PCID appears to be unchanged into staging. 
Sadly, it doesn't appear to be trivial to fix.

~Andrew

>
> -Bit
>
>
> (XEN) [19458.318035] Failed vm entry (exit reason 0x80000021) caused
> by invalid guest state (0).
> (XEN) [19458.318042] ************* VMCS Area **************
> (XEN) [19458.318050] *** Guest State ***
> (XEN) [19458.318056] CR0: actual=0x000000008005003b,
> shadow=0x0000000080050033, gh_mask=ffffffffffffffff
> (XEN) [19458.318062] CR4: actual=0x0000000000362670,
> shadow=0x0000000000360670, gh_mask=ffffffffffffffff
> (XEN) [19458.318069] CR3 = 0x800000001ded7080
> (XEN) [19458.318076] PDPTE0 = 0x0000000000020000  PDPTE1 =
> 0x000006f800150018
> (XEN) [19458.318082] PDPTE2 = 0x0000000000000000  PDPTE3 =
> 0x000006f800150018
> (XEN) [19458.318089] RSP = 0xffff880015b87f50 (0xffff880015b87f50) 
> RIP = 0xffffffff81845857 (0xffffffff81845857)
> (XEN) [19458.318095] RFLAGS=0x00000082 (0x00000082)  DR7 =
> 0x0000000000000400
> (XEN) [19458.318101] Sysenter RSP=0000000000000000
> CS:RIP=0010:ffffffff8184a220
> (XEN) [19458.318105]        sel  attr  limit   base
> (XEN) [19458.318112]   CS: 0010 0a09b ffffffff 0000000000000000
> (XEN) [19458.318119]   DS: 0000 1c000 ffffffff 0000000000000000
> (XEN) [19458.318126]   SS: 0018 0c093 ffffffff 0000000000000000
> (XEN) [19458.318133]   ES: 0000 1c000 ffffffff 0000000000000000
> (XEN) [19458.318140]   FS: 0000 1c000 ffffffff 00007fde038ba700
> (XEN) [19458.318147]   GS: 0000 1c000 ffffffff ffff88001ba00000
> (XEN) [19458.318152] GDTR:            0000007f ffff88001ba0c000
> (XEN) [19458.318158] LDTR: 0000 1c000 ffffffff 0000000000000000
> (XEN) [19458.318164] IDTR:            00000fff ffffffffff574000
> (XEN) [19458.318169]   TR: 0040 0008b 00002087 ffff88001ba048c0
> (XEN) [19458.318175] EFER = 0x0000000000000000  PAT = 0x0407010600070106
> (XEN) [19458.318179] PreemptionTimer = 0x00000000  SM Base = 0x00000000
> (XEN) [19458.318185] DebugCtl = 0x0000000000000000  DebugExceptions =
> 0x0000000000000000
> (XEN) [19458.318233] PerfGlobCtl = 0x0000000000000000  BndCfgS =
> 0x0000000000000000
> (XEN) [19458.318297] Interruptibility = 00000000  ActivityState = 00000000
> (XEN) [19458.318324] *** Host State ***
> (XEN) [19458.318329] RIP = 0xffff82d0801ee100
> (vmx_asm_vmexit_handler)  RSP = 0xffff8300bfcfff90
> (XEN) [19458.318333] CS=e008 SS=0000 DS=0000 ES=0000 FS=0000 GS=0000
> TR=e040
> (XEN) [19458.318335] FSBase=0000000000000000 GSBase=0000000000000000
> TRBase=ffff82d08035e780
> (XEN) [19458.318337] GDTBase=ffff82d0802d9000 IDTBase=ffff82d080357ce0
> (XEN) [19458.318339] CR0=000000008005003b CR3=000000010f001000
> CR4=00000000003526e0
> (XEN) [19458.318341] Sysenter RSP=ffff8300bfcfffc0
> CS:RIP=e008:ffff82d08022bb30
> (XEN) [19458.318343] EFER = 0x0000000000000000  PAT = 0x0000050100070406
> (XEN) [19458.318344] *** Control State ***
> (XEN) [19458.318347] PinBased=0000003f CPUBased=b6a0e5fa
> SecondaryExec=001014ea
> (XEN) [19458.318348] EntryControls=000153ff ExitControls=008fefff
> (XEN) [19458.318350] ExceptionBitmap=00060082 PFECmask=00000000
> PFECmatch=00000000
> (XEN) [19458.318352] VMEntry: intr_info=00000000 errcode=00000000
> ilen=00000000
> (XEN) [19458.318353] VMExit: intr_info=00000000 errcode=00000000
> ilen=00000003
> (XEN) [19458.318355]         reason=80000021
> qualification=0000000000000000
> (XEN) [19458.318357] IDTVectoring: info=00000000 errcode=00000000
> (XEN) [19458.318359] TSC Offset = 0xffffd23bbd8772ac  TSC Multiplier =
> 0x0000000000000000
> (XEN) [19458.318361] TPR Threshold = 0x00  PostedIntrVec = 0x00
> (XEN) [19458.318365] EPT pointer = 0x000000010ee9501e  EPTP index = 0x0000
> (XEN) [19458.318396] PLE Gap=00000080 Window=00001000
> (XEN) [19458.318402] Virtual processor ID = 0xccd3 VMfunc controls =
> 0000000000000000
> (XEN) [19458.318406] **************************************
> (XEN) [19458.318412] domain_crash called from
> vmx_vmexit_handler+0x4ab/0x19f5
> (XEN) [19458.318417] Domain 15 (vcpu#0) crashed on cpu#0:
> (XEN) [19458.318443] ----[ Xen-4.7.1-1.0  x86_64  debug=n  Not tainted
> ]----
> (XEN) [19458.318448] CPU:    0
> (XEN) [19458.318453] RIP:    0010:[<ffffffff81845857>]
> (XEN) [19458.318458] RFLAGS: 0000000000000082   CONTEXT: hvm guest (d15v0)
> (XEN) [19458.318466] rax: 800000001ded7080   rbx: 0000000000000000  
> rcx: 00007fde033ce730
> (XEN) [19458.318470] rdx: 00000000000000fa   rsi: 0000000000000002  
> rdi: 00007ffd8ee85250
> (XEN) [19458.318484] rbp: 00007ffd8ee85410   rsp: ffff880015b87f50  
> r8:  0000000000000000
> (XEN) [19458.318498] r9:  0000000000000017   r10: 0000000000000000  
> r11: 0000000000000246
> (XEN) [19458.318502] r12: 00007ffd8ee85250   r13: 0000000000000000  
> r14: 0000000000000004
> (XEN) [19458.318525] r15: 000055a8503b3828   cr0: 0000000080050033  
> cr4: 0000000000360670
> (XEN) [19458.318538] cr3: 800000001ded7080   cr2: 00007ffef290a090
> (XEN) [19458.318552] ds: 0000   es: 0000   fs: 0000   gs: 0000   ss:
> 0018   cs: 0010
>


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.