From 71c32de1d78c95f5b4a9a47d6491adfa251a48f3 Mon Sep 17 00:00:00 2001 From: Chun-Chieh Li Date: Wed, 2 Jun 2021 11:38:11 +0800 Subject: [PATCH 1/3] M2354: Refine TF-M import readme Add bug report of GNU Arm Embedded Toolchain 10-2020-q4-major in CMSE support --- .../TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/README.md b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/README.md index e214c74e234..ba0f1507d91 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/README.md +++ b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/README.md @@ -75,7 +75,7 @@ To define memory spec of SRAM for TF-M/Mbed, search/change the line: Navigate [TF-M](https://www.trustedfirmware.org/projects/tf-m/). Then go through **DOCS** → **Getting Started Guides** → **Software requirements** for TF-M build environment setup. -**NOTE**: For unknown reason, **GNU Arm Embedded Toolchain 10-2020-q4-major** built code **FAILS** to run. Avoid this toolchain version. +**NOTE**: **GNU Arm Embedded Toolchain 10-2020-q4-major** built code **FAILS** to run. Avoid this toolchain version. Check [its bug report](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99157). ### Compile From 79cf5a01d5467c99c6353df8d7c8a4399aa045e3 Mon Sep 17 00:00:00 2001 From: Chun-Chieh Li Date: Tue, 1 Jun 2021 17:42:09 +0800 Subject: [PATCH 2/3] M2354: Synchronize platform extra secure files from TF-M These files are refactored on TF-M and make no logic change on Mbed. --- .../TARGET_TFM/platform_extra_secure.c | 165 ++++++++++-------- .../TARGET_TFM/platform_extra_secure.h | 126 ++++++------- 2 files changed, 155 insertions(+), 136 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.c b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.c index 7919d7d16b6..956dfedc8b1 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.c +++ b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.c @@ -19,23 +19,38 @@ #include "cmsis.h" #include "platform_extra_secure.h" -#ifdef __MBED__ +#if __MBED__ #include "mbed_error.h" #include "nu_bitutil.h" #include "tfm_platform_api.h" -#else +#elif NU_TFM_PLAT_IOCTL_NS +#include "tfm_platform_api.h" +#elif NU_TFM_PLAT_IOCTL_S #include "tfm_platform_system.h" #include #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS + +#if __MBED__ +#define PLAT_NSC_ERROR(SEC_FUNC, RC) \ + MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_HAL, MBED_ERROR_CODE_UNDERFLOW), \ + #SEC_FUNC "() failed with: ", RC) + +#elif NU_TFM_PLAT_IOCTL_NS +#define PLAT_NSC_ERROR(SEC_FUNC, RC) \ + do { \ + printf(#SEC_FUNC "() failed with: %d\n", RC); \ + while(1); \ + } while(0) + +#endif /* Secure function call via platform ioctl */ #define PLAT_NSC_CALL(SEC_FUNC, INBUF, INSIZE, OUTBUF, OUTSIZE) \ PLAT_NSC_CALL_(NU_PLAT_XTRA_SEC_REQ(SEC_FUNC), INBUF, INSIZE, OUTBUF, OUTSIZE) \ if (rc != TFM_PLATFORM_ERR_SUCCESS) { \ - MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_HAL, MBED_ERROR_CODE_UNDERFLOW), \ - #SEC_FUNC " failed with: ", rc); \ + PLAT_NSC_ERROR(SEC_FUNC, rc); \ } #define PLAT_NSC_CALL_(REQ, INBUF, INSIZE, OUTBUF, OUTSIZE) \ @@ -62,7 +77,7 @@ rc = tfm_platform_ioctl(request, NULL, NULL); \ } -#else +#elif NU_TFM_PLAT_IOCTL_S /* NOTE: Hazard of passing struct argument between client and service * @@ -100,6 +115,17 @@ } \ } \ +#define NU_MFP_POS(pin) ((pin % 8) * 4) +#define NU_MFP_MSK(pin) (0xful << NU_MFP_POS(pin)) + +bool nu_check_sys_ns(uint32_t modidx); +bool nu_check_clk_ns(uint32_t modidx); +bool nu_check_gpio_ns(uint32_t port_index, uint32_t pin_index); + +#endif + +#if NU_TFM_PLAT_IOCTL_NS || NU_TFM_PLAT_IOCTL_S + __STATIC_INLINE uint32_t nu_get32_be(const uint8_t *pos) { uint32_t val; @@ -123,16 +149,9 @@ __STATIC_INLINE void nu_set32_be(uint8_t *pos, uint32_t val) *pos ++ = (val & 0xFF); } -#define NU_MFP_POS(pin) ((pin % 8) * 4) -#define NU_MFP_MSK(pin) (0xful << NU_MFP_POS(pin)) - -bool nu_check_sys_ns(uint32_t modidx); -bool nu_check_clk_ns(uint32_t modidx); -bool nu_check_gpio_ns(uint32_t port_index, uint32_t pin_index); - #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void SYS_ResetModule_S(uint32_t u32ModuleIndex) { /* Set up input parameter for NSC call */ @@ -142,7 +161,7 @@ void SYS_ResetModule_S(uint32_t u32ModuleIndex) /* Invoke NSC function */ PLAT_NSC_CALL(SYS_ResetModule_S, inbuf, sizeof(inbuf), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(SYS_ResetModule_S) { /* Check parameter validity */ @@ -161,13 +180,13 @@ NU_PLAT_XTRA_SEC_HDLR(SYS_ResetModule_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void SYS_LockReg_S(void) { /* Invoke NSC function */ PLAT_NSC_CALL(SYS_LockReg_S, NULL, 0, NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(SYS_LockReg_S) { /* Check parameter validity */ @@ -179,13 +198,13 @@ NU_PLAT_XTRA_SEC_HDLR(SYS_LockReg_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void SYS_UnlockReg_S(void) { /* Invoke NSC function */ PLAT_NSC_CALL(SYS_UnlockReg_S, NULL, 0, NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(SYS_UnlockReg_S) { /* Check parameter validity */ @@ -197,7 +216,7 @@ NU_PLAT_XTRA_SEC_HDLR(SYS_UnlockReg_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_SetModuleClock_S(uint32_t u32ModuleIndex, uint32_t u32ClkSrc, uint32_t u32ClkDiv) { /* Set up input parameter for NSC call */ @@ -209,7 +228,7 @@ void CLK_SetModuleClock_S(uint32_t u32ModuleIndex, uint32_t u32ClkSrc, uint32_t /* Invoke NSC function */ PLAT_NSC_CALL(CLK_SetModuleClock_S, inbuf, sizeof(inbuf), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_SetModuleClock_S) { /* Check parameter validity */ @@ -230,7 +249,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_SetModuleClock_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_EnableModuleClock_S(uint32_t u32ModuleIndex) { /* Set up input parameter for NSC call */ @@ -240,7 +259,7 @@ void CLK_EnableModuleClock_S(uint32_t u32ModuleIndex) /* Invoke NSC function */ PLAT_NSC_CALL(CLK_EnableModuleClock_S, inbuf, sizeof(inbuf), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_EnableModuleClock_S) { /* Check parameter validity */ @@ -259,7 +278,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_EnableModuleClock_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_DisableModuleClock_S(uint32_t u32ModuleIndex) { /* Set up input parameter for NSC call */ @@ -269,7 +288,7 @@ void CLK_DisableModuleClock_S(uint32_t u32ModuleIndex) /* Invoke NSC function */ PLAT_NSC_CALL(CLK_DisableModuleClock_S, inbuf, sizeof(inbuf), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_DisableModuleClock_S) { /* Check parameter validity */ @@ -288,13 +307,13 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_DisableModuleClock_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_Idle_S(void) { /* Invoke NSC function */ PLAT_NSC_CALL(CLK_Idle_S, NULL, 0, NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_Idle_S) { /* Check parameter validity */ @@ -308,13 +327,13 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_Idle_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_PowerDown_S(void) { /* Invoke NSC function */ PLAT_NSC_CALL(CLK_PowerDown_S, NULL, 0, NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_PowerDown_S) { /* Check parameter validity */ @@ -328,7 +347,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_PowerDown_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetHXTFreq_S(void) { /* Set up output parameter for NSC call */ @@ -341,7 +360,7 @@ uint32_t CLK_GetHXTFreq_S(void) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetHXTFreq_S) { /* Check parameter validity */ @@ -354,7 +373,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetHXTFreq_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetLXTFreq_S(void) { /* Set up output parameter for NSC call */ @@ -367,7 +386,7 @@ uint32_t CLK_GetLXTFreq_S(void) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetLXTFreq_S) { /* Check parameter validity */ @@ -380,7 +399,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetLXTFreq_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetHCLKFreq_S(void) { /* Set up output parameter for NSC call */ @@ -393,7 +412,7 @@ uint32_t CLK_GetHCLKFreq_S(void) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetHCLKFreq_S) { /* Check parameter validity */ @@ -406,7 +425,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetHCLKFreq_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetPCLK0Freq_S(void) { /* Set up output parameter for NSC call */ @@ -419,7 +438,7 @@ uint32_t CLK_GetPCLK0Freq_S(void) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetPCLK0Freq_S) { /* Check parameter validity */ @@ -432,7 +451,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetPCLK0Freq_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetPCLK1Freq_S(void) { /* Set up output parameter for NSC call */ @@ -445,7 +464,7 @@ uint32_t CLK_GetPCLK1Freq_S(void) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetPCLK1Freq_S) { /* Check parameter validity */ @@ -458,7 +477,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetPCLK1Freq_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetCPUFreq_S(void) { /* Set up output parameter for NSC call */ @@ -471,7 +490,7 @@ uint32_t CLK_GetCPUFreq_S(void) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetCPUFreq_S) { /* Check parameter validity */ @@ -484,7 +503,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetCPUFreq_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetPLLClockFreq_S(void) { /* Set up output parameter for NSC call */ @@ -497,7 +516,7 @@ uint32_t CLK_GetPLLClockFreq_S(void) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetPLLClockFreq_S) { /* Check parameter validity */ @@ -510,7 +529,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetPLLClockFreq_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetModuleClockSource_S(uint32_t u32ModuleIndex) { /* Set up input parameter for NSC call */ @@ -527,7 +546,7 @@ uint32_t CLK_GetModuleClockSource_S(uint32_t u32ModuleIndex) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetModuleClockSource_S) { /* Check parameter validity */ @@ -541,7 +560,7 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetModuleClockSource_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetModuleClockDivider_S(uint32_t u32ModuleIndex) { /* Set up input parameter for NSC call */ @@ -558,7 +577,7 @@ uint32_t CLK_GetModuleClockDivider_S(uint32_t u32ModuleIndex) uint32_t output = nu_get32_be(outbuf); return output; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetModuleClockDivider_S) { /* Check parameter validity */ @@ -572,13 +591,13 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetModuleClockDivider_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_Open_S(S_RTC_TIME_DATA_T_PTR sPt) { /* Invoke NSC function */ PLAT_NSC_CALL(RTC_Open_S, sPt, (sPt ? sizeof(S_RTC_TIME_DATA_T) : 0), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_Open_S) { /* Check parameter validity */ @@ -596,13 +615,13 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_Open_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_Close_S(void) { /* Invoke NSC function */ PLAT_NSC_CALL(RTC_Close_S, NULL, 0, NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_Close_S) { /* Check parameter validity */ @@ -614,13 +633,13 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_Close_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_WaitAccessEnable_S(void) { /* On M2354, RTC_WaitAccessEnable() is unnecessary and is not provided by BSP. * Provide a dummy one to make code consistent. */ } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_WaitAccessEnable_S) { /* On M2354, RTC_WaitAccessEnable() is unnecessary and is not provided by BSP. @@ -633,13 +652,13 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_WaitAccessEnable_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_GetDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt) { /* Invoke NSC function */ PLAT_NSC_CALL(RTC_GetDateAndTime_S, NULL, 0, sPt, sizeof(S_RTC_TIME_DATA_T)); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_GetDateAndTime_S) { /* Check parameter validity */ @@ -653,13 +672,13 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_GetDateAndTime_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_GetAlarmDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt) { /* Invoke NSC function */ PLAT_NSC_CALL(RTC_GetAlarmDateAndTime_S, NULL, 0, sPt, sizeof(S_RTC_TIME_DATA_T)); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_GetAlarmDateAndTime_S) { /* Check parameter validity */ @@ -673,13 +692,13 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_GetAlarmDateAndTime_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_SetDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt) { /* Invoke NSC function */ PLAT_NSC_CALL(RTC_SetDateAndTime_S, sPt, sizeof(S_RTC_TIME_DATA_T), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_SetDateAndTime_S) { /* Check parameter validity */ @@ -693,13 +712,13 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_SetDateAndTime_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_SetAlarmDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt) { /* Invoke NSC function */ PLAT_NSC_CALL(RTC_SetAlarmDateAndTime_S, sPt, sizeof(S_RTC_TIME_DATA_T), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_SetAlarmDateAndTime_S) { /* Check parameter validity */ @@ -713,7 +732,7 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_SetAlarmDateAndTime_S) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_pin_function_s(uint32_t port_index, uint32_t pin_index, uint32_t data) { /* Set up input parameter for NSC call */ @@ -725,7 +744,7 @@ void nu_pin_function_s(uint32_t port_index, uint32_t pin_index, uint32_t data) /* Invoke NSC function */ PLAT_NSC_CALL(nu_pin_function_s, inbuf, sizeof(inbuf), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_pin_function_s) { /* Check parameter validity */ @@ -750,7 +769,7 @@ NU_PLAT_XTRA_SEC_HDLR(nu_pin_function_s) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_idle_s(void) { /* We should have had default (shallow) sleep/idle mode configuration guaranteed by SPE. @@ -758,7 +777,7 @@ void nu_idle_s(void) * (shallow) sleep-related tests. */ __WFI(); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_idle_s) { /* Check parameter validity */ @@ -768,13 +787,13 @@ NU_PLAT_XTRA_SEC_HDLR(nu_idle_s) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_powerdown_s(void) { /* Invoke NSC function */ PLAT_NSC_CALL(nu_powerdown_s, NULL, 0, NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_powerdown_s) { /* Check parameter validity */ @@ -800,7 +819,7 @@ NU_PLAT_XTRA_SEC_HDLR(nu_powerdown_s) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t nu_rtc_read_spare_register_s(uint32_t reg_num) { /* Set up input parameter for NSC call */ @@ -817,7 +836,7 @@ uint32_t nu_rtc_read_spare_register_s(uint32_t reg_num) int32_t reg_val = nu_get32_be(outbuf); return reg_val; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_rtc_read_spare_register_s) { /* Check parameter validity */ @@ -834,7 +853,7 @@ NU_PLAT_XTRA_SEC_HDLR(nu_rtc_read_spare_register_s) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_rtc_write_spare_register_s(uint32_t reg_num, uint32_t reg_val) { /* Set up input parameter for NSC call */ @@ -845,7 +864,7 @@ void nu_rtc_write_spare_register_s(uint32_t reg_num, uint32_t reg_val) /* Invoke NSC function */ PLAT_NSC_CALL(nu_rtc_write_spare_register_s, inbuf, sizeof(inbuf), NULL, 0); } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_rtc_write_spare_register_s) { /* Check parameter validity */ @@ -862,7 +881,7 @@ NU_PLAT_XTRA_SEC_HDLR(nu_rtc_write_spare_register_s) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS int32_t nu_rtc_isenabled_s(void) { /* Set up output parameter for NSC call */ @@ -875,7 +894,7 @@ int32_t nu_rtc_isenabled_s(void) int32_t enabled = nu_get32_be(outbuf); return enabled; } -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_rtc_isenabled_s) { /* Check parameter validity */ diff --git a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.h b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.h index 83ebaf2bf74..00bd958e2c7 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.h +++ b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/platform_extra_secure.h @@ -22,9 +22,9 @@ #include #include -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS typedef void * S_RTC_TIME_DATA_T_PTR; -#else +#elif NU_TFM_PLAT_IOCTL_S #include "tfm_platform_system.h" #endif @@ -85,7 +85,7 @@ typedef enum { NU_PLAT_XTRA_SEC_REQ(INT_SIZE) = INT_MAX } nu_plat_req_t; -#ifndef __MBED__ +#if NU_TFM_PLAT_IOCTL_S #define NU_PLAT_XTRA_SEC_HDLR(SEC_FUN) \ enum tfm_platform_err_t SEC_FUN(psa_invec *in_vec, psa_outvec *out_vec) @@ -97,9 +97,9 @@ typedef enum { * Guard access to secure module from non-secure domain before SYS_ResetModule. * Its synopsis is the same as SYS_ResetModule. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void SYS_ResetModule_S(uint32_t u32ModuleIndex); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(SYS_ResetModule_S); #endif @@ -108,9 +108,9 @@ NU_PLAT_XTRA_SEC_HDLR(SYS_ResetModule_S); * Guard access to secure module from non-secure domain before SYS_LockReg. * Its synopsis is the same as SYS_LockReg. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void SYS_LockReg_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(SYS_LockReg_S); #endif @@ -119,9 +119,9 @@ NU_PLAT_XTRA_SEC_HDLR(SYS_LockReg_S); * Guard access to secure module from non-secure domain before SYS_UnlockReg. * Its synopsis is the same as SYS_UnlockReg. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void SYS_UnlockReg_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(SYS_UnlockReg_S); #endif @@ -130,9 +130,9 @@ NU_PLAT_XTRA_SEC_HDLR(SYS_UnlockReg_S); * Guard access to secure module from non-secure domain before CLK_SetModuleClock. * Its synopsis is the same as CLK_SetModuleClock. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_SetModuleClock_S(uint32_t u32ModuleIndex, uint32_t u32ClkSrc, uint32_t u32ClkDiv); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_SetModuleClock_S); #endif @@ -141,9 +141,9 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_SetModuleClock_S); * Guard access to secure module from non-secure domain before CLK_EnableModuleClock. * Its synopsis is the same as CLK_EnableModuleClock. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_EnableModuleClock_S(uint32_t u32ModuleIndex); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_EnableModuleClock_S); #endif @@ -153,75 +153,75 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_EnableModuleClock_S); * Its synopsis is the same as CLK_DisableModuleClock. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_DisableModuleClock_S(uint32_t u32ModuleIndex); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_DisableModuleClock_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_Idle_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_Idle_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void CLK_PowerDown_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_PowerDown_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetHXTFreq_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetHXTFreq_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetLXTFreq_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetLXTFreq_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetHCLKFreq_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetHCLKFreq_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetPCLK0Freq_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetPCLK0Freq_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetPCLK1Freq_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetPCLK1Freq_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetCPUFreq_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetCPUFreq_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetPLLClockFreq_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetPLLClockFreq_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetModuleClockSource_S(uint32_t u32ModuleIndex); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetModuleClockSource_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t CLK_GetModuleClockDivider_S(uint32_t u32ModuleIndex); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(CLK_GetModuleClockDivider_S); #endif @@ -232,21 +232,21 @@ NU_PLAT_XTRA_SEC_HDLR(CLK_GetModuleClockDivider_S); * functions. We determine to choose int64_t rather than int32_t to avoid 'Year 2038 problem'. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_Open_S(S_RTC_TIME_DATA_T_PTR sPt); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_Open_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_Close_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_Close_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_WaitAccessEnable_S(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_WaitAccessEnable_S); __STATIC_INLINE void RTC_WaitAccessEnable(void) @@ -256,27 +256,27 @@ __STATIC_INLINE void RTC_WaitAccessEnable(void) } #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_GetDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_GetDateAndTime_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_GetAlarmDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_GetAlarmDateAndTime_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_SetDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_SetDateAndTime_S); #endif -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void RTC_SetAlarmDateAndTime_S(S_RTC_TIME_DATA_T_PTR sPt); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(RTC_SetAlarmDateAndTime_S); #endif @@ -284,23 +284,23 @@ NU_PLAT_XTRA_SEC_HDLR(RTC_SetAlarmDateAndTime_S); * * Guard access to secure GPIO from non-secure domain. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_pin_function_s(uint32_t port_index, uint32_t pin_index, uint32_t data); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_pin_function_s); #endif /* Secure sequence of SYS_UnlockReg > CLK_Idle > SYS_LockReg */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_idle_s(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_idle_s); #endif /* Secure sequence of SYS_UnlockReg > CLK_PowerDown > SYS_LockReg */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_powerdown_s(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_powerdown_s); #endif @@ -312,9 +312,9 @@ NU_PLAT_XTRA_SEC_HDLR(nu_powerdown_s); * RTC_WaitAccessEnable(); * RTC_READ_SPARE_REGISTER(RTC, reg_num); */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS uint32_t nu_rtc_read_spare_register_s(uint32_t reg_num); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_rtc_read_spare_register_s); #endif @@ -326,9 +326,9 @@ NU_PLAT_XTRA_SEC_HDLR(nu_rtc_read_spare_register_s); * RTC_WaitAccessEnable(); * RTC_WRITE_SPARE_REGISTER(RTC, reg_num, reg_val); */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS void nu_rtc_write_spare_register_s(uint32_t reg_num, uint32_t reg_val); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_rtc_write_spare_register_s); #endif @@ -337,9 +337,9 @@ NU_PLAT_XTRA_SEC_HDLR(nu_rtc_write_spare_register_s); * Its synopsis is the same as normal version except change of return/argument type for * binary-compatible across compilers. */ -#ifdef __MBED__ +#if __MBED__ || NU_TFM_PLAT_IOCTL_NS int32_t nu_rtc_isenabled_s(void); -#else +#elif NU_TFM_PLAT_IOCTL_S NU_PLAT_XTRA_SEC_HDLR(nu_rtc_isenabled_s); #endif From 0b6fdf46f069f34f3f66495bc486bd26f937bec0 Mon Sep 17 00:00:00 2001 From: Chun-Chieh Li Date: Fri, 28 May 2021 16:21:12 +0800 Subject: [PATCH 3/3] M2354: Default to HXT not present 1. Build TF-M v1.3 with GNUARM and HXT not present. 2. Support configurability of HXT presence (targets.json). 3. Default HXT to not present (targets.json). This must align with built TF-M secure code above. --- .../COMPONENT_TFM_S_FW/bl2.bin | Bin 28612 -> 28600 bytes .../COMPONENT_TFM_S_FW/tfm_s.bin | Bin 323872 -> 323872 bytes targets/targets.json | 6 ++++++ 3 files changed, 6 insertions(+) diff --git a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/bl2.bin b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/bl2.bin index 330ac9c9f9364c55523f7494bf646fb55ee54a24..a80002a1625f2174f05196d2cd5e106ced3b5dc5 100644 GIT binary patch delta 1789 zcmY+E4NOy46vyv*?-eK?(#|pDqtH?qkb*$K4|I#P*ryc>*2E#=6cnY*6?FzTVh|m1 z>YR!@a~nZ)=!}_}ndZsF1R^fF&1A`F+)P-u0do!=hCRz{kq^65Ta9b-`@i#b?>+b3 z*L$rWI{V?g3!n=}K~EaZ<-@mV<5DAP#$nVY;qwO4Y6Es7m9VOz-Pj)eTH^cd@D@|13I;Qk*f|Wxv>s zVu73S{^<2b(0WV+eYvSc9H3Q`RYuXD>BJ#LCdg7$P$NLHbTrroumgueaw3+g3S2#E ze^m^oC=_)?zsWG z32mVZ!d7e3pX^qU*I;Yt(ZpW^*+}o>Aw}A#^LO9d(fU^uWLhyyuly`fGlDz9HiYG6 zKh1uP!(l_}@74eBV4ie4dtDtIQ+4 zqI)2a*@j!EIbb{XPs@U8jEr2Xo;fLK>6n>GEE5+m6y%q&F|r=+;iJeBkR*#L1|qf? zRY_XkzCe(*xLMuWxU#^%{K*N>em4Xe51pcW*FuU3;d#QqQ#&YceLZJL>E#VEy@Da0 z+Q=~aW)a;5f${H7RMa;maE8-;r|8Y>S}3|-^i>GHs$q)6KdJxAce+okL9(bq+W*2V zfFSA0^i2Srk|9dN!&S7*FvD>?JfjXik`yrr5QivKL^eS3O zzrwAgZFrRQ0A41o$KOb+5#sf*0#ir}(L$Po4$?$CLK=Y`@ue_`5t?+x595VmIUd%; zM69gXXP?LD8`kmiC9Kq>!$~|qdJsEE-@$&;^{7lphhof4FoOZ>6B=L}dJ^g(6SpSr zfxpp1dIlS`ZLkvKbctZY`8o}lu#7Yp-`0)7dEAtA1uF;(nYY#1qtq9MFb*N2~y`YP=zfXRwJvfKrsJ9f-$%gQ_(eetsCY`dBL$KF7 zM*pHt3@&Pii_#ZGaR6)a`qEdqf+^f-eFvAp;*V5s)MsI zxpPd_-6KA%!q8Q>6v?%WJ-|Dw_R<(fInO67rhuJDBlZ!8hz|+hZ=zf}v}S};w2*&R z+Fh9o%4g+L_d5Q0_s05D&$(E)VH6%nH5=!EuFK(@izB8nu8J|guVO5OG2Z7(SF3}A zHauFwn7W9u3riV`qGt?|PUy%Vq-P7!Kn?wEs DpPYid delta 1830 zcmY+Ee@s(X6vyv*eFaMS(T;S`LE)8#0jmfM`~l9$&j$?_#Ap};1r)Y2EsQy{G{X_c zm@{J3oiSy~oKZ5CNCJ7m$YLj1NYuRvVn6OTX5PGEfuKUDXqpe`F!8`b?-g* z-Pe108pfw#$O&*A=fOZ4&E>#NtmKlzTNeeE%9vxyEq83kE-o4N;UJd}pWuBi4Njs? zmK=L#--f;aJ4!tn!=m%%TU5#9j?Tr$l)W49+84bG zaoz&wAI0A}ncQgUEC`wqT_Mb0Yo%JaC{PcU5y4PX&@0Z+su`+$(VzJiXXRwL3u&N^nO1SD->x8mf`bw$9?QlSk-R5=$cVc1pLtblXMOP$2pdMdxSBin&P;8jJ7I z;oS{nY}giIg?5~dNCzuMM%JmbmwADXnH7lDVrdcYScM&tHn@+EA}e52GO4r>-kz^Y z6ny&v-ti)~s!w+`=K0^iz!C`8W?|LCNzv6^L@_=ro1b}N2W9WJamJ(xnNd5z8{?>r z_4&S8MAzoP_>Y(BZJqI)v4843y_xPJ(IxmQcwf~VMN(Gk|MH#giglYTs*nypw+0|g zx*D|yU|ce4bTYVxrkG;5fX8C?!mzd!Zyr`FNRFC#UB70F2vg)3)>R9z<~>- zgLpvbgPjw68JKaVpm~!#B8ptr0Fr=hkL&a76lXy&ND!n#wr6X5puE39E}m?FfPS|tIK2LJL;Dfw3uT~Rq-C7AZ8+~Sy$km zTw3rffOw4iF?HdnG__+F(Jfnp%4^F*yh{iP3$Yk-`DDV!EO?*mx zPJBW5e!;cU2RrX^@_zC!N&6eJK=HI(8r~&)*0t|G|BQ>nyP~kYX$Cyfj@Q?L{<_sS zA4fzmu8}dnuVO5OF`3VoM&1YxYLb^RrX%c|8Pn4Q zN@6?FL^KmSw$eDlM)pDCC^1U(68*#=>RZk#YSG&P)Xp;AXvxy*su;^8z9!}fc6>rc W$_7x=x+(POo?9@pWh)M~hWrPryOyT_ diff --git a/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/tfm_s.bin b/targets/TARGET_NUVOTON/TARGET_M2354/TARGET_TFM/TARGET_NU_M2354/COMPONENT_TFM_S_FW/tfm_s.bin index 86f47f0aad6766b5f256368856e1f112ef69309e..787bd0378babe5bab25df657213a54db42fcb2b2 100644 GIT binary patch delta 8800 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 z