11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2abe38974SJens Wiklander /* 33f4d6849SJens Wiklander * Copyright (c) 2016, Linaro Limited 4abe38974SJens Wiklander * Copyright (c) 2014, STMicroelectronics International N.V. 5abe38974SJens Wiklander */ 6abe38974SJens Wiklander 7*d50fee03SEtienne Carriere #ifndef __SM_SM_H 8*d50fee03SEtienne Carriere #define __SM_SM_H 9abe38974SJens Wiklander 10757331fcSJens Wiklander #ifndef __ASSEMBLER__ 1165363c52SEtienne Carriere 125849875fSAndrew F. Davis #include <compiler.h> 13abe38974SJens Wiklander #include <types_ext.h> 14abe38974SJens Wiklander 150160fec3SJerome Forissier struct sm_unbanked_regs { 16abe38974SJens Wiklander uint32_t usr_sp; 17abe38974SJens Wiklander uint32_t usr_lr; 18abe38974SJens Wiklander uint32_t irq_spsr; 19abe38974SJens Wiklander uint32_t irq_sp; 20abe38974SJens Wiklander uint32_t irq_lr; 21f2dec49bSJens Wiklander uint32_t fiq_spsr; 22f2dec49bSJens Wiklander uint32_t fiq_sp; 23f2dec49bSJens Wiklander uint32_t fiq_lr; 243f4d6849SJens Wiklander /* 253f4d6849SJens Wiklander * Note that fiq_r{8-12} are not saved here. Instead thread_fiq_handler 263f4d6849SJens Wiklander * preserves r{8-12}. 273f4d6849SJens Wiklander */ 28abe38974SJens Wiklander uint32_t svc_spsr; 29abe38974SJens Wiklander uint32_t svc_sp; 30abe38974SJens Wiklander uint32_t svc_lr; 31abe38974SJens Wiklander uint32_t abt_spsr; 32abe38974SJens Wiklander uint32_t abt_sp; 33abe38974SJens Wiklander uint32_t abt_lr; 34abe38974SJens Wiklander uint32_t und_spsr; 35abe38974SJens Wiklander uint32_t und_sp; 36abe38974SJens Wiklander uint32_t und_lr; 378267e19bSJerome Forissier #ifdef CFG_SM_NO_CYCLE_COUNTING 388267e19bSJerome Forissier uint32_t pmcr; 398267e19bSJerome Forissier #endif 40099918f6SSumit Garg #ifdef CFG_FTRACE_SUPPORT 41edaf8c38SSumit Garg uint32_t cntkctl; 42edaf8c38SSumit Garg uint32_t pad; 43edaf8c38SSumit Garg #endif 443f4d6849SJens Wiklander }; 453f4d6849SJens Wiklander 463f4d6849SJens Wiklander struct sm_nsec_ctx { 470160fec3SJerome Forissier struct sm_unbanked_regs ub_regs; 483f4d6849SJens Wiklander 49abe38974SJens Wiklander uint32_t r8; 50abe38974SJens Wiklander uint32_t r9; 51abe38974SJens Wiklander uint32_t r10; 52abe38974SJens Wiklander uint32_t r11; 53abe38974SJens Wiklander uint32_t r12; 543f4d6849SJens Wiklander 55abe38974SJens Wiklander uint32_t r0; 56abe38974SJens Wiklander uint32_t r1; 57abe38974SJens Wiklander uint32_t r2; 58abe38974SJens Wiklander uint32_t r3; 593f4d6849SJens Wiklander uint32_t r4; 603f4d6849SJens Wiklander uint32_t r5; 613f4d6849SJens Wiklander uint32_t r6; 623f4d6849SJens Wiklander uint32_t r7; 633f4d6849SJens Wiklander 643f4d6849SJens Wiklander /* return state */ 653f4d6849SJens Wiklander uint32_t mon_lr; 663f4d6849SJens Wiklander uint32_t mon_spsr; 67abe38974SJens Wiklander }; 68abe38974SJens Wiklander 69abe38974SJens Wiklander struct sm_sec_ctx { 700160fec3SJerome Forissier struct sm_unbanked_regs ub_regs; 713f4d6849SJens Wiklander 723f4d6849SJens Wiklander uint32_t r0; 733f4d6849SJens Wiklander uint32_t r1; 743f4d6849SJens Wiklander uint32_t r2; 753f4d6849SJens Wiklander uint32_t r3; 763f4d6849SJens Wiklander uint32_t r4; 773f4d6849SJens Wiklander uint32_t r5; 783f4d6849SJens Wiklander uint32_t r6; 793f4d6849SJens Wiklander uint32_t r7; 803f4d6849SJens Wiklander 813f4d6849SJens Wiklander /* return state */ 82abe38974SJens Wiklander uint32_t mon_lr; 83abe38974SJens Wiklander uint32_t mon_spsr; 84abe38974SJens Wiklander }; 85abe38974SJens Wiklander 863f4d6849SJens Wiklander struct sm_ctx { 87e72c941fSJens Wiklander #ifndef CFG_SM_NO_CYCLE_COUNTING 883f4d6849SJens Wiklander uint32_t pad; 89e72c941fSJens Wiklander #endif 903f4d6849SJens Wiklander struct sm_sec_ctx sec; 91e72c941fSJens Wiklander #ifdef CFG_SM_NO_CYCLE_COUNTING 92e72c941fSJens Wiklander uint32_t pad; 93e72c941fSJens Wiklander #endif 943f4d6849SJens Wiklander struct sm_nsec_ctx nsec; 953f4d6849SJens Wiklander }; 963f4d6849SJens Wiklander 973f4d6849SJens Wiklander /* 98c822f03fSJens Wiklander * The secure monitor reserves space at top of stack_tmp to hold struct 99c822f03fSJens Wiklander * sm_ctx. 1003f4d6849SJens Wiklander */ 101c822f03fSJens Wiklander #define SM_STACK_TMP_RESERVE_SIZE sizeof(struct sm_ctx) 1023f4d6849SJens Wiklander 103abe38974SJens Wiklander /* Returns storage location of non-secure context for current CPU */ 104abe38974SJens Wiklander struct sm_nsec_ctx *sm_get_nsec_ctx(void); 105abe38974SJens Wiklander 106abe38974SJens Wiklander /* Returns stack pointer to use in monitor mode for current CPU */ 107abe38974SJens Wiklander void *sm_get_sp(void); 108abe38974SJens Wiklander 109abe38974SJens Wiklander /* 110abe38974SJens Wiklander * Initializes secure monitor, must be called by each CPU 111abe38974SJens Wiklander */ 112abe38974SJens Wiklander void sm_init(vaddr_t stack_pointer); 113abe38974SJens Wiklander 114aea0999eSEtienne Carriere enum sm_handler_ret { 115aea0999eSEtienne Carriere SM_HANDLER_SMC_HANDLED = 0, 116aea0999eSEtienne Carriere SM_HANDLER_PENDING_SMC, 117aea0999eSEtienne Carriere }; 118aea0999eSEtienne Carriere 119aea0999eSEtienne Carriere /* 120aea0999eSEtienne Carriere * Returns whether SMC was handled from platform handler in secure monitor 121aea0999eSEtienne Carriere * or if it shall reach OP-TEE core . 122aea0999eSEtienne Carriere */ 123aea0999eSEtienne Carriere enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx); 1245849875fSAndrew F. Davis 1250160fec3SJerome Forissier void sm_save_unbanked_regs(struct sm_unbanked_regs *regs); 1260160fec3SJerome Forissier void sm_restore_unbanked_regs(struct sm_unbanked_regs *regs); 12765363c52SEtienne Carriere 128651d7537SJens Wiklander /* 129651d7537SJens Wiklander * These function return to secure monitor by SMC instead of a normal 130651d7537SJens Wiklander * function return. 131651d7537SJens Wiklander */ 132651d7537SJens Wiklander void vector_std_smc_entry(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, 133651d7537SJens Wiklander uint32_t a4, uint32_t a5, uint32_t a6, uint32_t a7); 134651d7537SJens Wiklander void vector_fast_smc_entry(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, 135651d7537SJens Wiklander uint32_t a4, uint32_t a5, uint32_t a6, uint32_t a7); 136651d7537SJens Wiklander void vector_fiq_entry(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, 137651d7537SJens Wiklander uint32_t a4, uint32_t a5, uint32_t a6, uint32_t a7); 138651d7537SJens Wiklander 139757331fcSJens Wiklander #endif /*!__ASSEMBLER__*/ 14065363c52SEtienne Carriere 14165363c52SEtienne Carriere /* 32 bit return value for sm_from_nsec() */ 14265363c52SEtienne Carriere #define SM_EXIT_TO_NON_SECURE 0 14365363c52SEtienne Carriere #define SM_EXIT_TO_SECURE 1 14465363c52SEtienne Carriere 145*d50fee03SEtienne Carriere #endif /*__SM_SM_H*/ 146