[DTrace-devel] [PATCH] uregs: Account for larger page sizes on some older ARM kernels
eugene.loh at oracle.com
eugene.loh at oracle.com
Fri May 26 16:02:31 UTC 2023
From: Eugene Loh <eugene.loh at oracle.com>
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 0e6ec0b3..dec92c33 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -4242,20 +4242,28 @@ dt_cg_uregs(unsigned int idx, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp
#undef MY_THREAD_SIZE
#elif defined(__aarch64__)
+ {
+ int tmp = getpagesize(), page_shift = 0;
+ int kasan_thread_shift, min_thread_shift, thread_shift, thread_size;
-/* arch/arm64/include/asm/memory.h */
-#define MY_KASAN_THREAD_SHIFT 0 /* for CONFIG_KASAN not set */
-#define MY_MIN_THREAD_SHIFT (14 + MY_KASAN_THREAD_SHIFT)
-#define MY_THREAD_SHIFT MY_MIN_THREAD_SHIFT
-#define MY_THREAD_SIZE (1 << MY_THREAD_SHIFT)
-
- offset += MY_THREAD_SIZE;
+ /* Discover PAGE_SHIFT, set in arch/arm64/include/asm/page-def.h */
+ while (tmp > 1) {
+ page_shift++;
+ tmp >>= 1;
+ }
-#undef MY_KASAN_THREAD_SHIFT
-#undef MY_MIN_THREAD_SHIFT
-#undef MY_THREAD_SHIFT
-#undef MY_THREAD_SIZE
+ /* Work through logic of arch/arm64/include/asm/memory.h */
+ kasan_thread_shift = 0; /* for CONFIG_KASAN not set */
+ min_thread_shift = 14 + kasan_thread_shift;
+ if (min_thread_shift < page_shift) /* for CONFIG_VMAP_STACK */
+ thread_shift = page_shift;
+ else
+ thread_shift = min_thread_shift;
+ thread_size = 1 << thread_shift;
+ /* Now we have the offset. */
+ offset += thread_size;
+ }
#else
# error ISA not supported
#endif
--
2.18.4
More information about the DTrace-devel
mailing list