From 8cc852f79132897a0d371b05780762a0fcd959d8 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Tue, 28 Feb 2012 17:27:15 +0000 Subject: [PATCH] ArmPlatformPkg: Move the Secure Monitor initialization into a separate 'ArmTrustedMonitorLib' library git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13059 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPlatformPkg/ArmPlatformPkg.dsc | 1 + .../ArmRealViewEbPkg/ArmRealViewEb.dsc.inc | 3 +- .../ArmVExpressPkg/ArmVExpress.dsc.inc | 5 ++- .../Include/Library/ArmTrustedMonitorLib.h | 24 +++++++++++ .../ArmTrustedMonitorLibNull.c | 37 +++++++++++++++++ .../ArmTrustedMonitorLibNull.inf | 37 +++++++++++++++++ .../ArmTrustedMonitorLibNull/MonitorTable.S | 41 +++++++++++++++++++ .../ArmTrustedMonitorLibNull/MonitorTable.asm | 40 ++++++++++++++++++ ArmPlatformPkg/Sec/Helper.S | 13 +----- ArmPlatformPkg/Sec/Helper.asm | 14 +------ ArmPlatformPkg/Sec/Sec.c | 12 +++--- ArmPlatformPkg/Sec/Sec.inf | 3 +- 12 files changed, 196 insertions(+), 34 deletions(-) create mode 100644 ArmPlatformPkg/Include/Library/ArmTrustedMonitorLib.h create mode 100644 ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.c create mode 100644 ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.inf create mode 100644 ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.S create mode 100644 ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.asm diff --git a/ArmPlatformPkg/ArmPlatformPkg.dsc b/ArmPlatformPkg/ArmPlatformPkg.dsc index 551e739368..a268c4c96a 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dsc +++ b/ArmPlatformPkg/ArmPlatformPkg.dsc @@ -115,6 +115,7 @@ [LibraryClasses.common.SEC] ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf ArmPlatformLib|ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNullSec.inf + ArmTrustedMonitorLib|ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.inf ArmPlatformSecExtraActionLib|ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf ArmPlatformGlobalVariableLib|ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.inf diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb.dsc.inc b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb.dsc.inc index 1ef593f086..0821dc2237 100644 --- a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb.dsc.inc +++ b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb.dsc.inc @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, ARM Limited. All rights reserved. +# Copyright (c) 2011-2012, ARM Limited. All rights reserved. # # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -101,6 +101,7 @@ [LibraryClasses.common.SEC] ArmPlatformSecExtraActionLib|ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf ArmPlatformGlobalVariableLib|ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.inf + ArmTrustedMonitorLib|ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.inf DebugAgentLib|ArmPkg/Library/DebugAgentSymbolsOnlyLib/DebugAgentSymbolsOnlyLib.inf # Uncomment to turn on GDB stub in SEC. diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc index 6242891c57..0bec286141 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, ARM Limited. All rights reserved. +# Copyright (c) 2011-2012, ARM Limited. All rights reserved. # # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -118,6 +118,9 @@ MemoryInitPeiLib|ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf !endif + # Trustzone Support + ArmTrustedMonitorLib|ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.inf + [LibraryClasses.common.PEI_CORE] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf diff --git a/ArmPlatformPkg/Include/Library/ArmTrustedMonitorLib.h b/ArmPlatformPkg/Include/Library/ArmTrustedMonitorLib.h new file mode 100644 index 0000000000..5368697c5c --- /dev/null +++ b/ArmPlatformPkg/Include/Library/ArmTrustedMonitorLib.h @@ -0,0 +1,24 @@ +/** @file +* Main file supporting the Monitor World on ARM PLatforms +* +* Copyright (c) 2011, ARM Limited. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#ifndef __ARM_TRUSTED_MONITOR_LIB_H_ +#define __ARM_TRUSTED_MONITOR_LIB_H_ + +VOID +ArmSecureMonitorWorldInitialize ( + VOID + ); + +#endif diff --git a/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.c b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.c new file mode 100644 index 0000000000..b6eff6ee9d --- /dev/null +++ b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.c @@ -0,0 +1,37 @@ +/** @file +* Main file supporting the Monitor World on ARM PLatforms +* +* Copyright (c) 2011, ARM Limited. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#include +#include +#include + +#define IS_ALIGNED(Address, Align) (((UINTN)Address & (Align-1)) == 0) + +VOID +MonitorVectorTable ( + VOID + ); + +VOID +ArmSecureMonitorWorldInitialize ( + VOID + ) +{ + // Ensure the Monitor Table is 32bit aligned + ASSERT (IS_ALIGNED(MonitorVectorTable, BIT5)); + + // Write the Monitor Mode Vector Table Address + ArmWriteVMBar ((UINT32) &MonitorVectorTable); +} diff --git a/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.inf b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.inf new file mode 100644 index 0000000000..39bd97c6f5 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/ArmTrustedMonitorLibNull.inf @@ -0,0 +1,37 @@ +#/* @file +# Copyright (c) 2011, ARM Limited. All rights reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +#*/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ArmTrustedMonitorLibNull + FILE_GUID = c4b50eb2-ed16-4283-a5b0-a7341c3f997b + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmTrustedMonitorLib + +[Sources.common] + ArmTrustedMonitorLibNull.c + MonitorTable.asm | RVCT + MonitorTable.S | GCC + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + ArmLib + BaseLib + DebugLib + PcdLib + \ No newline at end of file diff --git a/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.S b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.S new file mode 100644 index 0000000000..3e75bee505 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.S @@ -0,0 +1,41 @@ +// +// Copyright (c) 2011, ARM Limited. All rights reserved. +// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the BSD License +// which accompanies this distribution. The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// +// + +#include +#include +#include + +.text +.align 5 + +GCC_ASM_EXPORT(MonitorVectorTable) + +ASM_PFX(MonitorVectorTable): + +_MonitorResetEntry: + b _MonitorResetEntry +_MonitorUndefinedEntry: + b _MonitorUndefinedEntry +_MonitorSmcEntry: + b _MonitorSmcEntry +_MonitorPrefetchEntry: + b _MonitorPrefetchEntry +_MonitorDataAbortEntry: + b _MonitorDataAbortEntry +_MonitorReservedEntry: + b _MonitorReservedEntry +_MonitorIrqEntry: + b _MonitorIrqEntry +_MonitorFiqEntry: + b _MonitorFiqEntry + diff --git a/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.asm b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.asm new file mode 100644 index 0000000000..f4f515d05c --- /dev/null +++ b/ArmPlatformPkg/Library/ArmTrustedMonitorLibNull/MonitorTable.asm @@ -0,0 +1,40 @@ +// +// Copyright (c) 2011, ARM Limited. All rights reserved. +// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the BSD License +// which accompanies this distribution. The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// +// + +#include + + EXPORT MonitorVectorTable + + PRESERVE8 + AREA MonitoVectorTableArea, CODE, READONLY, CODEALIGN, ALIGN=5 + +MonitorVectorTable + +_MonitorResetEntry + b _MonitorResetEntry +_MonitorUndefinedEntry + b _MonitorUndefinedEntry +_MonitorSmcEntry + b _MonitorSmcEntry +_MonitorPrefetchEntry + b _MonitorPrefetchEntry +_MonitorDataAbortEntry + b _MonitorDataAbortEntry +_MonitorReservedEntry + b _MonitorReservedEntry +_MonitorIrqEntry + b _MonitorIrqEntry +_MonitorFiqEntry + b _MonitorFiqEntry + + END diff --git a/ArmPlatformPkg/Sec/Helper.S b/ArmPlatformPkg/Sec/Helper.S index 61491b5655..50cd733f97 100644 --- a/ArmPlatformPkg/Sec/Helper.S +++ b/ArmPlatformPkg/Sec/Helper.S @@ -1,5 +1,5 @@ #======================================================================================== -# Copyright (c) 2011, ARM Limited. All rights reserved. +# Copyright (c) 2011-2012, ARM Limited. All rights reserved. # # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -15,22 +15,11 @@ .text .align 3 -GCC_ASM_EXPORT(monitor_vector_table) GCC_ASM_EXPORT(return_from_exception) GCC_ASM_EXPORT(enter_monitor_mode) GCC_ASM_EXPORT(copy_cpsr_into_spsr) GCC_ASM_EXPORT(set_non_secure_mode) -ASM_PFX(monitor_vector_table): - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - # arg0: Secure Monitor mode stack ASM_PFX(enter_monitor_mode): mov r2, lr @ Save current lr diff --git a/ArmPlatformPkg/Sec/Helper.asm b/ArmPlatformPkg/Sec/Helper.asm index cd9603c7a0..1ba7b434e7 100644 --- a/ArmPlatformPkg/Sec/Helper.asm +++ b/ArmPlatformPkg/Sec/Helper.asm @@ -1,5 +1,5 @@ // -// Copyright (c) 2011, ARM Limited. All rights reserved. +// Copyright (c) 2011-2012, ARM Limited. All rights reserved. // // This program and the accompanying materials // are licensed and made available under the terms and conditions of the BSD License @@ -11,7 +11,6 @@ // // - EXPORT monitor_vector_table EXPORT return_from_exception EXPORT enter_monitor_mode EXPORT copy_cpsr_into_spsr @@ -19,17 +18,6 @@ AREA Helper, CODE, READONLY - ALIGN 32 -monitor_vector_table - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - ldr pc, dead - // arg0: Secure Monitor mode stack enter_monitor_mode mov r2, lr // Save current lr diff --git a/ArmPlatformPkg/Sec/Sec.c b/ArmPlatformPkg/Sec/Sec.c index a32cd3857e..59012a1266 100644 --- a/ArmPlatformPkg/Sec/Sec.c +++ b/ArmPlatformPkg/Sec/Sec.c @@ -1,7 +1,7 @@ /** @file * Main file supporting the SEC Phase on ARM Platforms * -* Copyright (c) 2011, ARM Limited. All rights reserved. +* Copyright (c) 2011-2012, ARM Limited. All rights reserved. * * This program and the accompanying materials * are licensed and made available under the terms and conditions of the BSD License @@ -13,6 +13,7 @@ * **/ +#include #include #include #include @@ -24,8 +25,6 @@ #define SerialPrint(txt) SerialPortWrite ((UINT8*)txt, AsciiStrLen(txt)+1); -extern VOID *monitor_vector_table; - VOID CEntryPoint ( IN UINTN MpId @@ -114,10 +113,11 @@ CEntryPoint ( // Enter Monitor Mode enter_monitor_mode ((VOID*)(PcdGet32(PcdCPUCoresSecMonStackBase) + (PcdGet32(PcdCPUCoreSecMonStackSize) * (GET_CORE_POS(MpId) + 1)))); - //Write the monitor mode vector table address - ArmWriteVMBar((UINT32) &monitor_vector_table); + //-------------------- Monitor Mode --------------------- + + // Set up Monitor World (Vector Table, etc) + ArmSecureMonitorWorldInitialize (); - //-------------------- Monitor Mode --------------------- // Setup the Trustzone Chipsets if (IS_PRIMARY_CORE(MpId)) { ArmPlatformTrustzoneInit (); diff --git a/ArmPlatformPkg/Sec/Sec.inf b/ArmPlatformPkg/Sec/Sec.inf index f80db4a630..7a7a61251e 100644 --- a/ArmPlatformPkg/Sec/Sec.inf +++ b/ArmPlatformPkg/Sec/Sec.inf @@ -1,7 +1,7 @@ #/** @file # SEC - Reset vector code that jumps to C and loads DXE core # -# Copyright (c) 2011, ARM Limited. All rights reserved. +# Copyright (c) 2011-2012, ARM Limited. All rights reserved. # # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -39,6 +39,7 @@ ArmCpuLib ArmLib ArmPlatformLib + ArmTrustedMonitorLib BaseLib DebugLib DebugAgentLib -- 2.39.2