Any more concerns or can this be commited? bluhm
Index: arch/amd64/amd64/db_trace.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/db_trace.c,v retrieving revision 1.47 diff -u -p -r1.47 db_trace.c --- arch/amd64/amd64/db_trace.c 10 Nov 2019 10:03:33 -0000 1.47 +++ arch/amd64/amd64/db_trace.c 26 Dec 2019 19:08:35 -0000 @@ -150,7 +150,7 @@ db_stack_trace_print(db_expr_t addr, int name = NULL; } - if (lastframe == 0 && sym == NULL) { + if (lastframe == 0 && sym == NULL && callpc != 0) { /* Symbol not found, peek at code */ unsigned long instr = db_get_value(callpc, 8, 0); Index: arch/amd64/amd64/trap.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/trap.c,v retrieving revision 1.77 diff -u -p -r1.77 trap.c --- arch/amd64/amd64/trap.c 6 Sep 2019 12:22:01 -0000 1.77 +++ arch/amd64/amd64/trap.c 26 Dec 2019 19:08:35 -0000 @@ -77,6 +77,7 @@ #include <sys/signal.h> #include <sys/syscall.h> #include <sys/syscall_mi.h> +#include <sys/stdarg.h> #include <uvm/uvm_extern.h> @@ -132,6 +133,24 @@ static inline void verify_smap(const cha static inline void debug_trap(struct trapframe *_frame, struct proc *_p, long _type); +static inline int +fault(const char *format, ...) +{ + static char faultbuf[512]; + va_list ap; + + /* + * Save the fault info for DDB and retain the kernel lock to keep + * faultbuf from being overwritten by another CPU. + */ + va_start(ap, format); + vsnprintf(faultbuf, sizeof faultbuf, format, ap); + va_end(ap); + printf("%s\n", faultbuf); + faultstr = faultbuf; + return 0; +} + /* * pageflttrap(frame, usermode): page fault handler * Returns non-zero if the fault was handled (possibly by generating @@ -160,16 +179,14 @@ pageflttrap(struct trapframe *frame, int KERNEL_LOCK(); if (!usermode) { - extern struct vm_map *kernel_map; - /* This will only trigger if SMEP is enabled */ if (cr2 <= VM_MAXUSER_ADDRESS && frame->tf_err & PGEX_I) - panic("attempt to execute user address %p " + return fault("attempt to execute user address %p " "in supervisor mode", (void *)cr2); /* This will only trigger if SMAP is enabled */ if (pcb->pcb_onfault == NULL && cr2 <= VM_MAXUSER_ADDRESS && frame->tf_err & PGEX_P) - panic("attempt to access user address %p " + return fault("attempt to access user address %p " "in supervisor mode", (void *)cr2); /* @@ -211,18 +228,9 @@ pageflttrap(struct trapframe *frame, int frame->tf_rip = (u_int64_t)pcb->pcb_onfault; return 1; } else { - /* - * Bad memory access in the kernel; save the fault - * info for DDB and retain the kernel lock to keep - * faultbuf from being overwritten by another CPU. - */ - static char faultbuf[512]; - snprintf(faultbuf, sizeof faultbuf, - "uvm_fault(%p, 0x%llx, 0, %d) -> %x", + /* bad memory access in the kernel */ + return fault("uvm_fault(%p, 0x%llx, 0, %d) -> %x", map, cr2, ftype, error); - printf("%s\n", faultbuf); - faultstr = faultbuf; - return 0; } } else { union sigval sv; @@ -395,7 +403,7 @@ trap_print(struct trapframe *frame, int printf(" in %s mode\n", KERNELMODE(frame->tf_cs, frame->tf_rflags) ? "supervisor" : "user"); printf("trap type %d code %llx rip %llx cs %llx rflags %llx cr2 " - " %llx cpl %x rsp %llx\n", + "%llx cpl %x rsp %llx\n", type, frame->tf_err, frame->tf_rip, frame->tf_cs, frame->tf_rflags, rcr2(), curcpu()->ci_ilevel, frame->tf_rsp); printf("gsbase %p kgsbase %p\n", Index: ddb/db_examine.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/ddb/db_examine.c,v retrieving revision 1.26 diff -u -p -r1.26 db_examine.c --- ddb/db_examine.c 7 Nov 2019 13:16:25 -0000 1.26 +++ ddb/db_examine.c 26 Dec 2019 19:08:35 -0000 @@ -288,8 +288,10 @@ void db_print_loc_and_inst(vaddr_t loc) { db_printsym(loc, DB_STGY_PROC, db_printf); - db_printf(":\t"); - (void) db_disasm(loc, 0); + if (loc != 0) { + db_printf(":\t"); + db_disasm(loc, 0); + } } /* local copy is needed here so that we can trace strlcpy() in libkern */