1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2020, Red Hat, Inc.
7 * Nested SVM testing: VMCALL
10 #include "test_util.h"
12 #include "processor.h"
15 static void l2_guest_code(struct svm_test_data
*svm
)
17 __asm__
__volatile__("vmcall");
20 static void l1_guest_code(struct svm_test_data
*svm
)
22 #define L2_GUEST_STACK_SIZE 64
23 unsigned long l2_guest_stack
[L2_GUEST_STACK_SIZE
];
24 struct vmcb
*vmcb
= svm
->vmcb
;
26 /* Prepare for L2 execution. */
27 generic_svm_setup(svm
, l2_guest_code
,
28 &l2_guest_stack
[L2_GUEST_STACK_SIZE
]);
30 run_guest(vmcb
, svm
->vmcb_gpa
);
32 GUEST_ASSERT(vmcb
->control
.exit_code
== SVM_EXIT_VMMCALL
);
36 int main(int argc
, char *argv
[])
38 struct kvm_vcpu
*vcpu
;
42 TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SVM
));
44 vm
= vm_create_with_one_vcpu(&vcpu
, l1_guest_code
);
46 vcpu_alloc_svm(vm
, &svm_gva
);
47 vcpu_args_set(vcpu
, 1, svm_gva
);
53 TEST_ASSERT_KVM_EXIT_REASON(vcpu
, KVM_EXIT_IO
);
55 switch (get_ucall(vcpu
, &uc
)) {
57 REPORT_GUEST_ASSERT(uc
);
64 TEST_FAIL("Unknown ucall 0x%lx.", uc
.cmd
);