summaryrefslogtreecommitdiff
path: root/ArmPlatformPkg/PrePi
diff options
context:
space:
mode:
authorOlivier Martin <olivier.martin@arm.com>2014-01-23 00:59:08 +0000
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>2014-01-23 00:59:08 +0000
commitc2d87a49f788fd9a38a1150e265d2ef2f59fcc77 (patch)
tree1f2a5af2366c17a2cd58c6e05f68ef73c286d4b3 /ArmPlatformPkg/PrePi
parenteb98fc6de8d3a2d2085b988e760255f5ef8c859a (diff)
downloadedk2-platforms-c2d87a49f788fd9a38a1150e265d2ef2f59fcc77.tar.xz
ArmPlatformPkg/PrePi: Fixed register corruption
The commit on Fri Dec 6 2013: "ArmPlatformPkg/ArmPlatformStackLib: Do not directly use PcdArmPrimaryCore" has made the function ArmPlatformStackSet() overwrites the registers r6 and r7. These registers are used by PrePi to store the MPIDR and the the base of the system memory region used by UEFI. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15167 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'ArmPlatformPkg/PrePi')
-rw-r--r--ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.S34
-rw-r--r--ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.asm34
2 files changed, 34 insertions, 34 deletions
diff --git a/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.S b/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.S
index 50671aecd7..4fe10addc1 100644
--- a/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.S
+++ b/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.S
@@ -1,5 +1,5 @@
//
-// Copyright (c) 2011-2013, ARM Limited. All rights reserved.
+// Copyright (c) 2011-2014, 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
@@ -38,7 +38,7 @@ ASM_PFX(_ModuleEntryPoint):
// Get ID of this CPU in Multicore system
bl ASM_PFX(ArmReadMpidr)
// Keep a copy of the MpId register value
- mov r6, r0
+ mov r8, r0
_SetSVCMode:
// Enter SVC mode, Disable FIQ and IRQ
@@ -83,47 +83,47 @@ _SetupStack:
// 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
// top of the memory space)
- adds r7, r1, #1
+ adds r9, r1, #1
bcs _SetupOverflowStack
_SetupAlignedStack:
- mov r1, r7
+ mov r1, r9
b _GetBaseUefiMemory
_SetupOverflowStack:
// Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE
// aligned (4KB)
- LoadConstantToReg (EFI_PAGE_MASK, r7)
- and r7, r7, r1
- sub r1, r1, r7
+ LoadConstantToReg (EFI_PAGE_MASK, r9)
+ and r9, r9, r1
+ sub r1, r1, r9
_GetBaseUefiMemory:
// Calculate the Base of the UEFI Memory
- sub r7, r1, r4
+ sub r9, r1, r4
_GetStackBase:
// r1 = The top of the Mpcore Stacks
// Stack for the primary core = PrimaryCoreStack
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
- sub r8, r1, r2
+ sub r10, r1, r2
// Stack for the secondary core = Number of Cores - 1
LoadConstantToReg (FixedPcdGet32(PcdCoreCount), r0)
sub r0, r0, #1
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r1)
mul r1, r1, r0
- sub r8, r8, r1
+ sub r10, r10, r1
- // r8 = The base of the MpCore Stacks (primary stack & secondary stacks)
- mov r0, r8
- mov r1, r6
+ // r10 = The base of the MpCore Stacks (primary stack & secondary stacks)
+ mov r0, r10
+ mov r1, r8
//ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r3)
bl ASM_PFX(ArmPlatformStackSet)
// Is it the Primary Core ?
- mov r0, r6
+ mov r0, r8
bl ASM_PFX(ArmPlatformIsPrimaryCore)
cmp r0, #1
bne _PrepareArguments
@@ -134,9 +134,9 @@ _ReserveGlobalVariable:
InitializePrimaryStack(r0, r1)
_PrepareArguments:
- mov r0, r6
- mov r1, r7
- mov r2, r8
+ mov r0, r8
+ mov r1, r9
+ mov r2, r10
mov r3, sp
// Move sec startup address into a data register
diff --git a/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.asm b/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.asm
index f76b62e5d0..028a9a1b22 100644
--- a/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.asm
+++ b/ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.asm
@@ -1,5 +1,5 @@
//
-// Copyright (c) 2011-2013, ARM Limited. All rights reserved.
+// Copyright (c) 2011-2014, 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
@@ -40,7 +40,7 @@ _ModuleEntryPoint
// Get ID of this CPU in Multicore system
bl ArmReadMpidr
// Keep a copy of the MpId register value
- mov r6, r0
+ mov r8, r0
_SetSVCMode
// Enter SVC mode, Disable FIQ and IRQ
@@ -85,47 +85,47 @@ _SetupStack
// 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
// top of the memory space)
- adds r7, r1, #1
+ adds r9, r1, #1
bcs _SetupOverflowStack
_SetupAlignedStack
- mov r1, r7
+ mov r1, r9
b _GetBaseUefiMemory
_SetupOverflowStack
// Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE
// aligned (4KB)
- LoadConstantToReg (EFI_PAGE_MASK, r7)
- and r7, r7, r1
- sub r1, r1, r7
+ LoadConstantToReg (EFI_PAGE_MASK, r9)
+ and r9, r9, r1
+ sub r1, r1, r9
_GetBaseUefiMemory
// Calculate the Base of the UEFI Memory
- sub r7, r1, r4
+ sub r9, r1, r4
_GetStackBase
// r1 = The top of the Mpcore Stacks
// Stack for the primary core = PrimaryCoreStack
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
- sub r8, r1, r2
+ sub r10, r1, r2
// Stack for the secondary core = Number of Cores - 1
LoadConstantToReg (FixedPcdGet32(PcdCoreCount), r0)
sub r0, r0, #1
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r1)
mul r1, r1, r0
- sub r8, r8, r1
+ sub r10, r10, r1
- // r8 = The base of the MpCore Stacks (primary stack & secondary stacks)
- mov r0, r8
- mov r1, r6
+ // r10 = The base of the MpCore Stacks (primary stack & secondary stacks)
+ mov r0, r10
+ mov r1, r8
//ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r3)
bl ArmPlatformStackSet
// Is it the Primary Core ?
- mov r0, r6
+ mov r0, r8
bl ArmPlatformIsPrimaryCore
cmp r0, #1
bne _PrepareArguments
@@ -136,9 +136,9 @@ _ReserveGlobalVariable
InitializePrimaryStack r0, r1
_PrepareArguments
- mov r0, r6
- mov r1, r7
- mov r2, r8
+ mov r0, r8
+ mov r1, r9
+ mov r2, r10
mov r3, sp
// Move sec startup address into a data register