* [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