From 5b403a6a0737d2f7d0147750a02f3a1140f68c37 Mon Sep 17 00:00:00 2001 From: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:58:07 +0530 Subject: [PATCH] Add reg tests to NuMaker M2351 project (#992) * Add reg tests to NuMaker M2351 project Signed-off-by: Gaurav Aggarwal * Add reg tests for IAR Signed-off-by: Gaurav Aggarwal * Fix formatting check Signed-off-by: Gaurav Aggarwal * Fix header check Signed-off-by: Gaurav Aggarwal --------- Signed-off-by: Gaurav Aggarwal --- .github/scripts/core_checker.py | 1 + .../.gitignore | 10 + .../Nuvoton_Code/StdDriver/src/retarget.c | 9 +- .../IAR/NonSecure/FreeRTOSDemo_ns.ewd | 128 ++++-- .../IAR/NonSecure/FreeRTOSDemo_ns.ewp | 188 ++++++--- .../Projects/IAR/NonSecure/main_ns.c | 11 +- .../Projects/IAR/Secure/FreeRTOSDemo_s.ewd | 130 ++++-- .../Projects/IAR/Secure/FreeRTOSDemo_s.ewp | 178 ++++++--- .../Projects/IAR/Secure/main_s.c | 8 +- .../Keil/NonSecure/FreeRTOSDemo_ns.uvoptx | 62 ++- .../Keil/NonSecure/FreeRTOSDemo_ns.uvprojx | 36 +- .../Projects/Keil/NonSecure/main_ns.c | 11 +- .../Keil/Secure/FreeRTOSDemo_s.uvoptx | 60 ++- .../Keil/Secure/FreeRTOSDemo_s.uvprojx | 26 +- .../Projects/Keil/Secure/main_s.c | 8 +- .../RegTests/reg_tests.c | 373 ++++++++++++++++++ .../RegTests/reg_tests.h | 35 ++ .../GCC/ARM_CM23/non_secure/reg_test_asm.c | 312 +++++++++++++++ .../GCC/ARM_CM23/non_secure/reg_test_asm.h | 46 +++ .../GCC/ARM_CM23/secure/secure_reg_test_asm.c | 151 +++++++ .../GCC/ARM_CM23/secure/secure_reg_test_asm.h | 49 +++ .../IAR/ARM_CM23/non_secure/reg_test_asm.h | 46 +++ .../IAR/ARM_CM23/non_secure/reg_test_asm.s | 298 ++++++++++++++ .../IAR/ARM_CM23/secure/secure_reg_test.c | 61 +++ .../IAR/ARM_CM23/secure/secure_reg_test_asm.h | 49 +++ .../IAR/ARM_CM23/secure/secure_reg_test_asm.s | 127 ++++++ 26 files changed, 2185 insertions(+), 228 deletions(-) create mode 100644 FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/.gitignore create mode 100644 FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.c create mode 100644 FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.h create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.c create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.h create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.c create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.h create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.h create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.s create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test.c create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.h create mode 100644 FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.s diff --git a/.github/scripts/core_checker.py b/.github/scripts/core_checker.py index 471f248353..f029e3b76c 100755 --- a/.github/scripts/core_checker.py +++ b/.github/scripts/core_checker.py @@ -260,6 +260,7 @@ FREERTOS_IGNORED_PATTERNS = [ r'.*mbedtls_config\.h.*', r'.*CMSIS.*', r'.*/Nordic_Code/*', + r'.*/Nuvoton_Code/*', r'.*/ST_Code/*', r'.*/NXP_Code/*', r'.*/makefile', diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/.gitignore b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/.gitignore new file mode 100644 index 0000000000..30de058bd1 --- /dev/null +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/.gitignore @@ -0,0 +1,10 @@ +# Auto generated files. +*.uvgui* +settings/ +Nu_Link_Driver.ini +*.ewt +*.dep + +# Build artifacts. +Objects/ +Listings/ diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/retarget.c b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/retarget.c index 486df61248..127cd2d271 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/retarget.c +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Nuvoton_Code/StdDriver/src/retarget.c @@ -496,10 +496,15 @@ int fputc(int ch, FILE *stream) } -#if defined ( __GNUC__ ) +#if ( defined ( __GNUC__ ) || defined( __ICCARM__ ) ) #if !defined(OS_USE_SEMIHOSTING) -int _write (int fd, char *ptr, int len) + +#if defined( __ICCARM__ ) + int __write (int fd, char *ptr, int len) +#else + int _write (int fd, char *ptr, int len) +#endif { int i = len; diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewd b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewd index 8ed1ef4caf..c798137190 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewd +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewd @@ -11,7 +11,7 @@ C-SPY 2 - 30 + 32 1 0 - - + + + @@ -494,7 +498,7 @@ IJET_ID 2 - 8 + 9 1 0 + + + + + + + + + + + + + @@ -924,7 +980,7 @@ LMIFTDI_ID 2 - 2 + 3 1 0 + + + @@ -1003,7 +1072,7 @@ STLINK_ID 2 - 5 + 8 1 0 + + + @@ -1218,7 +1300,7 @@ XDS100_ID 2 - 8 + 9 1 0 + @@ -1428,21 +1514,17 @@ 0 - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin 0 - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin 0 $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin 0 - - $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin - 0 - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin 0 @@ -1455,10 +1537,6 @@ $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin 0 - - $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin - 1 - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin 0 diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewp b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewp index 6c57c8dc93..d6839b9c13 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewp +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/FreeRTOSDemo_ns.ewp @@ -11,9 +11,13 @@ General 3 - 31 + 35 1 0 + - - - - - + + + + + ICCARM 2 - 34 + 37 1 0 - - - + + AARM 2 - 10 + 11 1 0 + @@ -673,14 +676,10 @@ - 0 + 112 + inputOutputBased - - BICOMP - 0 - - BUILDACTION 1 @@ -693,17 +692,13 @@ ILINK 0 - 21 + 27 1 0 - + + + + + + + + + + + + + + @@ -1032,11 +1083,6 @@ - - BILINK - 0 - - Config @@ -1052,6 +1098,18 @@ $PROJ_DIR$\..\..\..\..\Common\ARMv8M\mpu_demo\mpu_demo.h + + $PROJ_DIR$\..\..\..\..\Common\ARMv8M\reg_tests\IAR\ARM_CM23\non_secure\reg_test_asm.h + + + $PROJ_DIR$\..\..\..\..\Common\ARMv8M\reg_tests\IAR\ARM_CM23\non_secure\reg_test_asm.s + + + $PROJ_DIR$\..\..\..\RegTests\reg_tests.c + + + $PROJ_DIR$\..\..\..\RegTests\reg_tests.h + $PROJ_DIR$\..\..\..\..\Common\ARMv8M\tz_demo\tz_demo.c diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/main_ns.c b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/main_ns.c index 5e28eba01e..900ed89e6b 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/main_ns.c +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/NonSecure/main_ns.c @@ -35,6 +35,7 @@ /* Demo includes. */ #include "tz_demo.h" #include "mpu_demo.h" +#include "reg_tests.h" /** * @brief Create all demo tasks. @@ -54,10 +55,10 @@ int main( void ) DEBUG_PORT->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1; /* Print banner. */ - printf( "\n" ); - printf( "+---------------------------------------------+\n" ); - printf( "| Nonsecure is running ... |\n" ); - printf( "+---------------------------------------------+\n" ); + printf( "\r\n" ); + printf( "+---------------------------------------------+\r\n" ); + printf( "| Nonsecure is running ... |\r\n" ); + printf( "+---------------------------------------------+\r\n" ); /* Create tasks. */ prvCreateTasks(); @@ -83,6 +84,8 @@ static void prvCreateTasks( void ) /* Create tasks for the TZ Demo. */ vStartTZDemo(); + /* Create tasks for register tests. */ + vStartRegTests(); } /*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewd b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewd index ecf520569d..8491b4e1a6 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewd +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewd @@ -11,7 +11,7 @@ C-SPY 2 - 30 + 32 1 0 - - + + + @@ -494,7 +498,7 @@ IJET_ID 2 - 8 + 9 1 0 + + + + + + + + + + + + + @@ -924,7 +980,7 @@ LMIFTDI_ID 2 - 2 + 3 1 0 + + + @@ -1003,7 +1072,7 @@ STLINK_ID 2 - 5 + 8 1 0 + + + @@ -1218,7 +1300,7 @@ XDS100_ID 2 - 8 + 9 1 0 + @@ -1428,21 +1514,17 @@ 0 - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin 0 - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin 0 $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin 0 - - $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin - 0 - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin 0 @@ -1455,10 +1537,6 @@ $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin 0 - - $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin - 1 - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin 0 diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewp b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewp index 4b8ba8a58b..9815b540db 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewp +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/FreeRTOSDemo_s.ewp @@ -11,9 +11,13 @@ General 3 - 31 + 35 1 0 + - - - - - + + + + + ICCARM 2 - 34 + 37 1 0 - - - + + AARM 2 - 10 + 11 1 0 + @@ -671,13 +671,9 @@ 0 + inputOutputBased - - BICOMP - 0 - - BUILDACTION 1 @@ -690,17 +686,13 @@ ILINK 0 - 21 + 27 1 0 - + + + + + + + + + + + + + + @@ -1029,11 +1077,6 @@ - - BILINK - 0 - - Device @@ -1067,6 +1110,15 @@ $PROJ_DIR$\..\..\..\..\Common\ARMv8M\tz_demo\nsc_functions.h + + $PROJ_DIR$\..\..\..\..\Common\ARMv8M\reg_tests\IAR\ARM_CM23\secure\secure_reg_test.c + + + $PROJ_DIR$\..\..\..\..\Common\ARMv8M\reg_tests\IAR\ARM_CM23\secure\secure_reg_test_asm.h + + + $PROJ_DIR$\..\..\..\..\Common\ARMv8M\reg_tests\IAR\ARM_CM23\secure\secure_reg_test_asm.s + SecureContext diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/main_s.c b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/main_s.c index 240bfb9953..48653a444c 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/main_s.c +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/IAR/Secure/main_s.c @@ -69,10 +69,10 @@ int main(void) prvSetupHardware(); /* Print banner. */ - printf( "\n" ); - printf( "+---------------------------------------------+\n" ); - printf( "| Secure is running ... |\n" ); - printf( "+---------------------------------------------+\n" ); + printf( "\r\n" ); + printf( "+---------------------------------------------+\r\n" ); + printf( "| Secure is running ... |\r\n" ); + printf( "+---------------------------------------------+\r\n" ); /* Do not generate Systick interrupt on secure side. */ SysTick_Config( 1 ); diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvoptx b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvoptx index 1e170edd80..a4e011e60d 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvoptx +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvoptx @@ -10,7 +10,7 @@ *.s*; *.src; *.a* *.obj; *.o *.lib - *.txt; *.h; *.inc + *.txt; *.h; *.inc; *.md *.plm *.cpp 0 @@ -77,7 +77,7 @@ 0 1 - 255 + 6 0 1 @@ -101,7 +101,9 @@ 0 0 1 - 19 + 0 + 0 + 7 @@ -112,13 +114,13 @@ .\FreeRTOSDemo_ns_debug.ini - Bin\Nu_Link.dll + NULink\Nu_Link.dll 0 DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=3048,372,3621,908,0)(6000=-1,-1,-1,-1,0) + (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) 0 @@ -504,6 +506,54 @@ 0 0 + + 5 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\non_secure\reg_test_asm.c + reg_test_asm.c + 0 + 0 + + + 5 + 25 + 5 + 0 + 0 + 0 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\non_secure\reg_test_asm.h + reg_test_asm.h + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\..\..\RegTests\reg_tests.c + reg_tests.c + 0 + 0 + + + 5 + 27 + 5 + 0 + 0 + 0 + ..\..\..\RegTests\reg_tests.h + reg_tests.h + 0 + 0 + @@ -514,7 +564,7 @@ 0 6 - 24 + 28 1 0 0 diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvprojx b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvprojx index b073ae2989..02f216bffa 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvprojx +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/FreeRTOSDemo_ns.uvprojx @@ -10,14 +10,14 @@ FreeRTOSDemo_ns 0x4 ARM-ADS - 6070000::V6.7::.\ARMCLANG + 6190000::V6.19::ARMCLANG 1 M2351KIAAEES Nuvoton - Nuvoton.NuMicro_DFP.1.3.3 - http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack + Nuvoton.NuMicro_DFP.1.3.19 + https://github.com/OpenNuvoton/cmsis-packs/raw/master/Nuvoton_DFP/ IRAM(0x20000000,0x18000) IROM(0x00000000,0x00080000) CPUTYPE("ARMV8MBL") TZ CLOCK(12000000) ESEL ELITTLE @@ -134,7 +134,7 @@ 0 1 1 - 4100 + 4102 1 BIN\UL2V8M.DLL @@ -184,6 +184,9 @@ 0 0 0 + 0 + 0 + 0 0 0 8 @@ -324,6 +327,7 @@ 0 0 0 + 0 0 5 0 @@ -336,7 +340,7 @@ DEBUG_PORT=UART0_NS - ..\Config;..\..\..\..\Common\ARMv8M\tz_demo;..\..\..\..\Common\ARMv8M\mpu_demo;..\..\..\..\..\Source\include;..\..\..\..\..\Source\portable\GCC\ARM_CM23\secure;..\..\..\..\..\Source\portable\GCC\ARM_CM23\non_secure;..\..\..\Nuvoton_Code\StdDriver\inc;..\..\..\Nuvoton_Code\CMSIS\Include;..\..\..\Nuvoton_Code\Device\Nuvoton\M2351\Include + ..\Config;..\..\..\RegTests;..\..\..\..\Common\ARMv8M\tz_demo;..\..\..\..\Common\ARMv8M\mpu_demo;..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\secure;..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\non_secure;..\..\..\..\..\Source\include;..\..\..\..\..\Source\portable\GCC\ARM_CM23\secure;..\..\..\..\..\Source\portable\GCC\ARM_CM23\non_secure;..\..\..\Nuvoton_Code\StdDriver\inc;..\..\..\Nuvoton_Code\CMSIS\Include;..\..\..\Nuvoton_Code\Device\Nuvoton\M2351\Include @@ -349,7 +353,7 @@ 1 0 0 - 0 + 4 @@ -515,6 +519,26 @@ 1 ..\..\..\..\Common\ARMv8M\tz_demo\tz_demo.c + + reg_test_asm.c + 1 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\non_secure\reg_test_asm.c + + + reg_test_asm.h + 5 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\non_secure\reg_test_asm.h + + + reg_tests.c + 1 + ..\..\..\RegTests\reg_tests.c + + + reg_tests.h + 5 + ..\..\..\RegTests\reg_tests.h + diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/main_ns.c b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/main_ns.c index a0590b71b5..c702e95cdd 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/main_ns.c +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/NonSecure/main_ns.c @@ -35,6 +35,7 @@ /* Demo includes. */ #include "tz_demo.h" #include "mpu_demo.h" +#include "reg_tests.h" /* Externs needed by the MPU setup code. These are defined in Scatter-Loading * description file (FreeRTOSDemo_ns.sct). */ @@ -97,10 +98,10 @@ int main( void ) DEBUG_PORT->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1; /* Print banner. */ - printf( "\n" ); - printf( "+---------------------------------------------+\n" ); - printf( "| Nonsecure is running ... |\n" ); - printf( "+---------------------------------------------+\n" ); + printf( "\r\n" ); + printf( "+---------------------------------------------+\r\n" ); + printf( "| Nonsecure is running ... |\r\n" ); + printf( "+---------------------------------------------+\r\n" ); /* Create tasks. */ prvCreateTasks(); @@ -126,6 +127,8 @@ static void prvCreateTasks( void ) /* Create tasks for the TZ Demo. */ vStartTZDemo(); + /* Create tasks for register tests. */ + vStartRegTests(); } /*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvoptx b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvoptx index 09c6368dad..e2fb7fca09 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvoptx +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvoptx @@ -10,7 +10,7 @@ *.s*; *.src; *.a* *.obj; *.o *.lib - *.txt; *.h; *.inc + *.txt; *.h; *.inc; *.md *.plm *.cpp 0 @@ -77,7 +77,7 @@ 0 1 - 255 + 6 0 1 @@ -101,7 +101,9 @@ 0 0 1 - 19 + 0 + 0 + 7 @@ -112,7 +114,7 @@ .\FreeRTOSDemo_s_debug.ini - Bin\Nu_Link.dll + NULink\Nu_Link.dll @@ -137,6 +139,14 @@ + + + 1 + 2 + 0x30016060 + 0 + + 0 @@ -312,6 +322,30 @@ 0 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\secure\secure_reg_test_asm.c + secure_reg_test_asm.c + 0 + 0 + + + 3 + 11 + 5 + 0 + 0 + 0 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\secure\secure_reg_test_asm.h + secure_reg_test_asm.h + 0 + 0 + @@ -322,7 +356,7 @@ 0 4 - 10 + 12 5 0 0 @@ -334,7 +368,7 @@ 4 - 11 + 13 1 0 0 @@ -346,7 +380,7 @@ 4 - 12 + 14 1 0 0 @@ -358,7 +392,7 @@ 4 - 13 + 15 5 0 0 @@ -378,7 +412,7 @@ 0 5 - 14 + 16 5 0 0 @@ -390,7 +424,7 @@ 5 - 15 + 17 1 0 0 @@ -410,7 +444,7 @@ 0 6 - 16 + 18 5 0 0 @@ -422,7 +456,7 @@ 6 - 17 + 19 1 0 0 @@ -442,7 +476,7 @@ 0 7 - 18 + 20 1 0 0 diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvprojx b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvprojx index 0d6eb2628b..1f6c9dab0e 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvprojx +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/FreeRTOSDemo_s.uvprojx @@ -10,14 +10,14 @@ FreeRTOSDemo_s 0x4 ARM-ADS - 6070000::V6.7::.\ARMCLANG + 6190000::V6.19::ARMCLANG 1 M2351KIAAEES Nuvoton - Nuvoton.NuMicro_DFP.1.3.3 - http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack + Nuvoton.NuMicro_DFP.1.3.19 + https://github.com/OpenNuvoton/cmsis-packs/raw/master/Nuvoton_DFP/ IRAM(0x20000000,0x18000) IROM(0x00000000,0x00080000) CPUTYPE("ARMV8MBL") TZ CLOCK(12000000) ESEL ELITTLE @@ -134,7 +134,7 @@ 0 1 1 - 4099 + 4102 1 BIN\UL2V8M.DLL @@ -184,6 +184,9 @@ 0 0 0 + 0 + 0 + 0 0 0 8 @@ -324,6 +327,7 @@ 0 0 0 + 0 0 5 0 @@ -334,7 +338,7 @@ 0 -mfloat-abi=soft -Wno-documentation -Wno-reserved-id-macro - DEBUG_PORT = UART1 + DEBUG_PORT = UART0 ..\Config;..\..\Keil;..\..\..\..\Common\ARMv8M\tz_demo;..\..\..\..\..\Source\portable\GCC\ARM_CM23\secure;..\..\..\Nuvoton_Code\StdDriver\inc;..\..\..\Nuvoton_Code\CMSIS\Include;..\..\..\Nuvoton_Code\Device\Nuvoton\M2351\Include @@ -349,7 +353,7 @@ 1 0 0 - 0 + 4 @@ -435,6 +439,16 @@ 1 ..\..\..\..\Common\ARMv8M\tz_demo\nsc_functions.c + + secure_reg_test_asm.c + 1 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\secure\secure_reg_test_asm.c + + + secure_reg_test_asm.h + 5 + ..\..\..\..\Common\ARMv8M\reg_tests\GCC\ARM_CM23\secure\secure_reg_test_asm.h + diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/main_s.c b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/main_s.c index 8d3603f0cd..d247ecc165 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/main_s.c +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/Projects/Keil/Secure/main_s.c @@ -69,10 +69,10 @@ int main(void) prvSetupHardware(); /* Print banner. */ - printf( "\n" ); - printf( "+---------------------------------------------+\n" ); - printf( "| Secure is running ... |\n" ); - printf( "+---------------------------------------------+\n" ); + printf( "\r\n" ); + printf( "+---------------------------------------------+\r\n" ); + printf( "| Secure is running ... |\r\n" ); + printf( "+---------------------------------------------+\r\n" ); /* Do not generate Systick interrupt on secure side. */ SysTick_Config( 1 ); diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.c b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.c new file mode 100644 index 0000000000..9cda7f753b --- /dev/null +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.c @@ -0,0 +1,373 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Reg test includes. */ +#include "reg_tests.h" +#include "reg_test_asm.h" +#include "secure_reg_test_asm.h" + +/* Device includes. */ +#include "NuMicro.h" + +/* + * Functions that implement reg test tasks. + */ +static void prvRegTest1_Task( void * pvParameters ); +static void prvRegTest2_Task( void * pvParameters ); +static void prvRegTest_Secure_Task( void * pvParameters ); +static void prvRegTest_NonSecureCallback_Task( void * pvParameters ); + +/* + * Check task periodically checks that reg tests tasks + * are running fine. + */ +static void prvCheckTask( void * pvParameters ); +/*-----------------------------------------------------------*/ + +/* + * On board LEDs. + */ +#define YELLOW_LED PA11_NS +#define GREEN_LED PA10_NS + +/* + * Priority of the check task. + */ +#define CHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) + +/* + * Frequency of check task. + */ +#define NO_ERROR_CHECK_TASK_PERIOD ( pdMS_TO_TICKS( 5000UL ) ) +#define ERROR_CHECK_TASK_PERIOD ( pdMS_TO_TICKS( 200UL ) ) + +/* + * Parameters passed to reg test tasks. + */ +#define REG_TEST_1_TASK_PARAMETER ( ( void * ) 0x12345678 ) +#define REG_TEST_2_TASK_PARAMETER ( ( void * ) 0x87654321 ) +#define REG_TEST_SECURE_TASK_PARAMETER ( ( void * ) 0x1234ABCD ) +#define REG_TEST_NON_SECURE_CALLBACK_TASK_PARAMETER ( ( void * ) 0xABCD1234 ) +/*-----------------------------------------------------------*/ + +/* + * The following variables are used to communicate the status of the register + * test tasks to the check task. If the variables keep incrementing, then the + * register test tasks have not discovered any errors. If a variable stops + * incrementing, then an error has been found. + */ +volatile unsigned long ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL; +volatile unsigned long ulRegTestSecureLoopCounter = 0UL; +volatile unsigned long ulRegTestNonSecureCallbackLoopCounter = 0UL; + +/** + * Counter to keep a count of how may times the check task loop has detected + * error. + */ +volatile unsigned long ulCheckTaskLoops = 0UL; +/*-----------------------------------------------------------*/ + +void vStartRegTests( void ) +{ +static StackType_t xRegTest1TaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) ); +static StackType_t xRegTest2TaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) ); +static StackType_t xRegTestSecureTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) ); +static StackType_t xRegTestNonSecureCallbackTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) ); +static StackType_t xCheckTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( 32 ) ) ); + +TaskParameters_t xRegTest1TaskParameters = +{ + .pvTaskCode = prvRegTest1_Task, + .pcName = "RegTest1", + .usStackDepth = configMINIMAL_STACK_SIZE, + .pvParameters = REG_TEST_1_TASK_PARAMETER, + .uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT, + .puxStackBuffer = xRegTest1TaskStack, + .xRegions = { + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 } + } +}; +TaskParameters_t xRegTest2TaskParameters = +{ + .pvTaskCode = prvRegTest2_Task, + .pcName = "RegTest2", + .usStackDepth = configMINIMAL_STACK_SIZE, + .pvParameters = REG_TEST_2_TASK_PARAMETER, + .uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT, + .puxStackBuffer = xRegTest2TaskStack, + .xRegions = { + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 } + } +}; +TaskParameters_t xRegTestSecureTaskParameters = +{ + .pvTaskCode = prvRegTest_Secure_Task, + .pcName = "RegTestSecure", + .usStackDepth = configMINIMAL_STACK_SIZE, + .pvParameters = REG_TEST_SECURE_TASK_PARAMETER, + .uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT, + .puxStackBuffer = xRegTestSecureTaskStack, + .xRegions = { + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 } + } +}; +TaskParameters_t xRegTestNonSecureCallbackTaskParameters = +{ + .pvTaskCode = prvRegTest_NonSecureCallback_Task, + .pcName = "RegTestNonSecureCallback", + .usStackDepth = configMINIMAL_STACK_SIZE, + .pvParameters = REG_TEST_NON_SECURE_CALLBACK_TASK_PARAMETER, + .uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT, + .puxStackBuffer = xRegTestNonSecureCallbackTaskStack, + .xRegions = { + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 } + } +}; + +TaskParameters_t xCheckTaskParameters = +{ + .pvTaskCode = prvCheckTask, + .pcName = "Check", + .usStackDepth = configMINIMAL_STACK_SIZE, + .pvParameters = NULL, + .uxPriority = ( CHECK_TASK_PRIORITY | portPRIVILEGE_BIT ), + .puxStackBuffer = xCheckTaskStack, + .xRegions = { + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 } + } +}; + + /* Configure pins in output mode to drive external LEDs. */ + GPIO_SetMode( PA_NS, BIT10 | BIT11, GPIO_MODE_OUTPUT ); + + /* Start with both LEDs off. */ + YELLOW_LED = 1; + GREEN_LED = 1; + + xTaskCreateRestricted( &( xRegTest1TaskParameters ), NULL ); + xTaskCreateRestricted( &( xRegTest2TaskParameters ), NULL ); + xTaskCreateRestricted( &( xRegTestSecureTaskParameters ), NULL ); + xTaskCreateRestricted( &( xRegTestNonSecureCallbackTaskParameters ), NULL ); + xTaskCreateRestricted( &( xCheckTaskParameters ), NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvRegTest1_Task( void * pvParameters ) +{ + /* Although the reg tests are written in assembly, its entry + * point is written in C for convenience of checking that the + * task parameter is being passed in correctly. */ + if( pvParameters == REG_TEST_1_TASK_PARAMETER ) + { + /* Start the part of the test that is written in assembler. */ + vRegTest1Asm_NonSecure(); + } + + /* The following line will only execute if the task parameter + * is found to be incorrect. The check task will detect that + * the reg test loop counter is not being incremented and flag + * an error. */ + vTaskDelete( NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvRegTest2_Task( void * pvParameters ) +{ + /* Although the reg tests are written in assembly, its entry + * point is written in C for convenience of checking that the + * task parameter is being passed in correctly. */ + if( pvParameters == REG_TEST_2_TASK_PARAMETER ) + { + /* Start the part of the test that is written in assembler. */ + vRegTest2Asm_NonSecure(); + } + + /* The following line will only execute if the task parameter + * is found to be incorrect. The check task will detect that + * the reg test loop counter is not being incremented and flag + * an error. */ + vTaskDelete( NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvRegTest_Secure_Task( void * pvParameters ) +{ + /* This task is going to call secure side functions. */ + portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); + + /* Although the reg tests are written in assembly, its entry + * point is written in C for convenience of checking that the + * task parameter is being passed in correctly. */ + if( pvParameters == REG_TEST_SECURE_TASK_PARAMETER ) + { + for( ;; ) + { + /* Call the secure side function. This function populates registers + * with known values, then forces a context switch while on the + * secure side and then verifies that the contents of the registers + * are intact. This ensure that the context restoring mechanism + * works properly when the interrupted task was in the middle of a + * call to a secure side function. */ + vRegTestAsm_Secure(); + + ulRegTestSecureLoopCounter += 1; + } + } + + /* The following line will only execute if the task parameter + * is found to be incorrect. The check task will detect that + * the reg test loop counter is not being incremented and flag + * an error. */ + vTaskDelete( NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvRegTest_NonSecureCallback_Task( void * pvParameters ) +{ + /* This task is going to call secure side functions. */ + portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); + + /* Although the reg tests are written in assembly, its entry + * point is written in C for convenience of checking that the + * task parameter is being passed in correctly. */ + if( pvParameters == REG_TEST_NON_SECURE_CALLBACK_TASK_PARAMETER ) + { + for( ;; ) + { + /* Call the secure side function. This function calls the provided + * non-secure callback which in-turn populates registers with + * known values, then forces a context switch while on the + * non-secure side and then verifies that the contents of the + * registers are intact. This ensure that the context restoring + * mechanism works properly when the interrupted task was in the + * middle of a non-secure callback from the secure side. */ + vRegTest_NonSecureCallback( vRegTestAsm_NonSecureCallback ); + + ulRegTestNonSecureCallbackLoopCounter += 1; + } + } + + /* The following line will only execute if the task parameter + * is found to be incorrect. The check task will detect that + * the reg test loop counter is not being incremented and flag + * an error. */ + vTaskDelete( NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvCheckTask( void * pvParameters ) +{ +TickType_t xDelayPeriod = NO_ERROR_CHECK_TASK_PERIOD; +TickType_t xLastExecutionTime; +unsigned long ulErrorFound = pdFALSE; +static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0; +static unsigned long ulLastRegTestSecureValue = 0, ulLastRegTestNonSecureCallbackValue = 0; + + /* Just to stop compiler warnings. */ + ( void ) pvParameters; + + /* Initialize xLastExecutionTime so the first call to vTaskDelayUntil() + * works correctly. */ + xLastExecutionTime = xTaskGetTickCount(); + + /* Cycle for ever, delaying then checking all the other tasks are still + * operating without error. The onboard LED is toggled on each iteration. + * If an error is detected then the delay period is decreased from + * mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD. This has + * the effect of increasing the rate at which the onboard LED toggles, and + * in so doing gives visual feedback of the system status. */ + for( ;; ) + { + /* Delay until it is time to execute again. */ + vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod ); + + /* Check that the register test 1 task is still running. */ + if( ulLastRegTest1Value == ulRegTest1LoopCounter ) + { + ulErrorFound |= 1UL << 0UL; + } + ulLastRegTest1Value = ulRegTest1LoopCounter; + + /* Check that the register test 2 task is still running. */ + if( ulLastRegTest2Value == ulRegTest2LoopCounter ) + { + ulErrorFound |= 1UL << 1UL; + } + ulLastRegTest2Value = ulRegTest2LoopCounter; + + /* Check that the register test secure task is still running. */ + if( ulLastRegTestSecureValue == ulRegTestSecureLoopCounter ) + { + ulErrorFound |= 1UL << 2UL; + } + ulLastRegTestSecureValue = ulRegTestSecureLoopCounter; + + /* Check that the register test non-secure callback task is + * still running. */ + if( ulLastRegTestNonSecureCallbackValue == ulRegTestNonSecureCallbackLoopCounter ) + { + ulErrorFound |= 1UL << 3UL; + } + ulLastRegTestNonSecureCallbackValue = ulRegTestNonSecureCallbackLoopCounter; + + /* Toggle the green LED to give an indication of the system status. + * If the LED toggles every NO_ERROR_CHECK_TASK_PERIOD milliseconds + * then everything is ok. A faster toggle indicates an error. */ + GPIO_TOGGLE( GREEN_LED ); + + if( ulErrorFound != pdFALSE ) + { + /* An error has been detected in one of the tasks. */ + xDelayPeriod = ERROR_CHECK_TASK_PERIOD; + + /* Turn on Yellow LED to indicate error. */ + YELLOW_LED = 0; + printf( "ERROR detected!\r\n" ); + + /* Increment error detection count. */ + ulCheckTaskLoops++; + } + else + { + printf( "No errors.\r\n" ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.h b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.h new file mode 100644 index 0000000000..0837aad72d --- /dev/null +++ b/FreeRTOS/Demo/CORTEX_MPU_M23_Nuvoton_NuMaker_PFM_M2351_IAR_GCC/RegTests/reg_tests.h @@ -0,0 +1,35 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef REG_TESTS_H +#define REG_TESTS_H + +/** + * @brief Creates all the tasks for reg tests. + */ +void vStartRegTests( void ); + +#endif /* REG_TESTS_H */ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.c b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.c new file mode 100644 index 0000000000..c0af7c5136 --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.c @@ -0,0 +1,312 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * "Reg tests" - These tests fill the registers with known values, then check + * that each register maintains its expected value for the lifetime of the + * task. Each task uses a different set of values. The reg test tasks execute + * with a very low priority, so get preempted very frequently. A register + * containing an unexpected value is indicative of an error in the context + * switching mechanism. + */ + +#include "reg_test_asm.h" +/*-----------------------------------------------------------*/ + +void vRegTest1Asm_NonSecure( void ) /* __attribute__(( naked )) */ +{ + __asm volatile + ( + ".extern ulRegTest1LoopCounter \n" + ".syntax unified \n" + " \n" + " /* Fill the core registers with known values. */ \n" + " movs r1, #101 \n" + " movs r2, #102 \n" + " movs r3, #103 \n" + " movs r4, #104 \n" + " movs r5, #105 \n" + " movs r6, #106 \n" + " movs r7, #107 \n" + " movs r0, #108 \n" + " mov r8, r0 \n" + " movs r0, #109 \n" + " mov r9, r0 \n" + " movs r0, #110 \n" + " mov r10, r0 \n" + " movs r0, #111 \n" + " mov r11, r0 \n" + " movs r0, #112 \n" + " mov r12, r0 \n" + " movs r0, #100 \n" + " \n" + "reg1_loop: \n" + " \n" + " /* Verify that core registers contain correct values. */ \n" + " cmp r0, #100 \n" + " bne reg1_error_loop \n" + " cmp r1, #101 \n" + " bne reg1_error_loop \n" + " cmp r2, #102 \n" + " bne reg1_error_loop \n" + " cmp r3, #103 \n" + " bne reg1_error_loop \n" + " cmp r4, #104 \n" + " bne reg1_error_loop \n" + " cmp r5, #105 \n" + " bne reg1_error_loop \n" + " cmp r6, #106 \n" + " bne reg1_error_loop \n" + " cmp r7, #107 \n" + " bne reg1_error_loop \n" + " movs r0, #108 \n" + " cmp r8, r0 \n" + " bne reg1_error_loop \n" + " movs r0, #109 \n" + " cmp r9, r0 \n" + " bne reg1_error_loop \n" + " movs r0, #110 \n" + " cmp r10, r0 \n" + " bne reg1_error_loop \n" + " movs r0, #111 \n" + " cmp r11, r0 \n" + " bne reg1_error_loop \n" + " movs r0, #112 \n" + " cmp r12, r0 \n" + " bne reg1_error_loop \n" + " \n" + " /* Everything passed, inc the loop counter. */ \n" + " push { r1 } \n" + " ldr r0, =ulRegTest1LoopCounter \n" + " ldr r1, [r0] \n" + " adds r1, r1, #1 \n" + " str r1, [r0] \n" + " \n" + " /* Yield to increase test coverage. */ \n" + " movs r0, #0x01 \n" + " ldr r1, =0xe000ed04 \n" /* NVIC_ICSR. */ + " lsls r0, #28 \n" /* Shift to PendSV bit. */ + " str r0, [r1] \n" + " dsb \n" + " pop { r1 } \n" + " \n" + " /* Start again. */ \n" + " movs r0, #100 \n" + " b reg1_loop \n" + " \n" + "reg1_error_loop: \n" + " /* If this line is hit then there was an error in \n" + " * a core register value. The loop ensures the \n" + " * loop counter stops incrementing. */ \n" + " b reg1_error_loop \n" + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +void vRegTest2Asm_NonSecure( void ) /* __attribute__(( naked )) */ +{ + __asm volatile + ( + ".extern ulRegTest2LoopCounter \n" + ".syntax unified \n" + " \n" + " /* Fill the core registers with known values. */ \n" + " movs r1, #1 \n" + " movs r2, #2 \n" + " movs r3, #3 \n" + " movs r4, #4 \n" + " movs r5, #5 \n" + " movs r6, #6 \n" + " movs r7, #7 \n" + " movs r0, #8 \n" + " mov r8, r0 \n" + " movs r0, #9 \n" + " mov r9, r0 \n" + " movs r0, #10 \n" + " mov r10, r0 \n" + " movs r0, #11 \n" + " mov r11, r0 \n" + " movs r0, #12 \n" + " mov r12, r0 \n" + " movs r0, #10 \n" + " \n" + "reg2_loop: \n" + " \n" + " /* Verify that core registers contain correct values. */ \n" + " cmp r0, #10 \n" + " bne reg2_error_loop \n" + " cmp r1, #1 \n" + " bne reg2_error_loop \n" + " cmp r2, #2 \n" + " bne reg2_error_loop \n" + " cmp r3, #3 \n" + " bne reg2_error_loop \n" + " cmp r4, #4 \n" + " bne reg2_error_loop \n" + " cmp r5, #5 \n" + " bne reg2_error_loop \n" + " cmp r6, #6 \n" + " bne reg2_error_loop \n" + " cmp r7, #7 \n" + " bne reg2_error_loop \n" + " movs r0, #8 \n" + " cmp r8, r0 \n" + " bne reg2_error_loop \n" + " movs r0, #9 \n" + " cmp r9, r0 \n" + " bne reg2_error_loop \n" + " movs r0, #10 \n" + " cmp r10, r0 \n" + " bne reg2_error_loop \n" + " movs r0, #11 \n" + " cmp r11, r0 \n" + " bne reg2_error_loop \n" + " movs r0, #12 \n" + " cmp r12, r0 \n" + " bne reg2_error_loop \n" + " \n" + " /* Everything passed, inc the loop counter. */ \n" + " push { r1 } \n" + " ldr r0, =ulRegTest2LoopCounter \n" + " ldr r1, [r0] \n" + " adds r1, r1, #1 \n" + " str r1, [r0] \n" + " pop { r1 } \n" + " \n" + " /* Start again. */ \n" + " movs r0, #10 \n" + " b reg2_loop \n" + " \n" + "reg2_error_loop: \n" + " /* If this line is hit then there was an error in \n" + " * a core register value. The loop ensures the \n" + " * loop counter stops incrementing. */ \n" + " b reg2_error_loop \n" + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +void vRegTestAsm_NonSecureCallback( void ) +{ + __asm volatile + ( + ".syntax unified \n" + " \n" + " /* Store callee saved registers. */ \n" + " push { r4-r7 } \n" + " mov r0, r8 \n" + " mov r1, r9 \n" + " mov r2, r10 \n" + " mov r3, r11 \n" + " mov r4, r12 \n" + " push { r0-r4 } \n" + " \n" + " /* Fill the core registers with known values. */ \n" + " movs r1, #151 \n" + " movs r2, #152 \n" + " movs r3, #153 \n" + " movs r4, #154 \n" + " movs r5, #155 \n" + " movs r6, #156 \n" + " movs r7, #157 \n" + " movs r0, #158 \n" + " mov r8, r0 \n" + " movs r0, #159 \n" + " mov r9, r0 \n" + " movs r0, #160 \n" + " mov r10, r0 \n" + " movs r0, #161 \n" + " mov r11, r0 \n" + " movs r0, #162 \n" + " mov r12, r0 \n" + " movs r0, #150 \n" + " \n" + " /* Force a context switch by pending non-secure sv. */ \n" + " push { r0, r1 } \n" + " movs r0, #0x01 \n" + " ldr r1, =0xe000ed04 \n" /* NVIC_ICSR. */ + " lsls r0, #28 \n" /* Shift to PendSV bit. */ + " str r0, [r1] \n" + " dsb \n" + " pop { r0, r1 } \n" + " \n" + " /* Verify that core registers contain correct values. */ \n" + " cmp r0, #150 \n" + " bne reg_nscb_error_loop \n" + " cmp r1, #151 \n" + " bne reg_nscb_error_loop \n" + " cmp r2, #152 \n" + " bne reg_nscb_error_loop \n" + " cmp r3, #153 \n" + " bne reg_nscb_error_loop \n" + " cmp r4, #154 \n" + " bne reg_nscb_error_loop \n" + " cmp r5, #155 \n" + " bne reg_nscb_error_loop \n" + " cmp r6, #156 \n" + " bne reg_nscb_error_loop \n" + " cmp r7, #157 \n" + " bne reg_nscb_error_loop \n" + " movs r0, #158 \n" + " cmp r8, r0 \n" + " bne reg_nscb_error_loop \n" + " movs r0, #159 \n" + " cmp r9, r0 \n" + " bne reg_nscb_error_loop \n" + " movs r0, #160 \n" + " cmp r10, r0 \n" + " bne reg_nscb_error_loop \n" + " movs r0, #161 \n" + " cmp r11, r0 \n" + " bne reg_nscb_error_loop \n" + " movs r0, #162 \n" + " cmp r12, r0 \n" + " bne reg_nscb_error_loop \n" + " \n" + " /* Everything passed, finish. */ \n" + " b reg_nscb_success \n" + " \n" + "reg_nscb_error_loop : \n" + " /* If this line is hit then there was an error in \n" + " * a core register value. The loop ensures the \n" + " * loop counter stops incrementing. */ \n" + " b reg_nscb_error_loop \n" + " nop \n" + " \n" + "reg_nscb_success: \n" + " /* Restore callee saved registers. */ \n" + " pop { r0-r4 } \n" + " mov r8, r0 \n" + " mov r9, r1 \n" + " mov r10, r2 \n" + " mov r11, r3 \n" + " mov r12, r4 \n" + " pop { r4-r7 } \n" + ); +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.h b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.h new file mode 100644 index 0000000000..088f2ce987 --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/non_secure/reg_test_asm.h @@ -0,0 +1,46 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef REG_TEST_ASM_H +#define REG_TEST_ASM_H + +/** + * @brief Functions that implement reg tests in assembly. + * + * These are called from the FreeRTOS tasks on the non-secure side. + */ +void vRegTest1Asm_NonSecure( void ) __attribute__( ( naked ) ); +void vRegTest2Asm_NonSecure( void ) __attribute__( ( naked ) ); + +/** + * @brief Function that implements reg tests in assembly. + * + * This is passed as function pointer to the secure side and called + * from the secure side. + */ +void vRegTestAsm_NonSecureCallback( void ); + +#endif /* REG_TEST_ASM_H */ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.c b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.c new file mode 100644 index 0000000000..2230567e8c --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.c @@ -0,0 +1,151 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Interface includes. */ +#include "secure_reg_test_asm.h" + +/* FreeRTOS includes. */ +#include "secure_port_macros.h" + +/* typedef for non-secure callback function. */ +typedef RegTestCallback_t NonSecureRegTestCallback_t __attribute__( ( cmse_nonsecure_call ) ); +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void vRegTestAsm_Secure( void ) +{ + __asm volatile + ( + ".syntax unified \n" + " \n" + " /* Store callee saved registers. */ \n" + " push { r4-r7 } \n" + " mov r0, r8 \n" + " mov r1, r9 \n" + " mov r2, r10 \n" + " mov r3, r11 \n" + " mov r4, r12 \n" + " push { r0-r4 } \n" + " \n" + " /* Fill the core registers with known values. */ \n" + " movs r1, #201 \n" + " movs r2, #202 \n" + " movs r3, #203 \n" + " movs r4, #204 \n" + " movs r5, #205 \n" + " movs r6, #206 \n" + " movs r7, #207 \n" + " movs r0, #208 \n" + " mov r8, r0 \n" + " movs r0, #209 \n" + " mov r9, r0 \n" + " movs r0, #210 \n" + " mov r10, r0 \n" + " movs r0, #211 \n" + " mov r11, r0 \n" + " movs r0, #212 \n" + " mov r12, r0 \n" + " movs r0, #200 \n" + " \n" + " /* Force a context switch by pending non-secure sv. */ \n" + " push { r0, r1 } \n" + " movs r0, #0x01 \n" + " ldr r1, =0xe002ed04 \n" /* NVIC_ICSR_NS. */ + " lsls r0, #28 \n" /* Shift to PendSV bit. */ + " str r0, [r1] \n" + " dsb \n" + " pop { r0, r1 } \n" + " \n" + " /* Verify that core registers contain correct values. */ \n" + " cmp r0, #200 \n" + " bne secure_reg_test_error_loop \n" + " cmp r1, #201 \n" + " bne secure_reg_test_error_loop \n" + " cmp r2, #202 \n" + " bne secure_reg_test_error_loop \n" + " cmp r3, #203 \n" + " bne secure_reg_test_error_loop \n" + " cmp r4, #204 \n" + " bne secure_reg_test_error_loop \n" + " cmp r5, #205 \n" + " bne secure_reg_test_error_loop \n" + " cmp r6, #206 \n" + " bne secure_reg_test_error_loop \n" + " cmp r7, #207 \n" + " bne secure_reg_test_error_loop \n" + " movs r0, #208 \n" + " cmp r8, r0 \n" + " bne secure_reg_test_error_loop \n" + " movs r0, #209 \n" + " cmp r9, r0 \n" + " bne secure_reg_test_error_loop \n" + " movs r0, #210 \n" + " cmp r10, r0 \n" + " bne secure_reg_test_error_loop \n" + " movs r0, #211 \n" + " cmp r11, r0 \n" + " bne secure_reg_test_error_loop \n" + " movs r0, #212 \n" + " cmp r12, r0 \n" + " bne secure_reg_test_error_loop \n" + " \n" + " /* Everything passed, finish. */ \n" + " b secure_reg_test_success \n" + " \n" + "secure_reg_test_error_loop: \n" + " /* If this line is hit then there was an error in \n" + " * a core register value. The loop ensures the \n" + " * loop counter stops incrementing. */ \n" + " b secure_reg_test_error_loop \n" + " nop \n" + " \n" + "secure_reg_test_success: \n" + " /* Restore callee saved registers. */ \n" + " pop { r0-r4 } \n" + " mov r8, r0 \n" + " mov r9, r1 \n" + " mov r10, r2 \n" + " mov r11, r3 \n" + " mov r12, r4 \n" + " pop { r4-r7 } \n" + ); +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void vRegTest_NonSecureCallback( RegTestCallback_t pxRegTestCallback ) +{ + NonSecureRegTestCallback_t pxNonSecureRegTestCallback; + + /* Return function pointer with cleared LSB. */ + pxNonSecureRegTestCallback = ( NonSecureRegTestCallback_t ) cmse_nsfptr_create( pxRegTestCallback ); + + /* Invoke the callback which runs reg tests. */ + pxNonSecureRegTestCallback(); +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.h b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.h new file mode 100644 index 0000000000..3b59c88d23 --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/GCC/ARM_CM23/secure/secure_reg_test_asm.h @@ -0,0 +1,49 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef SECURE_REG_TEST_ASM_H +#define SECURE_REG_TEST_ASM_H + +/* Callback function pointer definition. */ +typedef void ( * RegTestCallback_t )( void ); + +/** + * @brief Function that implements reg tests for the secure side. + * + * This function is exported as "non-secure callable" and is called + * from a FreeRTOS task on the non-secure side. + */ +void vRegTestAsm_Secure( void ); + +/** + * @brief Invokes the supplied reg test callback on the non-secure side. + * + * This function is exported as "non-secure callable" and is called + * from a FreeRTOS task on the non-secure side.. + */ +void vRegTest_NonSecureCallback( RegTestCallback_t pxRegTestCallback ); + +#endif /* SECURE_REG_TEST_ASM_H */ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.h b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.h new file mode 100644 index 0000000000..088f2ce987 --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.h @@ -0,0 +1,46 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef REG_TEST_ASM_H +#define REG_TEST_ASM_H + +/** + * @brief Functions that implement reg tests in assembly. + * + * These are called from the FreeRTOS tasks on the non-secure side. + */ +void vRegTest1Asm_NonSecure( void ) __attribute__( ( naked ) ); +void vRegTest2Asm_NonSecure( void ) __attribute__( ( naked ) ); + +/** + * @brief Function that implements reg tests in assembly. + * + * This is passed as function pointer to the secure side and called + * from the secure side. + */ +void vRegTestAsm_NonSecureCallback( void ); + +#endif /* REG_TEST_ASM_H */ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.s b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.s new file mode 100644 index 0000000000..630e0540c7 --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/non_secure/reg_test_asm.s @@ -0,0 +1,298 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * "Reg tests" - These tests fill the registers with known values, then check + * that each register maintains its expected value for the lifetime of the + * task. Each task uses a different set of values. The reg test tasks execute + * with a very low priority, so get preempted very frequently. A register + * containing an unexpected value is indicative of an error in the context + * switching mechanism. + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + + EXTERN ulRegTest1LoopCounter + EXTERN ulRegTest2LoopCounter + + PUBLIC vRegTest1Asm_NonSecure + PUBLIC vRegTest2Asm_NonSecure + PUBLIC vRegTestAsm_NonSecureCallback +/*-----------------------------------------------------------*/ + +vRegTest1Asm_NonSecure: + /* Fill the core registers with known values. */ + movs r1, #101 + movs r2, #102 + movs r3, #103 + movs r4, #104 + movs r5, #105 + movs r6, #106 + movs r7, #107 + movs r0, #108 + mov r8, r0 + movs r0, #109 + mov r9, r0 + movs r0, #110 + mov r10, r0 + movs r0, #111 + mov r11, r0 + movs r0, #112 + mov r12, r0 + movs r0, #100 + + reg1_loop: + /* Verify that core registers contain correct values. */ + cmp r0, #100 + bne reg1_error_loop + cmp r1, #101 + bne reg1_error_loop + cmp r2, #102 + bne reg1_error_loop + cmp r3, #103 + bne reg1_error_loop + cmp r4, #104 + bne reg1_error_loop + cmp r5, #105 + bne reg1_error_loop + cmp r6, #106 + bne reg1_error_loop + cmp r7, #107 + bne reg1_error_loop + movs r0, #108 + cmp r8, r0 + bne reg1_error_loop + movs r0, #109 + cmp r9, r0 + bne reg1_error_loop + movs r0, #110 + cmp r10, r0 + bne reg1_error_loop + movs r0, #111 + cmp r11, r0 + bne reg1_error_loop + movs r0, #112 + cmp r12, r0 + bne reg1_error_loop + + /* Everything passed, inc the loop counter. */ + push { r1 } + ldr r0, =ulRegTest1LoopCounter + ldr r1, [r0] + adds r1, r1, #1 + str r1, [r0] + + /* Yield to increase test coverage. */ + movs r0, #0x01 + ldr r1, =0xe000ed04 /* NVIC_ICSR. */ + lsls r0, r0, #28 /* Shift to PendSV bit. */ + str r0, [r1] + dsb + pop { r1 } + + /* Start again. */ + movs r0, #100 + b reg1_loop + + reg1_error_loop: + /* If this line is hit then there was an error in + * a core register value. The loop ensures the + * loop counter stops incrementing. */ + b reg1_error_loop + nop +/*-----------------------------------------------------------*/ + +vRegTest2Asm_NonSecure: + /* Fill the core registers with known values. */ + movs r1, #1 + movs r2, #2 + movs r3, #3 + movs r4, #4 + movs r5, #5 + movs r6, #6 + movs r7, #7 + movs r0, #8 + mov r8, r0 + movs r0, #9 + mov r9, r0 + movs r0, #10 + mov r10, r0 + movs r0, #11 + mov r11, r0 + movs r0, #12 + mov r12, r0 + movs r0, #10 + + reg2_loop: + /* Verify that core registers contain correct values. */ + cmp r0, #10 + bne reg2_error_loop + cmp r1, #1 + bne reg2_error_loop + cmp r2, #2 + bne reg2_error_loop + cmp r3, #3 + bne reg2_error_loop + cmp r4, #4 + bne reg2_error_loop + cmp r5, #5 + bne reg2_error_loop + cmp r6, #6 + bne reg2_error_loop + cmp r7, #7 + bne reg2_error_loop + movs r0, #8 + cmp r8, r0 + bne reg2_error_loop + movs r0, #9 + cmp r9, r0 + bne reg2_error_loop + movs r0, #10 + cmp r10, r0 + bne reg2_error_loop + movs r0, #11 + cmp r11, r0 + bne reg2_error_loop + movs r0, #12 + cmp r12, r0 + bne reg2_error_loop + + /* Everything passed, inc the loop counter. */ + push { r1 } + ldr r0, =ulRegTest2LoopCounter + ldr r1, [r0] + adds r1, r1, #1 + str r1, [r0] + pop { r1 } + + /* Start again. */ + movs r0, #10 + b reg2_loop + + reg2_error_loop: + /* If this line is hit then there was an error in + * a core register value. The loop ensures the + * loop counter stops incrementing. */ + b reg2_error_loop + nop +/*-----------------------------------------------------------*/ + +vRegTestAsm_NonSecureCallback: + /* Store callee saved registers. */ + push { r4-r7 } + mov r0, r8 + mov r1, r9 + mov r2, r10 + mov r3, r11 + mov r4, r12 + push { r0-r4 } + + /* Fill the core registers with known values. */ + movs r1, #151 + movs r2, #152 + movs r3, #153 + movs r4, #154 + movs r5, #155 + movs r6, #156 + movs r7, #157 + movs r0, #158 + mov r8, r0 + movs r0, #159 + mov r9, r0 + movs r0, #160 + mov r10, r0 + movs r0, #161 + mov r11, r0 + movs r0, #162 + mov r12, r0 + movs r0, #150 + + /* Force a context switch by pending non-secure sv. */ + push { r0, r1 } + movs r0, #0x01 + ldr r1, =0xe000ed04 /* NVIC_ICSR. */ + lsls r0, r0, #28 /* Shift to PendSV bit. */ + str r0, [r1] + dsb + pop { r0, r1 } + + /* Verify that core registers contain correct values. */ + cmp r0, #150 + bne reg_nscb_error_loop + cmp r1, #151 + bne reg_nscb_error_loop + cmp r2, #152 + bne reg_nscb_error_loop + cmp r3, #153 + bne reg_nscb_error_loop + cmp r4, #154 + bne reg_nscb_error_loop + cmp r5, #155 + bne reg_nscb_error_loop + cmp r6, #156 + bne reg_nscb_error_loop + cmp r7, #157 + bne reg_nscb_error_loop + movs r0, #158 + cmp r8, r0 + bne reg_nscb_error_loop + movs r0, #159 + cmp r9, r0 + bne reg_nscb_error_loop + movs r0, #160 + cmp r10, r0 + bne reg_nscb_error_loop + movs r0, #161 + cmp r11, r0 + bne reg_nscb_error_loop + movs r0, #162 + cmp r12, r0 + bne reg_nscb_error_loop + + /* Everything passed, finish. */ + b reg_nscb_success + + reg_nscb_error_loop: + /* If this line is hit then there was an error in + * a core register value. The loop ensures the + * loop counter stops incrementing. */ + b reg_nscb_error_loop + nop + + reg_nscb_success: + /* Restore callee saved registers. */ + pop { r0-r4 } + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + mov r12, r4 + pop { r4-r7 } + bx lr +/*-----------------------------------------------------------*/ + + END diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test.c b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test.c new file mode 100644 index 0000000000..cbef601139 --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test.c @@ -0,0 +1,61 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Interface includes. */ +#include "secure_reg_test_asm.h" + +/* FreeRTOS includes. */ +#include "secure_port_macros.h" + +/* Implemented in assembly. */ +extern void vRegTestAsm_SecureImpl( void ); + +/* typedef for non-secure callback function. */ +typedef __cmse_nonsecure_call void ( * NonSecureRegTestCallback_t ) ( void ); +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void vRegTestAsm_Secure( void ) +{ + /* Call the function implemented in assembly. */ + vRegTestAsm_SecureImpl(); +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void vRegTest_NonSecureCallback( RegTestCallback_t pxRegTestCallback ) +{ + NonSecureRegTestCallback_t pxNonSecureRegTestCallback; + + /* Return function pointer with cleared LSB. */ + pxNonSecureRegTestCallback = ( NonSecureRegTestCallback_t ) cmse_nsfptr_create( pxRegTestCallback ); + + /* Invoke the callback which runs reg tests. */ + pxNonSecureRegTestCallback(); +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.h b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.h new file mode 100644 index 0000000000..3b59c88d23 --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.h @@ -0,0 +1,49 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef SECURE_REG_TEST_ASM_H +#define SECURE_REG_TEST_ASM_H + +/* Callback function pointer definition. */ +typedef void ( * RegTestCallback_t )( void ); + +/** + * @brief Function that implements reg tests for the secure side. + * + * This function is exported as "non-secure callable" and is called + * from a FreeRTOS task on the non-secure side. + */ +void vRegTestAsm_Secure( void ); + +/** + * @brief Invokes the supplied reg test callback on the non-secure side. + * + * This function is exported as "non-secure callable" and is called + * from a FreeRTOS task on the non-secure side.. + */ +void vRegTest_NonSecureCallback( RegTestCallback_t pxRegTestCallback ); + +#endif /* SECURE_REG_TEST_ASM_H */ diff --git a/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.s b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.s new file mode 100644 index 0000000000..cdb2c0842d --- /dev/null +++ b/FreeRTOS/Demo/Common/ARMv8M/reg_tests/IAR/ARM_CM23/secure/secure_reg_test_asm.s @@ -0,0 +1,127 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + + PUBLIC vRegTestAsm_SecureImpl +/*-----------------------------------------------------------*/ + +vRegTestAsm_SecureImpl: + /* Store callee saved registers. */ + push { r4-r7 } + mov r0, r8 + mov r1, r9 + mov r2, r10 + mov r3, r11 + mov r4, r12 + push { r0-r4 } + + /* Fill the core registers with known values. */ + movs r1, #201 + movs r2, #202 + movs r3, #203 + movs r4, #204 + movs r5, #205 + movs r6, #206 + movs r7, #207 + movs r0, #208 + mov r8, r0 + movs r0, #209 + mov r9, r0 + movs r0, #210 + mov r10, r0 + movs r0, #211 + mov r11, r0 + movs r0, #212 + mov r12, r0 + movs r0, #200 + + /* Force a context switch by pending non-secure sv. */ + push { r0, r1 } + movs r0, #0x01 + ldr r1, =0xe002ed04 /* NVIC_ICSR_NS. */ + lsls r0, r0, #28 /* Shift to PendSV bit. */ + str r0, [r1] + dsb + pop { r0, r1 } + + /* Verify that core registers contain correct values. */ + cmp r0, #200 + bne secure_reg_test_error_loop + cmp r1, #201 + bne secure_reg_test_error_loop + cmp r2, #202 + bne secure_reg_test_error_loop + cmp r3, #203 + bne secure_reg_test_error_loop + cmp r4, #204 + bne secure_reg_test_error_loop + cmp r5, #205 + bne secure_reg_test_error_loop + cmp r6, #206 + bne secure_reg_test_error_loop + cmp r7, #207 + bne secure_reg_test_error_loop + movs r0, #208 + cmp r8, r0 + bne secure_reg_test_error_loop + movs r0, #209 + cmp r9, r0 + bne secure_reg_test_error_loop + movs r0, #210 + cmp r10, r0 + bne secure_reg_test_error_loop + movs r0, #211 + cmp r11, r0 + bne secure_reg_test_error_loop + movs r0, #212 + cmp r12, r0 + bne secure_reg_test_error_loop + + /* Everything passed, finish. */ + b secure_reg_test_success + + secure_reg_test_error_loop: + /* If this line is hit then there was an error in + * a core register value. The loop ensures the + * loop counter stops incrementing. */ + b secure_reg_test_error_loop + nop + + secure_reg_test_success: + /* Restore callee saved registers. */ + pop { r0-r4 } + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + mov r12, r4 + pop { r4-r7 } + bx lr +/*-----------------------------------------------------------*/ + + END