diff mbox

[edk2,1/2] ArmVirtPkg/PrePi: use correct callee saved regs

Message ID 1470408838-1020-1-git-send-email-ard.biesheuvel@linaro.org
State Accepted
Commit 298f83612375bda69e8a7230dfea036e85eda553
Headers show

Commit Message

Ard Biesheuvel Aug. 5, 2016, 2:53 p.m. UTC
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>

---
 ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S | 24 ++++++++++----------
 ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S     | 10 ++++----
 2 files changed, 17 insertions(+), 17 deletions(-)

-- 
2.7.4

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Comments

Laszlo Ersek Aug. 5, 2016, 6:31 p.m. UTC | #1
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.biesheuvel@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 <lersek@redhat.com>

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
diff mbox

Patch

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)