mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
feat(esp_tee): Support for ESP-TEE - the main component
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "esp_attr.h"
|
||||
#include "esp_private/cache_utils.h"
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
#include "esp_tee.h"
|
||||
#include "secure_service_num.h"
|
||||
|
||||
/* See esp_tee_u2m_switch.S */
|
||||
extern uint32_t _u2m_switch(int argc, va_list ap);
|
||||
|
||||
static SemaphoreHandle_t s_tee_mutex;
|
||||
static StaticSemaphore_t s_tee_mutex_buf;
|
||||
|
||||
static void init_mutex(void)
|
||||
{
|
||||
static bool is_first_call = true;
|
||||
if (is_first_call) {
|
||||
s_tee_mutex = xSemaphoreCreateMutexStatic(&s_tee_mutex_buf);
|
||||
is_first_call = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TEE interface API used by untrusted side application
|
||||
* to call secure service in trusted side
|
||||
*/
|
||||
uint32_t esp_tee_service_call(int argc, ...)
|
||||
{
|
||||
init_mutex();
|
||||
|
||||
uint32_t val = UINT32_MAX;
|
||||
va_list ap;
|
||||
va_start(ap, argc);
|
||||
|
||||
if (xTaskGetSchedulerState() == taskSCHEDULER_RUNNING) {
|
||||
if (xSemaphoreTake(s_tee_mutex, portMAX_DELAY) == pdTRUE) {
|
||||
val = _u2m_switch(argc, ap);
|
||||
xSemaphoreGive(s_tee_mutex);
|
||||
}
|
||||
} else {
|
||||
val = _u2m_switch(argc, ap);
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
return val;
|
||||
}
|
||||
|
||||
IRAM_ATTR uint32_t esp_tee_service_call_with_noniram_intr_disabled(int argc, ...)
|
||||
{
|
||||
uint32_t val = UINT32_MAX;
|
||||
va_list ap;
|
||||
va_start(ap, argc);
|
||||
|
||||
/* NOTE: Disabling the scheduler and non-IRAM residing interrupts */
|
||||
spi_flash_op_lock();
|
||||
esp_intr_noniram_disable();
|
||||
|
||||
val = _u2m_switch(argc, ap);
|
||||
|
||||
esp_intr_noniram_enable();
|
||||
spi_flash_op_unlock();
|
||||
|
||||
va_end(ap);
|
||||
return val;
|
||||
}
|
||||
Reference in New Issue
Block a user