#include <i386/thread.h>
#include <vm/vm_map.h>
#include <i386/pmap.h>
-#include <kern/kalloc.h>
#define KDP_TEST_HARNESS 0
#if KDP_TEST_HARNESS
void
kdp_panic(
- const char *msg
+ const char *fmt,
+ ...
)
{
- kprintf("kdp panic: %s\n", msg);
+ char kdp_fmt[256];
+ va_list args;
+
+ va_start(args, fmt);
+ (void) snprintf(kdp_fmt, sizeof(kdp_fmt), "kdp panic: %s", fmt);
+ vprintf(kdp_fmt, args);
+ va_end(args);
+
__asm__ volatile ("hlt");
}
char * tracebound,
int nframes,
boolean_t user_p,
- boolean_t trace_fp,
uint32_t * thread_trace_flags)
{
uint32_t * tracebuf = (uint32_t *)tracepos;
- uint32_t framesize = (trace_fp ? 2 : 1) * sizeof(uint32_t);
+ uint32_t framesize = sizeof(uint32_t);
uint32_t fence = 0;
uint32_t stackptr = 0;
for (framecount = 0; framecount < nframes; framecount++) {
*tracebuf++ = prev_eip;
- if (trace_fp) {
- *tracebuf++ = stackptr;
- }
/* Invalid frame, or hit fence */
if (!stackptr || (stackptr == fence)) {
char * tracebound,
int nframes,
boolean_t user_p,
- boolean_t trace_fp,
uint32_t * thread_trace_flags,
- uint64_t *sp)
+ uint64_t *sp,
+ vm_offset_t fp)
{
uint64_t * tracebuf = (uint64_t *)tracepos;
- unsigned framesize = (trace_fp ? 2 : 1) * sizeof(addr64_t);
+ unsigned framesize = sizeof(addr64_t);
uint32_t fence = 0;
addr64_t stackptr = 0;
x86_saved_state64_t *iss64;
iss64 = USER_REGS64(thread);
prev_rip = iss64->isf.rip;
- stackptr = iss64->rbp;
+ if (fp == 0) {
+ stackptr = iss64->rbp;
+ }
bt_vm_map = thread->task->map;
if (sp && user_p) {
*sp = iss64->isf.rsp;
}
} else {
- stackptr = STACK_IKS(thread->kernel_stack)->k_rbp;
+ if (fp == 0) {
+ stackptr = STACK_IKS(thread->kernel_stack)->k_rbp;
+ }
prev_rip = STACK_IKS(thread->kernel_stack)->k_rip;
prev_rip = VM_KERNEL_UNSLIDE(prev_rip);
bt_vm_map = kernel_map;
for (framecount = 0; framecount < nframes; framecount++) {
*tracebuf++ = prev_rip;
- if (trace_fp) {
- *tracebuf++ = stackptr;
- }
if (!stackptr || (stackptr == fence)) {
break;