Module Name:    src
Committed By:   skrll
Date:           Fri Nov  2 08:18:19 UTC 2018

Modified Files:
        src/sys/arch/aarch64/include: asan.h

Log Message:
Provide a kasan_md_unwind

OK maxv


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/aarch64/include/asan.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/include/asan.h
diff -u src/sys/arch/aarch64/include/asan.h:1.1 src/sys/arch/aarch64/include/asan.h:1.2
--- src/sys/arch/aarch64/include/asan.h:1.1	Thu Nov  1 20:34:50 2018
+++ src/sys/arch/aarch64/include/asan.h	Fri Nov  2 08:18:18 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: asan.h,v 1.1 2018/11/01 20:34:50 maxv Exp $	*/
+/*	$NetBSD: asan.h,v 1.2 2018/11/02 08:18:18 skrll Exp $	*/
 
 /*
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,6 +30,8 @@
  */
 
 #include <sys/atomic.h>
+#include <sys/ksyms.h>
+
 #include <aarch64/pmap.h>
 #include <aarch64/vmparam.h>
 #include <aarch64/cpufunc.h>
@@ -133,4 +135,57 @@ kasan_md_init(void)
 	    eva - VM_MIN_KERNEL_ADDRESS);
 }
 
-#define kasan_md_unwind()	__nothing
+static inline bool
+__md_unwind_end(const char *name)
+{
+	if (!strncmp(name, "el0_trap", 8) ||
+	    !strncmp(name, "el1_trap", 8)) {
+		return true;
+	}
+
+	return false;
+}
+
+static void
+kasan_md_unwind(void)
+{
+	uint64_t lr, *fp;
+	const char *mod;
+	const char *sym;
+	size_t nsym;
+	int error;
+
+	fp = (uint64_t *)__builtin_frame_address(0);
+	nsym = 0;
+
+	while (1) {
+		/*
+		 * normal stack frame
+		 *  fp[0]  saved fp(x29) value
+		 *  fp[1]  saved lr(x30) value
+		 */
+		lr = fp[1];
+
+		if (lr < VM_MIN_KERNEL_ADDRESS) {
+			break;
+		}
+		error = ksyms_getname(&mod, &sym, (vaddr_t)lr, KSYMS_PROC);
+		if (error) {
+			break;
+		}
+		printf("#%zu %p in %s <%s>\n", nsym, (void *)lr, sym, mod);
+		if (__md_unwind_end(sym)) {
+			break;
+		}
+
+		fp = (uint64_t *)fp[0];
+		if (fp == NULL) {
+			break;
+		}
+		nsym++;
+
+		if (nsym >= 15) {
+			break;
+		}
+	}
+}

Reply via email to