On 08/05/16 16:53, Ard Biesheuvel wrote: > 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.biesheu...@linaro.org> > --- > ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S | 24 ++++++++++---------- > ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S | 10 ++++---- > 2 files changed, 17 insertions(+), 17 deletions(-) > > diff --git a/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S > b/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S > index 68049d5df2bf..e61f5df12e89 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,39 +113,39 @@ _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 > + 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 x0, x22 > mov x1, x10 > //ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, > SecondaryStackSize) > LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), x2) > @@ -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) > diff --git a/ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S > b/ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S > index 441db36857de..3215c7d55876 100644 > --- a/ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S > +++ b/ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S > @@ -154,17 +154,17 @@ _GetStackBase: > // r1 = The top of the Mpcore Stacks > // Stack for the primary core = PrimaryCoreStack > LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) > - sub r12, r1, r2 > + sub r9, 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 r12, r12, r1 > + sub r9, r9, r1 > > - // r12 = The base of the MpCore Stacks (primary stack & secondary stacks) > - mov r0, r12 > + // r9 = The base of the MpCore Stacks (primary stack & secondary stacks) > + mov r0, r9 > mov r1, r10 > //ArmPlatformStackSet(StackBase, MpId, PrimaryStackSize, > SecondaryStackSize) > LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) > @@ -180,7 +180,7 @@ _GetStackBase: > _PrepareArguments: > mov r0, r10 > mov r1, r11 > - mov r2, r12 > + mov r2, r9 > > // Move sec startup address into a data register > // Ensure we're jumping to FV version of the code (not boot remapped alias) >
Callee saved, caller saved... Bah! :) Acked-by: Laszlo Ersek <ler...@redhat.com> _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel