]> git.saurik.com Git - apple/xnu.git/blobdiff - libkern/gen/OSDebug.cpp
xnu-1228.15.4.tar.gz
[apple/xnu.git] / libkern / gen / OSDebug.cpp
index f464ad8899d8cb48a1e7db4da8e71f4a927738b2..3690714e8ca74dd84ec16b02da3a6ee74e4c712c 100644 (file)
@@ -39,6 +39,8 @@
 #include <libkern/libkern.h>   // From bsd's libkern directory
 #include <mach/vm_param.h>
 
+#include <sys/kdebug.h>
+extern int etext;
 __BEGIN_DECLS
 // From osmfk/kern/thread.h but considered to be private
 extern vm_offset_t min_valid_stack_address(void);
@@ -48,10 +50,39 @@ extern vm_offset_t max_valid_stack_address(void);
 extern void kmod_dump_log(vm_offset_t *addr, unsigned int cnt);
 
 extern addr64_t kvtophys(vm_offset_t va);
+
 __END_DECLS
 
 static mutex_t *sOSReportLock = mutex_alloc(0);
 
+/* Use kernel_debug() to log a backtrace */ 
+void
+trace_backtrace(unsigned int debugid, unsigned int debugid2, int size, int data) {
+       void *bt[16];
+       const unsigned cnt = sizeof(bt) / sizeof(bt[0]);
+       unsigned i;
+       int found = 0;
+
+       OSBacktrace(bt, cnt);   
+  
+       /* find first non-kernel frame */
+       for (i = 3; i < cnt && bt[i]; i++) {
+               if (bt[i] > (void*)&etext) {
+                       found = 1;
+                       break;
+               }
+       }
+       /* 
+        * if there are non-kernel frames, only log these
+        * otherwise, log everything but the first two
+        */
+       if (!found) i=2;
+
+#define safe_bt(a) (int)(a<cnt ? bt[a] : 0)
+       kernel_debug(debugid, data, size, safe_bt(i), safe_bt(i+1), 0);
+       kernel_debug(debugid2, safe_bt(i+2), safe_bt(i+3), safe_bt(i+4), safe_bt(i+5), 0);
+}
+
 /* Report a message with a 4 entry backtrace - very slow */
 void
 OSReportWithBacktrace(const char *str, ...)