ArmPlatformPkg/ArmPlatformStackLib: Introduced helper library to initialize stacks

The new functions are:
- ArmPlatformStackSet(IN UINTN StackBase, IN UINTN MpId, IN UINTN PrimaryStackSize, IN UINTN SecondaryStackSize);
- ArmPlatformStackSetPrimary(IN UINTN StackBase, IN UINTN MpId, IN UINTN PrimaryStackSize, IN UINTN SecondaryStackSize);
- ArmPlatformStackSetSecondary(IN UINTN StackBase, IN UINTN MpId, IN UINTN PrimaryStackSize, IN UINTN SecondaryStackSize);

The stack topology can be changed by implementing a new ArmPlatformStackLib

Signed-off-by: Olivier Martin <olivier.martin@arm.com>




git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13774 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
oliviermartin 2012-09-28 11:01:36 +00:00
parent 7d49ced0cf
commit 17839a45b8
11 changed files with 360 additions and 122 deletions

View File

@ -144,6 +144,21 @@ _SetPrimaryStackInitGlobals: ; \
b _SetPrimaryStackInitGlobals ; \ b _SetPrimaryStackInitGlobals ; \
_SetPrimaryStackEnd: _SetPrimaryStackEnd:
// Initialize the Global Variable with '0'
#define InitializePrimaryStack(GlobalSize, Tmp1) \
and Tmp1, GlobalSize, #7 ; \
rsbne Tmp1, Tmp1, #8 ; \
add GlobalSize, GlobalSize, Tmp1 ; \
; \
mov Tmp1, sp ; \
sub sp, GlobalSize ; \
mov GlobalSize, #0x0 ; \
_InitializePrimaryStackLoop: ; \
cmp Tmp1, sp ; \
bls _InitializePrimaryStackEnd ; \
str GlobalSize, [Tmp1], #-4 ; \
b _InitializePrimaryStackLoop ; \
_InitializePrimaryStackEnd:
#elif defined (__GNUC__) #elif defined (__GNUC__)
@ -213,6 +228,22 @@ _SetPrimaryStackInitGlobals: ; \
b _SetPrimaryStackInitGlobals ; \ b _SetPrimaryStackInitGlobals ; \
_SetPrimaryStackEnd: _SetPrimaryStackEnd:
// Initialize the Global Variable with '0'
#define InitializePrimaryStack(GlobalSize, Tmp1) \
and Tmp1, GlobalSize, #7 ; \
rsbne Tmp1, Tmp1, #8 ; \
add GlobalSize, GlobalSize, Tmp1 ; \
; \
mov Tmp1, sp ; \
sub sp, GlobalSize ; \
mov GlobalSize, #0x0 ; \
_InitializePrimaryStackLoop: ; \
cmp Tmp1, sp ; \
bls _InitializePrimaryStackEnd ; \
str GlobalSize, [Tmp1], #-4 ; \
b _InitializePrimaryStackLoop ; \
_InitializePrimaryStackEnd:
#else #else
// //
@ -278,6 +309,9 @@ _SetPrimaryStackEnd:
#define SetPrimaryStack(StackTop,GlobalSize,Tmp) SetPrimaryStack StackTop, GlobalSize, Tmp #define SetPrimaryStack(StackTop,GlobalSize,Tmp) SetPrimaryStack StackTop, GlobalSize, Tmp
// Initialize the Global Variable with '0'
#define InitializePrimaryStack(GlobalSize, Tmp1) InitializePrimaryStack GlobalSize, Tmp1
#endif #endif
#endif #endif

View File

@ -104,8 +104,25 @@ _SetPrimaryStackInitGlobals
beq _SetPrimaryStackEnd beq _SetPrimaryStackEnd
str $GlobalSize, [$Tmp], #4 str $GlobalSize, [$Tmp], #4
b _SetPrimaryStackInitGlobals b _SetPrimaryStackInitGlobals
_SetPrimaryStackEnd _SetPrimaryStackEnd
MEND MEND
MACRO
InitializePrimaryStack $GlobalSize, $Tmp1
and $Tmp1, $GlobalSize, #7
rsbne $Tmp1, $Tmp1, #8
add $GlobalSize, $GlobalSize, $Tmp1
mov $Tmp1, sp
sub sp, $GlobalSize
; Set all the global variables to 0
mov $GlobalSize, #0x0
_InitializePrimaryStackLoop
cmp $Tmp1, sp
bls _InitializePrimaryStackEnd
str $GlobalSize, [$Tmp1], #-4
b _InitializePrimaryStackLoop
_InitializePrimaryStackEnd
MEND
END END

View File

@ -61,6 +61,7 @@
ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf
DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf DmaLib|ArmPkg/Library/ArmDmaLib/ArmDmaLib.inf
ArmGicLib|ArmPkg/Drivers/PL390Gic/PL390GicLib.inf ArmGicLib|ArmPkg/Drivers/PL390Gic/PL390GicLib.inf
ArmPlatformStackLib|ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf
# Versatile Express Specific Libraries # Versatile Express Specific Libraries
ArmPlatformSysConfigLib|ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSysConfigLib/ArmVExpressSysConfigLib.inf ArmPlatformSysConfigLib|ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSysConfigLib/ArmVExpressSysConfigLib.inf

View File

@ -0,0 +1,106 @@
//
// Copyright (c) 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
// 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 <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(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
//VOID
//ArmPlatformStackSet (
// IN UINTN StackBase,
// IN UINTN MpId,
// IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize
// );
ASM_PFX(ArmPlatformStackSet):
// Identify Stack
// Mask for ClusterId|CoreId
LoadConstantToReg (0xFFFF, r4)
and r1, r1, r4
// Is it the Primary Core ?
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r4)
ldr r4, [r4]
cmp r1, r4
beq ASM_PFX(ArmPlatformStackSetPrimary)
bne ASM_PFX(ArmPlatformStackSetSecondary)
//VOID
//ArmPlatformStackSetPrimary (
// IN UINTN StackBase,
// IN UINTN MpId,
// IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize
// );
ASM_PFX(ArmPlatformStackSetPrimary):
mov r4, lr
// Add stack of primary stack to StackBase
add r0, r0, r2
// Compute SecondaryCoresCount * SecondaryCoreStackSize
LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1)
ldr r1, [r1]
sub r1, #1
mul r3, r3, r1
// Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
add sp, r0, r3
bx r4
//VOID
//ArmPlatformStackSetSecondary (
// IN UINTN StackBase,
// IN UINTN MpId,
// IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize
// );
ASM_PFX(ArmPlatformStackSetSecondary):
mov r4, lr
mov sp, r0
// Get Core Position
mov r0, r1
bl ASM_PFX(ArmPlatformGetCorePosition)
mov r5, r0
// Get Primary Core Position
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)
ldr r0, [r0]
bl ASM_PFX(ArmPlatformGetCorePosition)
// Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
cmp r5, r0
subhi r5, r5, #1
add r5, r5, #1
// Compute top of the secondary stack
mul r3, r3, r5
// Set stack
add sp, sp, r3
bx r4

View File

@ -0,0 +1,112 @@
//
// Copyright (c) 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
// 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 <AsmMacroIoLib.h>
#include <Base.h>
#include <AutoGen.h>
INCLUDE AsmMacroIoLib.inc
EXPORT ArmPlatformStackSet
EXPORT ArmPlatformStackSetPrimary
EXPORT ArmPlatformStackSetSecondary
IMPORT ArmPlatformGetCorePosition
IMPORT _gPcd_FixedAtBuild_PcdCoreCount
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
PRESERVE8
AREA ArmPlatformStackLib, CODE, READONLY
//VOID
//ArmPlatformStackSet (
// IN UINTN StackBase,
// IN UINTN MpId,
// IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize
// );
ArmPlatformStackSet FUNCTION
// Identify Stack
// Mask for ClusterId|CoreId
LoadConstantToReg (0xFFFF, r4)
and r1, r1, r4
// Is it the Primary Core ?
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r4)
ldr r4, [r4]
cmp r1, r4
beq ArmPlatformStackSetPrimary
bne ArmPlatformStackSetSecondary
ENDFUNC
//VOID
//ArmPlatformStackSetPrimary (
// IN UINTN StackBase,
// IN UINTN MpId,
// IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize
// );
ArmPlatformStackSetPrimary FUNCTION
mov r4, lr
// Add stack of primary stack to StackBase
add r0, r0, r2
// Compute SecondaryCoresCount * SecondaryCoreStackSize
LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1)
ldr r1, [r1]
sub r1, #1
mul r3, r3, r1
// Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
add sp, r0, r3
bx r4
ENDFUNC
//VOID
//ArmPlatformStackSetSecondary (
// IN UINTN StackBase,
// IN UINTN MpId,
// IN UINTN PrimaryStackSize,
// IN UINTN SecondaryStackSize
// );
ArmPlatformStackSetSecondary FUNCTION
mov r4, lr
mov sp, r0
// Get Core Position
mov r0, r1
bl ArmPlatformGetCorePosition
mov r5, r0
// Get Primary Core Position
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)
ldr r0, [r0]
bl ArmPlatformGetCorePosition
// Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
cmp r5, r0
subhi r5, r5, #1
add r5, r5, #1
// Compute top of the secondary stack
mul r3, r3, r5
// Set stack
add sp, sp, r3
bx r4
ENDFUNC
END

View File

@ -0,0 +1,39 @@
#/* @file
#
# Copyright (c) 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
# 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 = ArmPlatformStackLib
FILE_GUID = 5e2e44af-53c1-44c2-a801-9c149f3d6ba0
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = ArmPlatformStackLib
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
[Sources.common]
ArmPlatformStackLib.asm | RVCT
ArmPlatformStackLib.S | GCC
[FixedPcd]
gArmPlatformTokenSpaceGuid.PcdCoreCount
gArmPlatformTokenSpaceGuid.PcdCoreCount
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore

View File

@ -21,7 +21,7 @@
GCC_ASM_IMPORT(CEntryPoint) GCC_ASM_IMPORT(CEntryPoint)
GCC_ASM_IMPORT(ArmReadMpidr) GCC_ASM_IMPORT(ArmReadMpidr)
GCC_ASM_IMPORT(ArmIsMpCore) GCC_ASM_IMPORT(ArmPlatformStackSet)
GCC_ASM_EXPORT(_ModuleEntryPoint) GCC_ASM_EXPORT(_ModuleEntryPoint)
StartupAddr: .word CEntryPoint StartupAddr: .word CEntryPoint
@ -31,10 +31,11 @@ ASM_PFX(_ModuleEntryPoint):
// Get ID of this CPU in Multicore system // Get ID of this CPU in Multicore system
bl ASM_PFX(ArmReadMpidr) bl ASM_PFX(ArmReadMpidr)
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)
and r5, r0, r1 and r6, r0, r1
_SetSVCMode: _SetSVCMode:
// Enter SVC mode, Disable FIQ and IRQ // Enter SVC mode, Disable FIQ and IRQ
//TODO: remove hardcoded values
mov r1, #0x13|0x80|0x40 mov r1, #0x13|0x80|0x40
msr CPSR_c, r1 msr CPSR_c, r1
@ -76,92 +77,59 @@ _SetupStack:
// Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment // Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment
// one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the // one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the
// top of the memory space) // top of the memory space)
adds r6, r1, #1 adds r7, r1, #1
bcs _SetupOverflowStack bcs _SetupOverflowStack
_SetupAlignedStack: _SetupAlignedStack:
mov r1, r6 mov r1, r7
b _GetBaseUefiMemory b _GetBaseUefiMemory
_SetupOverflowStack: _SetupOverflowStack:
// Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE // Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE
// aligned (4KB) // aligned (4KB)
LoadConstantToReg (EFI_PAGE_MASK, r6) LoadConstantToReg (EFI_PAGE_MASK, r7)
and r6, r6, r1 and r7, r7, r1
sub r1, r1, r6 sub r1, r1, r7
_GetBaseUefiMemory: _GetBaseUefiMemory:
// Calculate the Base of the UEFI Memory // Calculate the Base of the UEFI Memory
sub r6, r1, r4 sub r7, r1, r4
_GetStackBase: _GetStackBase:
// Compute Base of Normal stacks for CPU Cores
// Is it MpCore system
bl ASM_PFX(ArmIsMpCore)
cmp r0, #0
// Case it is not an MP Core system. Just setup the primary core
beq _SetupUnicoreStack
_GetStackBaseMpCore:
// r1 = The top of the Mpcore Stacks // r1 = The top of the Mpcore Stacks
// Stack for the primary core = PrimaryCoreStack // Stack for the primary core = PrimaryCoreStack
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
sub r7, r1, r2 sub r8, r1, r2
// Stack for the secondary core = Number of Clusters * (4 Cores per cluster) * SecondaryStackSize // Stack for the secondary core = Number of Cores - 1
LoadConstantToReg (FixedPcdGet32(PcdClusterCount), r2) LoadConstantToReg (FixedPcdGet32(PcdCoreCount), r0)
lsl r2, r2, #2 sub r0, r0, #1
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r3) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r1)
mul r2, r2, r3 mul r1, r1, r0
sub r7, r7, r2 sub r8, r8, r1
// The base of the secondary Stacks = Top of Primary stack // r8 = The base of the MpCore Stacks (primary stack & secondary stacks)
mov r0, r8
mov r1, r6
//ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
add r1, r7, r2 LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r3)
bl ASM_PFX(ArmPlatformStackSet)
// r7 = The base of the MpCore Stacks (primary stack + cluster_count * 4 * secondary stacks)
// r1 = The base of the secondary Stacks = Top of the Primary stack
// Is it the Primary Core ? // Is it the Primary Core ?
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4) LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4)
cmp r5, r4 cmp r6, r4
beq _SetupPrimaryCoreStack
_SetupSecondaryCoreStack:
// r1 = The base of the secondary Stacks
// Get the position of the cores (ClusterId * 4) + CoreId
GetCorePositionFromMpId(r0, r5, r4)
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1
// Get the offset for the Secondary Stack
mul r0, r0, r3
add sp, r1, r0
bne _PrepareArguments bne _PrepareArguments
_SetupPrimaryCoreStack: _ReserveGlobalVariable:
// r1 = Top of the primary stack LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r0)
LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r2) // InitializePrimaryStack($GlobalVariableSize, $Tmp1)
b _PreparePrimaryStack InitializePrimaryStack(r0, r1)
_SetupUnicoreStack:
// The top of the Unicore Stack is in r1
LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r2)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r3)
// Calculate the bottom of the primary stack (StackBase)
sub r7, r1, r3
_PreparePrimaryStack:
// The reserved space for global variable must be 8-bytes aligned for pushing
// 64-bit variable on the stack
SetPrimaryStack (r1, r2, r3)
_PrepareArguments: _PrepareArguments:
mov r0, r5 mov r0, r6
mov r1, r6 mov r1, r7
mov r2, r7 mov r2, r8
mov r3, sp mov r3, sp
// Move sec startup address into a data register // Move sec startup address into a data register

View File

@ -33,10 +33,11 @@ _ModuleEntryPoint
// Get ID of this CPU in Multicore system // Get ID of this CPU in Multicore system
bl ArmReadMpidr bl ArmReadMpidr
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)
and r5, r0, r1 and r6, r0, r1
_SetSVCMode _SetSVCMode
// Enter SVC mode, Disable FIQ and IRQ // Enter SVC mode, Disable FIQ and IRQ
//TODO: remove hardcoded values
mov r1, #0x13 :OR: 0x80 :OR: 0x40 mov r1, #0x13 :OR: 0x80 :OR: 0x40
msr CPSR_c, r1 msr CPSR_c, r1
@ -78,33 +79,25 @@ _SetupStack
// Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment // Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment
// one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the // one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the
// top of the memory space) // top of the memory space)
adds r6, r1, #1 adds r7, r1, #1
bcs _SetupOverflowStack bcs _SetupOverflowStack
_SetupAlignedStack _SetupAlignedStack
mov r1, r6 mov r1, r7
b _GetBaseUefiMemory b _GetBaseUefiMemory
_SetupOverflowStack _SetupOverflowStack
// Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE // Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE
// aligned (4KB) // aligned (4KB)
LoadConstantToReg (EFI_PAGE_MASK, r6) LoadConstantToReg (EFI_PAGE_MASK, r7)
and r6, r6, r1 and r7, r7, r1
sub r1, r1, r6 sub r1, r1, r7
_GetBaseUefiMemory _GetBaseUefiMemory
// Calculate the Base of the UEFI Memory // Calculate the Base of the UEFI Memory
sub r6, r1, r4 sub r7, r1, r4
_GetStackBase _GetStackBase
// Compute Base of Normal stacks for CPU Cores
// Is it MpCore system
bl ArmIsMpCore
cmp r0, #0
// Case it is not an MP Core system. Just setup the primary core
beq _SetupUnicoreStack
_GetStackBaseMpCore
// r1 = The top of the Mpcore Stacks // r1 = The top of the Mpcore Stacks
// Stack for the primary core = PrimaryCoreStack // Stack for the primary core = PrimaryCoreStack
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
@ -123,56 +116,22 @@ _GetStackBaseMpCore
//ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize) //ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r3) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r3)
mul r2, r2, r3 bl ArmPlatformStackSet
sub r7, r7, r2
// The base of the secondary Stacks = Top of Primary stack
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
add r1, r7, r2
// r7 = The base of the MpCore Stacks (primary stack + cluster_count * 4 * secondary stacks)
// r1 = The base of the secondary Stacks = Top of the Primary stack
// Is it the Primary Core ? // Is it the Primary Core ?
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4) LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4)
cmp r5, r4 cmp r6, r4
beq _SetupPrimaryCoreStack
_SetupSecondaryCoreStack
// r1 = The base of the secondary Stacks
// Get the position of the cores (ClusterId * 4) + CoreId
GetCorePositionFromMpId(r0, r5, r4)
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1
// Get the offset for the Secondary Stack
mul r0, r0, r3
add sp, r1, r0
bne _PrepareArguments bne _PrepareArguments
_SetupPrimaryCoreStack _ReserveGlobalVariable
// r1 = Top of the primary stack LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r0)
LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r2) // InitializePrimaryStack($GlobalVariableSize, $Tmp1)
b _PreparePrimaryStack InitializePrimaryStack r0, r1
_SetupUnicoreStack
// The top of the Unicore Stack is in r1
LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r2)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r3)
// Calculate the bottom of the primary stack (StackBase)
sub r7, r1, r3
_PreparePrimaryStack
// The reserved space for global variable must be 8-bytes aligned for pushing
// 64-bit variable on the stack
SetPrimaryStack (r1, r2, r3)
_PrepareArguments _PrepareArguments
mov r0, r5 mov r0, r6
mov r1, r6 mov r1, r7
mov r2, r7 mov r2, r8
mov r3, sp mov r3, sp
// Move sec startup address into a data register // Move sec startup address into a data register

View File

@ -48,6 +48,7 @@
DebugAgentLib DebugAgentLib
PrePiLib PrePiLib
ArmPlatformLib ArmPlatformLib
ArmPlatformStackLib
MemoryAllocationLib MemoryAllocationLib
HobLib HobLib
PrePiHobListPointerLib PrePiHobListPointerLib
@ -77,7 +78,6 @@
gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdFvSize gArmTokenSpaceGuid.PcdFvSize
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize

View File

@ -47,6 +47,7 @@
DebugAgentLib DebugAgentLib
PrePiLib PrePiLib
ArmPlatformLib ArmPlatformLib
ArmPlatformStackLib
MemoryAllocationLib MemoryAllocationLib
HobLib HobLib
PrePiHobListPointerLib PrePiHobListPointerLib

View File

@ -34,6 +34,7 @@
ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf
ArmPlatformLib|BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf ArmPlatformLib|BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf
ArmCpuLib|ArmPkg/Drivers/ArmCpuLib/ArmCortexA8Lib/ArmCortexA8Lib.inf ArmCpuLib|ArmPkg/Drivers/ArmCpuLib/ArmCortexA8Lib/ArmCortexA8Lib.inf
ArmPlatformStackLib|ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf
HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf