|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2] coverage: place GCOV-generated .text.startup section in init text
GCOV instrumentation can emit executable input sections such as
.text.startup when CONFIG_COVERAGE is enabled.
At present the x86 already places .text.startup in .init.text,
but Arm, RISC-V and PPC do not. With CONFIG_COVERAGE=y .text.startup
can therefore be treated as a linker orphan on those architectures.
Constructors generated by coverage instrumentation can then point
at code outside the normal RX text mapping, leading to early boot
crashes from init_constructors():
(XEN) [ 12.331193] Instruction Abort Trap. Syndrome=0xf
(XEN) [ 12.334253] Walking Hypervisor VA 0xa00003ce000 on CPU0 via TTBR
0x000000004352d000
(XEN) [ 12.338550] 0TH[0x014] = 0x4352cf7f
(XEN) [ 12.341823] 1ST[0x000] = 0x4352bf7f
(XEN) [ 12.345124] 2ND[0x001] = 0x40000043527f7f
(XEN) [ 12.347329] 3RD[0x1ce] = 0x400000433cef7f
(XEN) [ 12.351233] CPU0: Unexpected Trap: Instruction Abort
(XEN) [ 12.357643] ----[ Xen-4.21.1 arm64 debug=n gcov=y Not tainted
]----
(XEN) [ 12.360243] CPU: 0
(XEN) [ 12.364098] PC: 00000a00003ce000 00000a00003ce000
(XEN) [ 12.375835] LR: 00000a00004802f8
(XEN) [ 12.378273] SP: 00000a00004c7e10
(XEN) [ 12.380492] CPSR: 0000000080000249 MODE:64-bit EL2h (Hypervisor,
handler)
(XEN) [ 12.382785] X0: 00000a00003ce000 X1: 0000000000000000 X2:
00000a0000410fa0
(XEN) [ 12.385176] X3: 0000000000000000 X4: 0000000000000010 X5:
0000000000000001
(XEN) [ 12.387555] X6: 00000a00004e5f40 X7: 00000a00004e5f38 X8:
0000000000000000
(XEN) [ 12.390027] X9: 00000a00004e5f20 X10: 00000a00004e5f30 X11:
00000a00004e5f40
(XEN) [ 12.392510] X12: 00000a0000439748 X13: 00000a0000406938 X14:
000000000000062e
(XEN) [ 12.394954] X15: 00000a00004f3918 X16: 00000a00004c7bb5 X17:
00000000004c7bb5
(XEN) [ 12.397293] X18: 0000000000000030 X19: 000000000000001d X20:
00000000000000a9
(XEN) [ 12.399803] X21: 00000a00004c8008 X22: 00000a00003fa000 X23:
00000a00004e2000
(XEN) [ 12.402392] X24: 00000a00003f9390 X25: 00000a00003fa000 X26:
00000a00003f4ca8
(XEN) [ 12.404798] X27: 0000000000000002 X28: 00000a000057a9c0 FP:
00000000bedb6740
(XEN) [ 12.407110]
(XEN) [ 12.409442] VTCR_EL2: 0000000080023558
(XEN) [ 12.411291] VTTBR_EL2: 00000000bffc4000
(XEN) [ 12.412895]
(XEN) [ 12.414204] SCTLR_EL2: 0000000030cd183d
(XEN) [ 12.415928] HCR_EL2: 0000000000000039
(XEN) [ 12.417642] TTBR0_EL2: 000000004352d000
(XEN) [ 12.419152]
(XEN) [ 12.420327] ESR_EL2: 000000008600000f
(XEN) [ 12.422056] HPFAR_EL2: 0000000000000000
(XEN) [ 12.423809] FAR_EL2: 00000a00003ce000
...
(XEN) [ 12.485355] Xen call trace:
(XEN) [ 12.489080] [<00000a00003ce000>] 00000a00003ce000 (PC)
(XEN) [ 12.512076] [<00000a00004802f8>] init_constructors+0x38/0x50
(LR)
Observed failing symbol:
_sub_I_00100_0
called from:
init_constructors()
The issue can be diagnosed by enabling linker orphan diagnostics or
generating a linker map:
LDFLAGS += "--orphan-handling=warn"
LDFLAGS += "-Map=xen.map"
and then inspecting orphaned executable sections such as:
.text.startup
Place .text.startup in .init.text on the non-x86 linker scripts,
matching the existing x86 behavior.
Signed-off-by: Dmytro Prokopchuk <dmytro_prokopchuk1@xxxxxxxx>
---
Changes in v2:
- do not add *(.text.*) when CONFIG_COVERAGE is enables
- copy the existing x86 linker script behavior to the non-x86 linker scripts
(put .text.startup into .init.text on Arm, RISC-V and PPC)
- update commit subject and message accordingly
Link to v1:
https://patchew.org/Xen/cb8c1e0862a554f7a28347f549e9cfd0b0d6db2f.1779829545.git.dmytro._5Fprokopchuk1@xxxxxxxx/
Test CI pipeline:
https://gitlab.com/xen-project/people/dimaprkp4k/xen/-/pipelines/2561258404
---
xen/arch/arm/xen.lds.S | 1 +
xen/arch/ppc/xen.lds.S | 1 +
xen/arch/riscv/xen.lds.S | 1 +
3 files changed, 3 insertions(+)
diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S
index 2d5f1c516d..4aab7770c9 100644
--- a/xen/arch/arm/xen.lds.S
+++ b/xen/arch/arm/xen.lds.S
@@ -125,6 +125,7 @@ SECTIONS
.init.text : {
_sinittext = .;
*(.init.text)
+ *(.text.startup)
_einittext = .;
. = ALIGN(PAGE_SIZE); /* Avoid mapping alt insns executable */
*(.altinstr_replacement)
diff --git a/xen/arch/ppc/xen.lds.S b/xen/arch/ppc/xen.lds.S
index d0f2ed43f1..de3aad0aae 100644
--- a/xen/arch/ppc/xen.lds.S
+++ b/xen/arch/ppc/xen.lds.S
@@ -98,6 +98,7 @@ SECTIONS
DECL_SECTION(.init.text) {
_sinittext = .;
*(.init.text)
+ *(.text.startup)
_einittext = .;
. = ALIGN(PAGE_SIZE); /* Avoid mapping alt insns executable */
} :text
diff --git a/xen/arch/riscv/xen.lds.S b/xen/arch/riscv/xen.lds.S
index 65f136dce9..c6f765a1c5 100644
--- a/xen/arch/riscv/xen.lds.S
+++ b/xen/arch/riscv/xen.lds.S
@@ -103,6 +103,7 @@ SECTIONS
.init.text : {
_sinittext = .;
*(.init.text)
+ *(.text.startup)
_einittext = .;
. = ALIGN(PAGE_SIZE); /* Avoid mapping alt insns executable */
} :text
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |