vmm(4)/vmx: fix memory scribbling by updating GDTR/TR if vcpu moves.
authordv <dv@openbsd.org>
Fri, 24 Nov 2023 21:48:25 +0000 (21:48 +0000)
committerdv <dv@openbsd.org>
Fri, 24 Nov 2023 21:48:25 +0000 (21:48 +0000)
commitdba1c86c31dfc962a00dced38cdfc91ac26c0a30
tree342aa65f4a801065d5399caa2676253116dc5e85
parent8d091280291736d9409a6cafae6eecb0d1cac21b
vmm(4)/vmx: fix memory scribbling by updating GDTR/TR if vcpu moves.

If the vcpu thread sleeps in the kernel, like when handling a nested
page fault and calling uvm_fault(9), the thread may be rescheduled
on another host cpu. vmm(4) was only setting the GDTR and TR bases
in the VMCS once prior to first vm entry, so a thread migration can
result in restoring the wrong GDTR and TR on vm exit for the host
cpu. This results in borked interrupts and corrupted stack pointers,
causing programs to segfault or sigabort. It can also result in
missed ipi's causing kernel deadlocks.

Use similar logic to the SVM routines and check for cpu migration
within the hot loop. Since we're letting the VMX features of the
cpu restore GDTR, we can also drop the manual store/load routines.

Reported and with much appreciated testing help from Mischa Peters.

ok mlarkin@
sys/arch/amd64/amd64/vmm_machdep.c