From 13dc7fa5a082418fbda49f9337fb0c94777bff5f Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 10 Aug 2016 16:24:24 +0200 Subject: [PATCH] ArmPlatformPkg/PrePeiCore: switch to ASM_FUNC() asm macro Annotate functions with ASM_FUNC() so that they are emitted into separate sections. While we're at it, replace some inefficient uses of LoadConstantToReg() Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel Reviewed-by: Leif Lindholm --- ArmPlatformPkg/PrePeiCore/AArch64/Helper.S | 11 ++----- .../PrePeiCore/AArch64/PrePeiCoreEntryPoint.S | 30 ++++--------------- .../PrePeiCore/AArch64/SwitchStack.S | 9 ++---- .../PrePeiCore/Arm/PrePeiCoreEntryPoint.S | 30 ++++--------------- ArmPlatformPkg/PrePeiCore/Arm/SwitchStack.S | 9 ++---- 5 files changed, 18 insertions(+), 71 deletions(-) diff --git a/ArmPlatformPkg/PrePeiCore/AArch64/Helper.S b/ArmPlatformPkg/PrePeiCore/AArch64/Helper.S index 8e23b03896..5f35484b12 100644 --- a/ArmPlatformPkg/PrePeiCore/AArch64/Helper.S +++ b/ArmPlatformPkg/PrePeiCore/AArch64/Helper.S @@ -14,15 +14,8 @@ #include #include -#start of the code section -.text -.align 3 - -GCC_ASM_EXPORT(SetupExceptionLevel1) -GCC_ASM_EXPORT(SetupExceptionLevel2) - // Setup EL1 while in EL1 -ASM_PFX(SetupExceptionLevel1): +ASM_FUNC(SetupExceptionLevel1) mov x5, x30 // Save LR mov x0, #CPACR_CP_FULL_ACCESS @@ -31,7 +24,7 @@ ASM_PFX(SetupExceptionLevel1): ret x5 // Setup EL2 while in EL2 -ASM_PFX(SetupExceptionLevel2): +ASM_FUNC(SetupExceptionLevel2) msr sctlr_el2, xzr mrs x0, hcr_el2 // Read EL2 Hypervisor configuration Register diff --git a/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S b/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S index 34bf3a4e68..aab5edab0c 100644 --- a/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S +++ b/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S @@ -12,23 +12,8 @@ // #include -#include -#include -#include -.text -.align 3 - -GCC_ASM_IMPORT(CEntryPoint) -GCC_ASM_IMPORT(ArmPlatformGetCorePosition) -GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore) -GCC_ASM_IMPORT(ArmReadMpidr) -GCC_ASM_IMPORT(ArmPlatformPeiBootAction) -GCC_ASM_EXPORT(_ModuleEntryPoint) - -StartupAddr: .8byte CEntryPoint - -ASM_PFX(_ModuleEntryPoint): +ASM_FUNC(_ModuleEntryPoint) // Do early platform specific actions bl ASM_PFX(ArmPlatformPeiBootAction) @@ -60,9 +45,7 @@ ASM_PFX(MainEntryPoint): bl ASM_PFX(ArmPlatformIsPrimaryCore) // Get the top of the primary stacks (and the base of the secondary stacks) - LoadConstantToReg (FixedPcdGet64(PcdCPUCoresStackBase), x1) - LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), x2) - add x1, x1, x2 + MOV64 (x1, FixedPcdGet64(PcdCPUCoresStackBase) + FixedPcdGet32(PcdCPUCorePrimaryStackSize)) // x0 is equal to 1 if I am the primary core cmp x0, #1 @@ -79,20 +62,19 @@ _SetupSecondaryCoreStack: add x0, x0, #1 // StackOffset = CorePos * StackSize - LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), x2) + MOV32 (x2, FixedPcdGet32(PcdCPUCoreSecondaryStackSize)) mul x0, x0, x2 // SP = StackBase + StackOffset add sp, x6, x0 _PrepareArguments: // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector - LoadConstantToReg (FixedPcdGet64(PcdFvBaseAddress), x2) - add x2, x2, #8 - ldr x1, [x2] + MOV64 (x2, FixedPcdGet64(PcdFvBaseAddress)) + ldr x1, [x2, #8] // Move sec startup address into a data register // Ensure we're jumping to FV version of the code (not boot remapped alias) - ldr x3, StartupAddr + ldr x3, =ASM_PFX(CEntryPoint) // Jump to PrePeiCore C code // x0 = mp_id diff --git a/ArmPlatformPkg/PrePeiCore/AArch64/SwitchStack.S b/ArmPlatformPkg/PrePeiCore/AArch64/SwitchStack.S index 8d83510517..89b98e630f 100644 --- a/ArmPlatformPkg/PrePeiCore/AArch64/SwitchStack.S +++ b/ArmPlatformPkg/PrePeiCore/AArch64/SwitchStack.S @@ -14,12 +14,7 @@ # #------------------------------------------------------------------------------ -.text -.align 3 - -GCC_ASM_EXPORT(SecSwitchStack) - - +#include #/** # This allows the caller to switch the stack and return @@ -35,7 +30,7 @@ GCC_ASM_EXPORT(SecSwitchStack) # VOID *StackDelta # )# # -ASM_PFX(SecSwitchStack): +ASM_FUNC(SecSwitchStack) mov x1, sp add x1, x0, x1 mov sp, x1 diff --git a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S index 1693f52e26..14344425ad 100644 --- a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S +++ b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S @@ -12,23 +12,8 @@ // #include -#include -#include -#include -.text -.align 3 - -GCC_ASM_IMPORT(CEntryPoint) -GCC_ASM_IMPORT(ArmPlatformGetCorePosition) -GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore) -GCC_ASM_IMPORT(ArmReadMpidr) -GCC_ASM_IMPORT(ArmPlatformPeiBootAction) -GCC_ASM_EXPORT(_ModuleEntryPoint) - -StartupAddr: .word CEntryPoint - -ASM_PFX(_ModuleEntryPoint): +ASM_FUNC(_ModuleEntryPoint) // Do early platform specific actions bl ASM_PFX(ArmPlatformPeiBootAction) @@ -41,9 +26,7 @@ ASM_PFX(_ModuleEntryPoint): bl ASM_PFX(ArmPlatformIsPrimaryCore) // Get the top of the primary stacks (and the base of the secondary stacks) - LoadConstantToReg (FixedPcdGet64(PcdCPUCoresStackBase), r1) - LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) - add r1, r1, r2 + MOV32 (r1, FixedPcdGet64(PcdCPUCoresStackBase) + FixedPcdGet32(PcdCPUCorePrimaryStackSize)) // r0 is equal to 1 if I am the primary core cmp r0, #1 @@ -60,20 +43,19 @@ _SetupSecondaryCoreStack: add r0, r0, #1 // StackOffset = CorePos * StackSize - LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2) + MOV32 (r2, FixedPcdGet32(PcdCPUCoreSecondaryStackSize)) mul r0, r0, r2 // SP = StackBase + StackOffset add sp, r6, r0 _PrepareArguments: // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector - LoadConstantToReg (FixedPcdGet32(PcdFvBaseAddress), r2) - add r2, r2, #4 - ldr r1, [r2] + MOV32 (r2, FixedPcdGet32(PcdFvBaseAddress)) + ldr r1, [r2, #4] // Move sec startup address into a data register // Ensure we're jumping to FV version of the code (not boot remapped alias) - ldr r3, StartupAddr + ldr r3, =ASM_PFX(CEntryPoint) // Jump to PrePeiCore C code // r0 = mp_id diff --git a/ArmPlatformPkg/PrePeiCore/Arm/SwitchStack.S b/ArmPlatformPkg/PrePeiCore/Arm/SwitchStack.S index 509dc205d9..c419463b4f 100644 --- a/ArmPlatformPkg/PrePeiCore/Arm/SwitchStack.S +++ b/ArmPlatformPkg/PrePeiCore/Arm/SwitchStack.S @@ -12,12 +12,7 @@ # #------------------------------------------------------------------------------ -.text -.align 3 - -GCC_ASM_EXPORT(SecSwitchStack) - - +#include #/** # This allows the caller to switch the stack and return @@ -33,7 +28,7 @@ GCC_ASM_EXPORT(SecSwitchStack) # VOID *StackDelta # )# # -ASM_PFX(SecSwitchStack): +ASM_FUNC(SecSwitchStack) mov R1, R13 add R1, R0, R1 mov R13, R1