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
struct registers __attribute__((packed))
Структура данных пакета от мыши
Definition: psf.h:19
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
Definition: string.c:203
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
size_t struntil(const char *str, const char find)
Возвращает индекс символа в строке
Definition: string.c:124
void qemu_printf(const char *text,...)
Вывод QEMU через COM1 информации
Definition: ports.c:149