On Fri, Apr 08, 2022 at 07:49:43PM -0600, Dave Voutila wrote:
> CVSROOT:      /cvs
> Module name:  src
> Changes by:   d...@cvs.openbsd.org    2022/04/08 19:49:43
>
> Modified files:
>       sys/arch/amd64/amd64: vmm_support.S
>
> Log message:
> Simplify vmx instruction error handling.
>
> Removes jumps and shortens the code while keeping functionality the
> same.
>
> ok mlarkin@

This commit breaks vmm on my ThinkPad T430s.

cpu1: failed to enter VMM mode
cpu0: failed to enter VMM mode

cpu0: Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz, 2893.83 MHz, 06-3a-09
cpu0: 
FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,FSGSBASE,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,MELTDOWN
cpu0: 256KB 64b/line 8-way L2 cache

I think the problem is that XOR affects the zero flag.  Does it?
This diff fixes it.

ok?

bluhm

Index: arch/amd64/amd64/vmm_support.S
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/vmm_support.S,v
retrieving revision 1.19
diff -u -p -r1.19 vmm_support.S
--- arch/amd64/amd64/vmm_support.S      9 Apr 2022 01:49:43 -0000       1.19
+++ arch/amd64/amd64/vmm_support.S      13 Apr 2022 17:10:42 -0000
@@ -62,8 +62,8 @@ _C_LABEL(vmm_dispatch_intr):

 _C_LABEL(vmxon):
        RETGUARD_SETUP(vmxon, r11)
-       vmxon   (%rdi)
        xorq    %rax, %rax
+       vmxon   (%rdi)
        setna   %al
        RETGUARD_CHECK(vmxon, r11)
        ret
@@ -71,8 +71,8 @@ _C_LABEL(vmxon):

 _C_LABEL(vmxoff):
        RETGUARD_SETUP(vmxoff, r11)
-       vmxoff
        xorq    %rax, %rax
+       vmxoff
        setna   %al
        RETGUARD_CHECK(vmxoff, r11)
        ret
@@ -80,8 +80,8 @@ _C_LABEL(vmxoff):

 _C_LABEL(vmclear):
        RETGUARD_SETUP(vmclear, r11)
-       vmclear (%rdi)
        xorq    %rax, %rax
+       vmclear (%rdi)
        setna   %al
        RETGUARD_CHECK(vmclear, r11)
        ret
@@ -89,8 +89,8 @@ _C_LABEL(vmclear):

 _C_LABEL(vmptrld):
        RETGUARD_SETUP(vmptrld, r11)
-       vmptrld (%rdi)
        xorq    %rax, %rax
+       vmptrld (%rdi)
        setna   %al
        RETGUARD_CHECK(vmptrld, r11)
        ret
@@ -98,8 +98,8 @@ _C_LABEL(vmptrld):

 _C_LABEL(vmptrst):
        RETGUARD_SETUP(vmptrst, r11)
-       vmptrst (%rdi)
        xorq    %rax, %rax
+       vmptrst (%rdi)
        setna   %al
        RETGUARD_CHECK(vmptrst, r11)
        ret
@@ -107,8 +107,8 @@ _C_LABEL(vmptrst):

 _C_LABEL(vmwrite):
        RETGUARD_SETUP(vmwrite, r11)
-       vmwrite %rsi, %rdi
        xorq    %rax, %rax
+       vmwrite %rsi, %rdi
        setna   %al
        RETGUARD_CHECK(vmwrite, r11)
        ret
@@ -116,8 +116,8 @@ _C_LABEL(vmwrite):

 _C_LABEL(vmread):
        RETGUARD_SETUP(vmread, r11)
-       vmread  %rdi, (%rsi)
        xorq    %rax, %rax
+       vmread  %rdi, (%rsi)
        setna   %al
        RETGUARD_CHECK(vmread, r11)
        ret

Reply via email to