History

Merge branch kvm-arm64/hcall-selection into kvmarm-master/next

* kvm-arm64/hcall-selection: : . : Introduce a new set of virtual sysregs for userspace to : select the hypercalls it wants to see exposed to the guest. : : Patches courtesy of Raghavendra and Oliver. : . KVM: arm64: Fix hypercall bitmap writeback when vcpus have already run KVM: arm64: Hide KVM_REG_ARM_*_BMAP_BIT_COUNT from userspace Documentation: Fix index.rst after psci.rst renaming selftests: KVM: aarch64: Add the bitmap firmware registers to get-reg-list selftests: KVM: aarch64: Introduce hypercall ABI test selftests: KVM: Create helper for making SMCCC calls selftests: KVM: Rename psci_cpu_on_test to psci_test tools: Import ARM SMCCC definitions Docs: KVM: Add doc for the bitmap firmware registers Docs: KVM: Rename psci.rst to hypercalls.rst KVM: arm64: Add vendor hypervisor firmware register KVM: arm64: Add standard hypervisor firmware register KVM: arm64: Setup a framework for hypercall bitmap firmware registers KVM: arm64: Factor out firmware register handling from psci.c

Marc Zyngier committed 4 years ago

Commit 0586e282 parents d25f30f 528ada221 files · +1146 −303Browse files

Showing the changes to tools/include/linux (1 of 21 files). Show all

Unified · Split

tools/include/linux/arm-smccc.h+193−0
@@ -0,0 +1,193 @@
1+/* SPDX-License-Identifier: GPL-2.0-only */
2+/*
3+ * Copyright (c) 2015, Linaro Limited
4+ */
5+#ifndef __LINUX_ARM_SMCCC_H
6+#define __LINUX_ARM_SMCCC_H
7+
8+#include <linux/const.h>
9+
10+/*
11+ * This file provides common defines for ARM SMC Calling Convention as
12+ * specified in
13+ * https://developer.arm.com/docs/den0028/latest
14+ *
15+ * This code is up-to-date with version DEN 0028 C
16+ */
17+
18+#define ARM_SMCCC_STD_CALL _AC(0,U)
19+#define ARM_SMCCC_FAST_CALL _AC(1,U)
20+#define ARM_SMCCC_TYPE_SHIFT 31
21+
22+#define ARM_SMCCC_SMC_32 0
23+#define ARM_SMCCC_SMC_64 1
24+#define ARM_SMCCC_CALL_CONV_SHIFT 30
25+
26+#define ARM_SMCCC_OWNER_MASK 0x3F
27+#define ARM_SMCCC_OWNER_SHIFT 24
28+
29+#define ARM_SMCCC_FUNC_MASK 0xFFFF
30+
31+#define ARM_SMCCC_IS_FAST_CALL(smc_val) \
32+ ((smc_val) & (ARM_SMCCC_FAST_CALL << ARM_SMCCC_TYPE_SHIFT))
33+#define ARM_SMCCC_IS_64(smc_val) \
34+ ((smc_val) & (ARM_SMCCC_SMC_64 << ARM_SMCCC_CALL_CONV_SHIFT))
35+#define ARM_SMCCC_FUNC_NUM(smc_val) ((smc_val) & ARM_SMCCC_FUNC_MASK)
36+#define ARM_SMCCC_OWNER_NUM(smc_val) \
37+ (((smc_val) >> ARM_SMCCC_OWNER_SHIFT) & ARM_SMCCC_OWNER_MASK)
38+
39+#define ARM_SMCCC_CALL_VAL(type, calling_convention, owner, func_num) \
40+ (((type) << ARM_SMCCC_TYPE_SHIFT) | \
41+ ((calling_convention) << ARM_SMCCC_CALL_CONV_SHIFT) | \
42+ (((owner) & ARM_SMCCC_OWNER_MASK) << ARM_SMCCC_OWNER_SHIFT) | \
43+ ((func_num) & ARM_SMCCC_FUNC_MASK))
44+
45+#define ARM_SMCCC_OWNER_ARCH 0
46+#define ARM_SMCCC_OWNER_CPU 1
47+#define ARM_SMCCC_OWNER_SIP 2
48+#define ARM_SMCCC_OWNER_OEM 3
49+#define ARM_SMCCC_OWNER_STANDARD 4
50+#define ARM_SMCCC_OWNER_STANDARD_HYP 5
51+#define ARM_SMCCC_OWNER_VENDOR_HYP 6
52+#define ARM_SMCCC_OWNER_TRUSTED_APP 48
53+#define ARM_SMCCC_OWNER_TRUSTED_APP_END 49
54+#define ARM_SMCCC_OWNER_TRUSTED_OS 50
55+#define ARM_SMCCC_OWNER_TRUSTED_OS_END 63
56+
57+#define ARM_SMCCC_FUNC_QUERY_CALL_UID 0xff01
58+
59+#define ARM_SMCCC_QUIRK_NONE 0
60+#define ARM_SMCCC_QUIRK_QCOM_A6 1 /* Save/restore register a6 */
61+
62+#define ARM_SMCCC_VERSION_1_0 0x10000
63+#define ARM_SMCCC_VERSION_1_1 0x10001
64+#define ARM_SMCCC_VERSION_1_2 0x10002
65+#define ARM_SMCCC_VERSION_1_3 0x10003
66+
67+#define ARM_SMCCC_1_3_SVE_HINT 0x10000
68+
69+#define ARM_SMCCC_VERSION_FUNC_ID \
70+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
71+ ARM_SMCCC_SMC_32, \
72+ 0, 0)
73+
74+#define ARM_SMCCC_ARCH_FEATURES_FUNC_ID \
75+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
76+ ARM_SMCCC_SMC_32, \
77+ 0, 1)
78+
79+#define ARM_SMCCC_ARCH_SOC_ID \
80+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
81+ ARM_SMCCC_SMC_32, \
82+ 0, 2)
83+
84+#define ARM_SMCCC_ARCH_WORKAROUND_1 \
85+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
86+ ARM_SMCCC_SMC_32, \
87+ 0, 0x8000)
88+
89+#define ARM_SMCCC_ARCH_WORKAROUND_2 \
90+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
91+ ARM_SMCCC_SMC_32, \
92+ 0, 0x7fff)
93+
94+#define ARM_SMCCC_ARCH_WORKAROUND_3 \
95+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
96+ ARM_SMCCC_SMC_32, \
97+ 0, 0x3fff)
98+
99+#define ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID \
100+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
101+ ARM_SMCCC_SMC_32, \
102+ ARM_SMCCC_OWNER_VENDOR_HYP, \
103+ ARM_SMCCC_FUNC_QUERY_CALL_UID)
104+
105+/* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */
106+#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0 0xb66fb428U
107+#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 0xe911c52eU
108+#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 0x564bcaa9U
109+#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3 0x743a004dU
110+
111+/* KVM "vendor specific" services */
112+#define ARM_SMCCC_KVM_FUNC_FEATURES 0
113+#define ARM_SMCCC_KVM_FUNC_PTP 1
114+#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127
115+#define ARM_SMCCC_KVM_NUM_FUNCS 128
116+
117+#define ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID \
118+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
119+ ARM_SMCCC_SMC_32, \
120+ ARM_SMCCC_OWNER_VENDOR_HYP, \
121+ ARM_SMCCC_KVM_FUNC_FEATURES)
122+
123+#define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED 1
124+
125+/*
126+ * ptp_kvm is a feature used for time sync between vm and host.
127+ * ptp_kvm module in guest kernel will get service from host using
128+ * this hypercall ID.
129+ */
130+#define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID \
131+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
132+ ARM_SMCCC_SMC_32, \
133+ ARM_SMCCC_OWNER_VENDOR_HYP, \
134+ ARM_SMCCC_KVM_FUNC_PTP)
135+
136+/* ptp_kvm counter type ID */
137+#define KVM_PTP_VIRT_COUNTER 0
138+#define KVM_PTP_PHYS_COUNTER 1
139+
140+/* Paravirtualised time calls (defined by ARM DEN0057A) */
141+#define ARM_SMCCC_HV_PV_TIME_FEATURES \
142+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
143+ ARM_SMCCC_SMC_64, \
144+ ARM_SMCCC_OWNER_STANDARD_HYP, \
145+ 0x20)
146+
147+#define ARM_SMCCC_HV_PV_TIME_ST \
148+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
149+ ARM_SMCCC_SMC_64, \
150+ ARM_SMCCC_OWNER_STANDARD_HYP, \
151+ 0x21)
152+
153+/* TRNG entropy source calls (defined by ARM DEN0098) */
154+#define ARM_SMCCC_TRNG_VERSION \
155+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
156+ ARM_SMCCC_SMC_32, \
157+ ARM_SMCCC_OWNER_STANDARD, \
158+ 0x50)
159+
160+#define ARM_SMCCC_TRNG_FEATURES \
161+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
162+ ARM_SMCCC_SMC_32, \
163+ ARM_SMCCC_OWNER_STANDARD, \
164+ 0x51)
165+
166+#define ARM_SMCCC_TRNG_GET_UUID \
167+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
168+ ARM_SMCCC_SMC_32, \
169+ ARM_SMCCC_OWNER_STANDARD, \
170+ 0x52)
171+
172+#define ARM_SMCCC_TRNG_RND32 \
173+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
174+ ARM_SMCCC_SMC_32, \
175+ ARM_SMCCC_OWNER_STANDARD, \
176+ 0x53)
177+
178+#define ARM_SMCCC_TRNG_RND64 \
179+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
180+ ARM_SMCCC_SMC_64, \
181+ ARM_SMCCC_OWNER_STANDARD, \
182+ 0x53)
183+
184+/*
185+ * Return codes defined in ARM DEN 0070A
186+ * ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C
187+ */
188+#define SMCCC_RET_SUCCESS 0
189+#define SMCCC_RET_NOT_SUPPORTED -1
190+#define SMCCC_RET_NOT_REQUIRED -2
191+#define SMCCC_RET_INVALID_PARAMETER -3
192+
193+#endif /*__LINUX_ARM_SMCCC_H*/