systemtap/unwind-ksalr.patch

33 lines
1.4 KiB
Diff

commit 17ee540dd61113fe4f557f191db3480db875cca1
Author: Mark Wielaard <mark@klomp.org>
Date: Wed Apr 18 15:00:24 2018 +0200
Make kernel DWARF unwinder work with ksalr.
The .debug_frame loaded from disk is already relocated against the
expected load offset of the kernel, but the actual static (load)
address might be different (with kaslr). So adjust the startLoc
for that difference when reading any address from the unwind table.
diff --git a/runtime/unwind.c b/runtime/unwind.c
index 3a2d991..4c360d2 100644
--- a/runtime/unwind.c
+++ b/runtime/unwind.c
@@ -724,10 +724,15 @@ adjustStartLoc (unsigned long startLoc,
dbug_unwind(2, "adjustStartLoc=%lx, ptrType=%s, m=%s, s=%s eh=%d\n",
startLoc, _stp_eh_enc_name(ptrType), m->path, s->name, is_ehframe);
if (startLoc == 0
- || strcmp (m->name, "kernel") == 0
|| (strcmp (s->name, ".absolute") == 0 && !is_ehframe))
return startLoc;
+ /* The .debug_frame loaded from disk is already relocated against the
+ expected load offset of the kernel, but the actual static (load)
+ address might be different (with kaslr). */
+ if (strcmp (m->name, "kernel") == 0)
+ return startLoc - s->sec_load_offset + s->static_addr;
+
/* eh_frame data has been loaded in the kernel, so readjust offset. */
if (is_ehframe) {
dbug_unwind(2, "eh_frame=%lx, eh_frame_addr=%lx\n", (unsigned long) m->eh_frame, m->eh_frame_addr);