ArmPlatformPkg/ArmPlatformStackLib: 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(),
and remove the workaround that was added to allow conditional branches
to functions with external linkage.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
Ard Biesheuvel 2016-08-10 16:55:23 +02:00
parent c17ae4cf8e
commit 926059304e
2 changed files with 12 additions and 48 deletions

View File

@ -12,21 +12,6 @@
// //
#include <AsmMacroIoLibV8.h> #include <AsmMacroIoLibV8.h>
#include <Base.h>
#include <AutoGen.h>
.text
.align 3
GCC_ASM_EXPORT(ArmPlatformStackSet)
GCC_ASM_EXPORT(ArmPlatformStackSetPrimary)
GCC_ASM_EXPORT(ArmPlatformStackSetSecondary)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(ArmPlatformGetPrimaryCoreMpId)
GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount)
//VOID //VOID
//ArmPlatformStackSet ( //ArmPlatformStackSet (
@ -35,7 +20,7 @@ GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount)
// IN UINTN PrimaryStackSize, // IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ASM_PFX(ArmPlatformStackSet): ASM_FUNC(ArmPlatformStackSet)
// Save parameters // Save parameters
mov x6, x3 mov x6, x3
mov x5, x2 mov x5, x2
@ -59,10 +44,10 @@ ASM_PFX(ArmPlatformStackSet):
// Restore the Link register // Restore the Link register
mov x30, x7 mov x30, x7
// Should be ASM_PFX(ArmPlatformStackSetPrimary) but generate linker error 'unsupported ELF EM_AARCH64' b.ne 0f
b.eq ArmPlatformStackSetPrimaryL
// Should be ASM_PFX(ArmPlatformStackSetSecondary) but generate linker error 'unsupported ELF EM_AARCH64' b ASM_PFX(ArmPlatformStackSetPrimary)
b.ne ArmPlatformStackSetSecondaryL 0:b ASM_PFX(ArmPlatformStackSetSecondary)
//VOID //VOID
//ArmPlatformStackSetPrimary ( //ArmPlatformStackSetPrimary (
@ -71,8 +56,7 @@ ASM_PFX(ArmPlatformStackSet):
// IN UINTN PrimaryStackSize, // IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ArmPlatformStackSetPrimaryL: ASM_FUNC(ArmPlatformStackSetPrimary)
ASM_PFX(ArmPlatformStackSetPrimary):
// Save the Link register // Save the Link register
mov x4, x30 mov x4, x30
@ -80,9 +64,7 @@ ASM_PFX(ArmPlatformStackSetPrimary):
add x0, x0, x2 add x0, x0, x2
// Compute SecondaryCoresCount * SecondaryCoreStackSize // Compute SecondaryCoresCount * SecondaryCoreStackSize
LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, x1) MOV32 (w1, FixedPcdGet32(PcdCoreCount) - 1)
ldr w1, [x1]
sub x1, x1, #1
mul x3, x3, x1 mul x3, x3, x1
// Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize)) // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
@ -97,8 +79,7 @@ ASM_PFX(ArmPlatformStackSetPrimary):
// IN UINTN PrimaryStackSize, // IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ArmPlatformStackSetSecondaryL: ASM_FUNC(ArmPlatformStackSetSecondary)
ASM_PFX(ArmPlatformStackSetSecondary):
// Save the Link register // Save the Link register
mov x4, x30 mov x4, x30
mov sp, x0 mov sp, x0

View File

@ -12,21 +12,6 @@
// //
#include <AsmMacroIoLib.h> #include <AsmMacroIoLib.h>
#include <Base.h>
#include <AutoGen.h>
.text
.align 3
GCC_ASM_EXPORT(ArmPlatformStackSet)
GCC_ASM_EXPORT(ArmPlatformStackSetPrimary)
GCC_ASM_EXPORT(ArmPlatformStackSetSecondary)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(ArmPlatformGetPrimaryCoreMpId)
GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount)
//VOID //VOID
//ArmPlatformStackSet ( //ArmPlatformStackSet (
@ -35,7 +20,7 @@ GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount)
// IN UINTN PrimaryStackSize, // IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ASM_PFX(ArmPlatformStackSet): ASM_FUNC(ArmPlatformStackSet)
// Save parameters // Save parameters
mov r6, r3 mov r6, r3
mov r5, r2 mov r5, r2
@ -69,16 +54,14 @@ ASM_PFX(ArmPlatformStackSet):
// IN UINTN PrimaryStackSize, // IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ASM_PFX(ArmPlatformStackSetPrimary): ASM_FUNC(ArmPlatformStackSetPrimary)
mov r4, lr mov r4, lr
// Add stack of primary stack to StackBase // Add stack of primary stack to StackBase
add r0, r0, r2 add r0, r0, r2
// Compute SecondaryCoresCount * SecondaryCoreStackSize // Compute SecondaryCoresCount * SecondaryCoreStackSize
LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1) MOV32 (r1, FixedPcdGet32(PcdCoreCount) - 1)
ldr r1, [r1]
sub r1, #1
mul r3, r3, r1 mul r3, r3, r1
// Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize)) // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
@ -93,7 +76,7 @@ ASM_PFX(ArmPlatformStackSetPrimary):
// IN UINTN PrimaryStackSize, // IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ASM_PFX(ArmPlatformStackSetSecondary): ASM_FUNC(ArmPlatformStackSetSecondary)
mov r4, lr mov r4, lr
mov sp, r0 mov sp, r0