[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