Fix syscall_async's signature
[akaros.git] / kern / arch / x86 / kdebug.c
index 0e3fffc..ec8795b 100644 (file)
@@ -1,7 +1,3 @@
-#ifdef __SHARC__
-#pragma nosharc
-#endif
-
 #include <stab.h>
 #include <string.h>
 #include <assert.h>
 #include <stab.h>
 #include <string.h>
 #include <assert.h>
 #include <ros/memlayout.h>
 
 // Beginning of stabs table
 #include <ros/memlayout.h>
 
 // Beginning of stabs table
-extern const stab_t (RO BND(__this,__STAB_END__) __STAB_BEGIN__)[];
+extern const stab_t __STAB_BEGIN__[];
 
 // End of stabs table
 
 // End of stabs table
-extern const stab_t (RO SNT __STAB_END__)[];
+extern const stab_t __STAB_END__[];
 
 // Beginning of string table
 
 // Beginning of string table
-extern const char (RO NT BND(__this,__STABSTR_END__) __STABSTR_BEGIN__)[];
+extern const char __STABSTR_BEGIN__[];
 
  // End of string table
 
  // End of string table
-extern const char (RO SNT __STABSTR_END__)[];
+extern const char __STABSTR_END__[];
 
 typedef struct UserStabData {
 
 typedef struct UserStabData {
-       const stab_t *BND(__this,stab_end) stabs;
-       const stab_t *SNT stab_end;
-       const char *NT BND(__this, stabstr_end) stabstr;
-       const char *SNT stabstr_end;
+       const stab_t *stabs;
+       const stab_t *stab_end;
+       const char *stabstr;
+       const char *stabstr_end;
 } user_stab_data_t;
 
 
 } user_stab_data_t;
 
 
@@ -82,8 +78,8 @@ static bool stab_table_valid(const char *stabstr, const char *stabstr_end)
 //     will exit setting left = 118, right = 554.
 //
 static void
 //     will exit setting left = 118, right = 554.
 //
 static void
-stab_binsearch(const stab_t *BND(__this, stab_end) stabs,
-           const stab_t *SNT stab_end,
+stab_binsearch(const stab_t *stabs,
+           const stab_t *stab_end,
            int *region_left, int *region_right,
               int type, uintptr_t addr)
 {
            int *region_left, int *region_right,
               int type, uintptr_t addr)
 {
@@ -138,12 +134,12 @@ stab_binsearch(const stab_t *BND(__this, stab_end) stabs,
 //     information into '*info'.
 //
 int
 //     information into '*info'.
 //
 int
-debuginfo_eip(uintptr_t addr, eipdebuginfo_t *NONNULL info)
+debuginfo_eip(uintptr_t addr, eipdebuginfo_t *info)
 {
 {
-       const stab_t *SNT stab_end;
-       const stab_t *BND(__this,stab_end) stabs;
-       const char *SNT stabstr_end;
-       const char *NT BND(__this,stabstr_end) stabstr;
+       const stab_t *stab_end;
+       const stab_t *stabs;
+       const char *stabstr_end;
+       const char *stabstr;
        int lfile, rfile, lfun, rfun, lline, rline;
 
        // Initialize *info
        int lfile, rfile, lfun, rfun, lline, rline;
 
        // Initialize *info
@@ -170,7 +166,7 @@ debuginfo_eip(uintptr_t addr, eipdebuginfo_t *NONNULL info)
                // to __STAB_BEGIN__, __STAB_END__, __STABSTR_BEGIN__, and
                // __STABSTR_END__) in a structure located at virtual address
                // USTABDATA.
                // to __STAB_BEGIN__, __STAB_END__, __STABSTR_BEGIN__, and
                // __STABSTR_END__) in a structure located at virtual address
                // USTABDATA.
-               const user_stab_data_t *usd = (const user_stab_data_t *COUNT(1))TC(USTABDATA);
+               const user_stab_data_t *usd = (const user_stab_data_t *)USTABDATA;
 
                // Make sure this memory is valid.
                // Return -1 if it is not.  Hint: Call user_mem_check.
 
                // Make sure this memory is valid.
                // Return -1 if it is not.  Hint: Call user_mem_check.
@@ -272,10 +268,10 @@ debuginfo_eip(uintptr_t addr, eipdebuginfo_t *NONNULL info)
 /* Returns a function pointer for a function name matching the given string. */
 void *debug_get_fn_addr(char *fn_name)
 {
 /* Returns a function pointer for a function name matching the given string. */
 void *debug_get_fn_addr(char *fn_name)
 {
-       const struct stab *SNT stab_end = __STAB_END__;
-       const struct stab *BND(__this,stab_end) stabs = __STAB_BEGIN__;
-       const char *SNT stabstr_end = __STABSTR_END__;
-       const char *NT BND(__this,stabstr_end) stabstr = __STABSTR_BEGIN__;
+       const struct stab *stab_end = __STAB_END__;
+       const struct stab *stabs = __STAB_BEGIN__;
+       const char *stabstr_end = __STABSTR_END__;
+       const char *stabstr = __STABSTR_BEGIN__;
 
        static int first_fn_idx = 0;
        int i = first_fn_idx;
 
        static int first_fn_idx = 0;
        int i = first_fn_idx;
@@ -312,13 +308,15 @@ size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
 {
        size_t nr_pcs = 0;
        while (fp && nr_pcs < nr_slots) {
 {
        size_t nr_pcs = 0;
        while (fp && nr_pcs < nr_slots) {
-               /* could put some sanity checks in here... */
+               /* could put some sanity checks in here...  i used to at least check for
+                * kernel addrs, but now we also bt user stacks. (dangerous!) */
                pcs[nr_pcs++] = pc;
                pcs[nr_pcs++] = pc;
-               /* PC becomes the retaddr - 1.  the -1 is to put our PC back inside the
-                * function that called us.  this was necessary in case we called as the
-                * last instruction in a function (would have to never return).  not
-                * sure how necessary this still is. */
-               pc = *(uintptr_t*)(fp + sizeof(uintptr_t)) - 1;
+               printd("PC %p FP %p\n", pc, fp);
+               /* We used to set PC = retaddr - 1, where the -1 would put our PC back
+                * inside the function that called us.  This was for obscure cases where
+                * a no-return function calls another function and has no other code
+                * after the function call.  Or something. */
+               pc = *(uintptr_t*)(fp + sizeof(uintptr_t));
                fp = *(uintptr_t*)fp;
        }
        return nr_pcs;
                fp = *(uintptr_t*)fp;
        }
        return nr_pcs;
@@ -326,32 +324,15 @@ size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
 
 void backtrace_frame(uintptr_t eip, uintptr_t ebp)
 { 
 
 void backtrace_frame(uintptr_t eip, uintptr_t ebp)
 { 
-       extern char (SNT RO _start)[];
-       eipdebuginfo_t debuginfo;
-       char buf[256];
        char *func_name;
        #define MAX_BT_DEPTH 20
        uintptr_t pcs[MAX_BT_DEPTH];
        size_t nr_pcs = backtrace_list(eip, ebp, pcs, MAX_BT_DEPTH);
 
        for (int i = 0; i < nr_pcs; i++) {
        char *func_name;
        #define MAX_BT_DEPTH 20
        uintptr_t pcs[MAX_BT_DEPTH];
        size_t nr_pcs = backtrace_list(eip, ebp, pcs, MAX_BT_DEPTH);
 
        for (int i = 0; i < nr_pcs; i++) {
-               #ifdef CONFIG_X86_64
                func_name = get_fn_name(pcs[i]);
                printk("#%02d [<%p>] in %s\n", i + 1,  pcs[i], func_name);
                kfree(func_name);
                func_name = get_fn_name(pcs[i]);
                printk("#%02d [<%p>] in %s\n", i + 1,  pcs[i], func_name);
                kfree(func_name);
-               #else
-               debuginfo_eip(pcs[i], &debuginfo);
-               memset(buf, 0, 256);
-               strncpy(buf, debuginfo.eip_fn_name, MIN(debuginfo.eip_fn_namelen, 256));
-               buf[MIN(debuginfo.eip_fn_namelen, 255)] = 0;
-               cprintf("#%02d [<%p>] in %s+%x(%p) from %s:%d\n", i + 1,  pcs[i], buf, 
-                       debuginfo.eip_fn_addr - (uintptr_t)_start,
-                       debuginfo.eip_fn_addr, debuginfo.eip_file, debuginfo.eip_line);
-               cprintf("    ebp: %x   Args:", ebp);
-               for (int j = 0; j < MIN(debuginfo.eip_fn_narg, 5); j++)
-                       cprintf(" %08x", *(uintptr_t*)(ebp + 2 + j));
-               cprintf("\n");
-               #endif /* CONFIG_X86_64 */
        }
 }
 
        }
 }