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