Index: amd64/db_trace.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/db_trace.c,v retrieving revision 1.26 diff -u -p -r1.26 db_trace.c --- amd64/db_trace.c 20 Apr 2017 12:41:43 -0000 1.26 +++ amd64/db_trace.c 5 May 2017 01:59:16 -0000 @@ -100,7 +100,7 @@ db_numargs(struct callframe *fp, const c #ifdef DDBCTF return db_ctf_func_numargs(sym); #else - return 0; + return 6; #endif /* DDBCTF */ } @@ -175,12 +175,21 @@ db_is_trap(const char *name) return NONE; } +const unsigned long *db_reg_args[6] = { + (unsigned long *)&ddb_regs.tf_rdi, + (unsigned long *)&ddb_regs.tf_rsi, + (unsigned long *)&ddb_regs.tf_rdx, + (unsigned long *)&ddb_regs.tf_rcx, + (unsigned long *)&ddb_regs.tf_r8, + (unsigned long *)&ddb_regs.tf_r9, +}; + void db_stack_trace_print(db_expr_t addr, boolean_t have_addr, db_expr_t count, char *modif, int (*pr)(const char *, ...)) { struct callframe *frame, *lastframe; - long *argp, *arg0; + unsigned long *argp, *arg0; db_addr_t callpc; int is_trap = 0; boolean_t kernel_only = TRUE; @@ -220,7 +229,8 @@ db_stack_trace_print(db_expr_t addr, boo lastframe = 0; while (count && frame != 0) { int narg; - char * name; + unsigned int i; + char * name; db_expr_t offset; db_sym_t sym; @@ -229,7 +239,7 @@ db_stack_trace_print(db_expr_t addr, boo if (lastframe == 0 && sym == NULL) { /* Symbol not found, peek at code */ - long instr = db_get_value(callpc, 8, FALSE); + unsigned long instr = db_get_value(callpc, 8, FALSE); offset = 1; if ((instr & 0x00ffffff) == 0x00e58955 || @@ -249,18 +259,32 @@ db_stack_trace_print(db_expr_t addr, boo (*pr)("%s(", name); if (lastframe == 0 && offset == 0 && !have_addr) { - /* - * We have a breakpoint before the frame is set up - * Use %rsp instead - */ + /* We have a breakpoint before the frame is set up */ + for (i = min(6, narg); i > 0; i--) { + (*pr)("%lx", *db_reg_args[i]); + if (--narg != 0) + (*pr)(","); + } + + /* Use %rsp instead */ arg0 = &((struct callframe *)(ddb_regs.tf_rsp-8))->f_arg0; } else { + argp = (unsigned long *)frame; + for (i = min(6, narg); i > 0; i--) { + argp--; + (*pr)("%lx", db_get_value((db_addr_t)argp, + sizeof(*argp), FALSE)); + if (--narg != 0) + (*pr)(","); + } + arg0 = &frame->f_arg0; } for (argp = arg0; narg > 0; ) { - (*pr)("%lx", db_get_value((db_addr_t)argp, 8, FALSE)); + (*pr)("%lx", db_get_value((db_addr_t)argp, + sizeof(*argp), FALSE)); argp++; if (--narg != 0) (*pr)(","); Index: conf/Makefile.amd64 =================================================================== RCS file: /cvs/src/sys/arch/amd64/conf/Makefile.amd64,v retrieving revision 1.75 diff -u -p -r1.75 Makefile.amd64 --- conf/Makefile.amd64 25 Jan 2017 11:15:07 -0000 1.75 +++ conf/Makefile.amd64 5 May 2017 01:59:16 -0000 @@ -33,6 +33,9 @@ CMACHFLAGS+= -ffreestanding ${NOPIE_FLAG .if ${IDENT:M-DNO_PROPOLICE} CMACHFLAGS+= -fno-stack-protector .endif +.if ${IDENT:M-DDDB} +CMACHFLAGS+= -msave-args +.endif .if ${IDENT:M-DSMALL_KERNEL} CMACHFLAGS+= -Wa,-n .endif