Module Name: src
Committed By: skrll
Date: Mon Nov 25 22:04:15 UTC 2024
Modified Files:
src/sys/arch/riscv/include: db_machdep.h mutex.h
src/sys/arch/riscv/riscv: db_interface.c db_machdep.c db_trace.c trap.c
src/usr.sbin/crash: Makefile
Log Message:
risc-v: support crash(8)
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/riscv/include/db_machdep.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/riscv/include/mutex.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/riscv/riscv/db_interface.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/riscv/riscv/db_machdep.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/riscv/riscv/db_trace.c
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/riscv/riscv/trap.c
cvs rdiff -u -r1.52 -r1.53 src/usr.sbin/crash/Makefile
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/riscv/include/db_machdep.h
diff -u src/sys/arch/riscv/include/db_machdep.h:1.12 src/sys/arch/riscv/include/db_machdep.h:1.13
--- src/sys/arch/riscv/include/db_machdep.h:1.12 Sat Nov 23 11:37:43 2024
+++ src/sys/arch/riscv/include/db_machdep.h Mon Nov 25 22:04:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: db_machdep.h,v 1.12 2024/11/23 11:37:43 skrll Exp $ */
+/* $NetBSD: db_machdep.h,v 1.13 2024/11/25 22:04:14 skrll Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -34,6 +34,10 @@
#include <riscv/frame.h>
+#ifndef _KERNEL
+#include <stdbool.h>
+#endif /* _KERNEL */
+
#define DB_ELF_SYMBOLS
typedef vaddr_t db_addr_t; /* address - unsigned */
Index: src/sys/arch/riscv/include/mutex.h
diff -u src/sys/arch/riscv/include/mutex.h:1.6 src/sys/arch/riscv/include/mutex.h:1.7
--- src/sys/arch/riscv/include/mutex.h:1.6 Wed Jul 12 12:50:13 2023
+++ src/sys/arch/riscv/include/mutex.h Mon Nov 25 22:04:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: mutex.h,v 1.6 2023/07/12 12:50:13 riastradh Exp $ */
+/* $NetBSD: mutex.h,v 1.7 2024/11/25 22:04:14 skrll Exp $ */
/*-
* Copyright (c) 2002, 2007 The NetBSD Foundation, Inc.
@@ -52,6 +52,8 @@ struct kmutex {
volatile uintptr_t mtx_owner;
};
+#ifdef _KERNEL
+
#ifdef _LP64
#define MTX_ASMOP_SFX ".d" // doubleword atomic op
#else
@@ -113,6 +115,8 @@ riscv_mutex_spinbit_lock_unlock(kmutex_t
:: "r"(~MTX_LOCK), "r"(__mtx));
}
+#endif /* _KERNEL */
+
#if 0
#define __HAVE_MUTEX_STUBS 1
#define __HAVE_SPIN_MUTEX_STUBS 1
Index: src/sys/arch/riscv/riscv/db_interface.c
diff -u src/sys/arch/riscv/riscv/db_interface.c:1.5 src/sys/arch/riscv/riscv/db_interface.c:1.6
--- src/sys/arch/riscv/riscv/db_interface.c:1.5 Fri Dec 22 08:41:59 2023
+++ src/sys/arch/riscv/riscv/db_interface.c Mon Nov 25 22:04:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: db_interface.c,v 1.5 2023/12/22 08:41:59 skrll Exp $ */
+/* $NetBSD: db_interface.c,v 1.6 2024/11/25 22:04:14 skrll Exp $ */
/*
* Mach Operating System
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.5 2023/12/22 08:41:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.6 2024/11/25 22:04:14 skrll Exp $");
#ifdef _KERNEL_OPT
#include "opt_multiprocessor.h"
@@ -71,16 +71,38 @@ int db_active = 0;
#ifdef _KERNEL
db_regs_t ddb_regs;
-#endif
#ifdef MULTIPROCESSOR
static void db_mach_cpu_cmd(db_expr_t, bool, db_expr_t, const char *);
#endif
+static void db_mach_reset_cmd(db_expr_t, bool, db_expr_t, const char *);
void db_tlbdump_cmd(db_expr_t, bool, db_expr_t, const char *);
void db_kvtophys_cmd(db_expr_t, bool, db_expr_t, const char *);
paddr_t kvtophys(vaddr_t);
+#endif
+
+
+const struct db_command db_machine_command_table[] = {
+#ifdef _KERNEL
+#ifdef MULTIPROCESSOR
+ { DDB_ADD_CMD("cpu", db_mach_cpu_cmd, 0,
+ "switch to another cpu", "cpu#", NULL) },
+#endif
+ { DDB_ADD_CMD("kvtop", db_kvtophys_cmd, 0,
+ "Print the physical address for a given kernel virtual address",
+ "address",
+ " address:\tvirtual address to look up") },
+ { DDB_ADD_CMD("reset", db_mach_reset_cmd, CS_NOREPEAT,
+ "Initiate hardware reset",
+ NULL, NULL) },
+ { DDB_ADD_CMD("tlb", db_tlbdump_cmd, 0,
+ "Print out TLB entries. (only works with options DEBUG)",
+ NULL, NULL) },
+#endif
+ { DDB_END_CMD },
+};
#ifdef _KERNEL
@@ -174,24 +196,6 @@ db_mach_reset_cmd(db_expr_t addr, bool h
{
}
-
-const struct db_command db_machine_command_table[] = {
-#ifdef MULTIPROCESSOR
- { DDB_ADD_CMD("cpu", db_mach_cpu_cmd, 0,
- "switch to another cpu", "cpu#", NULL) },
-#endif
- { DDB_ADD_CMD("kvtop", db_kvtophys_cmd, 0,
- "Print the physical address for a given kernel virtual address",
- "address",
- " address:\tvirtual address to look up") },
- { DDB_ADD_CMD("reset", db_mach_reset_cmd, CS_NOREPEAT,
- "Initiate hardware reset",
- NULL, NULL) },
- { DDB_ADD_CMD("tlb", db_tlbdump_cmd, 0,
- "Print out TLB entries. (only works with options DEBUG)",
- NULL, NULL) },
- { DDB_END_CMD },
-};
#endif /* !KGDB */
#ifdef MULTIPROCESSOR
Index: src/sys/arch/riscv/riscv/db_machdep.c
diff -u src/sys/arch/riscv/riscv/db_machdep.c:1.13 src/sys/arch/riscv/riscv/db_machdep.c:1.14
--- src/sys/arch/riscv/riscv/db_machdep.c:1.13 Sat Nov 23 12:03:55 2024
+++ src/sys/arch/riscv/riscv/db_machdep.c Mon Nov 25 22:04:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: db_machdep.c,v 1.13 2024/11/23 12:03:55 skrll Exp $ */
+/* $NetBSD: db_machdep.c,v 1.14 2024/11/25 22:04:14 skrll Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,21 +31,27 @@
#include <sys/cdefs.h>
-__RCSID("$NetBSD: db_machdep.c,v 1.13 2024/11/23 12:03:55 skrll Exp $");
+__RCSID("$NetBSD: db_machdep.c,v 1.14 2024/11/25 22:04:14 skrll Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
+#include <sys/systm.h>
#include <riscv/insn.h>
#include <riscv/db_machdep.h>
+#include <ddb/db_user.h>
#include <ddb/db_access.h>
#include <ddb/db_interface.h>
#include <ddb/db_extern.h>
#include <ddb/db_variables.h>
#include <ddb/db_output.h>
+#ifndef _KERNEL
+#include <stddef.h>
+#endif
+
static int db_rw_ddbreg(const struct db_variable *, db_expr_t *, int);
const struct db_variable db_regs[] = {
@@ -90,7 +96,7 @@ const struct db_variable * const db_ereg
int
db_rw_ddbreg(const struct db_variable *vp, db_expr_t *valp, int rw)
{
- struct trapframe * const tf = curcpu()->ci_ddb_regs;
+ struct trapframe * const tf = &ddb_regs;
const uintptr_t addr = (uintptr_t)tf + (uintptr_t)vp->valuep;
if (vp->modif != NULL && vp->modif[0] == 'i') {
if (rw == DB_VAR_GET) {
@@ -179,7 +185,6 @@ branch_taken(uint32_t insn, db_addr_t pc
displacement |= i.type_j.j_imm11 << 11;
displacement |= i.type_j.j_imm10to1 << 1;
} else {
- KASSERT(OPCODE_P(insn, BRANCH));
register_t rs1 = get_reg_value(tf, i.type_b.b_rs1);
register_t rs2 = get_reg_value(tf, i.type_b.b_rs2);
bool branch_p; // = false;
Index: src/sys/arch/riscv/riscv/db_trace.c
diff -u src/sys/arch/riscv/riscv/db_trace.c:1.6 src/sys/arch/riscv/riscv/db_trace.c:1.7
--- src/sys/arch/riscv/riscv/db_trace.c:1.6 Sat Nov 23 11:37:43 2024
+++ src/sys/arch/riscv/riscv/db_trace.c Mon Nov 25 22:04:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: db_trace.c,v 1.6 2024/11/23 11:37:43 skrll Exp $ */
+/* $NetBSD: db_trace.c,v 1.7 2024/11/25 22:04:14 skrll Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,16 +31,19 @@
#include <sys/cdefs.h>
-__RCSID("$NetBSD: db_trace.c,v 1.6 2024/11/23 11:37:43 skrll Exp $");
+__RCSID("$NetBSD: db_trace.c,v 1.7 2024/11/25 22:04:14 skrll Exp $");
#include <sys/param.h>
+#include <sys/proc.h>
#include <sys/systm.h>
+#include <sys/types.h>
#include <riscv/db_machdep.h>
#include <uvm/uvm_extern.h>
+#include <ddb/db_user.h>
#include <ddb/db_access.h>
#include <ddb/db_command.h>
#include <ddb/db_output.h>
@@ -51,6 +54,10 @@ __RCSID("$NetBSD: db_trace.c,v 1.6 2024/
#include <ddb/db_extern.h>
#include <ddb/db_interface.h>
+#ifndef _KERNEL
+#include <stddef.h>
+#endif
+
#define MAXBACKTRACE 128 /* against infinite loop */
#define TRACEFLAG_LOOKUPLWP 0x00000001
@@ -122,7 +129,7 @@ void
db_stack_trace_print(db_expr_t addr, bool have_addr, db_expr_t count,
const char *modif, void (*pr)(const char *, ...) __printflike(1, 2))
{
- register_t ra, fp, lastra, lastfp;
+ vaddr_t ra, fp, lastra, lastfp;
struct trapframe *tf = NULL;
int flags = 0;
bool trace_user = false;
@@ -176,14 +183,14 @@ db_stack_trace_print(db_expr_t addr, boo
#endif
if (trace_thread) {
- proc_t *pp, p;
+ proc_t *pp;
if ((pp = db_proc_find((pid_t)addr)) == 0) {
(*pr)("trace: pid %d: not found\n", (int)addr);
return;
}
- db_read_bytes((db_addr_t)pp, sizeof(p), (char *)&p);
- addr = (db_addr_t)p.p_lwps.lh_first;
+ db_read_bytes((db_addr_t)pp + offsetof(proc_t, p_lwps.lh_first),
+ sizeof(addr), (char *)&addr);
trace_thread = false;
trace_lwp = true;
}
@@ -217,7 +224,7 @@ db_stack_trace_print(db_expr_t addr, boo
}
} else if (tf == NULL) {
fp = addr;
- pr("trace fp %016" PRIxREGISTER "\n", fp);
+ pr("trace fp %016" PRIxVADDR "\n", fp);
} else {
pr("trace tf %p\n", tf);
}
Index: src/sys/arch/riscv/riscv/trap.c
diff -u src/sys/arch/riscv/riscv/trap.c:1.29 src/sys/arch/riscv/riscv/trap.c:1.30
--- src/sys/arch/riscv/riscv/trap.c:1.29 Sat Nov 23 11:37:43 2024
+++ src/sys/arch/riscv/riscv/trap.c Mon Nov 25 22:04:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.29 2024/11/23 11:37:43 skrll Exp $ */
+/* $NetBSD: trap.c,v 1.30 2024/11/25 22:04:14 skrll Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -34,11 +34,12 @@
#define __PMAP_PRIVATE
#define __UFETCHSTORE_PRIVATE
-__RCSID("$NetBSD: trap.c,v 1.29 2024/11/23 11:37:43 skrll Exp $");
+__RCSID("$NetBSD: trap.c,v 1.30 2024/11/25 22:04:14 skrll Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
+#include <sys/cpu.h>
#include <sys/kauth.h>
#include <sys/signal.h>
#include <sys/signalvar.h>
Index: src/usr.sbin/crash/Makefile
diff -u src/usr.sbin/crash/Makefile:1.52 src/usr.sbin/crash/Makefile:1.53
--- src/usr.sbin/crash/Makefile:1.52 Tue Nov 19 18:15:29 2024
+++ src/usr.sbin/crash/Makefile Mon Nov 25 22:04:15 2024
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.52 2024/11/19 18:15:29 skrll Exp $
+# $NetBSD: Makefile,v 1.53 2024/11/25 22:04:15 skrll Exp $
PROG= crash
MAN= crash.8
@@ -17,6 +17,7 @@ DPADD+= ${LIBUTIL} ${LIBKVM} ${LIBEDIT}
${MACHINE_CPU} == "aarch64" \
|| ${MACHINE_CPU} == "arm" \
|| ${MACHINE_CPU} == "mips" \
+ || ${MACHINE_CPU} == "riscv" \
|| ${MACHINE_ARCH} == "alpha" \
|| ${MACHINE_ARCH} == "m68k" \
|| ${MACHINE_ARCH} == "powerpc" \
@@ -27,7 +28,9 @@ DPADD+= ${LIBUTIL} ${LIBKVM} ${LIBEDIT}
|| ${MACHINE} == "sparc" \
|| ${MACHINE} == "sparc64"
SRCS+= db_trace.c
-.if ${MACHINE_ARCH} == "alpha"
+.if \
+ ${MACHINE_ARCH} == "alpha" \
+ || ${MACHINE_CPU} == "riscv"
SRCS+= db_interface.c
.elif ${MACHINE_CPU} == "mips"
SRCS+= db_interface.c mips_stacktrace.c