mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-23 13:36:05 +00:00
SPM: Implement global response buffer helpers
This buffer is where all the responses from Secure Partitions are stored until they are requested. Change-Id: Iafeb8f0848c5ff6f3e187060cd3a47702484dc45 Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
This commit is contained in:
parent
2f48ddae74
commit
aa9ae89835
4 changed files with 116 additions and 0 deletions
|
@ -139,5 +139,6 @@
|
|||
#define PLAT_SPM_SERVICES_MAX U(30)
|
||||
|
||||
#define PLAT_SPCI_HANDLES_MAX_NUM U(20)
|
||||
#define PLAT_SPM_RESPONSES_MAX U(30)
|
||||
|
||||
#endif /* ARM_SPM_DEF_H */
|
||||
|
|
|
@ -19,6 +19,7 @@ SPM_SOURCES := $(addprefix services/std_svc/spm/, \
|
|||
sp_setup.c \
|
||||
sp_xlat.c \
|
||||
spci.c \
|
||||
spm_buffers.c \
|
||||
spm_main.c \
|
||||
sprt.c) \
|
||||
${SPRT_LIB_SOURCES}
|
||||
|
|
108
services/std_svc/spm/spm_buffers.c
Normal file
108
services/std_svc/spm/spm_buffers.c
Normal file
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* Copyright (c) 2018, Arm Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <arch_helpers.h>
|
||||
#include <platform_def.h>
|
||||
#include <spinlock.h>
|
||||
#include <utils_def.h>
|
||||
|
||||
/*******************************************************************************
|
||||
* Secure Service response global array. All the responses to the requests done
|
||||
* to the Secure Partition are stored here. They are removed from the array as
|
||||
* soon as their value is read.
|
||||
******************************************************************************/
|
||||
struct sprt_response {
|
||||
int is_valid;
|
||||
uint32_t token;
|
||||
uint16_t client_id, handle;
|
||||
u_register_t x1, x2, x3;
|
||||
};
|
||||
|
||||
static struct sprt_response responses[PLAT_SPM_RESPONSES_MAX];
|
||||
|
||||
static spinlock_t responses_lock;
|
||||
|
||||
/* Add response to the global response buffer. Returns 0 on success else -1. */
|
||||
int spm_response_add(uint16_t client_id, uint16_t handle, uint32_t token,
|
||||
u_register_t x1, u_register_t x2, u_register_t x3)
|
||||
{
|
||||
spin_lock(&responses_lock);
|
||||
|
||||
/* Make sure that there isn't any other response with the same token. */
|
||||
for (unsigned int i = 0U; i < ARRAY_SIZE(responses); i++) {
|
||||
struct sprt_response *resp = &(responses[i]);
|
||||
|
||||
if ((resp->is_valid == 1) && (resp->token == token)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(responses); i++) {
|
||||
struct sprt_response *resp = &(responses[i]);
|
||||
|
||||
if (resp->is_valid == 0) {
|
||||
resp->token = token;
|
||||
resp->client_id = client_id;
|
||||
resp->handle = handle;
|
||||
resp->x1 = x1;
|
||||
resp->x2 = x2;
|
||||
resp->x3 = x3;
|
||||
|
||||
dmbish();
|
||||
|
||||
resp->is_valid = 1;
|
||||
|
||||
spin_unlock(&responses_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock(&responses_lock);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a response from the requests array and removes it from it. Returns 0
|
||||
* on success, -1 if it wasn't found.
|
||||
*/
|
||||
int spm_response_get(uint16_t client_id, uint16_t handle, uint32_t token,
|
||||
u_register_t *x1, u_register_t *x2, u_register_t *x3)
|
||||
{
|
||||
spin_lock(&responses_lock);
|
||||
|
||||
for (unsigned int i = 0U; i < ARRAY_SIZE(responses); i++) {
|
||||
struct sprt_response *resp = &(responses[i]);
|
||||
|
||||
/* Ignore invalid entries */
|
||||
if (resp->is_valid == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Make sure that all the information matches the stored one */
|
||||
if ((resp->token != token) || (resp->client_id != client_id) ||
|
||||
(resp->handle != handle)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
*x1 = resp->x1;
|
||||
*x2 = resp->x2;
|
||||
*x3 = resp->x3;
|
||||
|
||||
dmbish();
|
||||
|
||||
resp->is_valid = 0;
|
||||
|
||||
spin_unlock(&responses_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
spin_unlock(&responses_lock);
|
||||
|
||||
return -1;
|
||||
}
|
|
@ -104,6 +104,12 @@ void spm_cpu_set_sp_ctx(unsigned int linear_id, sp_context_t *sp_ctx);
|
|||
sp_context_t *spm_cpu_get_sp_ctx(unsigned int linear_id);
|
||||
sp_context_t *spm_sp_get_by_uuid(const uint32_t (*svc_uuid)[4]);
|
||||
|
||||
/* Functions to manipulate response and requests buffers */
|
||||
int spm_response_add(uint16_t client_id, uint16_t handle, uint32_t token,
|
||||
u_register_t x1, u_register_t x2, u_register_t x3);
|
||||
int spm_response_get(uint16_t client_id, uint16_t handle, uint32_t token,
|
||||
u_register_t *x1, u_register_t *x2, u_register_t *x3);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* SPM_PRIVATE_H */
|
||||
|
|
Loading…
Add table
Reference in a new issue