summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Martin <olivier.martin@arm.com>2014-01-22 16:05:31 +0000
committerLeif Lindholm <leif.lindholm@linaro.org>2014-01-24 15:45:20 +0000
commit43d6eb934a95d6f344f26753f2f40e62918e5f42 (patch)
tree0303990508c89278ed8416ec34562166ffe1a0b3
parentadab9dbe1ea8c60996d522024037154e2f703942 (diff)
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. Change-Id: I69ff80cb5a298c89cba1680b148eb306f47a6375
-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 50671aecd..4fe10addc 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 f76b62e5d..028a9a1b2 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