xref: /linux/tools/testing/selftests/kvm/arm64/kvm-uuid.c (revision 11e7861d680c3757eab18ec0a474ff680e007dc4)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 // Check that nobody has tampered with KVM's UID
4 
5 #include <errno.h>
6 #include <linux/arm-smccc.h>
7 #include <asm/kvm.h>
8 #include <kvm_util.h>
9 
10 #include "processor.h"
11 
12 /*
13  * Do NOT redefine these constants, or try to replace them with some
14  * "common" version. They are hardcoded here to detect any potential
15  * breakage happening in the rest of the kernel.
16  *
17  * KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74
18  */
19 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0	0xb66fb428U
20 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1	0xe911c52eU
21 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2	0x564bcaa9U
22 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3	0x743a004dU
23 
guest_code(void)24 static void guest_code(void)
25 {
26 	struct arm_smccc_res res = {};
27 
28 	smccc_hvc(ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID, 0, 0, 0, 0, 0, 0, 0, &res);
29 
30 	__GUEST_ASSERT(res.a0 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0 &&
31 		       res.a1 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 &&
32 		       res.a2 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 &&
33 		       res.a3 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3,
34 		       "Unexpected KVM-specific UID %lx %lx %lx %lx\n", res.a0, res.a1, res.a2, res.a3);
35 	GUEST_DONE();
36 }
37 
main(int argc,char * argv[])38 int main (int argc, char *argv[])
39 {
40 	struct kvm_vcpu *vcpu;
41 	struct kvm_vm *vm;
42 	struct ucall uc;
43 	bool guest_done = false;
44 
45 	vm = vm_create_with_one_vcpu(&vcpu, guest_code);
46 
47 	while (!guest_done) {
48 		vcpu_run(vcpu);
49 
50 		switch (get_ucall(vcpu, &uc)) {
51 		case UCALL_SYNC:
52 			break;
53 		case UCALL_DONE:
54 			guest_done = true;
55 			break;
56 		case UCALL_ABORT:
57 			REPORT_GUEST_ASSERT(uc);
58 			break;
59 		case UCALL_PRINTF:
60 			printf("%s", uc.buffer);
61 			break;
62 		default:
63 			TEST_FAIL("Unexpected guest exit");
64 		}
65 	}
66 
67 	kvm_vm_free(vm);
68 
69 	return 0;
70 }
71