| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // SPDX-License-Identifier: GPL-2.0
- // Check that nobody has tampered with KVM's UID
- #include <errno.h>
- #include <linux/arm-smccc.h>
- #include <asm/kvm.h>
- #include <kvm_util.h>
- #include "processor.h"
- /*
- * Do NOT redefine these constants, or try to replace them with some
- * "common" version. They are hardcoded here to detect any potential
- * breakage happening in the rest of the kernel.
- *
- * KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74
- */
- #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0 0xb66fb428U
- #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 0xe911c52eU
- #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 0x564bcaa9U
- #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3 0x743a004dU
- static void guest_code(void)
- {
- struct arm_smccc_res res = {};
- do_smccc(ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID, 0, 0, 0, 0, 0, 0, 0, &res);
- __GUEST_ASSERT(res.a0 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0 &&
- res.a1 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 &&
- res.a2 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 &&
- res.a3 == ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3,
- "Unexpected KVM-specific UID %lx %lx %lx %lx\n", res.a0, res.a1, res.a2, res.a3);
- GUEST_DONE();
- }
- int main (int argc, char *argv[])
- {
- struct kvm_vcpu *vcpu;
- struct kvm_vm *vm;
- struct ucall uc;
- bool guest_done = false;
- vm = vm_create_with_one_vcpu(&vcpu, guest_code);
- while (!guest_done) {
- vcpu_run(vcpu);
- switch (get_ucall(vcpu, &uc)) {
- case UCALL_SYNC:
- break;
- case UCALL_DONE:
- guest_done = true;
- break;
- case UCALL_ABORT:
- REPORT_GUEST_ASSERT(uc);
- break;
- case UCALL_PRINTF:
- printf("%s", uc.buffer);
- break;
- default:
- TEST_FAIL("Unexpected guest exit");
- }
- }
- kvm_vm_free(vm);
- return 0;
- }
|