]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/debug.c
xnu-2422.110.17.tar.gz
[apple/xnu.git] / osfmk / kern / debug.c
index b89774897c23216fa7baadc80df1900a0227a8ab..7ee11d7a97db7f9d43d745296550e51796461159 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2013 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -66,6 +66,7 @@
 #include <kern/sched_prim.h>
 #include <kern/misc_protos.h>
 #include <kern/clock.h>
+#include <kern/telemetry.h>
 #include <vm/vm_kern.h>
 #include <vm/pmap.h>
 #include <stdarg.h>
@@ -108,18 +109,15 @@ unsigned int              panic_is_inited = 0;
 unsigned int           return_on_panic = 0;
 unsigned long          panic_caller;
 
-#if CONFIG_EMBEDDED
-#define DEBUG_BUF_SIZE (PAGE_SIZE)
-#else
 #define DEBUG_BUF_SIZE (3 * PAGE_SIZE)
-#endif
 
 char debug_buf[DEBUG_BUF_SIZE];
 char *debug_buf_ptr = debug_buf;
 unsigned int debug_buf_size = sizeof(debug_buf);
 
 static char model_name[64];
-/* uuid_string_t */ char kernel_uuid[37]; 
+unsigned char *kernel_uuid;
+/* uuid_string_t */ char kernel_uuid_string[37];
 
 static spl_t panic_prologue(const char *str);
 static void panic_epilogue(spl_t s);
@@ -156,7 +154,15 @@ Assert(
        }
 
        saved_return_on_panic = return_on_panic;
-       return_on_panic = 1;
+
+       /*
+        * If we don't have a debugger configured, returning from an
+        * assert is a bad, bad idea; there is no guarantee that we
+        * didn't simply assert before we were able to restart the
+        * platform.
+        */
+       if (current_debugger != NO_CUR_DB)
+               return_on_panic = 1;
 
        panic_plain("%s:%d Assertion failed: %s", file, line, expression);
 
@@ -181,7 +187,6 @@ MACRO_BEGIN                                                         \
                simple_unlock(&panic_lock);                             \
 MACRO_END
 
-
 void
 panic_init(void)
 {
@@ -190,7 +195,8 @@ panic_init(void)
 
        uuid = getuuidfromheader(&_mh_execute_header, &uuidlen);
        if ((uuid != NULL) && (uuidlen == sizeof(uuid_t))) {
-               uuid_unparse_upper(*(uuid_t *)uuid, kernel_uuid);
+               kernel_uuid = uuid;
+               uuid_unparse_upper(*(uuid_t *)uuid, kernel_uuid_string);
        }
 
        simple_lock_init(&panic_lock, 0);
@@ -234,8 +240,10 @@ panic_prologue(const char *str)
        spl_t   s;
 
        if (kdebug_enable) {
-               ml_set_interrupts_enabled(TRUE);
-               kdbg_dump_trace_to_file("/var/tmp/panic.trace");
+               if (get_preemption_level() == 0 && !ml_at_interrupt_context()) {
+                       ml_set_interrupts_enabled(TRUE);
+                       kdbg_dump_trace_to_file("/var/tmp/panic.trace");
+               }
        }
 
        s = splhigh();
@@ -316,6 +324,7 @@ panic(const char *str, ...)
        va_list listp;
        spl_t   s;
 
+
        /* panic_caller is initialized to 0.  If set, don't change it */
        if ( ! panic_caller )
                panic_caller = (unsigned long)(char *)__builtin_return_address(0);
@@ -343,6 +352,7 @@ panic_context(unsigned int reason, void *ctx, const char *str, ...)
        va_list listp;
        spl_t   s;
 
+
        /* panic_caller is initialized to 0.  If set, don't change it */
        if ( ! panic_caller )
                panic_caller = (unsigned long)(char *)__builtin_return_address(0);
@@ -474,22 +484,20 @@ static void panic_display_model_name(void) {
 }
 
 static void panic_display_kernel_uuid(void) {
-       char tmp_kernel_uuid[sizeof(kernel_uuid)];
+       char tmp_kernel_uuid[sizeof(kernel_uuid_string)];
 
-       if (ml_nofault_copy((vm_offset_t) &kernel_uuid, (vm_offset_t) &tmp_kernel_uuid, sizeof(kernel_uuid)) != sizeof(kernel_uuid))
+       if (ml_nofault_copy((vm_offset_t) &kernel_uuid_string, (vm_offset_t) &tmp_kernel_uuid, sizeof(kernel_uuid_string)) != sizeof(kernel_uuid_string))
                return;
 
        if (tmp_kernel_uuid[0] != '\0')
                kdb_printf("Kernel UUID: %s\n", tmp_kernel_uuid);
 }
 
-static void panic_display_kernel_aslr(void) {
-#if    defined(__x86_64__)
+void panic_display_kernel_aslr(void) {
        if (vm_kernel_slide) {
-               kdb_printf("Kernel slide:     0x%016lx\n", vm_kernel_slide);
+               kdb_printf("Kernel slide:     0x%016lx\n", (unsigned long) vm_kernel_slide);
                kdb_printf("Kernel text base: %p\n", (void *) vm_kernel_stext);
        }
-#endif
 }
 
 static void panic_display_uptime(void) {
@@ -605,11 +613,11 @@ __private_extern__ void panic_display_ztrace(void)
 #endif /* CONFIG_ZLEAKS */
 
 #if !MACH_KDP
-static struct ether_addr kdp_current_mac_address = {{0, 0, 0, 0, 0, 0}};
+static struct kdp_ether_addr kdp_current_mac_address = {{0, 0, 0, 0, 0, 0}};
 
 /* XXX ugly forward declares to stop warnings */
 void *kdp_get_interface(void);
-void kdp_set_ip_and_mac_addresses(struct in_addr *, struct ether_addr *);
+void kdp_set_ip_and_mac_addresses(struct kdp_in_addr *, struct kdp_ether_addr *);
 void kdp_set_gateway_mac(void *);
 void kdp_set_interface(void *);
 void kdp_register_send_receive(void *, void *);
@@ -628,7 +636,7 @@ unsigned int
 kdp_get_ip_address(void )
 { return 0; }
 
-struct ether_addr
+struct kdp_ether_addr
 kdp_get_mac_addr(void)
 {       
         return kdp_current_mac_address;
@@ -636,8 +644,8 @@ kdp_get_mac_addr(void)
 
 void
 kdp_set_ip_and_mac_addresses(   
-        __unused struct in_addr          *ipaddr,
-        __unused struct ether_addr       *macaddr)
+        __unused struct kdp_in_addr          *ipaddr,
+        __unused struct kdp_ether_addr       *macaddr)
 {}
 
 void
@@ -674,3 +682,10 @@ kdp_stack_snapshot_bytes_traced(void)
 }
 
 #endif
+
+#if !CONFIG_TELEMETRY
+int telemetry_gather(user_addr_t buffer __unused, uint32_t *length __unused, boolean_t mark __unused)
+{
+       return KERN_NOT_SUPPORTED;
+}
+#endif