1*54fd6939SJiyong Park/* 2*54fd6939SJiyong Park * Copyright (c) 2013-2021, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park#include <platform_def.h> 8*54fd6939SJiyong Park 9*54fd6939SJiyong Park#include <arch.h> 10*54fd6939SJiyong Park#include <asm_macros.S> 11*54fd6939SJiyong Park#include <bl32/tsp/tsp.h> 12*54fd6939SJiyong Park#include <lib/xlat_tables/xlat_tables_defs.h> 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park#include "../tsp_private.h" 15*54fd6939SJiyong Park 16*54fd6939SJiyong Park 17*54fd6939SJiyong Park .globl tsp_entrypoint 18*54fd6939SJiyong Park .globl tsp_vector_table 19*54fd6939SJiyong Park 20*54fd6939SJiyong Park 21*54fd6939SJiyong Park 22*54fd6939SJiyong Park /* --------------------------------------------- 23*54fd6939SJiyong Park * Populate the params in x0-x7 from the pointer 24*54fd6939SJiyong Park * to the smc args structure in x0. 25*54fd6939SJiyong Park * --------------------------------------------- 26*54fd6939SJiyong Park */ 27*54fd6939SJiyong Park .macro restore_args_call_smc 28*54fd6939SJiyong Park ldp x6, x7, [x0, #TSP_ARG6] 29*54fd6939SJiyong Park ldp x4, x5, [x0, #TSP_ARG4] 30*54fd6939SJiyong Park ldp x2, x3, [x0, #TSP_ARG2] 31*54fd6939SJiyong Park ldp x0, x1, [x0, #TSP_ARG0] 32*54fd6939SJiyong Park smc #0 33*54fd6939SJiyong Park .endm 34*54fd6939SJiyong Park 35*54fd6939SJiyong Park .macro save_eret_context reg1 reg2 36*54fd6939SJiyong Park mrs \reg1, elr_el1 37*54fd6939SJiyong Park mrs \reg2, spsr_el1 38*54fd6939SJiyong Park stp \reg1, \reg2, [sp, #-0x10]! 39*54fd6939SJiyong Park stp x30, x18, [sp, #-0x10]! 40*54fd6939SJiyong Park .endm 41*54fd6939SJiyong Park 42*54fd6939SJiyong Park .macro restore_eret_context reg1 reg2 43*54fd6939SJiyong Park ldp x30, x18, [sp], #0x10 44*54fd6939SJiyong Park ldp \reg1, \reg2, [sp], #0x10 45*54fd6939SJiyong Park msr elr_el1, \reg1 46*54fd6939SJiyong Park msr spsr_el1, \reg2 47*54fd6939SJiyong Park .endm 48*54fd6939SJiyong Park 49*54fd6939SJiyong Parkfunc tsp_entrypoint _align=3 50*54fd6939SJiyong Park 51*54fd6939SJiyong Park#if ENABLE_PIE 52*54fd6939SJiyong Park /* 53*54fd6939SJiyong Park * ------------------------------------------------------------ 54*54fd6939SJiyong Park * If PIE is enabled fixup the Global descriptor Table only 55*54fd6939SJiyong Park * once during primary core cold boot path. 56*54fd6939SJiyong Park * 57*54fd6939SJiyong Park * Compile time base address, required for fixup, is calculated 58*54fd6939SJiyong Park * using "pie_fixup" label present within first page. 59*54fd6939SJiyong Park * ------------------------------------------------------------ 60*54fd6939SJiyong Park */ 61*54fd6939SJiyong Park pie_fixup: 62*54fd6939SJiyong Park ldr x0, =pie_fixup 63*54fd6939SJiyong Park and x0, x0, #~(PAGE_SIZE_MASK) 64*54fd6939SJiyong Park mov_imm x1, (BL32_LIMIT - BL32_BASE) 65*54fd6939SJiyong Park add x1, x1, x0 66*54fd6939SJiyong Park bl fixup_gdt_reloc 67*54fd6939SJiyong Park#endif /* ENABLE_PIE */ 68*54fd6939SJiyong Park 69*54fd6939SJiyong Park /* --------------------------------------------- 70*54fd6939SJiyong Park * Set the exception vector to something sane. 71*54fd6939SJiyong Park * --------------------------------------------- 72*54fd6939SJiyong Park */ 73*54fd6939SJiyong Park adr x0, tsp_exceptions 74*54fd6939SJiyong Park msr vbar_el1, x0 75*54fd6939SJiyong Park isb 76*54fd6939SJiyong Park 77*54fd6939SJiyong Park /* --------------------------------------------- 78*54fd6939SJiyong Park * Enable the SError interrupt now that the 79*54fd6939SJiyong Park * exception vectors have been setup. 80*54fd6939SJiyong Park * --------------------------------------------- 81*54fd6939SJiyong Park */ 82*54fd6939SJiyong Park msr daifclr, #DAIF_ABT_BIT 83*54fd6939SJiyong Park 84*54fd6939SJiyong Park /* --------------------------------------------- 85*54fd6939SJiyong Park * Enable the instruction cache, stack pointer 86*54fd6939SJiyong Park * and data access alignment checks and disable 87*54fd6939SJiyong Park * speculative loads. 88*54fd6939SJiyong Park * --------------------------------------------- 89*54fd6939SJiyong Park */ 90*54fd6939SJiyong Park mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) 91*54fd6939SJiyong Park mrs x0, sctlr_el1 92*54fd6939SJiyong Park orr x0, x0, x1 93*54fd6939SJiyong Park bic x0, x0, #SCTLR_DSSBS_BIT 94*54fd6939SJiyong Park msr sctlr_el1, x0 95*54fd6939SJiyong Park isb 96*54fd6939SJiyong Park 97*54fd6939SJiyong Park /* --------------------------------------------- 98*54fd6939SJiyong Park * Invalidate the RW memory used by the BL32 99*54fd6939SJiyong Park * image. This includes the data and NOBITS 100*54fd6939SJiyong Park * sections. This is done to safeguard against 101*54fd6939SJiyong Park * possible corruption of this memory by dirty 102*54fd6939SJiyong Park * cache lines in a system cache as a result of 103*54fd6939SJiyong Park * use by an earlier boot loader stage. If PIE 104*54fd6939SJiyong Park * is enabled however, RO sections including the 105*54fd6939SJiyong Park * GOT may be modified during pie fixup. 106*54fd6939SJiyong Park * Therefore, to be on the safe side, invalidate 107*54fd6939SJiyong Park * the entire image region if PIE is enabled. 108*54fd6939SJiyong Park * --------------------------------------------- 109*54fd6939SJiyong Park */ 110*54fd6939SJiyong Park#if ENABLE_PIE 111*54fd6939SJiyong Park#if SEPARATE_CODE_AND_RODATA 112*54fd6939SJiyong Park adrp x0, __TEXT_START__ 113*54fd6939SJiyong Park add x0, x0, :lo12:__TEXT_START__ 114*54fd6939SJiyong Park#else 115*54fd6939SJiyong Park adrp x0, __RO_START__ 116*54fd6939SJiyong Park add x0, x0, :lo12:__RO_START__ 117*54fd6939SJiyong Park#endif /* SEPARATE_CODE_AND_RODATA */ 118*54fd6939SJiyong Park#else 119*54fd6939SJiyong Park adrp x0, __RW_START__ 120*54fd6939SJiyong Park add x0, x0, :lo12:__RW_START__ 121*54fd6939SJiyong Park#endif /* ENABLE_PIE */ 122*54fd6939SJiyong Park adrp x1, __RW_END__ 123*54fd6939SJiyong Park add x1, x1, :lo12:__RW_END__ 124*54fd6939SJiyong Park sub x1, x1, x0 125*54fd6939SJiyong Park bl inv_dcache_range 126*54fd6939SJiyong Park 127*54fd6939SJiyong Park /* --------------------------------------------- 128*54fd6939SJiyong Park * Zero out NOBITS sections. There are 2 of them: 129*54fd6939SJiyong Park * - the .bss section; 130*54fd6939SJiyong Park * - the coherent memory section. 131*54fd6939SJiyong Park * --------------------------------------------- 132*54fd6939SJiyong Park */ 133*54fd6939SJiyong Park adrp x0, __BSS_START__ 134*54fd6939SJiyong Park add x0, x0, :lo12:__BSS_START__ 135*54fd6939SJiyong Park adrp x1, __BSS_END__ 136*54fd6939SJiyong Park add x1, x1, :lo12:__BSS_END__ 137*54fd6939SJiyong Park sub x1, x1, x0 138*54fd6939SJiyong Park bl zeromem 139*54fd6939SJiyong Park 140*54fd6939SJiyong Park#if USE_COHERENT_MEM 141*54fd6939SJiyong Park adrp x0, __COHERENT_RAM_START__ 142*54fd6939SJiyong Park add x0, x0, :lo12:__COHERENT_RAM_START__ 143*54fd6939SJiyong Park adrp x1, __COHERENT_RAM_END_UNALIGNED__ 144*54fd6939SJiyong Park add x1, x1, :lo12:__COHERENT_RAM_END_UNALIGNED__ 145*54fd6939SJiyong Park sub x1, x1, x0 146*54fd6939SJiyong Park bl zeromem 147*54fd6939SJiyong Park#endif 148*54fd6939SJiyong Park 149*54fd6939SJiyong Park /* -------------------------------------------- 150*54fd6939SJiyong Park * Allocate a stack whose memory will be marked 151*54fd6939SJiyong Park * as Normal-IS-WBWA when the MMU is enabled. 152*54fd6939SJiyong Park * There is no risk of reading stale stack 153*54fd6939SJiyong Park * memory after enabling the MMU as only the 154*54fd6939SJiyong Park * primary cpu is running at the moment. 155*54fd6939SJiyong Park * -------------------------------------------- 156*54fd6939SJiyong Park */ 157*54fd6939SJiyong Park bl plat_set_my_stack 158*54fd6939SJiyong Park 159*54fd6939SJiyong Park /* --------------------------------------------- 160*54fd6939SJiyong Park * Initialize the stack protector canary before 161*54fd6939SJiyong Park * any C code is called. 162*54fd6939SJiyong Park * --------------------------------------------- 163*54fd6939SJiyong Park */ 164*54fd6939SJiyong Park#if STACK_PROTECTOR_ENABLED 165*54fd6939SJiyong Park bl update_stack_protector_canary 166*54fd6939SJiyong Park#endif 167*54fd6939SJiyong Park 168*54fd6939SJiyong Park /* --------------------------------------------- 169*54fd6939SJiyong Park * Perform TSP setup 170*54fd6939SJiyong Park * --------------------------------------------- 171*54fd6939SJiyong Park */ 172*54fd6939SJiyong Park bl tsp_setup 173*54fd6939SJiyong Park 174*54fd6939SJiyong Park#if ENABLE_PAUTH 175*54fd6939SJiyong Park /* --------------------------------------------- 176*54fd6939SJiyong Park * Program APIAKey_EL1 177*54fd6939SJiyong Park * and enable pointer authentication 178*54fd6939SJiyong Park * --------------------------------------------- 179*54fd6939SJiyong Park */ 180*54fd6939SJiyong Park bl pauth_init_enable_el1 181*54fd6939SJiyong Park#endif /* ENABLE_PAUTH */ 182*54fd6939SJiyong Park 183*54fd6939SJiyong Park /* --------------------------------------------- 184*54fd6939SJiyong Park * Jump to main function. 185*54fd6939SJiyong Park * --------------------------------------------- 186*54fd6939SJiyong Park */ 187*54fd6939SJiyong Park bl tsp_main 188*54fd6939SJiyong Park 189*54fd6939SJiyong Park /* --------------------------------------------- 190*54fd6939SJiyong Park * Tell TSPD that we are done initialising 191*54fd6939SJiyong Park * --------------------------------------------- 192*54fd6939SJiyong Park */ 193*54fd6939SJiyong Park mov x1, x0 194*54fd6939SJiyong Park mov x0, #TSP_ENTRY_DONE 195*54fd6939SJiyong Park smc #0 196*54fd6939SJiyong Park 197*54fd6939SJiyong Parktsp_entrypoint_panic: 198*54fd6939SJiyong Park b tsp_entrypoint_panic 199*54fd6939SJiyong Parkendfunc tsp_entrypoint 200*54fd6939SJiyong Park 201*54fd6939SJiyong Park 202*54fd6939SJiyong Park /* ------------------------------------------- 203*54fd6939SJiyong Park * Table of entrypoint vectors provided to the 204*54fd6939SJiyong Park * TSPD for the various entrypoints 205*54fd6939SJiyong Park * ------------------------------------------- 206*54fd6939SJiyong Park */ 207*54fd6939SJiyong Parkvector_base tsp_vector_table 208*54fd6939SJiyong Park b tsp_yield_smc_entry 209*54fd6939SJiyong Park b tsp_fast_smc_entry 210*54fd6939SJiyong Park b tsp_cpu_on_entry 211*54fd6939SJiyong Park b tsp_cpu_off_entry 212*54fd6939SJiyong Park b tsp_cpu_resume_entry 213*54fd6939SJiyong Park b tsp_cpu_suspend_entry 214*54fd6939SJiyong Park b tsp_sel1_intr_entry 215*54fd6939SJiyong Park b tsp_system_off_entry 216*54fd6939SJiyong Park b tsp_system_reset_entry 217*54fd6939SJiyong Park b tsp_abort_yield_smc_entry 218*54fd6939SJiyong Park 219*54fd6939SJiyong Park /*--------------------------------------------- 220*54fd6939SJiyong Park * This entrypoint is used by the TSPD when this 221*54fd6939SJiyong Park * cpu is to be turned off through a CPU_OFF 222*54fd6939SJiyong Park * psci call to ask the TSP to perform any 223*54fd6939SJiyong Park * bookeeping necessary. In the current 224*54fd6939SJiyong Park * implementation, the TSPD expects the TSP to 225*54fd6939SJiyong Park * re-initialise its state so nothing is done 226*54fd6939SJiyong Park * here except for acknowledging the request. 227*54fd6939SJiyong Park * --------------------------------------------- 228*54fd6939SJiyong Park */ 229*54fd6939SJiyong Parkfunc tsp_cpu_off_entry 230*54fd6939SJiyong Park bl tsp_cpu_off_main 231*54fd6939SJiyong Park restore_args_call_smc 232*54fd6939SJiyong Parkendfunc tsp_cpu_off_entry 233*54fd6939SJiyong Park 234*54fd6939SJiyong Park /*--------------------------------------------- 235*54fd6939SJiyong Park * This entrypoint is used by the TSPD when the 236*54fd6939SJiyong Park * system is about to be switched off (through 237*54fd6939SJiyong Park * a SYSTEM_OFF psci call) to ask the TSP to 238*54fd6939SJiyong Park * perform any necessary bookkeeping. 239*54fd6939SJiyong Park * --------------------------------------------- 240*54fd6939SJiyong Park */ 241*54fd6939SJiyong Parkfunc tsp_system_off_entry 242*54fd6939SJiyong Park bl tsp_system_off_main 243*54fd6939SJiyong Park restore_args_call_smc 244*54fd6939SJiyong Parkendfunc tsp_system_off_entry 245*54fd6939SJiyong Park 246*54fd6939SJiyong Park /*--------------------------------------------- 247*54fd6939SJiyong Park * This entrypoint is used by the TSPD when the 248*54fd6939SJiyong Park * system is about to be reset (through a 249*54fd6939SJiyong Park * SYSTEM_RESET psci call) to ask the TSP to 250*54fd6939SJiyong Park * perform any necessary bookkeeping. 251*54fd6939SJiyong Park * --------------------------------------------- 252*54fd6939SJiyong Park */ 253*54fd6939SJiyong Parkfunc tsp_system_reset_entry 254*54fd6939SJiyong Park bl tsp_system_reset_main 255*54fd6939SJiyong Park restore_args_call_smc 256*54fd6939SJiyong Parkendfunc tsp_system_reset_entry 257*54fd6939SJiyong Park 258*54fd6939SJiyong Park /*--------------------------------------------- 259*54fd6939SJiyong Park * This entrypoint is used by the TSPD when this 260*54fd6939SJiyong Park * cpu is turned on using a CPU_ON psci call to 261*54fd6939SJiyong Park * ask the TSP to initialise itself i.e. setup 262*54fd6939SJiyong Park * the mmu, stacks etc. Minimal architectural 263*54fd6939SJiyong Park * state will be initialised by the TSPD when 264*54fd6939SJiyong Park * this function is entered i.e. Caches and MMU 265*54fd6939SJiyong Park * will be turned off, the execution state 266*54fd6939SJiyong Park * will be aarch64 and exceptions masked. 267*54fd6939SJiyong Park * --------------------------------------------- 268*54fd6939SJiyong Park */ 269*54fd6939SJiyong Parkfunc tsp_cpu_on_entry 270*54fd6939SJiyong Park /* --------------------------------------------- 271*54fd6939SJiyong Park * Set the exception vector to something sane. 272*54fd6939SJiyong Park * --------------------------------------------- 273*54fd6939SJiyong Park */ 274*54fd6939SJiyong Park adr x0, tsp_exceptions 275*54fd6939SJiyong Park msr vbar_el1, x0 276*54fd6939SJiyong Park isb 277*54fd6939SJiyong Park 278*54fd6939SJiyong Park /* Enable the SError interrupt */ 279*54fd6939SJiyong Park msr daifclr, #DAIF_ABT_BIT 280*54fd6939SJiyong Park 281*54fd6939SJiyong Park /* --------------------------------------------- 282*54fd6939SJiyong Park * Enable the instruction cache, stack pointer 283*54fd6939SJiyong Park * and data access alignment checks 284*54fd6939SJiyong Park * --------------------------------------------- 285*54fd6939SJiyong Park */ 286*54fd6939SJiyong Park mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) 287*54fd6939SJiyong Park mrs x0, sctlr_el1 288*54fd6939SJiyong Park orr x0, x0, x1 289*54fd6939SJiyong Park msr sctlr_el1, x0 290*54fd6939SJiyong Park isb 291*54fd6939SJiyong Park 292*54fd6939SJiyong Park /* -------------------------------------------- 293*54fd6939SJiyong Park * Give ourselves a stack whose memory will be 294*54fd6939SJiyong Park * marked as Normal-IS-WBWA when the MMU is 295*54fd6939SJiyong Park * enabled. 296*54fd6939SJiyong Park * -------------------------------------------- 297*54fd6939SJiyong Park */ 298*54fd6939SJiyong Park bl plat_set_my_stack 299*54fd6939SJiyong Park 300*54fd6939SJiyong Park /* -------------------------------------------- 301*54fd6939SJiyong Park * Enable MMU and D-caches together. 302*54fd6939SJiyong Park * -------------------------------------------- 303*54fd6939SJiyong Park */ 304*54fd6939SJiyong Park mov x0, #0 305*54fd6939SJiyong Park bl bl32_plat_enable_mmu 306*54fd6939SJiyong Park 307*54fd6939SJiyong Park#if ENABLE_PAUTH 308*54fd6939SJiyong Park /* --------------------------------------------- 309*54fd6939SJiyong Park * Program APIAKey_EL1 310*54fd6939SJiyong Park * and enable pointer authentication 311*54fd6939SJiyong Park * --------------------------------------------- 312*54fd6939SJiyong Park */ 313*54fd6939SJiyong Park bl pauth_init_enable_el1 314*54fd6939SJiyong Park#endif /* ENABLE_PAUTH */ 315*54fd6939SJiyong Park 316*54fd6939SJiyong Park /* --------------------------------------------- 317*54fd6939SJiyong Park * Enter C runtime to perform any remaining 318*54fd6939SJiyong Park * book keeping 319*54fd6939SJiyong Park * --------------------------------------------- 320*54fd6939SJiyong Park */ 321*54fd6939SJiyong Park bl tsp_cpu_on_main 322*54fd6939SJiyong Park restore_args_call_smc 323*54fd6939SJiyong Park 324*54fd6939SJiyong Park /* Should never reach here */ 325*54fd6939SJiyong Parktsp_cpu_on_entry_panic: 326*54fd6939SJiyong Park b tsp_cpu_on_entry_panic 327*54fd6939SJiyong Parkendfunc tsp_cpu_on_entry 328*54fd6939SJiyong Park 329*54fd6939SJiyong Park /*--------------------------------------------- 330*54fd6939SJiyong Park * This entrypoint is used by the TSPD when this 331*54fd6939SJiyong Park * cpu is to be suspended through a CPU_SUSPEND 332*54fd6939SJiyong Park * psci call to ask the TSP to perform any 333*54fd6939SJiyong Park * bookeeping necessary. In the current 334*54fd6939SJiyong Park * implementation, the TSPD saves and restores 335*54fd6939SJiyong Park * the EL1 state. 336*54fd6939SJiyong Park * --------------------------------------------- 337*54fd6939SJiyong Park */ 338*54fd6939SJiyong Parkfunc tsp_cpu_suspend_entry 339*54fd6939SJiyong Park bl tsp_cpu_suspend_main 340*54fd6939SJiyong Park restore_args_call_smc 341*54fd6939SJiyong Parkendfunc tsp_cpu_suspend_entry 342*54fd6939SJiyong Park 343*54fd6939SJiyong Park /*------------------------------------------------- 344*54fd6939SJiyong Park * This entrypoint is used by the TSPD to pass 345*54fd6939SJiyong Park * control for `synchronously` handling a S-EL1 346*54fd6939SJiyong Park * Interrupt which was triggered while executing 347*54fd6939SJiyong Park * in normal world. 'x0' contains a magic number 348*54fd6939SJiyong Park * which indicates this. TSPD expects control to 349*54fd6939SJiyong Park * be handed back at the end of interrupt 350*54fd6939SJiyong Park * processing. This is done through an SMC. 351*54fd6939SJiyong Park * The handover agreement is: 352*54fd6939SJiyong Park * 353*54fd6939SJiyong Park * 1. PSTATE.DAIF are set upon entry. 'x1' has 354*54fd6939SJiyong Park * the ELR_EL3 from the non-secure state. 355*54fd6939SJiyong Park * 2. TSP has to preserve the callee saved 356*54fd6939SJiyong Park * general purpose registers, SP_EL1/EL0 and 357*54fd6939SJiyong Park * LR. 358*54fd6939SJiyong Park * 3. TSP has to preserve the system and vfp 359*54fd6939SJiyong Park * registers (if applicable). 360*54fd6939SJiyong Park * 4. TSP can use 'x0-x18' to enable its C 361*54fd6939SJiyong Park * runtime. 362*54fd6939SJiyong Park * 5. TSP returns to TSPD using an SMC with 363*54fd6939SJiyong Park * 'x0' = TSP_HANDLED_S_EL1_INTR 364*54fd6939SJiyong Park * ------------------------------------------------ 365*54fd6939SJiyong Park */ 366*54fd6939SJiyong Parkfunc tsp_sel1_intr_entry 367*54fd6939SJiyong Park#if DEBUG 368*54fd6939SJiyong Park mov_imm x2, TSP_HANDLE_SEL1_INTR_AND_RETURN 369*54fd6939SJiyong Park cmp x0, x2 370*54fd6939SJiyong Park b.ne tsp_sel1_int_entry_panic 371*54fd6939SJiyong Park#endif 372*54fd6939SJiyong Park /*------------------------------------------------- 373*54fd6939SJiyong Park * Save any previous context needed to perform 374*54fd6939SJiyong Park * an exception return from S-EL1 e.g. context 375*54fd6939SJiyong Park * from a previous Non secure Interrupt. 376*54fd6939SJiyong Park * Update statistics and handle the S-EL1 377*54fd6939SJiyong Park * interrupt before returning to the TSPD. 378*54fd6939SJiyong Park * IRQ/FIQs are not enabled since that will 379*54fd6939SJiyong Park * complicate the implementation. Execution 380*54fd6939SJiyong Park * will be transferred back to the normal world 381*54fd6939SJiyong Park * in any case. The handler can return 0 382*54fd6939SJiyong Park * if the interrupt was handled or TSP_PREEMPTED 383*54fd6939SJiyong Park * if the expected interrupt was preempted 384*54fd6939SJiyong Park * by an interrupt that should be handled in EL3 385*54fd6939SJiyong Park * e.g. Group 0 interrupt in GICv3. In both 386*54fd6939SJiyong Park * the cases switch to EL3 using SMC with id 387*54fd6939SJiyong Park * TSP_HANDLED_S_EL1_INTR. Any other return value 388*54fd6939SJiyong Park * from the handler will result in panic. 389*54fd6939SJiyong Park * ------------------------------------------------ 390*54fd6939SJiyong Park */ 391*54fd6939SJiyong Park save_eret_context x2 x3 392*54fd6939SJiyong Park bl tsp_update_sync_sel1_intr_stats 393*54fd6939SJiyong Park bl tsp_common_int_handler 394*54fd6939SJiyong Park /* Check if the S-EL1 interrupt has been handled */ 395*54fd6939SJiyong Park cbnz x0, tsp_sel1_intr_check_preemption 396*54fd6939SJiyong Park b tsp_sel1_intr_return 397*54fd6939SJiyong Parktsp_sel1_intr_check_preemption: 398*54fd6939SJiyong Park /* Check if the S-EL1 interrupt has been preempted */ 399*54fd6939SJiyong Park mov_imm x1, TSP_PREEMPTED 400*54fd6939SJiyong Park cmp x0, x1 401*54fd6939SJiyong Park b.ne tsp_sel1_int_entry_panic 402*54fd6939SJiyong Parktsp_sel1_intr_return: 403*54fd6939SJiyong Park mov_imm x0, TSP_HANDLED_S_EL1_INTR 404*54fd6939SJiyong Park restore_eret_context x2 x3 405*54fd6939SJiyong Park smc #0 406*54fd6939SJiyong Park 407*54fd6939SJiyong Park /* Should never reach here */ 408*54fd6939SJiyong Parktsp_sel1_int_entry_panic: 409*54fd6939SJiyong Park no_ret plat_panic_handler 410*54fd6939SJiyong Parkendfunc tsp_sel1_intr_entry 411*54fd6939SJiyong Park 412*54fd6939SJiyong Park /*--------------------------------------------- 413*54fd6939SJiyong Park * This entrypoint is used by the TSPD when this 414*54fd6939SJiyong Park * cpu resumes execution after an earlier 415*54fd6939SJiyong Park * CPU_SUSPEND psci call to ask the TSP to 416*54fd6939SJiyong Park * restore its saved context. In the current 417*54fd6939SJiyong Park * implementation, the TSPD saves and restores 418*54fd6939SJiyong Park * EL1 state so nothing is done here apart from 419*54fd6939SJiyong Park * acknowledging the request. 420*54fd6939SJiyong Park * --------------------------------------------- 421*54fd6939SJiyong Park */ 422*54fd6939SJiyong Parkfunc tsp_cpu_resume_entry 423*54fd6939SJiyong Park bl tsp_cpu_resume_main 424*54fd6939SJiyong Park restore_args_call_smc 425*54fd6939SJiyong Park 426*54fd6939SJiyong Park /* Should never reach here */ 427*54fd6939SJiyong Park no_ret plat_panic_handler 428*54fd6939SJiyong Parkendfunc tsp_cpu_resume_entry 429*54fd6939SJiyong Park 430*54fd6939SJiyong Park /*--------------------------------------------- 431*54fd6939SJiyong Park * This entrypoint is used by the TSPD to ask 432*54fd6939SJiyong Park * the TSP to service a fast smc request. 433*54fd6939SJiyong Park * --------------------------------------------- 434*54fd6939SJiyong Park */ 435*54fd6939SJiyong Parkfunc tsp_fast_smc_entry 436*54fd6939SJiyong Park bl tsp_smc_handler 437*54fd6939SJiyong Park restore_args_call_smc 438*54fd6939SJiyong Park 439*54fd6939SJiyong Park /* Should never reach here */ 440*54fd6939SJiyong Park no_ret plat_panic_handler 441*54fd6939SJiyong Parkendfunc tsp_fast_smc_entry 442*54fd6939SJiyong Park 443*54fd6939SJiyong Park /*--------------------------------------------- 444*54fd6939SJiyong Park * This entrypoint is used by the TSPD to ask 445*54fd6939SJiyong Park * the TSP to service a Yielding SMC request. 446*54fd6939SJiyong Park * We will enable preemption during execution 447*54fd6939SJiyong Park * of tsp_smc_handler. 448*54fd6939SJiyong Park * --------------------------------------------- 449*54fd6939SJiyong Park */ 450*54fd6939SJiyong Parkfunc tsp_yield_smc_entry 451*54fd6939SJiyong Park msr daifclr, #DAIF_FIQ_BIT | DAIF_IRQ_BIT 452*54fd6939SJiyong Park bl tsp_smc_handler 453*54fd6939SJiyong Park msr daifset, #DAIF_FIQ_BIT | DAIF_IRQ_BIT 454*54fd6939SJiyong Park restore_args_call_smc 455*54fd6939SJiyong Park 456*54fd6939SJiyong Park /* Should never reach here */ 457*54fd6939SJiyong Park no_ret plat_panic_handler 458*54fd6939SJiyong Parkendfunc tsp_yield_smc_entry 459*54fd6939SJiyong Park 460*54fd6939SJiyong Park /*--------------------------------------------------------------------- 461*54fd6939SJiyong Park * This entrypoint is used by the TSPD to abort a pre-empted Yielding 462*54fd6939SJiyong Park * SMC. It could be on behalf of non-secure world or because a CPU 463*54fd6939SJiyong Park * suspend/CPU off request needs to abort the preempted SMC. 464*54fd6939SJiyong Park * -------------------------------------------------------------------- 465*54fd6939SJiyong Park */ 466*54fd6939SJiyong Parkfunc tsp_abort_yield_smc_entry 467*54fd6939SJiyong Park 468*54fd6939SJiyong Park /* 469*54fd6939SJiyong Park * Exceptions masking is already done by the TSPD when entering this 470*54fd6939SJiyong Park * hook so there is no need to do it here. 471*54fd6939SJiyong Park */ 472*54fd6939SJiyong Park 473*54fd6939SJiyong Park /* Reset the stack used by the pre-empted SMC */ 474*54fd6939SJiyong Park bl plat_set_my_stack 475*54fd6939SJiyong Park 476*54fd6939SJiyong Park /* 477*54fd6939SJiyong Park * Allow some cleanup such as releasing locks. 478*54fd6939SJiyong Park */ 479*54fd6939SJiyong Park bl tsp_abort_smc_handler 480*54fd6939SJiyong Park 481*54fd6939SJiyong Park restore_args_call_smc 482*54fd6939SJiyong Park 483*54fd6939SJiyong Park /* Should never reach here */ 484*54fd6939SJiyong Park bl plat_panic_handler 485*54fd6939SJiyong Parkendfunc tsp_abort_yield_smc_entry 486