Module Name: src Committed By: ryo Date: Fri Jul 20 07:12:50 UTC 2018
Modified Files: src/sys/arch/aarch64/aarch64: fault.c Log Message: avoid double-fault caused by reading the instruction when panic To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/aarch64/aarch64/fault.c 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.4 src/sys/arch/aarch64/aarch64/fault.c:1.5 --- src/sys/arch/aarch64/aarch64/fault.c:1.4 Thu Jul 19 18:27:26 2018 +++ src/sys/arch/aarch64/aarch64/fault.c Fri Jul 20 07:12:50 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: fault.c,v 1.4 2018/07/19 18:27:26 christos Exp $ */ +/* $NetBSD: fault.c,v 1.5 2018/07/20 07:12:50 ryo 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.4 2018/07/19 18:27:26 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.5 2018/07/20 07:12:50 ryo Exp $"); #include "opt_ddb.h" #include "opt_uvmhist.h" @@ -327,14 +327,19 @@ data_abort_handler(struct trapframe *tf, len += snprintf(panicinfo + len, sizeof(panicinfo) - len, ": pc %016"PRIxREGISTER, tf->tf_pc); - len += snprintf(panicinfo + len, sizeof(panicinfo) - len, - ": opcode %08x", *(uint32_t *)tf->tf_pc); - + if (tf->tf_pc == tf->tf_far) { /* XXX? */ + /* fault address is pc. the causal instruction cannot be read */ + len += snprintf(panicinfo + len, sizeof(panicinfo) - len, + ": opcode unknown"); + } else { + len += snprintf(panicinfo + len, sizeof(panicinfo) - len, + ": opcode %08x", *(uint32_t *)tf->tf_pc); #ifdef DDB - /* ...and disassemble the instruction */ - len += snprintf(panicinfo + len, sizeof(panicinfo) - len, - ": %s", strdisasm(tf->tf_pc)); + /* ...and disassemble the instruction */ + len += snprintf(panicinfo + len, sizeof(panicinfo) - len, + ": %s", strdisasm(tf->tf_pc)); #endif + } if (user) { #if defined(DEBUG_DDB_ON_USERFAULT) && defined(DDB)