/* Routine to encapsulate the 64-bit address read hack*/ unsigned machine_read64(addr64_t srcaddr, caddr_t dstaddr, uint32_t len) { unsigned retval; retval = kdp_machine_vm_read(srcaddr, dstaddr, len); return retval; }
int machine_trace_thread(thread_t thread, char *tracepos, char *tracebound, int nframes, boolean_t user_p) { uint32_t *tracebuf = (uint32_t *)tracepos; uint32_t fence = 0; uint32_t stackptr = 0; uint32_t stacklimit = 0xb0000000; int framecount = 0; uint32_t init_srr0 = 0; uint32_t prevsp = 0; uint32_t framesize = 2 * sizeof(vm_offset_t); if (user_p) { /* Examine the user savearea */ init_srr0 = thread->machine.upcb->save_srr0; stackptr = thread->machine.upcb->save_r1; /* This bound isn't useful, but it doesn't hinder us */ stacklimit = 0xffffffff; kdp_pmap = thread->task->map->pmap; } else { stackptr = thread->machine.pcb->save_r1; init_srr0 = thread->machine.pcb->save_srr0; } /* Fill in the "current" program counter */ *tracebuf++ = init_srr0; for (framecount = 0; framecount < nframes; framecount++) { /* Bounds check */ if ((uint32_t) (tracebound - ((char *)tracebuf)) < (4 * framesize)) { tracebuf--; break; } *tracebuf++ = stackptr; /* Invalid frame, or hit fence */ if (!stackptr || (stackptr == fence)) { break; } /* Stack grows downward */ if (stackptr < prevsp) { break; } /* Unaligned frame */ if (stackptr & 0x000000F) { break; } if (stackptr > stacklimit) { break; } /* Assume there's a saved link register, and read it */ if (kdp_machine_vm_read((caddr_t) (stackptr + LR_OFFSET), (caddr_t) tracebuf, sizeof(caddr_t)) != sizeof(caddr_t)) { break; } tracebuf++; prevsp = stackptr; /* Next frame */ if (kdp_machine_vm_read((caddr_t) stackptr, (caddr_t) &stackptr, sizeof(caddr_t)) != sizeof(caddr_t)) { *tracebuf++ = 0; break; } } /* Reset the target pmap */ kdp_pmap = NULL; return (uint32_t) (((char *) tracebuf) - tracepos); }
int machine_trace_thread(thread_t thread, char *tracepos, char *tracebound, int nframes, boolean_t user_p) { uint32_t *tracebuf = (uint32_t *)tracepos; uint32_t fence = 0; uint32_t stackptr = 0; uint32_t stacklimit = 0xfc000000; int framecount = 0; uint32_t init_eip = 0; uint32_t prevsp = 0; uint32_t framesize = 2 * sizeof(vm_offset_t); if (user_p) { x86_saved_state32_t *iss32; iss32 = USER_REGS32(thread); init_eip = iss32->eip; stackptr = iss32->ebp; stacklimit = 0xffffffff; kdp_pmap = thread->task->map->pmap; } else panic("32-bit trace attempted on 64-bit kernel"); *tracebuf++ = init_eip; for (framecount = 0; framecount < nframes; framecount++) { if ((tracebound - ((char *)tracebuf)) < (4 * framesize)) { tracebuf--; break; } *tracebuf++ = stackptr; /* Invalid frame, or hit fence */ if (!stackptr || (stackptr == fence)) { break; } /* Unaligned frame */ if (stackptr & 0x0000003) { break; } if (stackptr <= prevsp) { break; } if (stackptr > stacklimit) { break; } if (kdp_machine_vm_read((mach_vm_address_t)(stackptr + RETURN_OFFSET), (caddr_t) tracebuf, sizeof(*tracebuf)) != sizeof(*tracebuf)) { break; } tracebuf++; prevsp = stackptr; if (kdp_machine_vm_read((mach_vm_address_t)stackptr, (caddr_t) &stackptr, sizeof(stackptr)) != sizeof(stackptr)) { *tracebuf++ = 0; break; } } kdp_pmap = 0; return (uint32_t) (((char *) tracebuf) - tracepos); }
/* Routine to encapsulate the 64-bit address read hack*/ unsigned machine_read64(addr64_t srcaddr, caddr_t dstaddr, uint32_t len) { return (unsigned)kdp_machine_vm_read(srcaddr, dstaddr, len); }
int machine_trace_thread(thread_t thread, char *tracepos, char *tracebound, int nframes, boolean_t user_p) { uint32_t *tracebuf = (uint32_t *)tracepos; uint32_t fence = 0; uint32_t stackptr = 0; uint32_t stacklimit = 0xfc000000; int framecount = 0; uint32_t init_eip = 0; uint32_t prevsp = 0; uint32_t framesize = 2 * sizeof(vm_offset_t); if (user_p) { x86_saved_state32_t *iss32; iss32 = USER_REGS32(thread); init_eip = iss32->eip; stackptr = iss32->ebp; /* This bound isn't useful, but it doesn't hinder us*/ stacklimit = 0xffffffff; kdp_pmap = thread->task->map->pmap; } else { /*Examine the i386_saved_state at the base of the kernel stack*/ stackptr = STACK_IKS(thread->kernel_stack)->k_ebp; init_eip = STACK_IKS(thread->kernel_stack)->k_eip; } *tracebuf++ = init_eip; for (framecount = 0; framecount < nframes; framecount++) { if ((uint32_t)(tracebound - ((char *)tracebuf)) < (4 * framesize)) { tracebuf--; break; } *tracebuf++ = stackptr; /* Invalid frame, or hit fence */ if (!stackptr || (stackptr == fence)) { break; } /* Unaligned frame */ if (stackptr & 0x0000003) { break; } if (stackptr > stacklimit) { break; } if (stackptr <= prevsp) { break; } 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_machine_vm_read((mach_vm_address_t)stackptr, (caddr_t) &stackptr, sizeof(caddr_t)) != sizeof(caddr_t)) { *tracebuf++ = 0; break; } } kdp_pmap = 0; return (uint32_t) (((char *) tracebuf) - tracepos); }