summaryrefslogtreecommitdiff
path: root/src/kernel/arch/amd64/debug.c
blob: c273c3940b3f9ac2a02802cc4ddd8b6506061216 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <kernel/arch/generic.h>

void *debug_caller(size_t depth) {
	void **rbp;
	asm("mov %%rbp, %0"
	    : "=r" (rbp));
	while (depth--) {
		if (!rbp) return NULL;
		rbp = *rbp;
	}
	return rbp[1];
}

void debug_stacktrace(void) {
	for (size_t i = 0; i < 16; i++) {
		void *ptr = debug_caller(i);
		if (!ptr) break;
		kprintf(" k/%08x", (uintptr_t)ptr);
	}
	kprintf("\n");
}