~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/kvm/x86_64/svm_vmcall_test.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * svm_vmcall_test
  4  *
  5  * Copyright (C) 2020, Red Hat, Inc.
  6  *
  7  * Nested SVM testing: VMCALL
  8  */
  9 
 10 #include "test_util.h"
 11 #include "kvm_util.h"
 12 #include "processor.h"
 13 #include "svm_util.h"
 14 
 15 static void l2_guest_code(struct svm_test_data *svm)
 16 {
 17         __asm__ __volatile__("vmcall");
 18 }
 19 
 20 static void l1_guest_code(struct svm_test_data *svm)
 21 {
 22         #define L2_GUEST_STACK_SIZE 64
 23         unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE];
 24         struct vmcb *vmcb = svm->vmcb;
 25 
 26         /* Prepare for L2 execution. */
 27         generic_svm_setup(svm, l2_guest_code,
 28                           &l2_guest_stack[L2_GUEST_STACK_SIZE]);
 29 
 30         run_guest(vmcb, svm->vmcb_gpa);
 31 
 32         GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_VMMCALL);
 33         GUEST_DONE();
 34 }
 35 
 36 int main(int argc, char *argv[])
 37 {
 38         struct kvm_vcpu *vcpu;
 39         vm_vaddr_t svm_gva;
 40         struct kvm_vm *vm;
 41 
 42         TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SVM));
 43 
 44         vm = vm_create_with_one_vcpu(&vcpu, l1_guest_code);
 45 
 46         vcpu_alloc_svm(vm, &svm_gva);
 47         vcpu_args_set(vcpu, 1, svm_gva);
 48 
 49         for (;;) {
 50                 struct ucall uc;
 51 
 52                 vcpu_run(vcpu);
 53                 TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_IO);
 54 
 55                 switch (get_ucall(vcpu, &uc)) {
 56                 case UCALL_ABORT:
 57                         REPORT_GUEST_ASSERT(uc);
 58                         /* NOT REACHED */
 59                 case UCALL_SYNC:
 60                         break;
 61                 case UCALL_DONE:
 62                         goto done;
 63                 default:
 64                         TEST_FAIL("Unknown ucall 0x%lx.", uc.cmd);
 65                 }
 66         }
 67 done:
 68         kvm_vm_free(vm);
 69         return 0;
 70 }
 71 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php