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
This commit is contained in:
Olivier Martin 2014-01-23 00:59:08 +00:00 committed by oliviermartin
parent eb98fc6de8
commit c2d87a49f7
2 changed files with 34 additions and 34 deletions

View File

@ -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 // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // 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 // Get ID of this CPU in Multicore system
bl ASM_PFX(ArmReadMpidr) bl ASM_PFX(ArmReadMpidr)
// Keep a copy of the MpId register value // Keep a copy of the MpId register value
mov r6, r0 mov r8, r0
_SetSVCMode: _SetSVCMode:
// Enter SVC mode, Disable FIQ and IRQ // 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 // 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 r7, r1, #1 adds r9, r1, #1
bcs _SetupOverflowStack bcs _SetupOverflowStack
_SetupAlignedStack: _SetupAlignedStack:
mov r1, r7 mov r1, r9
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, r7) LoadConstantToReg (EFI_PAGE_MASK, r9)
and r7, r7, r1 and r9, r9, r1
sub r1, r1, r7 sub r1, r1, r9
_GetBaseUefiMemory: _GetBaseUefiMemory:
// Calculate the Base of the UEFI Memory // Calculate the Base of the UEFI Memory
sub r7, r1, r4 sub r9, r1, r4
_GetStackBase: _GetStackBase:
// 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 r8, r1, r2 sub r10, r1, r2
// Stack for the secondary core = Number of Cores - 1 // Stack for the secondary core = Number of Cores - 1
LoadConstantToReg (FixedPcdGet32(PcdCoreCount), r0) LoadConstantToReg (FixedPcdGet32(PcdCoreCount), r0)
sub r0, r0, #1 sub r0, r0, #1
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r1)
mul r1, r1, r0 mul r1, r1, r0
sub r8, r8, r1 sub r10, r10, r1
// r8 = The base of the MpCore Stacks (primary stack & secondary stacks) // r10 = The base of the MpCore Stacks (primary stack & secondary stacks)
mov r0, r8 mov r0, r10
mov r1, r6 mov r1, r8
//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)
bl ASM_PFX(ArmPlatformStackSet) bl ASM_PFX(ArmPlatformStackSet)
// Is it the Primary Core ? // Is it the Primary Core ?
mov r0, r6 mov r0, r8
bl ASM_PFX(ArmPlatformIsPrimaryCore) bl ASM_PFX(ArmPlatformIsPrimaryCore)
cmp r0, #1 cmp r0, #1
bne _PrepareArguments bne _PrepareArguments
@ -134,9 +134,9 @@ _ReserveGlobalVariable:
InitializePrimaryStack(r0, r1) InitializePrimaryStack(r0, r1)
_PrepareArguments: _PrepareArguments:
mov r0, r6 mov r0, r8
mov r1, r7 mov r1, r9
mov r2, r8 mov r2, r10
mov r3, sp mov r3, sp
// Move sec startup address into a data register // Move sec startup address into a data register

View File

@ -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 // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // 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 // Get ID of this CPU in Multicore system
bl ArmReadMpidr bl ArmReadMpidr
// Keep a copy of the MpId register value // Keep a copy of the MpId register value
mov r6, r0 mov r8, r0
_SetSVCMode _SetSVCMode
// Enter SVC mode, Disable FIQ and IRQ // 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 // 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 r7, r1, #1 adds r9, r1, #1
bcs _SetupOverflowStack bcs _SetupOverflowStack
_SetupAlignedStack _SetupAlignedStack
mov r1, r7 mov r1, r9
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, r7) LoadConstantToReg (EFI_PAGE_MASK, r9)
and r7, r7, r1 and r9, r9, r1
sub r1, r1, r7 sub r1, r1, r9
_GetBaseUefiMemory _GetBaseUefiMemory
// Calculate the Base of the UEFI Memory // Calculate the Base of the UEFI Memory
sub r7, r1, r4 sub r9, r1, r4
_GetStackBase _GetStackBase
// 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 r8, r1, r2 sub r10, r1, r2
// Stack for the secondary core = Number of Cores - 1 // Stack for the secondary core = Number of Cores - 1
LoadConstantToReg (FixedPcdGet32(PcdCoreCount), r0) LoadConstantToReg (FixedPcdGet32(PcdCoreCount), r0)
sub r0, r0, #1 sub r0, r0, #1
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r1)
mul r1, r1, r0 mul r1, r1, r0
sub r8, r8, r1 sub r10, r10, r1
// r8 = The base of the MpCore Stacks (primary stack & secondary stacks) // r10 = The base of the MpCore Stacks (primary stack & secondary stacks)
mov r0, r8 mov r0, r10
mov r1, r6 mov r1, r8
//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)
bl ArmPlatformStackSet bl ArmPlatformStackSet
// Is it the Primary Core ? // Is it the Primary Core ?
mov r0, r6 mov r0, r8
bl ArmPlatformIsPrimaryCore bl ArmPlatformIsPrimaryCore
cmp r0, #1 cmp r0, #1
bne _PrepareArguments bne _PrepareArguments
@ -136,9 +136,9 @@ _ReserveGlobalVariable
InitializePrimaryStack r0, r1 InitializePrimaryStack r0, r1
_PrepareArguments _PrepareArguments
mov r0, r6 mov r0, r8
mov r1, r7 mov r1, r9
mov r2, r8 mov r2, r10
mov r3, sp mov r3, sp
// Move sec startup address into a data register // Move sec startup address into a data register