@@ -208,14 +208,15 @@ struct regs get_regs(void)
struct svm_test *v2_test;
-#define ASM_VMRUN_CMD \
+#define ASM_PRE_VMRUN_CMD \
"vmload %%rax\n\t" \
"mov regs+0x80, %%r15\n\t" \
"mov %%r15, 0x170(%%rax)\n\t" \
"mov regs, %%r15\n\t" \
"mov %%r15, 0x1f8(%%rax)\n\t" \
LOAD_GPR_C \
- "vmrun %%rax\n\t" \
+
+#define ASM_POST_VMRUN_CMD \
SAVE_GPR_C \
"mov 0x170(%%rax), %%r15\n\t" \
"mov %%r15, regs+0x80\n\t" \
@@ -232,7 +233,9 @@ int svm_vmrun(void)
regs.rdi = (ulong)v2_test;
asm volatile (
- ASM_VMRUN_CMD
+ ASM_PRE_VMRUN_CMD
+ "vmrun %%rax\n\t" \
+ ASM_POST_VMRUN_CMD
:
: "a" (virt_to_phys(vmcb))
: "memory", "r15");
@@ -240,6 +243,8 @@ int svm_vmrun(void)
return (vmcb->control.exit_code);
}
+extern void *vmrun_rip;
+
static void test_run(struct svm_test *test)
{
u64 vmcb_phys = virt_to_phys(vmcb);
@@ -258,7 +263,10 @@ static void test_run(struct svm_test *test)
"sti \n\t"
"call *%c[PREPARE_GIF_CLEAR](%[test]) \n \t"
"mov %[vmcb_phys], %%rax \n\t"
- ASM_VMRUN_CMD
+ ASM_PRE_VMRUN_CMD
+ ".global vmrun_rip\n\t" \
+ "vmrun_rip: vmrun %%rax\n\t" \
+ ASM_POST_VMRUN_CMD
"cli \n\t"
"stgi"
: // inputs clobbered by the guest:
Add an assembly label to the VMRUN instruction so that its RIP can be known to test cases. This will be used by the test in the next patch. Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Krish Sadhukhan <krish.sadhukhan@oracle.com> --- x86/svm.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)