mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-24 22:05:40 +00:00

This patch adds the TSPD service which is responsible for managing communication between the non-secure state and the Test Secure Payload (TSP) executing in S-EL1. The TSPD does the following: 1. Determines the location of the TSP (BL3-2) image and passes control to it for initialization. This is done by exporting the 'bl32_init()' function. 2. Receives a structure containing the various entry points into the TSP image as a response to being initialized. The TSPD uses this information to determine how the TSP should be entered depending on the type of operation. 3. Implements a synchronous mechanism for entering into and returning from the TSP image. This mechanism saves the current C runtime context on top of the current stack and jumps to the TSP through an ERET instruction. The TSP issues an SMC to indicate completion of the previous request. The TSPD restores the saved C runtime context and resumes TSP execution. This patch also introduces a Make variable 'SPD' to choose the specific SPD to include in the build. By default, no SPDs are included in the build. Change-Id: I124da5695cdc510999b859a1bf007f4d049e04f3 Co-authored-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
134 lines
5.8 KiB
C
134 lines
5.8 KiB
C
/*
|
|
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* Redistributions of source code must retain the above copyright notice, this
|
|
* list of conditions and the following disclaimer.
|
|
*
|
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* Neither the name of ARM nor the names of its contributors may be used
|
|
* to endorse or promote products derived from this software without specific
|
|
* prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __SPD_PRIVATE_H__
|
|
#define __SPD_PRIVATE_H__
|
|
|
|
#include <context.h>
|
|
#include <arch.h>
|
|
#include <psci.h>
|
|
#include <tsp.h>
|
|
|
|
/*******************************************************************************
|
|
* Secure Payload PM state information e.g. SP is suspended, uninitialised etc
|
|
******************************************************************************/
|
|
#define TSP_STATE_OFF 0
|
|
#define TSP_STATE_ON 1
|
|
#define TSP_STATE_SUSPEND 2
|
|
|
|
/*******************************************************************************
|
|
* Secure Payload execution state information i.e. aarch32 or aarch64
|
|
******************************************************************************/
|
|
#define TSP_AARCH32 MODE_RW_32
|
|
#define TSP_AARCH64 MODE_RW_64
|
|
|
|
/*******************************************************************************
|
|
* The SPD should know the type of Secure Payload.
|
|
******************************************************************************/
|
|
#define TSP_TYPE_UP PSCI_TOS_NOT_UP_MIG_CAP
|
|
#define TSP_TYPE_UPM PSCI_TOS_UP_MIG_CAP
|
|
#define TSP_TYPE_MP PSCI_TOS_NOT_PRESENT_MP
|
|
|
|
/*******************************************************************************
|
|
* Secure Payload migrate type information as known to the SPD. We assume that
|
|
* the SPD is dealing with an MP Secure Payload.
|
|
******************************************************************************/
|
|
#define TSP_MIGRATE_INFO TSP_TYPE_MP
|
|
|
|
/*******************************************************************************
|
|
* Number of cpus that the present on this platform. TODO: Rely on a topology
|
|
* tree to determine this in the future to avoid assumptions about mpidr
|
|
* allocation
|
|
******************************************************************************/
|
|
#define TSPD_CORE_COUNT PLATFORM_CORE_COUNT
|
|
|
|
/*******************************************************************************
|
|
* Constants that allow assembler code to preserve callee-saved registers of the
|
|
* C runtime context while performing a security state switch.
|
|
******************************************************************************/
|
|
#define TSPD_C_RT_CTX_X19 0x0
|
|
#define TSPD_C_RT_CTX_X20 0x8
|
|
#define TSPD_C_RT_CTX_X21 0x10
|
|
#define TSPD_C_RT_CTX_X22 0x18
|
|
#define TSPD_C_RT_CTX_X23 0x20
|
|
#define TSPD_C_RT_CTX_X24 0x28
|
|
#define TSPD_C_RT_CTX_X25 0x30
|
|
#define TSPD_C_RT_CTX_X26 0x38
|
|
#define TSPD_C_RT_CTX_X27 0x40
|
|
#define TSPD_C_RT_CTX_X28 0x48
|
|
#define TSPD_C_RT_CTX_X29 0x50
|
|
#define TSPD_C_RT_CTX_X30 0x58
|
|
#define TSPD_C_RT_CTX_SIZE 0x60
|
|
#define TSPD_C_RT_CTX_ENTRIES (TSPD_C_RT_CTX_SIZE >> DWORD_SHIFT)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
/* AArch64 callee saved general purpose register context structure. */
|
|
DEFINE_REG_STRUCT(c_rt_regs, TSPD_C_RT_CTX_ENTRIES);
|
|
|
|
/*
|
|
* Compile time assertion to ensure that both the compiler and linker
|
|
* have the same double word aligned view of the size of the C runtime
|
|
* register context.
|
|
*/
|
|
CASSERT(TSPD_C_RT_CTX_SIZE == sizeof(c_rt_regs), \
|
|
assert_spd_c_rt_regs_size_mismatch);
|
|
|
|
/*******************************************************************************
|
|
* Structure which helps the SPD to maintain the per-cpu state of the SP.
|
|
* 'state' - collection of flags to track SP state e.g. on/off
|
|
* 'mpidr' - mpidr to associate a context with a cpu
|
|
* 'c_rt_ctx' - stack address to restore C runtime context from after returning
|
|
* from a synchronous entry into the SP.
|
|
* 'cpu_ctx' - space to maintain SP architectural state
|
|
******************************************************************************/
|
|
typedef struct {
|
|
uint32_t state;
|
|
uint64_t mpidr;
|
|
uint64_t c_rt_ctx;
|
|
cpu_context cpu_ctx;
|
|
} tsp_context;
|
|
|
|
/*******************************************************************************
|
|
* Function & Data prototypes
|
|
******************************************************************************/
|
|
extern uint64_t tspd_enter_sp(uint64_t *c_rt_ctx);
|
|
extern void __dead2 tspd_exit_sp(uint64_t c_rt_ctx, uint64_t ret);
|
|
extern uint64_t tspd_synchronous_sp_entry(tsp_context *tsp_ctx);
|
|
extern void __dead2 tspd_synchronous_sp_exit(tsp_context *tsp_ctx, uint64_t ret);
|
|
extern int32_t tspd_init_secure_context(uint64_t entrypoint,
|
|
uint32_t rw,
|
|
uint64_t mpidr,
|
|
tsp_context *tsp_ctx);
|
|
extern tsp_context tspd_sp_context[TSPD_CORE_COUNT];
|
|
extern entry_info *tsp_entry_info;
|
|
#endif /*__ASSEMBLY__*/
|
|
|
|
#endif /* __SPD_PRIVATE_H__ */
|