Module Name: src Committed By: christos Date: Thu Jul 19 18:27:26 UTC 2018
Modified Files: src/sys/arch/aarch64/aarch64: fault.c trap.c src/sys/arch/aarch64/include: machdep.h Log Message: Implement TRAP_SIGDEBUG for aarch64... ptraced programs die with: data_abort_handler, 257: pid 199.1 (a.out): signal 11 (trap 0x82000006) @pc 0, addr 0x0, error=Instruction Abort (EL0) To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/aarch64/aarch64/fault.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/aarch64/aarch64/trap.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/aarch64/include/machdep.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/aarch64/aarch64/fault.c diff -u src/sys/arch/aarch64/aarch64/fault.c:1.3 src/sys/arch/aarch64/aarch64/fault.c:1.4 --- src/sys/arch/aarch64/aarch64/fault.c:1.3 Tue Jul 17 06:07:49 2018 +++ src/sys/arch/aarch64/aarch64/fault.c Thu Jul 19 14:27:26 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: fault.c,v 1.3 2018/07/17 10:07:49 ryo Exp $ */ +/* $NetBSD: fault.c,v 1.4 2018/07/19 18:27:26 christos Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.3 2018/07/17 10:07:49 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.4 2018/07/19 18:27:26 christos Exp $"); #include "opt_ddb.h" #include "opt_uvmhist.h" @@ -119,7 +119,7 @@ is_fatal_abort(uint32_t esr) } void -data_abort_handler(struct trapframe *tf, uint32_t eclass, const char *trapname) +data_abort_handler(struct trapframe *tf, uint32_t eclass) { struct proc *p; struct lwp *l; @@ -297,7 +297,8 @@ data_abort_handler(struct trapframe *tf, /* * fatal abort. analyze fault status code to show by panic() */ - len = snprintf(panicinfo, sizeof(panicinfo), "Trap: %s:", trapname); + len = snprintf(panicinfo, sizeof(panicinfo), "Trap: %s:", + eclass_trapname(eclass)); if ((fsc >= __arraycount(fault_status_code)) || ((faultstr = fault_status_code[fsc]) == NULL)) Index: src/sys/arch/aarch64/aarch64/trap.c diff -u src/sys/arch/aarch64/aarch64/trap.c:1.5 src/sys/arch/aarch64/aarch64/trap.c:1.6 --- src/sys/arch/aarch64/aarch64/trap.c:1.5 Mon Jul 16 20:35:51 2018 +++ src/sys/arch/aarch64/aarch64/trap.c Thu Jul 19 14:27:26 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.5 2018/07/17 00:35:51 christos Exp $ */ +/* $NetBSD: trap.c,v 1.6 2018/07/19 18:27:26 christos Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.5 2018/07/17 00:35:51 christos Exp $"); +__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.6 2018/07/19 18:27:26 christos Exp $"); #include "opt_arm_intr_impl.h" #include "opt_compat_netbsd32.h" @@ -118,14 +118,14 @@ const char * const trap_names[] = { [ESR_EC_VECTOR_CATCH] = "A32: Vector Catch Exception" }; -static inline const char * +const char * eclass_trapname(uint32_t eclass) { static char trapnamebuf[sizeof("Unknown trap 0x????????")]; if (eclass >= __arraycount(trap_names) || trap_names[eclass] == NULL) { snprintf(trapnamebuf, sizeof(trapnamebuf), - "Unknown trap 0x%02x", eclass); + "Unknown trap %#02x", eclass); return trapnamebuf; } return trap_names[eclass]; @@ -175,7 +175,6 @@ trap_el1h_sync(struct trapframe *tf) { const uint32_t esr = tf->tf_esr; const uint32_t eclass = __SHIFTOUT(esr, ESR_EC); /* exception class */ - const char *trapname; /* re-enable traps and interrupts */ if (!(tf->tf_spsr & SPSR_I)) @@ -183,12 +182,10 @@ trap_el1h_sync(struct trapframe *tf) else daif_enable(DAIF_D|DAIF_A); - trapname = eclass_trapname(eclass); - switch (eclass) { case ESR_EC_INSN_ABT_EL1: case ESR_EC_DATA_ABT_EL1: - data_abort_handler(tf, eclass, trapname); + data_abort_handler(tf, eclass); break; case ESR_EC_BRKPNT_EL1: @@ -218,7 +215,8 @@ trap_el1h_sync(struct trapframe *tf) case ESR_EC_ILL_STATE: default: panic("Trap: fatal %s: pc=%016" PRIx64 "sp=%016" PRIx64 - "esr=%08x", trapname, tf->tf_pc, tf->tf_sp, esr); + "esr=%08x", eclass_trapname(eclass), tf->tf_pc, tf->tf_sp, + esr); break; } } @@ -229,17 +227,14 @@ trap_el0_sync(struct trapframe *tf) struct lwp * const l = curlwp; const uint32_t esr = tf->tf_esr; const uint32_t eclass = __SHIFTOUT(esr, ESR_EC); /* exception class */ - const char *trapname; /* enable traps and interrupts */ daif_enable(DAIF_D|DAIF_A|DAIF_I|DAIF_F); - trapname = eclass_trapname(eclass); - switch (eclass) { case ESR_EC_INSN_ABT_EL0: case ESR_EC_DATA_ABT_EL0: - data_abort_handler(tf, eclass, trapname); + data_abort_handler(tf, eclass); userret(l); break; @@ -304,13 +299,10 @@ trap_el0_32sync(struct trapframe *tf) struct lwp * const l = curlwp; const uint32_t esr = tf->tf_esr; const uint32_t eclass = __SHIFTOUT(esr, ESR_EC); /* exception class */ - const char *trapname; /* enable traps and interrupts */ daif_enable(DAIF_D|DAIF_A|DAIF_I|DAIF_F); - trapname = eclass_trapname(eclass); - switch (eclass) { case ESR_EC_FP_ACCESS: fpu_load(l); @@ -319,7 +311,7 @@ trap_el0_32sync(struct trapframe *tf) case ESR_EC_INSN_ABT_EL0: case ESR_EC_DATA_ABT_EL0: - data_abort_handler(tf, eclass, trapname); + data_abort_handler(tf, eclass); userret(l); break; @@ -344,14 +336,16 @@ trap_el0_32sync(struct trapframe *tf) case ESR_EC_FP_TRAP_A32: case ESR_EC_BKPT_INSN_A32: /* XXX notyet */ - printf("%s:%d: %s\n", __func__, __LINE__, trapname); + printf("%s:%d: %s\n", __func__, __LINE__, + eclass_trapname(eclass)); do_trapsignal(l, SIGILL, ILL_ILLTRP, (void *)tf->tf_pc, esr); userret(l); break; #endif /* COMPAT_NETBSD32 */ default: /* XXX notyet */ - printf("%s:%d: %s\n", __func__, __LINE__, trapname); + printf("%s:%d: %s\n", __func__, __LINE__, + eclass_trapname(eclass)); do_trapsignal(l, SIGILL, ILL_ILLTRP, (void *)tf->tf_pc, esr); userret(l); break; @@ -451,3 +445,64 @@ copystr(const void *kfaddr, void *kdaddr } return error; } + +#ifdef TRAP_SIGDEBUG +static void +frame_dump(const struct trapframe *tf) +{ + const struct reg *r = &tf->tf_regs; + + printf("trapframe %p\n", tf); + for (size_t i = 0; i < __arraycount(r->r_reg); i++) { + printf(" r%.2zu %#018%s" PRIx64, i, r->r_reg[i], + " \n"[i && (i & 1) == 0]); + } + + printf("\n"); + printf(" sp %#018" PRIx64 " pc %#018" PRIx64 "\n", + r->r_sp, r->r_pc); + printf(" spsr %#018" PRIx64 " tpidr %#018" PRIx64 "\n", + r->r_spsr, r->r_tpidr); + printf(" esr %#018" PRIx64 " far %#018" PRIx64 "\n", + tf->tf_esr, tf->tf_far); + + printf("\n"); + hexdump(printf, "Stack dump", tf, 256); +} + +static void +sigdebug(const struct trapframe *tf, const ksiginfo_t *ksi) +{ + struct lwp *l = curlwp; + struct proc *p = l->l_proc; + const uint32_t eclass = __SHIFTOUT(ksi->ksi_trap, ESR_EC); + + printf("pid %d.%d (%s): signal %d (trap %#x) " + "@pc %#" PRIx64 ", addr %p, error=%s\n", + p->p_pid, l->l_lid, p->p_comm, ksi->ksi_signo, ksi->ksi_trap, + tf->tf_regs.r_pc, ksi->ksi_addr, eclass_trapname(eclass)); + frame_dump(tf); +} +#endif + +void do_trapsignal1( +#ifdef TRAP_SIGDEBUG + const char *func, + size_t line, + struct trapframe *tf, +#endif + struct lwp *l, int signo, int code, void *addr, int trap) +{ + ksiginfo_t ksi; + + KSI_INIT_TRAP(&ksi); + ksi.ksi_signo = signo; + ksi.ksi_code = code; + ksi.ksi_addr = addr; + ksi.ksi_trap = trap; +#ifdef TRAP_SIGDEBUG + printf("%s, %zu: ", func, line); + sigdebug(tf, &ksi); +#endif + (*l->l_proc->p_emul->e_trapsignal)(l, &ksi); +} Index: src/sys/arch/aarch64/include/machdep.h diff -u src/sys/arch/aarch64/include/machdep.h:1.2 src/sys/arch/aarch64/include/machdep.h:1.3 --- src/sys/arch/aarch64/include/machdep.h:1.2 Mon Jul 9 02:19:53 2018 +++ src/sys/arch/aarch64/include/machdep.h Thu Jul 19 14:27:26 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.h,v 1.2 2018/07/09 06:19:53 ryo Exp $ */ +/* $NetBSD: machdep.h,v 1.3 2018/07/19 18:27:26 christos Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -77,7 +77,7 @@ void dumpsys(void); struct trapframe; /* fault.c */ -void data_abort_handler(struct trapframe *, uint32_t, const char *); +void data_abort_handler(struct trapframe *, uint32_t); /* trap.c */ void lwp_trampoline(void); @@ -134,18 +134,21 @@ struct fpreg; void load_fpregs(struct fpreg *); void save_fpregs(struct fpreg *); -static inline void -do_trapsignal(struct lwp *l, int signo, int code, void *addr, int trap) -{ - ksiginfo_t ksi; +#ifdef TRAP_SIGDEBUG +#define do_trapsignal(l, signo, code, addr, trap) \ + do_trapsignal1(__func__, __LINE__, tf, l, signo, code, addr, trap) +#else +#define do_trapsignal(l, signo, code, addr, trap) \ + do_trapsignal1(l, signo, code, addr, trap) +#endif - KSI_INIT_TRAP(&ksi); - ksi.ksi_signo = signo; - ksi.ksi_code = code; - ksi.ksi_addr = addr; - ksi.ksi_trap = trap; - (*l->l_proc->p_emul->e_trapsignal)(l, &ksi); -} +void do_trapsignal1( +#ifdef TRAP_SIGDEBUG + const char *func, size_t line, struct trapframe *tf, +#endif + struct lwp *l, int signo, int code, void *addr, int trap); + +const char *eclass_trapname(uint32_t); #include <sys/pcu.h>