14d9f825aSVenkatesh Yadav Abbarapu /* 2619bc13eSMichal Simek * Copyright (c) 2014-2020, Arm Limited and Contributors. All rights reserved. 3c8be2240SPrasad Kummari * Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved. 44d9f825aSVenkatesh Yadav Abbarapu * 54d9f825aSVenkatesh Yadav Abbarapu * SPDX-License-Identifier: BSD-3-Clause 64d9f825aSVenkatesh Yadav Abbarapu */ 74d9f825aSVenkatesh Yadav Abbarapu 84d9f825aSVenkatesh Yadav Abbarapu #include <assert.h> 94ce3e99aSScott Branden #include <inttypes.h> 104ce3e99aSScott Branden #include <stdint.h> 114d9f825aSVenkatesh Yadav Abbarapu 124d9f825aSVenkatesh Yadav Abbarapu #include <arch_helpers.h> 134d9f825aSVenkatesh Yadav Abbarapu #include <common/debug.h> 144d9f825aSVenkatesh Yadav Abbarapu #include <plat_startup.h> 154d9f825aSVenkatesh Yadav Abbarapu 164d9f825aSVenkatesh Yadav Abbarapu 174d9f825aSVenkatesh Yadav Abbarapu /* 18b9d26cd3SPrasad Kummari * HandoffParams 194d9f825aSVenkatesh Yadav Abbarapu * Parameter bitfield encoding 204d9f825aSVenkatesh Yadav Abbarapu * ----------------------------------------------------------------------------- 214d9f825aSVenkatesh Yadav Abbarapu * Exec State 0 0 -> Aarch64, 1-> Aarch32 224d9f825aSVenkatesh Yadav Abbarapu * endianness 1 0 -> LE, 1 -> BE 234d9f825aSVenkatesh Yadav Abbarapu * secure (TZ) 2 0 -> Non secure, 1 -> secure 244d9f825aSVenkatesh Yadav Abbarapu * EL 3:4 00 -> EL0, 01 -> EL1, 10 -> EL2, 11 -> EL3 254d9f825aSVenkatesh Yadav Abbarapu * CPU# 5:6 00 -> A53_0, 01 -> A53_1, 10 -> A53_2, 11 -> A53_3 2601c8c6a5SAkshay Belsare * Reserved 7:10 Reserved 2701c8c6a5SAkshay Belsare * Cluster# 11:12 00 -> Cluster 0, 01 -> Cluster 1, 10 -> Cluster 2, 2801c8c6a5SAkshay Belsare * 11 -> Cluster (Applicable for Versal NET only). 2901c8c6a5SAkshay Belsare * Reserved 13:16 Reserved 304d9f825aSVenkatesh Yadav Abbarapu */ 314d9f825aSVenkatesh Yadav Abbarapu 32b9d26cd3SPrasad Kummari #define XBL_FLAGS_ESTATE_SHIFT 0U 33b9d26cd3SPrasad Kummari #define XBL_FLAGS_ESTATE_MASK (1U << XBL_FLAGS_ESTATE_SHIFT) 34b9d26cd3SPrasad Kummari #define XBL_FLAGS_ESTATE_A64 0U 35b9d26cd3SPrasad Kummari #define XBL_FLAGS_ESTATE_A32 1U 364d9f825aSVenkatesh Yadav Abbarapu 37b9d26cd3SPrasad Kummari #define XBL_FLAGS_ENDIAN_SHIFT 1U 38b9d26cd3SPrasad Kummari #define XBL_FLAGS_ENDIAN_MASK (1U << XBL_FLAGS_ENDIAN_SHIFT) 39b9d26cd3SPrasad Kummari #define XBL_FLAGS_ENDIAN_LE 0U 40b9d26cd3SPrasad Kummari #define XBL_FLAGS_ENDIAN_BE 1U 414d9f825aSVenkatesh Yadav Abbarapu 42b9d26cd3SPrasad Kummari #define XBL_FLAGS_TZ_SHIFT 2U 43b9d26cd3SPrasad Kummari #define XBL_FLAGS_TZ_MASK (1U << XBL_FLAGS_TZ_SHIFT) 44b9d26cd3SPrasad Kummari #define XBL_FLAGS_NON_SECURE 0U 45b9d26cd3SPrasad Kummari #define XBL_FLAGS_SECURE 1U 464d9f825aSVenkatesh Yadav Abbarapu 47b9d26cd3SPrasad Kummari #define XBL_FLAGS_EL_SHIFT 3U 48b9d26cd3SPrasad Kummari #define XBL_FLAGS_EL_MASK (3U << XBL_FLAGS_EL_SHIFT) 49b9d26cd3SPrasad Kummari #define XBL_FLAGS_EL0 0U 50b9d26cd3SPrasad Kummari #define XBL_FLAGS_EL1 1U 51b9d26cd3SPrasad Kummari #define XBL_FLAGS_EL2 2U 52b9d26cd3SPrasad Kummari #define XBL_FLAGS_EL3 3U 534d9f825aSVenkatesh Yadav Abbarapu 54b9d26cd3SPrasad Kummari #define XBL_FLAGS_CPU_SHIFT 5U 55b9d26cd3SPrasad Kummari #define XBL_FLAGS_CPU_MASK (3U << XBL_FLAGS_CPU_SHIFT) 56b9d26cd3SPrasad Kummari #define XBL_FLAGS_A53_0 0U 57b9d26cd3SPrasad Kummari #define XBL_FLAGS_A53_1 1U 58b9d26cd3SPrasad Kummari #define XBL_FLAGS_A53_2 2U 59b9d26cd3SPrasad Kummari #define XBL_FLAGS_A53_3 3U 604d9f825aSVenkatesh Yadav Abbarapu 6101c8c6a5SAkshay Belsare #if defined(PLAT_versal_net) 6201c8c6a5SAkshay Belsare #define XBL_FLAGS_CLUSTER_SHIFT 11U 6301c8c6a5SAkshay Belsare #define XBL_FLAGS_CLUSTER_MASK GENMASK(11, 12) 6401c8c6a5SAkshay Belsare 6501c8c6a5SAkshay Belsare #define XBL_FLAGS_CLUSTER_0 0U 6601c8c6a5SAkshay Belsare #endif /* PLAT_versal_net */ 6701c8c6a5SAkshay Belsare 684d9f825aSVenkatesh Yadav Abbarapu /** 69b9d26cd3SPrasad Kummari * get_xbl_cpu() - Get the target CPU for partition. 70de7ed953SPrasad Kummari * @partition: Pointer to partition struct. 714d9f825aSVenkatesh Yadav Abbarapu * 72b9d26cd3SPrasad Kummari * Return: XBL_FLAGS_A53_0, XBL_FLAGS_A53_1, XBL_FLAGS_A53_2 or XBL_FLAGS_A53_3. 734d9f825aSVenkatesh Yadav Abbarapu * 744d9f825aSVenkatesh Yadav Abbarapu */ 753a1a2daeSMaheedhar Bollapalli static uint32_t get_xbl_cpu(const struct xbl_partition *partition) 764d9f825aSVenkatesh Yadav Abbarapu { 77b9d26cd3SPrasad Kummari uint64_t flags = partition->flags & XBL_FLAGS_CPU_MASK; 784d9f825aSVenkatesh Yadav Abbarapu 793a1a2daeSMaheedhar Bollapalli flags >>= XBL_FLAGS_CPU_SHIFT; 803a1a2daeSMaheedhar Bollapalli 813a1a2daeSMaheedhar Bollapalli return (uint32_t)flags; 824d9f825aSVenkatesh Yadav Abbarapu } 834d9f825aSVenkatesh Yadav Abbarapu 844d9f825aSVenkatesh Yadav Abbarapu /** 85b9d26cd3SPrasad Kummari * get_xbl_el() - Get the target exception level for partition. 86de7ed953SPrasad Kummari * @partition: Pointer to partition struct. 874d9f825aSVenkatesh Yadav Abbarapu * 88b9d26cd3SPrasad Kummari * Return: XBL_FLAGS_EL0, XBL_FLAGS_EL1, XBL_FLAGS_EL2 or XBL_FLAGS_EL3. 894d9f825aSVenkatesh Yadav Abbarapu * 904d9f825aSVenkatesh Yadav Abbarapu */ 913a1a2daeSMaheedhar Bollapalli static uint32_t get_xbl_el(const struct xbl_partition *partition) 924d9f825aSVenkatesh Yadav Abbarapu { 93b9d26cd3SPrasad Kummari uint64_t flags = partition->flags & XBL_FLAGS_EL_MASK; 944d9f825aSVenkatesh Yadav Abbarapu 953a1a2daeSMaheedhar Bollapalli flags >>= XBL_FLAGS_EL_SHIFT; 963a1a2daeSMaheedhar Bollapalli 973a1a2daeSMaheedhar Bollapalli return (uint32_t)flags; 984d9f825aSVenkatesh Yadav Abbarapu } 994d9f825aSVenkatesh Yadav Abbarapu 1004d9f825aSVenkatesh Yadav Abbarapu /** 101b9d26cd3SPrasad Kummari * get_xbl_ss() - Get the target security state for partition. 102de7ed953SPrasad Kummari * @partition: Pointer to partition struct. 1034d9f825aSVenkatesh Yadav Abbarapu * 104b9d26cd3SPrasad Kummari * Return: XBL_FLAGS_NON_SECURE or XBL_FLAGS_SECURE. 1054d9f825aSVenkatesh Yadav Abbarapu * 1064d9f825aSVenkatesh Yadav Abbarapu */ 1073a1a2daeSMaheedhar Bollapalli static uint32_t get_xbl_ss(const struct xbl_partition *partition) 1084d9f825aSVenkatesh Yadav Abbarapu { 109b9d26cd3SPrasad Kummari uint64_t flags = partition->flags & XBL_FLAGS_TZ_MASK; 1104d9f825aSVenkatesh Yadav Abbarapu 1113a1a2daeSMaheedhar Bollapalli flags >>= XBL_FLAGS_TZ_SHIFT; 1123a1a2daeSMaheedhar Bollapalli 1133a1a2daeSMaheedhar Bollapalli return (uint32_t)flags; 1144d9f825aSVenkatesh Yadav Abbarapu } 1154d9f825aSVenkatesh Yadav Abbarapu 1164d9f825aSVenkatesh Yadav Abbarapu /** 117b9d26cd3SPrasad Kummari * get_xbl_endian() - Get the target endianness for partition. 118de7ed953SPrasad Kummari * @partition: Pointer to partition struct. 1194d9f825aSVenkatesh Yadav Abbarapu * 120de7ed953SPrasad Kummari * Return: SPSR_E_LITTLE or SPSR_E_BIG. 1214d9f825aSVenkatesh Yadav Abbarapu * 1224d9f825aSVenkatesh Yadav Abbarapu */ 1233a1a2daeSMaheedhar Bollapalli static uint32_t get_xbl_endian(const struct xbl_partition *partition) 1244d9f825aSVenkatesh Yadav Abbarapu { 125b9d26cd3SPrasad Kummari uint64_t flags = partition->flags & XBL_FLAGS_ENDIAN_MASK; 126906d5892SNithin G uint32_t spsr_value = 0U; 1274d9f825aSVenkatesh Yadav Abbarapu 128b9d26cd3SPrasad Kummari flags >>= XBL_FLAGS_ENDIAN_SHIFT; 1294d9f825aSVenkatesh Yadav Abbarapu 130b9d26cd3SPrasad Kummari if (flags == XBL_FLAGS_ENDIAN_BE) { 131906d5892SNithin G spsr_value = SPSR_E_BIG; 132eb0d2b17SVenkatesh Yadav Abbarapu } else { 133906d5892SNithin G spsr_value = SPSR_E_LITTLE; 1344d9f825aSVenkatesh Yadav Abbarapu } 135906d5892SNithin G 136906d5892SNithin G return spsr_value; 137eb0d2b17SVenkatesh Yadav Abbarapu } 1384d9f825aSVenkatesh Yadav Abbarapu 1394d9f825aSVenkatesh Yadav Abbarapu /** 140b9d26cd3SPrasad Kummari * get_xbl_estate() - Get the target execution state for partition. 141de7ed953SPrasad Kummari * @partition: Pointer to partition struct. 1424d9f825aSVenkatesh Yadav Abbarapu * 143b9d26cd3SPrasad Kummari * Return: XBL_FLAGS_ESTATE_A32 or XBL_FLAGS_ESTATE_A64. 1444d9f825aSVenkatesh Yadav Abbarapu * 1454d9f825aSVenkatesh Yadav Abbarapu */ 1463a1a2daeSMaheedhar Bollapalli static uint32_t get_xbl_estate(const struct xbl_partition *partition) 1474d9f825aSVenkatesh Yadav Abbarapu { 148b9d26cd3SPrasad Kummari uint64_t flags = partition->flags & XBL_FLAGS_ESTATE_MASK; 1494d9f825aSVenkatesh Yadav Abbarapu 1503a1a2daeSMaheedhar Bollapalli flags >>= XBL_FLAGS_ESTATE_SHIFT; 1513a1a2daeSMaheedhar Bollapalli 152*5d8831c2SSaivardhan Thatikonda return (uint32_t)flags; 1534d9f825aSVenkatesh Yadav Abbarapu } 1544d9f825aSVenkatesh Yadav Abbarapu 15501c8c6a5SAkshay Belsare #if defined(PLAT_versal_net) 15601c8c6a5SAkshay Belsare /** 15701c8c6a5SAkshay Belsare * get_xbl_cluster - Get the cluster number 15801c8c6a5SAkshay Belsare * @partition: pointer to the partition structure. 15901c8c6a5SAkshay Belsare * 16001c8c6a5SAkshay Belsare * Return: cluster number for the partition. 16101c8c6a5SAkshay Belsare */ 1623a1a2daeSMaheedhar Bollapalli static uint32_t get_xbl_cluster(const struct xbl_partition *partition) 16301c8c6a5SAkshay Belsare { 16401c8c6a5SAkshay Belsare uint64_t flags = partition->flags & XBL_FLAGS_CLUSTER_MASK; 16501c8c6a5SAkshay Belsare 1663a1a2daeSMaheedhar Bollapalli return (flags >> XBL_FLAGS_CLUSTER_SHIFT); 16701c8c6a5SAkshay Belsare } 16801c8c6a5SAkshay Belsare #endif /* PLAT_versal_net */ 16901c8c6a5SAkshay Belsare 1704d9f825aSVenkatesh Yadav Abbarapu /** 171421893a0SPrasad Kummari * xbl_handover() - Populates the bl32 and bl33 image info structures. 172de7ed953SPrasad Kummari * @bl32: BL32 image info structure. 173de7ed953SPrasad Kummari * @bl33: BL33 image info structure. 174421893a0SPrasad Kummari * @handoff_addr: TF-A handoff address. 1754d9f825aSVenkatesh Yadav Abbarapu * 176b9d26cd3SPrasad Kummari * Process the handoff parameters from the XBL and populate the BL32 and BL33 1774d9f825aSVenkatesh Yadav Abbarapu * image info structures accordingly. 1784d9f825aSVenkatesh Yadav Abbarapu * 1794d9f825aSVenkatesh Yadav Abbarapu * Return: Return the status of the handoff. The value will be from the 180b9d26cd3SPrasad Kummari * xbl_handoff enum. 181de7ed953SPrasad Kummari * 1824d9f825aSVenkatesh Yadav Abbarapu */ 183b9d26cd3SPrasad Kummari enum xbl_handoff xbl_handover(entry_point_info_t *bl32, 1844d9f825aSVenkatesh Yadav Abbarapu entry_point_info_t *bl33, 185b9d26cd3SPrasad Kummari uint64_t handoff_addr) 1864d9f825aSVenkatesh Yadav Abbarapu { 187b9d26cd3SPrasad Kummari const struct xbl_handoff_params *HandoffParams; 188906d5892SNithin G enum xbl_handoff xbl_status = XBL_HANDOFF_SUCCESS; 189b9d26cd3SPrasad Kummari 1907d15b94bSMaheedhar Bollapalli if (handoff_addr == 0U) { 191b9d26cd3SPrasad Kummari WARN("BL31: No handoff structure passed\n"); 192906d5892SNithin G xbl_status = XBL_HANDOFF_NO_STRUCT; 193906d5892SNithin G goto exit_label; 1944d9f825aSVenkatesh Yadav Abbarapu } 1954d9f825aSVenkatesh Yadav Abbarapu 196b9d26cd3SPrasad Kummari HandoffParams = (struct xbl_handoff_params *)handoff_addr; 19783bcef3fSMaheedhar Bollapalli if ((HandoffParams->magic[0] != (uint8_t)'X') || 19883bcef3fSMaheedhar Bollapalli (HandoffParams->magic[1] != (uint8_t)'L') || 19983bcef3fSMaheedhar Bollapalli (HandoffParams->magic[2] != (uint8_t)'N') || 20083bcef3fSMaheedhar Bollapalli (HandoffParams->magic[3] != (uint8_t)'X')) { 201b9d26cd3SPrasad Kummari ERROR("BL31: invalid handoff structure at %" PRIx64 "\n", handoff_addr); 202906d5892SNithin G xbl_status = XBL_HANDOFF_INVAL_STRUCT; 203906d5892SNithin G goto exit_label; 2044d9f825aSVenkatesh Yadav Abbarapu } 2054d9f825aSVenkatesh Yadav Abbarapu 206c8be2240SPrasad Kummari VERBOSE("BL31: TF-A handoff params at:0x%" PRIx64 ", entries:%u\n", 207b9d26cd3SPrasad Kummari handoff_addr, HandoffParams->num_entries); 208b9d26cd3SPrasad Kummari if (HandoffParams->num_entries > XBL_MAX_PARTITIONS) { 209c8be2240SPrasad Kummari ERROR("BL31: TF-A handoff params: too many partitions (%u/%u)\n", 210b9d26cd3SPrasad Kummari HandoffParams->num_entries, XBL_MAX_PARTITIONS); 211906d5892SNithin G xbl_status = XBL_HANDOFF_TOO_MANY_PARTS; 212906d5892SNithin G goto exit_label; 2134d9f825aSVenkatesh Yadav Abbarapu } 2144d9f825aSVenkatesh Yadav Abbarapu 2154d9f825aSVenkatesh Yadav Abbarapu /* 2164d9f825aSVenkatesh Yadav Abbarapu * we loop over all passed entries but only populate two image structs 2174d9f825aSVenkatesh Yadav Abbarapu * (bl32, bl33). I.e. the last applicable images in the handoff 2184d9f825aSVenkatesh Yadav Abbarapu * structure will be used for the hand off 2194d9f825aSVenkatesh Yadav Abbarapu */ 220b9d26cd3SPrasad Kummari for (size_t i = 0; i < HandoffParams->num_entries; i++) { 2214d9f825aSVenkatesh Yadav Abbarapu entry_point_info_t *image; 2223a1a2daeSMaheedhar Bollapalli uint32_t target_estate, target_secure, target_cpu; 223bfd7c881SVenkatesh Yadav Abbarapu uint32_t target_endianness, target_el; 2244d9f825aSVenkatesh Yadav Abbarapu 2254ce3e99aSScott Branden VERBOSE("BL31: %zd: entry:0x%" PRIx64 ", flags:0x%" PRIx64 "\n", i, 226b9d26cd3SPrasad Kummari HandoffParams->partition[i].entry_point, 227b9d26cd3SPrasad Kummari HandoffParams->partition[i].flags); 2284d9f825aSVenkatesh Yadav Abbarapu 22901c8c6a5SAkshay Belsare #if defined(PLAT_versal_net) 23001c8c6a5SAkshay Belsare uint32_t target_cluster; 23101c8c6a5SAkshay Belsare 23201c8c6a5SAkshay Belsare target_cluster = get_xbl_cluster(&HandoffParams->partition[i]); 23301c8c6a5SAkshay Belsare if (target_cluster != XBL_FLAGS_CLUSTER_0) { 23401c8c6a5SAkshay Belsare WARN("BL31: invalid target Cluster (%i)\n", 23501c8c6a5SAkshay Belsare target_cluster); 23601c8c6a5SAkshay Belsare continue; 23701c8c6a5SAkshay Belsare } 23801c8c6a5SAkshay Belsare #endif /* PLAT_versal_net */ 23901c8c6a5SAkshay Belsare 240b9d26cd3SPrasad Kummari target_cpu = get_xbl_cpu(&HandoffParams->partition[i]); 2413a1a2daeSMaheedhar Bollapalli if (target_cpu != XBL_FLAGS_A53_0) { 2424d9f825aSVenkatesh Yadav Abbarapu WARN("BL31: invalid target CPU (%i)\n", target_cpu); 2434d9f825aSVenkatesh Yadav Abbarapu continue; 2444d9f825aSVenkatesh Yadav Abbarapu } 2454d9f825aSVenkatesh Yadav Abbarapu 246b9d26cd3SPrasad Kummari target_el = get_xbl_el(&HandoffParams->partition[i]); 247b9d26cd3SPrasad Kummari if ((target_el == XBL_FLAGS_EL3) || 248b9d26cd3SPrasad Kummari (target_el == XBL_FLAGS_EL0)) { 249a0a4d86cSAkshay Belsare WARN("BL31: invalid target exception level(%i)\n", 250a0a4d86cSAkshay Belsare target_el); 2514d9f825aSVenkatesh Yadav Abbarapu continue; 2524d9f825aSVenkatesh Yadav Abbarapu } 2534d9f825aSVenkatesh Yadav Abbarapu 2543a1a2daeSMaheedhar Bollapalli target_secure = get_xbl_ss(&HandoffParams->partition[i]); 2553a1a2daeSMaheedhar Bollapalli if ((target_secure == XBL_FLAGS_SECURE) && 2568e9a5a51SNithin G (target_el == XBL_FLAGS_EL2)) { 2574d9f825aSVenkatesh Yadav Abbarapu WARN("BL31: invalid security state (%i) for exception level (%i)\n", 2584d9f825aSVenkatesh Yadav Abbarapu target_secure, target_el); 2594d9f825aSVenkatesh Yadav Abbarapu continue; 2604d9f825aSVenkatesh Yadav Abbarapu } 2614d9f825aSVenkatesh Yadav Abbarapu 262b9d26cd3SPrasad Kummari target_estate = get_xbl_estate(&HandoffParams->partition[i]); 263b9d26cd3SPrasad Kummari target_endianness = get_xbl_endian(&HandoffParams->partition[i]); 2644d9f825aSVenkatesh Yadav Abbarapu 2653a1a2daeSMaheedhar Bollapalli if (target_secure == XBL_FLAGS_SECURE) { 2664d9f825aSVenkatesh Yadav Abbarapu image = bl32; 2674d9f825aSVenkatesh Yadav Abbarapu 2683a1a2daeSMaheedhar Bollapalli if (target_estate == XBL_FLAGS_ESTATE_A32) { 2693a1a2daeSMaheedhar Bollapalli bl32->spsr = (uint32_t)SPSR_MODE32(MODE32_svc, SPSR_T_ARM, 2703a1a2daeSMaheedhar Bollapalli (uint64_t)target_endianness, 2714d9f825aSVenkatesh Yadav Abbarapu DISABLE_ALL_EXCEPTIONS); 272eb0d2b17SVenkatesh Yadav Abbarapu } else { 273*5d8831c2SSaivardhan Thatikonda bl32->spsr = (uint32_t)SPSR_64(MODE_EL1, MODE_SP_ELX, 2744d9f825aSVenkatesh Yadav Abbarapu DISABLE_ALL_EXCEPTIONS); 275eb0d2b17SVenkatesh Yadav Abbarapu } 2764d9f825aSVenkatesh Yadav Abbarapu } else { 2774d9f825aSVenkatesh Yadav Abbarapu image = bl33; 2784d9f825aSVenkatesh Yadav Abbarapu 2793a1a2daeSMaheedhar Bollapalli if (target_estate == XBL_FLAGS_ESTATE_A32) { 280b9d26cd3SPrasad Kummari if (target_el == XBL_FLAGS_EL2) { 2814d9f825aSVenkatesh Yadav Abbarapu target_el = MODE32_hyp; 282eb0d2b17SVenkatesh Yadav Abbarapu } else { 2834d9f825aSVenkatesh Yadav Abbarapu target_el = MODE32_sys; 284eb0d2b17SVenkatesh Yadav Abbarapu } 2854d9f825aSVenkatesh Yadav Abbarapu 2863a1a2daeSMaheedhar Bollapalli bl33->spsr = (uint32_t)SPSR_MODE32((uint64_t)target_el, SPSR_T_ARM, 2873a1a2daeSMaheedhar Bollapalli (uint64_t)target_endianness, 2884d9f825aSVenkatesh Yadav Abbarapu DISABLE_ALL_EXCEPTIONS); 2894d9f825aSVenkatesh Yadav Abbarapu } else { 290b9d26cd3SPrasad Kummari if (target_el == XBL_FLAGS_EL2) { 2914d9f825aSVenkatesh Yadav Abbarapu target_el = MODE_EL2; 292eb0d2b17SVenkatesh Yadav Abbarapu } else { 2934d9f825aSVenkatesh Yadav Abbarapu target_el = MODE_EL1; 294eb0d2b17SVenkatesh Yadav Abbarapu } 2954d9f825aSVenkatesh Yadav Abbarapu 2963a1a2daeSMaheedhar Bollapalli bl33->spsr = (uint32_t)SPSR_64((uint64_t)target_el, MODE_SP_ELX, 2974d9f825aSVenkatesh Yadav Abbarapu DISABLE_ALL_EXCEPTIONS); 2984d9f825aSVenkatesh Yadav Abbarapu } 2994d9f825aSVenkatesh Yadav Abbarapu } 3004d9f825aSVenkatesh Yadav Abbarapu 3014ce3e99aSScott Branden VERBOSE("Setting up %s entry point to:%" PRIx64 ", el:%x\n", 3023a1a2daeSMaheedhar Bollapalli (target_secure == XBL_FLAGS_SECURE) ? "BL32" : "BL33", 303b9d26cd3SPrasad Kummari HandoffParams->partition[i].entry_point, 3044d9f825aSVenkatesh Yadav Abbarapu target_el); 305b9d26cd3SPrasad Kummari image->pc = HandoffParams->partition[i].entry_point; 3064d9f825aSVenkatesh Yadav Abbarapu 307eb0d2b17SVenkatesh Yadav Abbarapu if (target_endianness == SPSR_E_BIG) { 3084d9f825aSVenkatesh Yadav Abbarapu EP_SET_EE(image->h.attr, EP_EE_BIG); 309eb0d2b17SVenkatesh Yadav Abbarapu } else { 3104d9f825aSVenkatesh Yadav Abbarapu EP_SET_EE(image->h.attr, EP_EE_LITTLE); 3114d9f825aSVenkatesh Yadav Abbarapu } 312eb0d2b17SVenkatesh Yadav Abbarapu } 3134d9f825aSVenkatesh Yadav Abbarapu 314906d5892SNithin G exit_label: 315906d5892SNithin G return xbl_status; 3164d9f825aSVenkatesh Yadav Abbarapu } 317