mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-08-15 08:57:02 +02:00
Instead of just knowing if the Secure Partition is being initialized or not, this generic state enum can be used to tell if the Secure Partition is busy and to add more states in the future if needed. Also, the spinlock of the secure_partition_context_t structure now only protects against concurrent accesses to the state of the secure partition. Previously, it used to lock down the whole structure, thus preventing one CPU to access any of its fields while another CPU was executing the partition. Change-Id: I51215328e2ca8ea2452f92e4a1cb237415958b22 Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
71 lines
1.8 KiB
C
71 lines
1.8 KiB
C
/*
|
|
* Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __SPM_PRIVATE_H__
|
|
#define __SPM_PRIVATE_H__
|
|
|
|
#include <context.h>
|
|
|
|
/*******************************************************************************
|
|
* Constants that allow assembler code to preserve callee-saved registers of the
|
|
* C runtime context while performing a security state switch.
|
|
******************************************************************************/
|
|
#define SP_C_RT_CTX_X19 0x0
|
|
#define SP_C_RT_CTX_X20 0x8
|
|
#define SP_C_RT_CTX_X21 0x10
|
|
#define SP_C_RT_CTX_X22 0x18
|
|
#define SP_C_RT_CTX_X23 0x20
|
|
#define SP_C_RT_CTX_X24 0x28
|
|
#define SP_C_RT_CTX_X25 0x30
|
|
#define SP_C_RT_CTX_X26 0x38
|
|
#define SP_C_RT_CTX_X27 0x40
|
|
#define SP_C_RT_CTX_X28 0x48
|
|
#define SP_C_RT_CTX_X29 0x50
|
|
#define SP_C_RT_CTX_X30 0x58
|
|
|
|
#define SP_C_RT_CTX_SIZE 0x60
|
|
#define SP_C_RT_CTX_ENTRIES (SP_C_RT_CTX_SIZE >> DWORD_SHIFT)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <spinlock.h>
|
|
#include <stdint.h>
|
|
#include <xlat_tables_v2.h>
|
|
|
|
typedef enum secure_partition_state {
|
|
SP_STATE_RESET = 0,
|
|
SP_STATE_IDLE,
|
|
SP_STATE_BUSY
|
|
} sp_state_t;
|
|
|
|
typedef struct sp_context {
|
|
uint64_t c_rt_ctx;
|
|
cpu_context_t cpu_ctx;
|
|
xlat_ctx_t *xlat_ctx_handle;
|
|
|
|
sp_state_t state;
|
|
spinlock_t state_lock;
|
|
} sp_context_t;
|
|
|
|
/* Assembly helpers */
|
|
uint64_t spm_secure_partition_enter(uint64_t *c_rt_ctx);
|
|
void __dead2 spm_secure_partition_exit(uint64_t c_rt_ctx, uint64_t ret);
|
|
|
|
void spm_sp_setup(sp_context_t *sp_ctx);
|
|
|
|
xlat_ctx_t *spm_get_sp_xlat_context(void);
|
|
|
|
int32_t spm_memory_attributes_get_smc_handler(sp_context_t *sp_ctx,
|
|
uintptr_t base_va);
|
|
int spm_memory_attributes_set_smc_handler(sp_context_t *sp_ctx,
|
|
u_register_t page_address,
|
|
u_register_t pages_count,
|
|
u_register_t smc_attributes);
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __SPM_PRIVATE_H__ */
|