diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2016-08-05 16:41:32 +0200 |
---|---|---|
committer | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2016-08-10 13:15:15 +0200 |
commit | 298f83612375bda69e8a7230dfea036e85eda553 (patch) | |
tree | 594a01caa68b6219f366cb1b7ef8b3233fb7a0a3 /ArmVirtPkg/PrePi/AArch64 | |
parent | af90df3cb099ed8e009579b7b55e7142dc0fc410 (diff) | |
download | edk2-298f83612375bda69e8a7230dfea036e85eda553.zip edk2-298f83612375bda69e8a7230dfea036e85eda553.tar.gz edk2-298f83612375bda69e8a7230dfea036e85eda553.tar.bz2 |
ArmVirtPkg/PrePi: use correct callee saved regs
Both the ARM and the AARCH64 versions of the PrePi code (shared between
ArmVirtQemuKernel and ArmVirtXen) 'preserve' values across a function
call using registers that are not in fact callee saved. So fix that.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Diffstat (limited to 'ArmVirtPkg/PrePi/AArch64')
-rw-r--r-- | ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S b/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S index 68049d5..d6be345 100644 --- a/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S +++ b/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S @@ -71,7 +71,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 x10, x0
+ mov x20, x0
// Check if we can install the stack at the top of the System Memory or if we need
// to install the stacks at the bottom of the Firmware Device (case the FD is located
@@ -113,40 +113,40 @@ _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 x11, x1, #1
+ adds x21, x1, #1
b.cs _SetupOverflowStack
_SetupAlignedStack:
- mov x1, x11
+ mov x1, x21
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, x11)
- and x11, x11, x1
- sub x1, x1, x11
+ LoadConstantToReg (EFI_PAGE_MASK, x21)
+ and x21, x21, x1
+ sub x1, x1, x21
_GetBaseUefiMemory:
// Calculate the Base of the UEFI Memory
- sub x11, x1, x4
+ sub x21, x1, x4
_GetStackBase:
// r1 = The top of the Mpcore Stacks
// Stack for the primary core = PrimaryCoreStack
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), x2)
- sub x12, x1, x2
+ sub x22, x1, x2
// Stack for the secondary core = Number of Cores - 1
LoadConstantToReg (FixedPcdGet32(PcdCoreCount), x0)
sub x0, x0, #1
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), x1)
mul x1, x1, x0
- sub x12, x12, x1
+ sub x22, x22, x1
- // x12 = The base of the MpCore Stacks (primary stack & secondary stacks)
- mov x0, x12
- mov x1, x10
+ // x22 = The base of the MpCore Stacks (primary stack & secondary stacks)
+ mov x0, x22
+ mov x1, x20
//ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, SecondaryStackSize)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), x2)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), x3)
@@ -159,9 +159,9 @@ _GetStackBase: bne _PrepareArguments
_PrepareArguments:
- mov x0, x10
- mov x1, x11
- mov x2, x12
+ mov x0, x20
+ mov x1, x21
+ mov x2, x22
// Move sec startup address into a data register
// Ensure we're jumping to FV version of the code (not boot remapped alias)
|