public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems
@ 2018-11-16 22:55 Ard Biesheuvel
  2018-11-16 22:55 ` [PATCH 1/2] ArmPlatformPkg: clear frame pointer in startup code Ard Biesheuvel
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2018-11-16 22:55 UTC (permalink / raw)
  To: edk2-devel; +Cc: lersek, leif.lindholm, philmd, Ard Biesheuvel

The backtrace code on AARCH64 does not sanitize the frame pointer values
it pulls of the stack when attempting to do a backtrace, and so junk left
in the frame pointer register may result in a recursive exception and a
truncated backtrace.

Ard Biesheuvel (2):
  ArmPlatformPkg: clear frame pointer in startup code
  ArmVirtPkg/PrePi: clear frame pointer in startup code

 ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S | 3 +++
 ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S          | 3 +++
 ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S              | 3 +++
 3 files changed, 9 insertions(+)

-- 
2.17.1



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] ArmPlatformPkg: clear frame pointer in startup code
  2018-11-16 22:55 [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Ard Biesheuvel
@ 2018-11-16 22:55 ` Ard Biesheuvel
  2018-11-16 22:55 ` [PATCH 2/2] ArmVirtPkg/PrePi: " Ard Biesheuvel
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2018-11-16 22:55 UTC (permalink / raw)
  To: edk2-devel; +Cc: lersek, leif.lindholm, philmd, Ard Biesheuvel

When setting up the stack in the startup code and jumping into C code
for the first time, ensure that the frame pointer register is cleared
so that backtraces terminate correctly. Otherwise, output like the
below is shown when encountering an exception on a DEBUG build:

  Synchronous Exception at 0x0000000078A14780
  PC 0x000078A14780 (0x000078A00000+0x00014780) [ 0] ArmVeNorFlashDxe.dll
  PC 0x000078A10634 (0x000078A00000+0x00010634) [ 0] ArmVeNorFlashDxe.dll
  PC 0x000078A11CF0 (0x000078A00000+0x00011CF0) [ 0] ArmVeNorFlashDxe.dll
  PC 0x000078A11DD0 (0x000078A00000+0x00011DD0) [ 0] ArmVeNorFlashDxe.dll
  PC 0x00007BC9D87C (0x00007BC98000+0x0000587C) [ 1] PartitionDxe.dll
  PC 0x00007BC99B3C (0x00007BC98000+0x00001B3C) [ 1] PartitionDxe.dll
  PC 0x00007F362F50 (0x00007F359000+0x00009F50) [ 2] DxeCore.dll
  PC 0x00007BD63BB0 (0x00007BD5B000+0x00008BB0) [ 3] BdsDxe.dll
  PC 0x00007BD6EE00 (0x00007BD5B000+0x00013E00) [ 3] BdsDxe.dll
  PC 0x00007BD67C70 (0x00007BD5B000+0x0000CC70) [ 3] BdsDxe.dll
  PC 0x00007F3724F0 (0x00007F359000+0x000194F0) [ 4] DxeCore.dll
  PC 0x00004008FC30
  PC 0x000040090130
  PC 0x5800F6025800F5E1

  Recursive exception occurred while dumping the CPU state

which is rather unhelpful, given that this prevent the remaining debug
output from being printed (register dump, stack dump, fault related
system registers etc)

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S | 3 +++
 ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S          | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S b/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S
index 0950fd0c0cdb..dc52e1138199 100644
--- a/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S
+++ b/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S
@@ -76,6 +76,9 @@ _PrepareArguments:
   // Ensure we're jumping to FV version of the code (not boot remapped alias)
   ldr   x3, =ASM_PFX(CEntryPoint)
 
+  // Set the frame pointer to 0x0 so any backtraces terminate here
+  mov   x29, xzr
+
   // Jump to PrePeiCore C code
   //    x0 = mp_id
   //    x1 = pei_core_address
diff --git a/ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S b/ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S
index a81709d5d12d..8db022dcf05e 100644
--- a/ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S
+++ b/ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S
@@ -109,6 +109,9 @@ _PrepareArguments:
   // Ensure we're jumping to FV version of the code (not boot remapped alias)
   ldr   x4, =ASM_PFX(CEntryPoint)
 
+  // Set the frame pointer to 0x0 so any backtraces terminate here
+  mov   x29, xzr
+
   // Jump to PrePiCore C code
   //    x0 = MpId
   //    x1 = UefiMemoryBase
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] ArmVirtPkg/PrePi: clear frame pointer in startup code
  2018-11-16 22:55 [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Ard Biesheuvel
  2018-11-16 22:55 ` [PATCH 1/2] ArmPlatformPkg: clear frame pointer in startup code Ard Biesheuvel
@ 2018-11-16 22:55 ` Ard Biesheuvel
  2018-11-19 18:53 ` [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Laszlo Ersek
  2018-11-19 18:56 ` Leif Lindholm
  3 siblings, 0 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2018-11-16 22:55 UTC (permalink / raw)
  To: edk2-devel; +Cc: lersek, leif.lindholm, philmd, Ard Biesheuvel

When setting up the stack in the startup code and jumping into C code
for the first time, ensure that the frame pointer register is cleared
so that backtraces terminate correctly. Otherwise, output like the
below is shown when encountering an exception on a DEBUG build:

  Synchronous Exception at 0x0000000078A14780
  PC 0x000078A14780 (0x000078A00000+0x00014780) [ 0] ArmVeNorFlashDxe.dll
  PC 0x000078A10634 (0x000078A00000+0x00010634) [ 0] ArmVeNorFlashDxe.dll
  PC 0x000078A11CF0 (0x000078A00000+0x00011CF0) [ 0] ArmVeNorFlashDxe.dll
  PC 0x000078A11DD0 (0x000078A00000+0x00011DD0) [ 0] ArmVeNorFlashDxe.dll
  PC 0x00007BC9D87C (0x00007BC98000+0x0000587C) [ 1] PartitionDxe.dll
  PC 0x00007BC99B3C (0x00007BC98000+0x00001B3C) [ 1] PartitionDxe.dll
  PC 0x00007F362F50 (0x00007F359000+0x00009F50) [ 2] DxeCore.dll
  PC 0x00007BD63BB0 (0x00007BD5B000+0x00008BB0) [ 3] BdsDxe.dll
  PC 0x00007BD6EE00 (0x00007BD5B000+0x00013E00) [ 3] BdsDxe.dll
  PC 0x00007BD67C70 (0x00007BD5B000+0x0000CC70) [ 3] BdsDxe.dll
  PC 0x00007F3724F0 (0x00007F359000+0x000194F0) [ 4] DxeCore.dll
  PC 0x00004008FC30
  PC 0x000040090130
  PC 0x5800F6025800F5E1

  Recursive exception occurred while dumping the CPU state

which is rather unhelpful, given that this prevent the remaining debug
output from being printed (register dump, stack dump, fault related
system registers etc)

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S b/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S
index 891cf1fcab40..86b9fbee6e67 100644
--- a/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S
+++ b/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S
@@ -121,6 +121,9 @@ _GetStackBase:
   mov   x1, x21
   mov   x2, x22
 
+  // Set the frame pointer to 0x0 so any backtraces terminate here
+  mov   x29, xzr
+
   // Jump to PrePiCore C code
   //    x0 = MpId
   //    x1 = UefiMemoryBase
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems
  2018-11-16 22:55 [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Ard Biesheuvel
  2018-11-16 22:55 ` [PATCH 1/2] ArmPlatformPkg: clear frame pointer in startup code Ard Biesheuvel
  2018-11-16 22:55 ` [PATCH 2/2] ArmVirtPkg/PrePi: " Ard Biesheuvel
@ 2018-11-19 18:53 ` Laszlo Ersek
  2018-11-19 18:56 ` Leif Lindholm
  3 siblings, 0 replies; 6+ messages in thread
From: Laszlo Ersek @ 2018-11-19 18:53 UTC (permalink / raw)
  To: Ard Biesheuvel, edk2-devel

On 11/16/18 23:55, Ard Biesheuvel wrote:
> The backtrace code on AARCH64 does not sanitize the frame pointer values
> it pulls of the stack when attempting to do a backtrace, and so junk left
> in the frame pointer register may result in a recursive exception and a
> truncated backtrace.
> 
> Ard Biesheuvel (2):
>   ArmPlatformPkg: clear frame pointer in startup code
>   ArmVirtPkg/PrePi: clear frame pointer in startup code
> 
>  ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S | 3 +++
>  ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S          | 3 +++
>  ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S              | 3 +++
>  3 files changed, 9 insertions(+)
> 

Acked-by: Laszlo Ersek <lersek@redhat.com>



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems
  2018-11-16 22:55 [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Ard Biesheuvel
                   ` (2 preceding siblings ...)
  2018-11-19 18:53 ` [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Laszlo Ersek
@ 2018-11-19 18:56 ` Leif Lindholm
  2018-11-19 19:28   ` Ard Biesheuvel
  3 siblings, 1 reply; 6+ messages in thread
From: Leif Lindholm @ 2018-11-19 18:56 UTC (permalink / raw)
  To: Ard Biesheuvel; +Cc: edk2-devel, lersek, philmd

On Fri, Nov 16, 2018 at 02:55:56PM -0800, Ard Biesheuvel wrote:
> The backtrace code on AARCH64 does not sanitize the frame pointer values
> it pulls of the stack when attempting to do a backtrace, and so junk left
> in the frame pointer register may result in a recursive exception and a
> truncated backtrace.

If I was bikeshedding, I'd ask for a (NULL) in the comments next to
the 0x0. But other than that, for the series:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
(be it green or black)

> Ard Biesheuvel (2):
>   ArmPlatformPkg: clear frame pointer in startup code
>   ArmVirtPkg/PrePi: clear frame pointer in startup code
> 
>  ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S | 3 +++
>  ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S          | 3 +++
>  ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S              | 3 +++
>  3 files changed, 9 insertions(+)
> 
> -- 
> 2.17.1
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems
  2018-11-19 18:56 ` Leif Lindholm
@ 2018-11-19 19:28   ` Ard Biesheuvel
  0 siblings, 0 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2018-11-19 19:28 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: edk2-devel@lists.01.org, Laszlo Ersek,
	Philippe Mathieu-Daudé

On Mon, 19 Nov 2018 at 10:56, Leif Lindholm <leif.lindholm@linaro.org> wrote:
>
> On Fri, Nov 16, 2018 at 02:55:56PM -0800, Ard Biesheuvel wrote:
> > The backtrace code on AARCH64 does not sanitize the frame pointer values
> > it pulls of the stack when attempting to do a backtrace, and so junk left
> > in the frame pointer register may result in a recursive exception and a
> > truncated backtrace.
>
> If I was bikeshedding, I'd ask for a (NULL) in the comments next to
> the 0x0. But other than that, for the series:
> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
> (be it green or black)
>

Thanks all.

Series pushed as 316b3a719fd2..81c6f1dfbac1 (after s/0x0/NULL/ in the comments)


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-11-19 19:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-16 22:55 [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Ard Biesheuvel
2018-11-16 22:55 ` [PATCH 1/2] ArmPlatformPkg: clear frame pointer in startup code Ard Biesheuvel
2018-11-16 22:55 ` [PATCH 2/2] ArmVirtPkg/PrePi: " Ard Biesheuvel
2018-11-19 18:53 ` [PATCH 0/2] Clear frame pointer in startup code on AARCH64 systems Laszlo Ersek
2018-11-19 18:56 ` Leif Lindholm
2018-11-19 19:28   ` Ard Biesheuvel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox