- unsigned frame;
-
-#if __ppc__
- vm_offset_t stackptr, stackptr_prev;
- const vm_offset_t * const mem = (vm_offset_t *) 0;
- unsigned i = 0;
-
- __asm__ volatile("mflr %0" : "=r" (stackptr));
- bt[i++] = (void *) stackptr;
-
- __asm__ volatile("mr %0,r1" : "=r" (stackptr));
- for ( ; i < maxAddrs; i++) {
- // Validate we have a reasonable stackptr
- if ( !(minstackaddr <= stackptr && stackptr < maxstackaddr)
- || (stackptr & 3))
- break;
-
- stackptr_prev = stackptr;
- stackptr = mem[stackptr_prev >> 2];
- if ((stackptr - stackptr_prev) > 8 * 1024) // Sanity check
- break;
-
- vm_offset_t addr = mem[(stackptr >> 2) + 2];
- if ((addr & 3) || (addr < 0x8000)) // More sanity checks
- break;
- bt[i] = (void *) addr;
- }
- frame = i;
-
- for ( ; i < maxAddrs; i++)
- bt[i] = (void *) 0;
-#elif __i386__
-#define SANE_i386_FRAME_SIZE (kernel_stack_size >> 1)
- vm_offset_t stackptr, stackptr_prev, raddr;
- unsigned frame_index = 0;
-/* Obtain current frame pointer */
- __asm__ volatile("movl %%ebp, %0" : "=m" (stackptr));
-
- if (!i386_validate_stackptr(stackptr))
- goto pad;
-
- raddr = *((vm_offset_t *) (stackptr + i386_RETURN_OFFSET));
-
- if (!i386_validate_raddr(raddr))
- goto pad;
-
- bt[frame_index++] = (void *) raddr;
-
- for ( ; frame_index < maxAddrs; frame_index++) {
- stackptr_prev = stackptr;
- stackptr = *((vm_offset_t *) stackptr_prev);
-
- if (!i386_validate_stackptr(stackptr))
- break;
- /* Stack grows downwards */
- if (stackptr < stackptr_prev)
- break;
-
- if ((stackptr - stackptr_prev) > SANE_i386_FRAME_SIZE)
- break;
-
- raddr = *((vm_offset_t *) (stackptr + i386_RETURN_OFFSET));
-
- if (!i386_validate_raddr(raddr))
- break;