]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kdp/ml/i386/kdp_machdep.c
xnu-1456.1.26.tar.gz
[apple/xnu.git] / osfmk / kdp / ml / i386 / kdp_machdep.c
index 07c3145a2fe108b0e1bd398dd1a1f7266a7c867b..8beb2959ed7dd0333c84238868da29935398fc7e 100644 (file)
@@ -39,6 +39,7 @@
 #include <mach-o/nlist.h>
 #include <IOKit/IOPlatformExpert.h> /* for PE_halt_restart */
 #include <kern/machine.h> /* for halt_all_cpus */
+#include <libkern/OSAtomic.h>
 
 #include <kern/thread.h>
 #include <i386/thread.h>
@@ -73,8 +74,6 @@ machine_trace_thread64(thread_t thread, char *tracepos, char *tracebound, int nf
 unsigned
 machine_read64(addr64_t srcaddr, caddr_t dstaddr, uint32_t len);
 
-extern unsigned kdp_vm_read(caddr_t src, caddr_t dst, unsigned len);
-
 static void    kdp_callouts(kdp_event_t event);
 
 void
@@ -153,8 +152,11 @@ kdp_getstate(
     state->esi = saved_state->esi;
     state->ebp = saved_state->ebp;
 
-    if ((saved_state->cs & 0x3) == 0){ /* Kernel State */
-       state->esp = (unsigned int) &saved_state->uesp;
+    if ((saved_state->cs & SEL_PL) == SEL_PL_K) { /* Kernel state? */
+           if (cpu_mode_is64bit())
+                   state->esp = (uint32_t) saved_state->uesp;
+           else
+                   state->esp = ((uint32_t)saved_state) + offsetof(x86_saved_state_t, ss_32) + sizeof(x86_saved_state32_t);
         state->ss = KERNEL_DS;
     } else {
        state->esp = saved_state->uesp;
@@ -193,8 +195,6 @@ kdp_setstate(
     saved_state->frame.eflags |=  ( EFL_IF | EFL_SET );
 #endif
     saved_state->eip = state->eip;
-    saved_state->fs = state->fs;
-    saved_state->gs = state->gs;
 }
 
 
@@ -278,11 +278,7 @@ kdp_machine_hostinfo(
 
 void
 kdp_panic(
-#if CONFIG_NO_KPRINTF_STRINGS
-    __unused const char                *msg
-#else
     const char         *msg
-#endif
 )
 {
     kprintf("kdp panic: %s\n", msg);    
@@ -291,7 +287,7 @@ kdp_panic(
 
 
 void
-kdp_reboot(void)
+kdp_machine_reboot(void)
 {
        printf("Attempting system restart...");
        /* Call the platform specific restart*/
@@ -488,13 +484,17 @@ kdp_call_kdb(
         return(FALSE);
 }
 
-unsigned int
-kdp_ml_get_breakinsn(void)
+void
+kdp_machine_get_breakinsn(
+                                                 uint8_t *bytes,
+                                                 uint32_t *size
+)
 {
-  return 0xcc;
+       bytes[0] = 0xcc;
+       *size = 1;
 }
+
 extern pmap_t kdp_pmap;
-extern uint32_t kdp_src_high32;
 
 #define RETURN_OFFSET 4
 int
@@ -541,25 +541,27 @@ machine_trace_thread(thread_t thread, char *tracepos, char *tracebound, int nfra
                if (!stackptr || (stackptr == fence)) {
                        break;
                }
-               /* Stack grows downward */
-               if (stackptr < prevsp) {
-                       break;
-               }
+
                /* Unaligned frame */
                if (stackptr & 0x0000003) {
                        break;
                }
+
                if (stackptr > stacklimit) {
                        break;
                }
+               
+               if (stackptr <= prevsp) {
+                       break;
+               }
 
-               if (kdp_vm_read((caddr_t) (stackptr + RETURN_OFFSET), (caddr_t) tracebuf, sizeof(caddr_t)) != sizeof(caddr_t)) {
+               if (kdp_machine_vm_read((mach_vm_address_t)(stackptr + RETURN_OFFSET), (caddr_t) tracebuf, sizeof(caddr_t)) != sizeof(caddr_t)) {
                        break;
                }
                tracebuf++;
                
                prevsp = stackptr;
-               if (kdp_vm_read((caddr_t) stackptr, (caddr_t) &stackptr, sizeof(caddr_t)) != sizeof(caddr_t)) {
+               if (kdp_machine_vm_read((mach_vm_address_t)stackptr, (caddr_t) &stackptr, sizeof(caddr_t)) != sizeof(caddr_t)) {
                        *tracebuf++ = 0;
                        break;
                }
@@ -575,14 +577,7 @@ machine_trace_thread(thread_t thread, char *tracepos, char *tracebound, int nfra
 unsigned
 machine_read64(addr64_t srcaddr, caddr_t dstaddr, uint32_t len)
 {
-       uint32_t kdp_vm_read_low32;
-       unsigned retval;
-       
-       kdp_src_high32 = srcaddr >> 32;
-       kdp_vm_read_low32 = srcaddr & 0x00000000FFFFFFFFUL;
-       retval = kdp_vm_read((caddr_t)kdp_vm_read_low32, dstaddr, len);
-       kdp_src_high32 = 0;
-       return retval;
+       return (unsigned)kdp_machine_vm_read(srcaddr, dstaddr, len);
 }
 
 int
@@ -605,11 +600,6 @@ machine_trace_thread64(thread_t thread, char *tracepos, char *tracebound, int nf
                stacklimit = 0xffffffffffffffffULL;
                kdp_pmap = thread->task->map->pmap;
        }
-       else {
-               /* DRK: This would need to adapt for a 64-bit kernel, if any */
-               stackptr = STACK_IKS(thread->kernel_stack)->k_ebp;
-               init_rip = STACK_IKS(thread->kernel_stack)->k_eip;
-       }
 
        *tracebuf++ = init_rip;
 
@@ -625,9 +615,7 @@ machine_trace_thread64(thread_t thread, char *tracepos, char *tracebound, int nf
                if (!stackptr || (stackptr == fence)){
                        break;
                }
-               if (stackptr < prevsp) {
-                       break;
-               }
+
                if (stackptr & 0x0000003) {
                        break;
                }
@@ -635,6 +623,10 @@ machine_trace_thread64(thread_t thread, char *tracepos, char *tracebound, int nf
                        break;
                }
 
+               if (stackptr <= prevsp) {
+                       break;
+               }
+
                if (machine_read64(stackptr + RETURN_OFFSET64, (caddr_t) tracebuf, sizeof(addr64_t)) != sizeof(addr64_t)) {
                        break;
                }
@@ -681,9 +673,7 @@ kdp_register_callout(
        do {
                list_head = kdp_callout_list;
                kcp->callout_next = list_head;
-       } while(!atomic_cmpxchg((uint32_t *) &kdp_callout_list,
-                               (uint32_t) list_head,
-                               (uint32_t) kcp));
+       } while (!OSCompareAndSwapPtr(list_head, kcp, (void * volatile *)&kdp_callout_list));
 }
 
 /*