--- Changes in v2: - Add a humand readable name for the
specification --- xen/arch/arm/vpsci.c | 1 +
xen/arch/arm/vsmc.c | 23 +++++++++++++++++++++++
xen/include/asm-arm/smccc.h | 15 +++++++++++++++ 3 files changed, 39
insertions(+)
diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c index
e82b62db1a..19ee7caeb4 100644 --- a/xen/arch/arm/vpsci.c +++
b/xen/arch/arm/vpsci.c @@ -212,6 +212,7 @@ static int32_t
do_psci_1_0_features(uint32_t psci_func_id) case
PSCI_0_2_FN32_SYSTEM_OFF: case PSCI_0_2_FN32_SYSTEM_RESET: case
PSCI_1_0_FN32_PSCI_FEATURES: + case ARM_SMCCC_VERSION_FID: return
0; default: return PSCI_NOT_SUPPORTED; diff --git
a/xen/arch/arm/vsmc.c b/xen/arch/arm/vsmc.c index
3d3bd95fee..a708aa5e81 100644 --- a/xen/arch/arm/vsmc.c +++
b/xen/arch/arm/vsmc.c @@ -81,6 +81,26 @@ static bool
fill_function_call_count(struct cpu_user_regs *regs, uint32_t cnt)
return true; }
+/* SMCCC interface for ARM Architecture */ +static bool
handle_arch(struct cpu_user_regs *regs) +{ + uint32_t fid =
(uint32_t)get_user_reg(regs, 0); + + switch ( fid ) + { +
case ARM_SMCCC_VERSION_FID: + set_user_reg(regs, 0,
ARM_SMCCC_VERSION_1_1); + return true; + + case
ARM_SMCCC_ARCH_FEATURES_FID: + /* Nothing supported yet */ +
set_user_reg(regs, 0, -1); + return true; + } + + return
false; +} + /* SMCCC interface for hypervisor. Tell about itself. */
static bool handle_hypervisor(struct cpu_user_regs *regs) { @@ -188,6
+208,9 @@ static bool vsmccc_handle_call(struct cpu_user_regs *regs)
{ switch ( smccc_get_owner(funcid) ) { + case
ARM_SMCCC_OWNER_ARCH: + handled = handle_arch(regs); +
break; case ARM_SMCCC_OWNER_HYPERVISOR: handled =
handle_hypervisor(regs); break; diff --git
a/xen/include/asm-arm/smccc.h b/xen/include/asm-arm/smccc.h index
62b3a8cdf5..431389c118 100644 --- a/xen/include/asm-arm/smccc.h +++
b/xen/include/asm-arm/smccc.h @@ -16,6 +16,9 @@ #ifndef
__ASM_ARM_SMCCC_H__ #define __ASM_ARM_SMCCC_H__
+#define ARM_SMCCC_VERSION_1_0 0x10000 +#define
ARM_SMCCC_VERSION_1_1 0x10001 + /* * This file provides common
defines for ARM SMC Calling Convention as * specified in @@ -100,6
+103,18 @@ static inline uint32_t smccc_get_owner(register_t funcid)
ARM_SMCCC_OWNER_##owner, \ 0xFF03)
+#define ARM_SMCCC_VERSION_FID \ +
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ +
ARM_SMCCC_CONV_32, \ +
ARM_SMCCC_OWNER_ARCH, \ + 0x0)
\ + +#define ARM_SMCCC_ARCH_FEATURES_FID \ +
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ +
ARM_SMCCC_CONV_32, \ +
ARM_SMCCC_OWNER_ARCH, \ + 0x1) + /* Only
one error code defined in SMCCC */ #define
ARM_SMCCC_ERR_UNKNOWN_FUNCTION (-1)