gArmTokenSpaceGuid.PcdFdSize|0|UINT32|0x0000002C\r
gArmTokenSpaceGuid.PcdFvBaseAddress|0|UINT32|0x0000002D\r
gArmTokenSpaceGuid.PcdFvSize|0|UINT32|0x0000002E\r
+ \r
+ #\r
+ # ARM Security Extension\r
+ #\r
+ \r
+ # Secure Configuration Register\r
+ # - BIT0 : NS - Non Secure bit \r
+ # - BIT1 : IRQ Handler\r
+ # - BIT2 : FIQ Handler\r
+ # - BIT3 : EA - External Abort\r
+ # - BIT4 : FW - F bit writable\r
+ # - BIT5 : AW - A bit writable\r
+ # - BIT6 : nET - Not Early Termination\r
+ # - BIT7 : SCD - Secure Monitor Call Disable\r
+ # - BIT8 : HCE - Hyp Call enable\r
+ # - BIT9 : SIF - Secure Instruction Fetch\r
+ # 0x31 = NS | EA | FW\r
+ gArmTokenSpaceGuid.PcdArmScr|0x31|UINT32|0x00000038\r
+ \r
+ # Non Secure Access Control Register\r
+ # - BIT15 : NSASEDIS - Disable Non-secure Advanced SIMD functionality\r
+ # - BIT14 : NSD32DIS - Disable Non-secure use of D16-D31 \r
+ # - BIT11 : cp11 - Non-secure access to coprocessor 11 enable\r
+ # - BIT10 : cp10 - Non-secure access to coprocessor 10 enable\r
+ # 0xC00 = cp10 | cp11\r
+ gArmTokenSpaceGuid.PcdArmNsacr|0xC00|UINT32|0x00000039\r
+ \r
+ gArmTokenSpaceGuid.PcdArmNonSecModeTransition|0x0|UINT32|0x0000003E\r
\r
# System Memory (DRAM): These PCDs define the region of in-built system memory\r
# Some platforms can get DRAM extensions, these additional regions will be declared\r
GCC_ASM_EXPORT(return_from_exception)\r
GCC_ASM_EXPORT(enter_monitor_mode)\r
GCC_ASM_EXPORT(copy_cpsr_into_spsr)\r
+GCC_ASM_EXPORT(set_non_secure_mode)\r
\r
ASM_PFX(monitor_vector_table):\r
ldr pc, dead\r
msr spsr_cxsf, r0\r
bx lr\r
\r
+# Set the Non Secure Mode\r
+ASM_PFX(set_non_secure_mode):\r
+ push { r1 }\r
+ and r0, r0, #0x1f @ Keep only the mode bits\r
+ mrs r1, spsr @ Read the spsr\r
+ bic r1, r1, #0x1f @ Clear all mode bits\r
+ orr r1, r1, r0\r
+ msr spsr_cxsf, r1 @ write back spsr (may have caused a mode switch)\r
+ isb\r
+ pop { r1 }\r
+ bx lr @ return (hopefully thumb-safe!)\r
+\r
dead:\r
b dead\r
\r
EXPORT return_from_exception\r
EXPORT enter_monitor_mode\r
EXPORT copy_cpsr_into_spsr\r
+ EXPORT set_non_secure_mode\r
\r
AREA Helper, CODE, READONLY\r
\r
msr spsr_cxsf, r0\r
bx lr\r
\r
+// Set the Non Secure Mode\r
+set_non_secure_mode\r
+ push { r1 }\r
+ and r0, r0, #0x1f // Keep only the mode bits\r
+ mrs r1, spsr // Read the spsr\r
+ bic r1, r1, #0x1f // Clear all mode bits\r
+ orr r1, r1, r0\r
+ msr spsr_cxsf, r1 // write back spsr (may have caused a mode switch)\r
+ isb\r
+ pop { r1 }\r
+ bx lr // return (hopefully thumb-safe!)\r
+\r
dead\r
B dead\r
\r
// Transfer the interrupt to Non-secure World
ArmGicSetupNonSecure (PcdGet32(PcdGicDistributorBase), PcdGet32(PcdGicInterruptInterfaceBase));
- // Write to CP15 Non-secure Access Control Register :
- // - Enable CP10 and CP11 accesses in NS World
- // - Enable Access to Preload Engine in NS World
- // - Enable lockable TLB entries allocation in NS world
- // - Enable R/W access to SMP bit of Auxiliary Control Register in NS world
- ArmWriteNsacr (NSACR_NS_SMP | NSACR_TL | NSACR_PLE | NSACR_CP(10) | NSACR_CP(11));
-
- // CP15 Secure Configuration Register with Non Secure bit (SCR_NS), CPSR.A modified in any
- // security state (SCR_AW), CPSR.F modified in any security state (SCR_FW)
- ArmWriteScr (SCR_NS | SCR_FW | SCR_AW);
+ // Write to CP15 Non-secure Access Control Register
+ ArmWriteNsacr (PcdGet32 (PcdArmNsacr));
+
+ // CP15 Secure Configuration Register
+ ArmWriteScr (PcdGet32 (PcdArmScr));
} else {
if (IS_PRIMARY_CORE(MpId)) {
SerialPrint ("Trust Zone Configuration is disabled\n\r");
JumpAddress = PcdGet32 (PcdFvBaseAddress);
ArmPlatformSecExtraAction (MpId, &JumpAddress);
+ // If PcdArmNonSecModeTransition is defined then set this specific mode to CPSR before the transition
+ // By not set, the mode for Non Secure World is SVC
+ if (PcdGet32 (PcdArmNonSecModeTransition) != 0) {
+ set_non_secure_mode ((ARM_PROCESSOR_MODE)PcdGet32 (PcdArmNonSecModeTransition));
+ }
+
return_from_exception (JumpAddress);
//-------------------- Non Secure Mode ---------------------
gArmTokenSpaceGuid.PcdTrustzoneSupport\r
gArmTokenSpaceGuid.PcdVFPEnabled\r
\r
+ gArmTokenSpaceGuid.PcdArmScr\r
+ gArmTokenSpaceGuid.PcdArmNsacr\r
+ gArmTokenSpaceGuid.PcdArmNonSecModeTransition\r
+ \r
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
gArmTokenSpaceGuid.PcdArmPrimaryCore\r
\r
+ gArmTokenSpaceGuid.PcdSecureFvBaseAddress\r
+ gArmTokenSpaceGuid.PcdSecureFvSize\r
+ \r
gArmTokenSpaceGuid.PcdFvBaseAddress\r
\r
gArmPlatformTokenSpaceGuid.PcdCPUCoresSecStackBase\r
VOID\r
);\r
\r
+VOID\r
+set_non_secure_mode (\r
+ IN ARM_PROCESSOR_MODE Mode\r
+ );\r
+\r
VOID\r
SecCommonExceptionEntry (\r
IN UINT32 Entry,\r