Module Name: src
Committed By: ryo
Date: Wed Jul 8 03:45:13 UTC 2020
Modified Files:
src/sys/arch/aarch64/aarch64: db_disasm.c fault.c kobj_machdep.c trap.c
src/sys/arch/aarch64/include: db_machdep.h machdep.h
Log Message:
Determination of A64,A32,T32 for disasm is now done in strrdisasm() instead of
the caller.
correctly disassemble by processor state if defined DEBUG_DUMP_ON_USERFAULT or
DEBUG_DDB_ON_USERFAULT.
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/aarch64/aarch64/db_disasm.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/aarch64/fault.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/aarch64/aarch64/kobj_machdep.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/aarch64/aarch64/trap.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/aarch64/include/db_machdep.h
cvs rdiff -u -r1.13 -r1.14 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/db_disasm.c
diff -u src/sys/arch/aarch64/aarch64/db_disasm.c:1.8 src/sys/arch/aarch64/aarch64/db_disasm.c:1.9
--- src/sys/arch/aarch64/aarch64/db_disasm.c:1.8 Wed Jul 8 03:44:10 2020
+++ src/sys/arch/aarch64/aarch64/db_disasm.c Wed Jul 8 03:45:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: db_disasm.c,v 1.8 2020/07/08 03:44:10 ryo Exp $ */
+/* $NetBSD: db_disasm.c,v 1.9 2020/07/08 03:45:13 ryo Exp $ */
/*
* Copyright (c) 2017 Ryo Shimizu <[email protected]>
@@ -27,7 +27,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.8 2020/07/08 03:44:10 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.9 2020/07/08 03:45:13 ryo Exp $");
+
+#ifdef _KERNEL_OPT
+#include "opt_compat_netbsd32.h"
+#endif
#include <sys/param.h>
#include <machine/db_machdep.h>
@@ -38,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: db_disasm.c,
#include <ddb/db_user.h>
#include <aarch64/cpufunc.h>
+#include <aarch64/machdep.h>
#include <arch/aarch64/aarch64/disasm.h>
static uint32_t
@@ -122,35 +127,36 @@ static const disasm_interface_t strdisas
};
const char *
-strdisasm(vaddr_t pc)
+strdisasm(vaddr_t pc, uint64_t spsr)
{
- char *p;
-
- strdisasm_ptr = strdisasm_buf;
- disasm(&strdisasm_interface, (db_addr_t)pc);
-
- /* replace tab to space, and chomp '\n' */
- for (p = strdisasm_buf; *p != '\0'; p++) {
- if (*p == '\t')
- *p = ' ';
+#ifdef COMPAT_NETBSD32
+ if (spsr & SPSR_A32) {
+ uint32_t insn = 0;
+ int size;
+ const char *arch = (spsr & SPSR_A32_T) ? "T32" : "A32";
+
+ size = fetch_arm_insn(pc, spsr, &insn);
+ if (size != 2)
+ size = 4;
+ snprintf(strdisasm_buf, sizeof(strdisasm_buf),
+ ".insn 0x%0*x (%s)", size * 2, insn, arch);
+ } else
+#endif /* COMPAT_NETBSD32 */
+ {
+ char *p;
+
+ /* disasm an aarch64 instruction */
+ strdisasm_ptr = strdisasm_buf;
+ disasm(&strdisasm_interface, (db_addr_t)pc);
+
+ /* replace tab to space, and chomp '\n' */
+ for (p = strdisasm_buf; *p != '\0'; p++) {
+ if (*p == '\t')
+ *p = ' ';
+ }
+ if ((p > strdisasm_buf) && (p[-1] == '\n'))
+ p[-1] = '\0';
}
- if ((p > strdisasm_buf) && (p[-1] == '\n'))
- p[-1] = '\0';
return strdisasm_buf;
}
-
-/*
- * disassemble aarch32 insns?
- */
-const char *
-strdisasm_aarch32(vaddr_t pc)
-{
- uint32_t insn = *(uint32_t *)pc;
-
- /* not supported any aarch32 insns yet... */
- snprintf(strdisasm_buf, sizeof(strdisasm_buf), ".insn 0x%08x", insn);
-
- return strdisasm_buf;
-}
-
Index: src/sys/arch/aarch64/aarch64/fault.c
diff -u src/sys/arch/aarch64/aarch64/fault.c:1.13 src/sys/arch/aarch64/aarch64/fault.c:1.14
--- src/sys/arch/aarch64/aarch64/fault.c:1.13 Wed May 13 06:08:51 2020
+++ src/sys/arch/aarch64/aarch64/fault.c Wed Jul 8 03:45:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fault.c,v 1.13 2020/05/13 06:08:51 ryo Exp $ */
+/* $NetBSD: fault.c,v 1.14 2020/07/08 03:45:13 ryo Exp $ */
/*
* Copyright (c) 2017 Ryo Shimizu <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.13 2020/05/13 06:08:51 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.14 2020/07/08 03:45:13 ryo Exp $");
#include "opt_compat_netbsd32.h"
#include "opt_ddb.h"
@@ -333,15 +333,14 @@ data_abort_handler(struct trapframe *tf,
/* 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
+ else {
/* ...and disassemble the instruction */
len += snprintf(panicinfo + len, sizeof(panicinfo) - len,
- ": %s", strdisasm(tf->tf_pc));
-#endif
+ ": %s", strdisasm(tf->tf_pc, tf->tf_spsr));
}
+#endif
if (user) {
#if defined(DEBUG_DDB_ON_USERFAULT) && defined(DDB)
Index: src/sys/arch/aarch64/aarch64/kobj_machdep.c
diff -u src/sys/arch/aarch64/aarch64/kobj_machdep.c:1.3 src/sys/arch/aarch64/aarch64/kobj_machdep.c:1.4
--- src/sys/arch/aarch64/aarch64/kobj_machdep.c:1.3 Sun Dec 1 20:27:26 2019
+++ src/sys/arch/aarch64/aarch64/kobj_machdep.c Wed Jul 8 03:45:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kobj_machdep.c,v 1.3 2019/12/01 20:27:26 jmcneill Exp $ */
+/* $NetBSD: kobj_machdep.c,v 1.4 2020/07/08 03:45:13 ryo Exp $ */
/*
* Copyright (c) 2018 Ryo Shimizu <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.3 2019/12/01 20:27:26 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.4 2020/07/08 03:45:13 ryo Exp $");
#define ELFSIZE ARCH_ELFSIZE
@@ -184,7 +184,7 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
old = *where;
#ifdef DDB
snprintf(disasmbuf, sizeof(disasmbuf), "%08x %s",
- *insn, strdisasm((vaddr_t)insn));
+ *insn, strdisasm((vaddr_t)insn), 0);
#endif
#endif /* KOBJ_MACHDEP_DEBUG */
@@ -348,7 +348,7 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
#ifdef DDB
printf("%s: insn %s\n", __func__, disasmbuf);
printf("%s: -> %08x %s\n", __func__,
- *insn, strdisasm((vaddr_t)insn));
+ *insn, strdisasm((vaddr_t)insn, 0));
#endif
printf("\n");
#endif /* KOBJ_MACHDEP_DEBUG */
Index: src/sys/arch/aarch64/aarch64/trap.c
diff -u src/sys/arch/aarch64/aarch64/trap.c:1.30 src/sys/arch/aarch64/aarch64/trap.c:1.31
--- src/sys/arch/aarch64/aarch64/trap.c:1.30 Thu Jul 2 13:04:46 2020
+++ src/sys/arch/aarch64/aarch64/trap.c Wed Jul 8 03:45:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.30 2020/07/02 13:04:46 rin Exp $ */
+/* $NetBSD: trap.c,v 1.31 2020/07/08 03:45:13 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.30 2020/07/02 13:04:46 rin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.31 2020/07/08 03:45:13 ryo Exp $");
#include "opt_arm_intr_impl.h"
#include "opt_compat_netbsd32.h"
@@ -474,7 +474,7 @@ trap_el0_sync(struct trapframe *tf)
curlwp->l_proc->p_pid, curlwp->l_proc->p_comm,
l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1,
eclass_trapname(eclass), tf->tf_esr, tf->tf_pc,
- strdisasm(tf->tf_pc));
+ strdisasm(tf->tf_pc, tf->tf_spsr));
}
#endif
/* illegal or not implemented instruction */
@@ -518,16 +518,16 @@ interrupt(struct trapframe *tf)
*/
#define THUMB_32BIT(hi) (((hi) & 0xe000) == 0xe000 && ((hi) & 0x1800))
-static int
-fetch_arm_insn(struct trapframe *tf, uint32_t *insn)
+int
+fetch_arm_insn(uint64_t pc, uint64_t spsr, uint32_t *insn)
{
/* THUMB? */
- if (tf->tf_spsr & SPSR_A32_T) {
- uint16_t *pc = (uint16_t *)(tf->tf_pc & ~1UL); /* XXX */
+ if (spsr & SPSR_A32_T) {
+ uint16_t *p = (uint16_t *)(pc & ~1UL); /* XXX */
uint16_t hi, lo;
- if (ufetch_16(pc, &hi))
+ if (ufetch_16(p, &hi))
return -1;
if (!THUMB_32BIT(hi)) {
@@ -537,14 +537,14 @@ fetch_arm_insn(struct trapframe *tf, uin
}
/* 32-bit Thumb instruction */
- if (ufetch_16(pc + 1, &lo))
+ if (ufetch_16(p + 1, &lo))
return -1;
*insn = ((uint32_t)hi << 16) | lo;
return 4;
}
- if (ufetch_32((uint32_t *)tf->tf_pc, insn))
+ if (ufetch_32((uint32_t *)pc, insn))
return -1;
return 4;
@@ -557,7 +557,7 @@ emul_arm_insn(struct trapframe *tf)
uint32_t insn;
int insn_size;
- insn_size = fetch_arm_insn(tf, &insn);
+ insn_size = fetch_arm_insn(tf->tf_pc, tf->tf_spsr, &insn);
switch (insn_size) {
case 2:
@@ -707,7 +707,7 @@ unknown:
curlwp->l_proc->p_pid, curlwp->l_proc->p_comm,
l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1,
eclass_trapname(eclass), tf->tf_esr, tf->tf_pc,
- strdisasm_aarch32(tf->tf_pc));
+ strdisasm(tf->tf_pc, tf->tf_spsr));
}
#endif
/* illegal or not implemented instruction */
Index: src/sys/arch/aarch64/include/db_machdep.h
diff -u src/sys/arch/aarch64/include/db_machdep.h:1.9 src/sys/arch/aarch64/include/db_machdep.h:1.10
--- src/sys/arch/aarch64/include/db_machdep.h:1.9 Fri May 22 19:29:26 2020
+++ src/sys/arch/aarch64/include/db_machdep.h Wed Jul 8 03:45:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: db_machdep.h,v 1.9 2020/05/22 19:29:26 ryo Exp $ */
+/* $NetBSD: db_machdep.h,v 1.10 2020/07/08 03:45:13 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -203,8 +203,7 @@ db_addr_t db_branch_taken(db_expr_t, db_
#define DB_MACHINE_COMMANDS
void dump_trapframe(struct trapframe *, void (*)(const char *, ...));
void dump_switchframe(struct trapframe *, void (*)(const char *, ...));
-const char *strdisasm(vaddr_t);
-const char *strdisasm_aarch32(vaddr_t);
+const char *strdisasm(vaddr_t, uint64_t);
void db_machdep_init(void);
/* hardware breakpoint/watchpoint functions */
Index: src/sys/arch/aarch64/include/machdep.h
diff -u src/sys/arch/aarch64/include/machdep.h:1.13 src/sys/arch/aarch64/include/machdep.h:1.14
--- src/sys/arch/aarch64/include/machdep.h:1.13 Wed Jul 1 08:01:07 2020
+++ src/sys/arch/aarch64/include/machdep.h Wed Jul 8 03:45:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.h,v 1.13 2020/07/01 08:01:07 ryo Exp $ */
+/* $NetBSD: machdep.h,v 1.14 2020/07/08 03:45:13 ryo Exp $ */
/*
* Copyright (c) 2017 Ryo Shimizu <[email protected]>
@@ -93,6 +93,7 @@ void configure_cpu_traps(void);
void cpu_dosoftints(void);
void cpu_switchto_softint(struct lwp *, int);
void dosoftints(void);
+int fetch_arm_insn(uint64_t, uint64_t, uint32_t *);
void trap_doast(struct trapframe *);
void trap_el1t_sync(struct trapframe *);