On Mon, Nov 07, 2022 at 09:54:32AM -0500, Paolo Bonzini wrote:
@@ -56,6 +59,16 @@ SYM_FUNC_START(__svm_vcpu_run) /* Move @svm to RDI. */ mov %_ASM_ARG2, %_ASM_DI
- /*
* Use a single vmcb (vmcb01 because it's always valid) for
* context switching guest state via VMLOAD/VMSAVE, that way
* the state doesn't need to be copied between vmcb01 and
* vmcb02 when switching vmcbs for nested virtualization.
*/
- mov SVM_vmcb01_pa(%_ASM_DI), %_ASM_AX
+1: vmload %_ASM_AX +2:
- /* "POP" @vmcb to RAX. */ pop %_ASM_AX
@@ -80,16 +93,11 @@ SYM_FUNC_START(__svm_vcpu_run) /* Enter guest mode */ sti +3: vmrun %_ASM_AX +4:
- cli
- /* Pop @svm to RAX while it's the only available register. */ pop %_ASM_AX
/* Save all guest registers. */
So Andrew noted that once the vmload has executed any exception taken (say at 3) will crash and burn because %gs is scribbled.
Might be good to make a record of this in the code so it can be cleaned up some day.
@@ -159,11 +179,19 @@ SYM_FUNC_START(__svm_vcpu_run) pop %_ASM_BP RET +10: cmpb $0, kvm_rebooting jne 2b ud2 +30: cmpb $0, kvm_rebooting
- jne 4b
- ud2
+50: cmpb $0, kvm_rebooting
- jne 6b
- ud2
- _ASM_EXTABLE(1b, 10b)
- _ASM_EXTABLE(3b, 30b)
- _ASM_EXTABLE(5b, 50b)