SayoriOS 0.3.3

unwind.c
1 #include "sys/unwind.h"
2 #include "io/ports.h"
3 #include "lib/string.h"
4
5
6 #ifndef RELEASE
7 __attribute__((section(".debug_symbols"))) char function_addr_data[128 * 1024] = {0};
8
9 char _temp_funcname[1024] = {0};
10
11 size_t decode_hex(const char s[], int length) {
12 int dec = 0;
13 int power = 1;
14
15 for (int i = length - 1; i >= 0; i--) {
16 int digit = 0;
17
18 if(s[i] >= 0 && s[i] <= '9') {
19 digit = s[i] - '0';
20 } else if(s[i] >= 'a' && s[i] <= 'f') {
21 digit = s[i] - 'a' + 10;
22 }
23
24 dec += digit * power;
25 power *= 16;
26 }
27
28 return dec;
29 }
30
31 // Returns true if okay, function name stored in _temp_funcname
32 bool get_func_name_by_addr(size_t addr) {
33 char* temp = (char*)function_addr_data;
34
35 memset(_temp_funcname, 0, 1024);
36
37 do {
38 memset(_temp_funcname, 0, 1024);
39
40 size_t current_addr = decode_hex(temp, 8); // First addr
41
42 temp += 3; // Type
43 temp += 8; // Address in HEX
44
45 memcpy(_temp_funcname, temp, struntil(temp, '\n'));
46
47 temp += struntil(temp, '\n') + 1; // Name
48
49 size_t next_addr = decode_hex(temp, 8); // Second addr
50
51 // qemu_log("%x | %x | %x", current_addr, addr, next_addr);
52
53 if(addr >= current_addr && addr < next_addr) {
54 return true;
55 }
56 } while(*temp != '\0');
57
58 return false;
59 }
60
61 void unwind_stack(uint32_t MaxFrames) {
62 struct stackframe *stk;
63 __asm__ volatile("movl %%ebp, %0" : "=r"(stk) :: );
64
65 qemu_log("Stack trace:");
66
67 for(uint32_t frame = 0; stk && frame < MaxFrames; ++frame) {
68 qemu_printf(" Frame #%d => %x -> ", frame, stk->eip);
69
70 bool exists = get_func_name_by_addr(stk->eip);
71
72 qemu_printf("%s\n", exists ? _temp_funcname : "???");
73
74 stk = stk->ebp;
75 }
76
77 // qemu_log("%s", function_addr_data);
78 }
79 #endif
__attribute__
struct registers __attribute__((packed))
Структура данных пакета от мыши
Definition: psf.h:19
memset
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
Definition: string.c:203
memcpy
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
struntil
size_t struntil(const char *str, const char find)
Возвращает индекс символа в строке
Definition: string.c:124
qemu_printf
void qemu_printf(const char *text,...)
Вывод QEMU через COM1 информации
Definition: ports.c:149
stackframe
Definition: unwind.h:5