Commit 0709055e authored by Antonio Nino Diaz's avatar Antonio Nino Diaz
Browse files

Remove support for the SMC Calling Convention 2.0

This reverts commit 2f370465

 ("Add support for the SMC Calling
Convention 2.0").

SMCCC v2.0 is no longer required for SPM, and won't be needed in the
future. Removing it makes the SMC handling code less complicated.

The SPM implementation based on SPCI and SPRT was using it, but it has
been adapted to SMCCC v1.0.

Change-Id: I36795b91857b2b9c00437cfbfed04b3c1627f578
Signed-off-by: default avatarAntonio Nino Diaz <antonio.ninodiaz@arm.com>
parent 7e9b0c8e
...@@ -432,16 +432,6 @@ ifeq ($(BL2_AT_EL3)-$(BL2_IN_XIP_MEM),0-1) ...@@ -432,16 +432,6 @@ ifeq ($(BL2_AT_EL3)-$(BL2_IN_XIP_MEM),0-1)
$(error "BL2_IN_XIP_MEM is only supported when BL2_AT_EL3 is enabled") $(error "BL2_IN_XIP_MEM is only supported when BL2_AT_EL3 is enabled")
endif endif
# SMC Calling Convention checks
ifneq (${SMCCC_MAJOR_VERSION},1)
ifneq (${SPD},none)
$(error "SMC Calling Convention 1.X must be used with SPDs")
endif
ifeq (${ARCH},aarch32)
$(error "Only SMCCC 1.X is supported in AArch32 mode.")
endif
endif
# For RAS_EXTENSION, require that EAs are handled in EL3 first # For RAS_EXTENSION, require that EAs are handled in EL3 first
ifeq ($(RAS_EXTENSION),1) ifeq ($(RAS_EXTENSION),1)
ifneq ($(HANDLE_EA_EL3_FIRST),1) ifneq ($(HANDLE_EA_EL3_FIRST),1)
...@@ -624,7 +614,6 @@ $(eval $(call assert_boolean,BL2_IN_XIP_MEM)) ...@@ -624,7 +614,6 @@ $(eval $(call assert_boolean,BL2_IN_XIP_MEM))
$(eval $(call assert_numeric,ARM_ARCH_MAJOR)) $(eval $(call assert_numeric,ARM_ARCH_MAJOR))
$(eval $(call assert_numeric,ARM_ARCH_MINOR)) $(eval $(call assert_numeric,ARM_ARCH_MINOR))
$(eval $(call assert_numeric,SMCCC_MAJOR_VERSION))
################################################################################ ################################################################################
# Add definitions to the cpp preprocessor based on the current build options. # Add definitions to the cpp preprocessor based on the current build options.
...@@ -664,7 +653,6 @@ $(eval $(call add_define,RAS_EXTENSION)) ...@@ -664,7 +653,6 @@ $(eval $(call add_define,RAS_EXTENSION))
$(eval $(call add_define,RESET_TO_BL31)) $(eval $(call add_define,RESET_TO_BL31))
$(eval $(call add_define,SEPARATE_CODE_AND_RODATA)) $(eval $(call add_define,SEPARATE_CODE_AND_RODATA))
$(eval $(call add_define,RECLAIM_INIT_CODE)) $(eval $(call add_define,RECLAIM_INIT_CODE))
$(eval $(call add_define,SMCCC_MAJOR_VERSION))
$(eval $(call add_define,SPD_${SPD})) $(eval $(call add_define,SPD_${SPD}))
$(eval $(call add_define,SPIN_ON_BL1_EXIT)) $(eval $(call add_define,SPIN_ON_BL1_EXIT))
$(eval $(call add_define,SPM_MM)) $(eval $(call add_define,SPM_MM))
......
/* /*
* Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -303,38 +303,6 @@ vector_entry serror_aarch32 ...@@ -303,38 +303,6 @@ vector_entry serror_aarch32
b enter_lower_el_async_ea b enter_lower_el_async_ea
end_vector_entry serror_aarch32 end_vector_entry serror_aarch32
/* ---------------------------------------------------------------------
* This macro takes an argument in x16 that is the index in the
* 'rt_svc_descs_indices' array, checks that the value in the array is
* valid, and loads in x15 the pointer to the handler of that service.
* ---------------------------------------------------------------------
*/
.macro load_rt_svc_desc_pointer
/* Load descriptor index from array of indices */
adr x14, rt_svc_descs_indices
ldrb w15, [x14, x16]
#if SMCCC_MAJOR_VERSION == 1
/* Any index greater than 127 is invalid. Check bit 7. */
tbnz w15, 7, smc_unknown
#elif SMCCC_MAJOR_VERSION == 2
/* Verify that the top 3 bits of the loaded index are 0 (w15 <= 31) */
cmp w15, #31
b.hi smc_unknown
#endif /* SMCCC_MAJOR_VERSION */
/*
* Get the descriptor using the index
* x11 = (base + off), w15 = index
*
* handler = (base + off) + (index << log2(size))
*/
adr x11, (__RT_SVC_DESCS_START__ + RT_SVC_DESC_HANDLE)
lsl w10, w15, #RT_SVC_SIZE_LOG2
ldr x15, [x11, w10, uxtw]
.endm
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
* The following code handles secure monitor calls. * The following code handles secure monitor calls.
* Depending upon the execution state from where the SMC has been * Depending upon the execution state from where the SMC has been
...@@ -363,56 +331,27 @@ smc_handler64: ...@@ -363,56 +331,27 @@ smc_handler64:
mov x5, xzr mov x5, xzr
mov x6, sp mov x6, sp
#if SMCCC_MAJOR_VERSION == 1
/* Get the unique owning entity number */ /* Get the unique owning entity number */
ubfx x16, x0, #FUNCID_OEN_SHIFT, #FUNCID_OEN_WIDTH ubfx x16, x0, #FUNCID_OEN_SHIFT, #FUNCID_OEN_WIDTH
ubfx x15, x0, #FUNCID_TYPE_SHIFT, #FUNCID_TYPE_WIDTH ubfx x15, x0, #FUNCID_TYPE_SHIFT, #FUNCID_TYPE_WIDTH
orr x16, x16, x15, lsl #FUNCID_OEN_WIDTH orr x16, x16, x15, lsl #FUNCID_OEN_WIDTH
load_rt_svc_desc_pointer /* Load descriptor index from array of indices */
adr x14, rt_svc_descs_indices
#elif SMCCC_MAJOR_VERSION == 2 ldrb w15, [x14, x16]
/* Bit 31 must be set */
tbz x0, #FUNCID_TYPE_SHIFT, smc_unknown
/*
* Check MSB of namespace to decide between compatibility/vendor and
* SPCI/SPRT
*/
tbz x0, #(FUNCID_NAMESPACE_SHIFT + 1), compat_or_vendor
/* Namespace is b'10 (SPRT) or b'11 (SPCI) */
#if ENABLE_SPM
tst x0, #(1 << FUNCID_NAMESPACE_SHIFT)
adr x15, spci_smc_handler
adr x16, sprt_smc_handler
csel x15, x15, x16, ne
b prepare_enter_handler
#else
b smc_unknown
#endif
compat_or_vendor:
/* Namespace is b'00 (compatibility) or b'01 (vendor) */ /* Any index greater than 127 is invalid. Check bit 7. */
tbnz w15, 7, smc_unknown
/* /*
* Add the LSB of the namespace (bit [28]) to the OEN [27:24] to create * Get the descriptor using the index
* a 5-bit index into the rt_svc_descs_indices array. * x11 = (base + off), w15 = index
* *
* The low 16 entries of the rt_svc_descs_indices array correspond to * handler = (base + off) + (index << log2(size))
* OENs of the compatibility namespace and the top 16 entries of the
* array are assigned to the vendor namespace descriptor.
*/ */
ubfx x16, x0, #FUNCID_OEN_SHIFT, #(FUNCID_OEN_WIDTH + 1) adr x11, (__RT_SVC_DESCS_START__ + RT_SVC_DESC_HANDLE)
lsl w10, w15, #RT_SVC_SIZE_LOG2
load_rt_svc_desc_pointer ldr x15, [x11, w10, uxtw]
prepare_enter_handler:
#endif /* SMCCC_MAJOR_VERSION */
/* /*
* Restore the saved C runtime stack value which will become the new * Restore the saved C runtime stack value which will become the new
......
/* /*
* Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -29,7 +29,6 @@ uint8_t rt_svc_descs_indices[MAX_RT_SVCS]; ...@@ -29,7 +29,6 @@ uint8_t rt_svc_descs_indices[MAX_RT_SVCS];
* Function to invoke the registered `handle` corresponding to the smc_fid in * Function to invoke the registered `handle` corresponding to the smc_fid in
* AArch32 mode. * AArch32 mode.
******************************************************************************/ ******************************************************************************/
#if SMCCC_MAJOR_VERSION == 1
uintptr_t handle_runtime_svc(uint32_t smc_fid, uintptr_t handle_runtime_svc(uint32_t smc_fid,
void *cookie, void *cookie,
void *handle, void *handle,
...@@ -55,7 +54,6 @@ uintptr_t handle_runtime_svc(uint32_t smc_fid, ...@@ -55,7 +54,6 @@ uintptr_t handle_runtime_svc(uint32_t smc_fid,
return rt_svc_descs[index].handle(smc_fid, x1, x2, x3, x4, cookie, return rt_svc_descs[index].handle(smc_fid, x1, x2, x3, x4, cookie,
handle, flags); handle, flags);
} }
#endif /* SMCCC_MAJOR_VERSION */
/******************************************************************************* /*******************************************************************************
* Simple routine to sanity check a runtime service descriptor before using it * Simple routine to sanity check a runtime service descriptor before using it
...@@ -71,14 +69,9 @@ static int32_t validate_rt_svc_desc(const rt_svc_desc_t *desc) ...@@ -71,14 +69,9 @@ static int32_t validate_rt_svc_desc(const rt_svc_desc_t *desc)
if (desc->end_oen >= OEN_LIMIT) if (desc->end_oen >= OEN_LIMIT)
return -EINVAL; return -EINVAL;
#if SMCCC_MAJOR_VERSION == 1
if ((desc->call_type != SMC_TYPE_FAST) && if ((desc->call_type != SMC_TYPE_FAST) &&
(desc->call_type != SMC_TYPE_YIELD)) (desc->call_type != SMC_TYPE_YIELD))
return -EINVAL; return -EINVAL;
#elif SMCCC_MAJOR_VERSION == 2
if (desc->is_vendor > 1U)
return -EINVAL;
#endif /* SMCCC_MAJOR_VERSION */
/* A runtime service having no init or handle function doesn't make sense */ /* A runtime service having no init or handle function doesn't make sense */
if ((desc->init == NULL) && (desc->handle == NULL)) if ((desc->init == NULL) && (desc->handle == NULL))
...@@ -149,17 +142,10 @@ void __init runtime_svc_init(void) ...@@ -149,17 +142,10 @@ void __init runtime_svc_init(void)
* descriptor which will handle the SMCs for this owning * descriptor which will handle the SMCs for this owning
* entity range. * entity range.
*/ */
#if SMCCC_MAJOR_VERSION == 1
start_idx = (uint8_t)get_unique_oen(service->start_oen, start_idx = (uint8_t)get_unique_oen(service->start_oen,
service->call_type); service->call_type);
end_idx = (uint8_t)get_unique_oen(service->end_oen, end_idx = (uint8_t)get_unique_oen(service->end_oen,
service->call_type); service->call_type);
#elif SMCCC_MAJOR_VERSION == 2
start_idx = (uint8_t)get_rt_desc_idx(service->start_oen,
service->is_vendor);
end_idx = (uint8_t)get_rt_desc_idx(service->end_oen,
service->is_vendor);
#endif
assert(start_idx <= end_idx); assert(start_idx <= end_idx);
assert(end_idx < MAX_RT_SVCS); assert(end_idx < MAX_RT_SVCS);
for (; start_idx <= end_idx; start_idx++) for (; start_idx <= end_idx; start_idx++)
......
...@@ -628,11 +628,6 @@ Common build options ...@@ -628,11 +628,6 @@ Common build options
pages" section in `Firmware Design`_. This flag is disabled by default and pages" section in `Firmware Design`_. This flag is disabled by default and
affects all BL images. affects all BL images.
- ``SMCCC_MAJOR_VERSION``: Numeric value that indicates the major version of
the SMC Calling Convention that the Trusted Firmware supports. The only two
allowed values are 1 and 2, and it defaults to 1. The minor version is
determined using this value.
- ``SPD``: Choose a Secure Payload Dispatcher component to be built into TF-A. - ``SPD``: Choose a Secure Payload Dispatcher component to be built into TF-A.
This build option is only valid if ``ARCH=aarch64``. The value should be This build option is only valid if ``ARCH=aarch64``. The value should be
the path to the directory containing the SPD source, relative to the path to the directory containing the SPD source, relative to
...@@ -2045,7 +2040,7 @@ wakeup interrupt from RTC. ...@@ -2045,7 +2040,7 @@ wakeup interrupt from RTC.
-------------- --------------
*Copyright (c) 2013-2018, Arm Limited and Contributors. All rights reserved.* *Copyright (c) 2013-2019, Arm Limited and Contributors. All rights reserved.*
.. _Linaro: `Linaro Release Notes`_ .. _Linaro: `Linaro Release Notes`_
.. _Linaro Release: `Linaro Release Notes`_ .. _Linaro Release: `Linaro Release Notes`_
......
/* /*
* Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -36,17 +36,8 @@ ...@@ -36,17 +36,8 @@
* In SMCCC 1.X, the function identifier has 6 bits for the owning entity number * In SMCCC 1.X, the function identifier has 6 bits for the owning entity number
* and a single bit for the type of smc call. When taken together, those values * and a single bit for the type of smc call. When taken together, those values
* limit the maximum number of runtime services to 128. * limit the maximum number of runtime services to 128.
*
* In SMCCC 2.X the type bit is always 1 and there are only 4 OEN bits in the
* compatibility namespace, so the total number of services is 16. The LSB of
* namespace is also added to these 4 bits to make space for the vendor service
* handler and so the total number of runtime services is 32.
*/ */
#if SMCCC_MAJOR_VERSION == 1
#define MAX_RT_SVCS U(128) #define MAX_RT_SVCS U(128)
#elif SMCCC_MAJOR_VERSION == 2
#define MAX_RT_SVCS U(32)
#endif
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
...@@ -70,11 +61,7 @@ typedef uintptr_t (*rt_svc_handle_t)(uint32_t smc_fid, ...@@ -70,11 +61,7 @@ typedef uintptr_t (*rt_svc_handle_t)(uint32_t smc_fid,
typedef struct rt_svc_desc { typedef struct rt_svc_desc {
uint8_t start_oen; uint8_t start_oen;
uint8_t end_oen; uint8_t end_oen;
#if SMCCC_MAJOR_VERSION == 1
uint8_t call_type; uint8_t call_type;
#elif SMCCC_MAJOR_VERSION == 2
uint8_t is_vendor;
#endif
const char *name; const char *name;
rt_svc_init_t init; rt_svc_init_t init;
rt_svc_handle_t handle; rt_svc_handle_t handle;
...@@ -83,8 +70,6 @@ typedef struct rt_svc_desc { ...@@ -83,8 +70,6 @@ typedef struct rt_svc_desc {
/* /*
* Convenience macros to declare a service descriptor * Convenience macros to declare a service descriptor
*/ */
#if SMCCC_MAJOR_VERSION == 1
#define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) \ #define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) \
static const rt_svc_desc_t __svc_desc_ ## _name \ static const rt_svc_desc_t __svc_desc_ ## _name \
__section("rt_svc_descs") __used = { \ __section("rt_svc_descs") __used = { \
...@@ -96,37 +81,6 @@ typedef struct rt_svc_desc { ...@@ -96,37 +81,6 @@ typedef struct rt_svc_desc {
.handle = (_smch) \ .handle = (_smch) \
} }
#elif SMCCC_MAJOR_VERSION == 2
#define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) \
static const rt_svc_desc_t __svc_desc_ ## _name \
__section("rt_svc_descs") __used = { \
.start_oen = (_start), \
.end_oen = (_end), \
.is_vendor = 0, \
.name = #_name, \
.init = (_setup), \
.handle = (_smch), \
}; \
CASSERT((_type) == SMC_TYPE_FAST, rt_svc_type_check_ ## _name)
/*
* The higher 16 entries of the runtime services are used for the vendor
* specific descriptor.
*/
#define DECLARE_RT_SVC_VENDOR(_setup, _smch) \
static const rt_svc_desc_t __svc_desc_vendor \
__section("rt_svc_descs") __used = { \
.start_oen = 0, \
.end_oen = 15, \
.is_vendor = 1, \
.name = "vendor_rt_svc", \
.init = _setup, \
.handle = _smch, \
}
#endif /* SMCCC_MAJOR_VERSION */
/* /*
* Compile time assertions related to the 'rt_svc_desc' structure to: * Compile time assertions related to the 'rt_svc_desc' structure to:
* 1. ensure that the assembler and the compiler view of the size * 1. ensure that the assembler and the compiler view of the size
...@@ -144,7 +98,6 @@ CASSERT(RT_SVC_DESC_HANDLE == __builtin_offsetof(rt_svc_desc_t, handle), \ ...@@ -144,7 +98,6 @@ CASSERT(RT_SVC_DESC_HANDLE == __builtin_offsetof(rt_svc_desc_t, handle), \
assert_rt_svc_desc_handle_offset_mismatch); assert_rt_svc_desc_handle_offset_mismatch);
#if SMCCC_MAJOR_VERSION == 1
/* /*
* This function combines the call type and the owning entity number * This function combines the call type and the owning entity number
* corresponding to a runtime service to generate a unique owning entity number. * corresponding to a runtime service to generate a unique owning entity number.
...@@ -169,22 +122,6 @@ static inline uint32_t get_unique_oen_from_smc_fid(uint32_t fid) ...@@ -169,22 +122,6 @@ static inline uint32_t get_unique_oen_from_smc_fid(uint32_t fid)
return get_unique_oen(GET_SMC_OEN(fid), GET_SMC_TYPE(fid)); return get_unique_oen(GET_SMC_OEN(fid), GET_SMC_TYPE(fid));
} }
#elif SMCCC_MAJOR_VERSION == 2
/*
* This function combines the owning entity number corresponding to a runtime
* service with one extra bit for the vendor namespace to generate an index into
* the 'rt_svc_descs_indices' array. The entry contains the index of the service
* descriptor in the 'rt_svc_descs' array.
*/
static inline uint32_t get_rt_desc_idx(uint32_t oen, uint32_t is_vendor)
{
return ((is_vendor & 1U) << FUNCID_OEN_WIDTH) |
(oen & FUNCID_OEN_MASK);
}
#endif
/******************************************************************************* /*******************************************************************************
* Function & variable prototypes * Function & variable prototypes
******************************************************************************/ ******************************************************************************/
......
/* /*
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -19,15 +19,69 @@ ...@@ -19,15 +19,69 @@
| (((uint32_t)(_minor) & SMCCC_VERSION_MINOR_MASK) << \ | (((uint32_t)(_minor) & SMCCC_VERSION_MINOR_MASK) << \
SMCCC_VERSION_MINOR_SHIFT)) SMCCC_VERSION_MINOR_SHIFT))
#if SMCCC_MAJOR_VERSION == 1 #define SMCCC_MAJOR_VERSION U(1)
# define SMCCC_MINOR_VERSION U(1) #define SMCCC_MINOR_VERSION U(1)
# include <lib/smccc_v1.h>
#elif SMCCC_MAJOR_VERSION == 2 /*******************************************************************************
# define SMCCC_MINOR_VERSION U(0) * Bit definitions inside the function id as per the SMC calling convention
# include <lib/smccc_v2.h> ******************************************************************************/
#else #define FUNCID_TYPE_SHIFT U(31)
# error "Unsupported version of SMCCC." #define FUNCID_TYPE_MASK U(0x1)
#endif #define FUNCID_TYPE_WIDTH U(1)
#define FUNCID_CC_SHIFT U(30)
#define FUNCID_CC_MASK U(0x1)
#define FUNCID_CC_WIDTH U(1)
#define FUNCID_OEN_SHIFT U(24)
#define FUNCID_OEN_MASK U(0x3f)
#define FUNCID_OEN_WIDTH U(6)
#define FUNCID_NUM_SHIFT U(0)
#define FUNCID_NUM_MASK U(0xffff)
#define FUNCID_NUM_WIDTH U(16)
#define GET_SMC_TYPE(id) (((id) >> FUNCID_TYPE_SHIFT) & \
FUNCID_TYPE_MASK)
#define GET_SMC_CC(id) (((id) >> FUNCID_CC_SHIFT) & \
FUNCID_CC_MASK)
#define GET_SMC_OEN(id) (((id) >> FUNCID_OEN_SHIFT) & \
FUNCID_OEN_MASK)
/*******************************************************************************
* Owning entity number definitions inside the function id as per the SMC
* calling convention
******************************************************************************/
#define OEN_ARM_START U(0)
#define OEN_ARM_END U(0)
#define OEN_CPU_START U(1)
#define OEN_CPU_END U(1)
#define OEN_SIP_START U(2)
#define OEN_SIP_END U(2)
#define OEN_OEM_START U(3)
#define OEN_OEM_END U(3)
#define OEN_STD_START U(4) /* Standard Service Calls */
#define OEN_STD_END U(4)
#define OEN_STD_HYP_START U(5) /* Standard Hypervisor Service calls */
#define OEN_STD_HYP_END U(5)
#define OEN_VEN_HYP_START U(6) /* Vendor Hypervisor Service calls */
#define OEN_VEN_HYP_END U(6)
#define OEN_TAP_START U(48) /* Trusted Applications */
#define OEN_TAP_END U(49)
#define OEN_TOS_START U(50) /* Trusted OS */
#define OEN_TOS_END U(63)
#define OEN_LIMIT U(64)
/* Flags and error codes */
#define SMC_64 U(1)
#define SMC_32 U(0)
#define SMC_TYPE_FAST ULL(1)
#define SMC_TYPE_YIELD ULL(0)
#define SMC_OK ULL(0)
#define SMC_UNK -1
#define SMC_PREEMPTED -2 /* Not defined by the SMCCC */
/* Various flags passed to SMC handlers */ /* Various flags passed to SMC handlers */
#define SMC_FROM_SECURE (U(0) << 0) #define SMC_FROM_SECURE (U(0) << 0)
......
/*
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SMCCC_V1_H
#define SMCCC_V1_H
#ifndef SMCCC_H
#error "This file must only be included from smccc.h"
#endif
/*******************************************************************************
* Bit definitions inside the function id as per the SMC calling convention
******************************************************************************/
#define FUNCID_TYPE_SHIFT U(31)
#define FUNCID_TYPE_MASK U(0x1)
#define FUNCID_TYPE_WIDTH U(1)
#define FUNCID_CC_SHIFT U(30)
#define FUNCID_CC_MASK U(0x1)
#define FUNCID_CC_WIDTH U(1)
#define FUNCID_OEN_SHIFT U(24)
#define FUNCID_OEN_MASK U(0x3f)
#define FUNCID_OEN_WIDTH U(6)
#define FUNCID_NUM_SHIFT U(0)
#define FUNCID_NUM_MASK U(0xffff)
#define FUNCID_NUM_WIDTH U(16)
#define GET_SMC_TYPE(id) (((id) >> FUNCID_TYPE_SHIFT) & \
FUNCID_TYPE_MASK)
#define GET_SMC_CC(id) (((id) >> FUNCID_CC_SHIFT) & \
FUNCID_CC_MASK)
#define GET_SMC_OEN(id) (((id) >> FUNCID_OEN_SHIFT) & \
FUNCID_OEN_MASK)
/*******************************************************************************
* Owning entity number definitions inside the function id as per the SMC
* calling convention
******************************************************************************/
#define OEN_ARM_START U(0)
#define OEN_ARM_END U(0)
#define OEN_CPU_START U(1)
#define OEN_CPU_END U(1)
#define OEN_SIP_START U(2)
#define OEN_SIP_END U(2)
#define OEN_OEM_START U(3)
#define OEN_OEM_END U(3)
#define OEN_STD_START U(4) /* Standard Service Calls */
#define OEN_STD_END U(4)
#define OEN_STD_HYP_START U(5) /* Standard Hypervisor Service calls */
#define OEN_STD_HYP_END U(5)
#define OEN_VEN_HYP_START U(6) /* Vendor Hypervisor Service calls */
#define OEN_VEN_HYP_END U(6)
#define OEN_TAP_START U(48) /* Trusted Applications */
#define OEN_TAP_END U(49)
#define OEN_TOS_START U(50) /* Trusted OS */
#define OEN_TOS_END U(63)
#define OEN_LIMIT U(64)
/* Flags and error codes */
#define SMC_64 U(1)
#define SMC_32 U(0)
#define SMC_TYPE_FAST ULL(1)
#define SMC_TYPE_YIELD ULL(0)
#define SMC_OK ULL(0)
#define SMC_UNK -1
#define SMC_PREEMPTED -2 /* Not defined by the SMCCC */
#endif /* SMCCC_V1_H */
/*
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SMCCC_V2_H
#define SMCCC_V2_H
#ifndef SMCCC_H
#error "This file must only be included from smccc.h"
#endif
/*******************************************************************************
* Bit definitions inside the function id as per the SMC calling convention
******************************************************************************/
#define FUNCID_TYPE_SHIFT U(31)
#define FUNCID_TYPE_MASK U(0x1)
#define FUNCID_TYPE_WIDTH U(1)
#define FUNCID_CC_SHIFT U(30)
#define FUNCID_CC_MASK U(0x1)
#define FUNCID_CC_WIDTH U(1)
#define FUNCID_NAMESPACE_SHIFT U(28)
#define FUNCID_NAMESPACE_MASK U(0x3)
#define FUNCID_NAMESPACE_WIDTH U(2)
#define FUNCID_OEN_SHIFT U(24)
#define FUNCID_OEN_MASK U(0xf)
#define FUNCID_OEN_WIDTH U(4)
#define FUNCID_NUM_SHIFT U(0)
#define FUNCID_NUM_MASK U(0xffff)
#define FUNCID_NUM_WIDTH U(16)
#define GET_SMC_TYPE(id) (((id) >> FUNCID_TYPE_SHIFT) & \
FUNCID_TYPE_MASK)
#define GET_SMC_CC(id) (((id) >> FUNCID_CC_SHIFT) & \
FUNCID_CC_MASK)
#define GET_SMC_NAMESPACE(id) (((id) >> FUNCID_NAMESPACE_SHIFT) & \
FUNCID_NAMESPACE_MASK)
#define GET_SMC_OEN(id) (((id) >> FUNCID_OEN_SHIFT) & \
FUNCID_OEN_MASK)
/*******************************************************************************
* Owning entity number definitions inside the function id as per the SMC
* calling convention
******************************************************************************/
#define OEN_ARM_START U(0)
#define OEN_ARM_END U(0)
#define OEN_CPU_START U(1)
#define OEN_CPU_END U(1)
#define OEN_SIP_START U(2)
#define OEN_SIP_END U(2)
#define OEN_OEM_START U(3)
#define OEN_OEM_END U(3)
#define OEN_STD_START U(4) /* Standard Service Calls */
#define OEN_STD_END U(4)
#define OEN_STD_HYP_START U(5) /* Standard Hypervisor Service calls */
#define OEN_STD_HYP_END U(5)
#define OEN_VEN_HYP_START U(6) /* Vendor Hypervisor Service calls */
#define OEN_VEN_HYP_END U(6)
#define OEN_LIMIT U(16)
/*******************************************************************************
* Service namespaces as per the SMC Calling Convention v2.X
******************************************************************************/
#define FUNCID_NAMESPACE_START U(0)
#define FUNCID_NAMESPACE_COMPAT U(0)
#define FUNCID_NAMESPACE_VENDOR U(1)
#define FUNCID_NAMESPACE_SPRT U(2)
#define FUNCID_NAMESPACE_SPCI U(3)
#define FUNCID_NAMESPACE_LIMIT U(4)
/* Flags and error codes */
#define SMC_64 U(1)
#define SMC_32 U(0)
#define SMC_TYPE_FAST ULL(1)
#define SMC_OK ULL(0)
#define SMC_UNK -1
#endif /* SMCCC_V2_H */
/* /*
* Copyright (c) 2018, Arm Limited. All rights reserved. * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -34,7 +34,10 @@ ...@@ -34,7 +34,10 @@
#define SPCI_FID_TUN_SHIFT U(24) #define SPCI_FID_TUN_SHIFT U(24)
#define SPCI_FID_TUN_MASK U(0x7) #define SPCI_FID_TUN_MASK U(0x7)
#define SPCI_SMC(spci_fid) ((FUNCID_NAMESPACE_SPCI << FUNCID_NAMESPACE_SHIFT) | \ #define OEN_SPCI_START U(0x30)
#define OEN_SPCI_END U(0x3F)
#define SPCI_SMC(spci_fid) ((OEN_SPCI_START << FUNCID_OEN_SHIFT) | \
(U(1) << 31) | (spci_fid)) (U(1) << 31) | (spci_fid))
#define SPCI_MISC_32(misc_fid) ((SMC_32 << FUNCID_CC_SHIFT) | \ #define SPCI_MISC_32(misc_fid) ((SMC_32 << FUNCID_CC_SHIFT) | \
SPCI_FID_MISC_FLAG | \ SPCI_FID_MISC_FLAG | \
......
/* /*
* Copyright (c) 2018, Arm Limited. All rights reserved. * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -37,10 +37,13 @@ ...@@ -37,10 +37,13 @@
/* Definitions to build the complete SMC ID */ /* Definitions to build the complete SMC ID */
#define SPRT_SMC_64(sprt_fid) ((FUNCID_NAMESPACE_SPRT << FUNCID_NAMESPACE_SHIFT) | \ #define OEN_SPRT_START U(0x20)
#define OEN_SPRT_END U(0x2F)
#define SPRT_SMC_64(sprt_fid) ((OEN_SPRT_START << FUNCID_OEN_SHIFT) | \
(U(1) << 31) | ((sprt_fid) & SPRT_FID_MASK) | \ (U(1) << 31) | ((sprt_fid) & SPRT_FID_MASK) | \
(SMC_64 << FUNCID_CC_SHIFT)) (SMC_64 << FUNCID_CC_SHIFT))
#define SPRT_SMC_32(sprt_fid) ((FUNCID_NAMESPACE_SPRT << FUNCID_NAMESPACE_SHIFT) | \ #define SPRT_SMC_32(sprt_fid) ((OEN_SPRT_START << FUNCID_OEN_SHIFT) | \
(U(1) << 31) | ((sprt_fid) & SPRT_FID_MASK) | \ (U(1) << 31) | ((sprt_fid) & SPRT_FID_MASK) | \
(SMC_32 << FUNCID_CC_SHIFT)) (SMC_32 << FUNCID_CC_SHIFT))
......
...@@ -153,9 +153,6 @@ SEPARATE_CODE_AND_RODATA := 0 ...@@ -153,9 +153,6 @@ SEPARATE_CODE_AND_RODATA := 0
# cores stack # cores stack
RECLAIM_INIT_CODE := 0 RECLAIM_INIT_CODE := 0
# Default to SMCCC Version 1.X
SMCCC_MAJOR_VERSION := 1
# SPD choice # SPD choice
SPD := none SPD := none
......
/* /*
* Copyright (c) 2018, Arm Limited. All rights reserved. * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <string.h> #include <string.h>
#include <common/debug.h> #include <common/debug.h>
#include <common/runtime_svc.h>
#include <lib/el3_runtime/context_mgmt.h> #include <lib/el3_runtime/context_mgmt.h>
#include <lib/smccc.h> #include <lib/smccc.h>
#include <lib/spinlock.h> #include <lib/spinlock.h>
...@@ -679,9 +680,10 @@ static uint64_t spci_service_get_response(void *handle, u_register_t x1, ...@@ -679,9 +680,10 @@ static uint64_t spci_service_get_response(void *handle, u_register_t x1,
/******************************************************************************* /*******************************************************************************
* This function handles all SMCs in the range reserved for SPCI. * This function handles all SMCs in the range reserved for SPCI.
******************************************************************************/ ******************************************************************************/
uint64_t spci_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, static uintptr_t spci_smc_handler(uint32_t smc_fid, u_register_t x1,
uint64_t x3, uint64_t x4, void *cookie, void *handle, u_register_t x2, u_register_t x3,
uint64_t flags) u_register_t x4, void *cookie, void *handle,
u_register_t flags)
{ {
uint32_t spci_fid; uint32_t spci_fid;
...@@ -773,3 +775,12 @@ uint64_t spci_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, ...@@ -773,3 +775,12 @@ uint64_t spci_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2,
WARN("SPCI: Unsupported call 0x%08x\n", smc_fid); WARN("SPCI: Unsupported call 0x%08x\n", smc_fid);
SMC_RET1(handle, SPCI_NOT_SUPPORTED); SMC_RET1(handle, SPCI_NOT_SUPPORTED);
} }
DECLARE_RT_SVC(
spci_handler,
OEN_SPCI_START,
OEN_SPCI_END,
SMC_TYPE_FAST,
NULL,
spci_smc_handler
);
# #
# Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. # Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
# #
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# #
...@@ -26,8 +26,5 @@ SPM_SOURCES := $(addprefix services/std_svc/spm/, \ ...@@ -26,8 +26,5 @@ SPM_SOURCES := $(addprefix services/std_svc/spm/, \
INCLUDES += ${SPRT_LIB_INCLUDES} INCLUDES += ${SPRT_LIB_INCLUDES}
# Force SMC Calling Convention 2 when using SPM
SMCCC_MAJOR_VERSION := 2
# Let the top-level Makefile know that we intend to include a BL32 image # Let the top-level Makefile know that we intend to include a BL32 image
NEED_BL32 := yes NEED_BL32 := yes
/* /*
* Copyright (c) 2018, Arm Limited. All rights reserved. * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <arch_helpers.h> #include <arch_helpers.h>
#include <common/debug.h> #include <common/debug.h>
#include <common/runtime_svc.h>
#include <lib/el3_runtime/context_mgmt.h> #include <lib/el3_runtime/context_mgmt.h>
#include <lib/smccc.h> #include <lib/smccc.h>
#include <lib/utils.h> #include <lib/utils.h>
...@@ -154,9 +155,10 @@ static int32_t sprt_memory_perm_attr_set(sp_context_t *sp_ctx, ...@@ -154,9 +155,10 @@ static int32_t sprt_memory_perm_attr_set(sp_context_t *sp_ctx,
/******************************************************************************* /*******************************************************************************
* This function handles all SMCs in the range reserved for SPRT. * This function handles all SMCs in the range reserved for SPRT.
******************************************************************************/ ******************************************************************************/
uint64_t sprt_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, static uintptr_t sprt_smc_handler(uint32_t smc_fid, u_register_t x1,
uint64_t x3, uint64_t x4, void *cookie, void *handle, u_register_t x2, u_register_t x3,
uint64_t flags) u_register_t x4, void *cookie, void *handle,
u_register_t flags)
{ {
/* SPRT only supported from the Secure world */ /* SPRT only supported from the Secure world */
if (is_caller_non_secure(flags) == SMC_FROM_NON_SECURE) { if (is_caller_non_secure(flags) == SMC_FROM_NON_SECURE) {
...@@ -214,3 +216,12 @@ uint64_t sprt_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, ...@@ -214,3 +216,12 @@ uint64_t sprt_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2,
WARN("SPRT: Unsupported call 0x%08x\n", smc_fid); WARN("SPRT: Unsupported call 0x%08x\n", smc_fid);
SMC_RET1(handle, SPRT_NOT_SUPPORTED); SMC_RET1(handle, SPRT_NOT_SUPPORTED);
} }
DECLARE_RT_SVC(
sprt_handler,
OEN_SPRT_START,
OEN_SPRT_END,
SMC_TYPE_FAST,
NULL,
sprt_smc_handler
);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment