diff options
Diffstat (limited to 'bl31')
-rw-r--r-- | bl31/aarch64/runtime_exceptions.S | 85 |
1 files changed, 12 insertions, 73 deletions
diff --git a/bl31/aarch64/runtime_exceptions.S b/bl31/aarch64/runtime_exceptions.S index e7abd503..4f53b8e7 100644 --- a/bl31/aarch64/runtime_exceptions.S +++ b/bl31/aarch64/runtime_exceptions.S @@ -1,5 +1,5 @@ /* - * 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 */ @@ -303,38 +303,6 @@ vector_entry serror_aarch32 b enter_lower_el_async_ea 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. * Depending upon the execution state from where the SMC has been @@ -363,56 +331,27 @@ smc_handler64: mov x5, xzr mov x6, sp -#if SMCCC_MAJOR_VERSION == 1 - /* Get the unique owning entity number */ ubfx x16, x0, #FUNCID_OEN_SHIFT, #FUNCID_OEN_WIDTH ubfx x15, x0, #FUNCID_TYPE_SHIFT, #FUNCID_TYPE_WIDTH orr x16, x16, x15, lsl #FUNCID_OEN_WIDTH - load_rt_svc_desc_pointer - -#elif SMCCC_MAJOR_VERSION == 2 - - /* 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: + /* Load descriptor index from array of indices */ + adr x14, rt_svc_descs_indices + ldrb w15, [x14, x16] - /* 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 - * a 5-bit index into the rt_svc_descs_indices array. + * Get the descriptor using the index + * x11 = (base + off), w15 = index * - * The low 16 entries of the rt_svc_descs_indices array correspond to - * OENs of the compatibility namespace and the top 16 entries of the - * array are assigned to the vendor namespace descriptor. + * handler = (base + off) + (index << log2(size)) */ - ubfx x16, x0, #FUNCID_OEN_SHIFT, #(FUNCID_OEN_WIDTH + 1) - - load_rt_svc_desc_pointer - -prepare_enter_handler: - -#endif /* SMCCC_MAJOR_VERSION */ + adr x11, (__RT_SVC_DESCS_START__ + RT_SVC_DESC_HANDLE) + lsl w10, w15, #RT_SVC_SIZE_LOG2 + ldr x15, [x11, w10, uxtw] /* * Restore the saved C runtime stack value which will become the new |