svn commit: r296614 - in head/sys: conf riscv/conf riscv/htif riscv/include riscv/riscv

Ruslan Bukin br at FreeBSD.org
Thu Mar 10 15:51:45 UTC 2016


Author: br
Date: Thu Mar 10 15:51:43 2016
New Revision: 296614
URL: https://svnweb.freebsd.org/changeset/base/296614

Log:
  Add support for ddb(4).
  
  Sponsored by:	DARPA, AFRL
  Sponsored by:	HEIF5

Added:
  head/sys/riscv/include/riscv_opcode.h   (contents, props changed)
  head/sys/riscv/include/stack.h   (contents, props changed)
  head/sys/riscv/riscv/db_disasm.c   (contents, props changed)
  head/sys/riscv/riscv/db_interface.c   (contents, props changed)
  head/sys/riscv/riscv/db_trace.c   (contents, props changed)
  head/sys/riscv/riscv/unwind.c   (contents, props changed)
Modified:
  head/sys/conf/Makefile.riscv
  head/sys/conf/files.riscv
  head/sys/riscv/conf/GENERIC
  head/sys/riscv/htif/htif_console.c
  head/sys/riscv/include/db_machdep.h
  head/sys/riscv/include/riscvreg.h
  head/sys/riscv/riscv/stack_machdep.c
  head/sys/riscv/riscv/trap.c

Modified: head/sys/conf/Makefile.riscv
==============================================================================
--- head/sys/conf/Makefile.riscv	Thu Mar 10 14:18:14 2016	(r296613)
+++ head/sys/conf/Makefile.riscv	Thu Mar 10 15:51:43 2016	(r296614)
@@ -29,7 +29,7 @@ S=	../../..
 INCLUDES+= -I$S/contrib/libfdt
 
 .if !empty(DDB_ENABLED)
-CFLAGS += -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
+CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
 .endif
 
 %BEFORE_DEPEND

Modified: head/sys/conf/files.riscv
==============================================================================
--- head/sys/conf/files.riscv	Thu Mar 10 14:18:14 2016	(r296613)
+++ head/sys/conf/files.riscv	Thu Mar 10 15:51:43 2016	(r296614)
@@ -23,6 +23,9 @@ riscv/riscv/clock.c		standard
 riscv/riscv/copyinout.S		standard
 riscv/riscv/copystr.c		standard
 riscv/riscv/cpufunc_asm.S	standard
+riscv/riscv/db_disasm.c		optional	ddb
+riscv/riscv/db_interface.c	optional	ddb
+riscv/riscv/db_trace.c		optional	ddb
 riscv/riscv/devmap.c		standard
 riscv/riscv/dump_machdep.c	standard
 riscv/riscv/elf_machdep.c	standard
@@ -44,4 +47,5 @@ riscv/riscv/trap.c		standard
 riscv/riscv/timer.c		standard
 riscv/riscv/uio_machdep.c	standard
 riscv/riscv/uma_machdep.c	standard
+riscv/riscv/unwind.c		optional	ddb | kdtrace_hooks | stack
 riscv/riscv/vm_machdep.c	standard

Modified: head/sys/riscv/conf/GENERIC
==============================================================================
--- head/sys/riscv/conf/GENERIC	Thu Mar 10 14:18:14 2016	(r296613)
+++ head/sys/riscv/conf/GENERIC	Thu Mar 10 15:51:43 2016	(r296614)
@@ -79,10 +79,10 @@ options 	SMP
 # options 	ROOTDEVNAME=\"ufs:/dev/md0\"
 
 # Debugging support.  Always need this:
-# options 	KDB			# Enable kernel debugger support.
-# options 	KDB_TRACE		# Print a stack trace for a panic.
+options 	KDB			# Enable kernel debugger support.
+options 	KDB_TRACE		# Print a stack trace for a panic.
 # For full debugger support use (turn off in stable branch):
-# options 	DDB			# Support DDB.
+options 	DDB			# Support DDB.
 # options 	GDB			# Support remote GDB.
 options 	DEADLKRES		# Enable the deadlock resolver
 options 	INVARIANTS		# Enable calls of extra sanity checking

Modified: head/sys/riscv/htif/htif_console.c
==============================================================================
--- head/sys/riscv/htif/htif_console.c	Thu Mar 10 14:18:14 2016	(r296613)
+++ head/sys/riscv/htif/htif_console.c	Thu Mar 10 15:51:43 2016	(r296614)
@@ -267,10 +267,37 @@ riscv_cnungrab(struct consdev *cp)
 static int
 riscv_cngetc(struct consdev *cp)
 {
+#if defined(KDB)
+	uint64_t devcmd;
+	uint64_t entry;
+	uint64_t devid;
+#endif
 	uint8_t data;
 	int ch;
 
-	ch = htif_getc();
+	htif_getc();
+
+#if defined(KDB)
+	if (kdb_active) {
+		entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
+		while (entry) {
+			devid = HTIF_DEV_ID(entry);
+			devcmd = HTIF_DEV_CMD(entry);
+			data = HTIF_DEV_DATA(entry);
+
+			if (devid == CONSOLE_DEFAULT_ID && devcmd == 0) {
+				entry_last->data = data;
+				entry_last->used = 1;
+				entry_last = entry_last->next;
+			} else {
+				printf("Lost interrupt: devid %d\n",
+				    devid);
+			}
+
+			entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
+		}
+	}
+#endif
 
 	if (entry_served->used == 1) {
 		data = entry_served->data;

Modified: head/sys/riscv/include/db_machdep.h
==============================================================================
--- head/sys/riscv/include/db_machdep.h	Thu Mar 10 14:18:14 2016	(r296613)
+++ head/sys/riscv/include/db_machdep.h	Thu Mar 10 15:51:43 2016	(r296614)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2015 Ruslan Bukin <br at bsdpad.com>
+ * Copyright (c) 2015-2016 Ruslan Bukin <br at bsdpad.com>
  * All rights reserved.
  *
  * Portions of this software were developed by SRI International and the
@@ -41,7 +41,51 @@
 #include <machine/frame.h>
 #include <machine/trap.h>
 
+#define	T_BREAKPOINT	(EXCP_INSTR_BREAKPOINT)
+#define	T_WATCHPOINT	(0)
+
 typedef vm_offset_t	db_addr_t;
 typedef long		db_expr_t;
 
+#define	PC_REGS()	((db_addr_t)kdb_thrctx->pcb_sepc)
+
+#define	BKPT_INST	(0x00100073)
+#define	BKPT_SIZE	(INSN_SIZE)
+#define	BKPT_SET(inst)	(BKPT_INST)
+
+#define	BKPT_SKIP do {				\
+	kdb_frame->tf_sepc += BKPT_SIZE;	\
+} while (0)
+
+#define	db_clear_single_step	kdb_cpu_clear_singlestep
+#define	db_set_single_step	kdb_cpu_set_singlestep
+
+#define	IS_BREAKPOINT_TRAP(type, code)	(type == T_BREAKPOINT)
+#define	IS_WATCHPOINT_TRAP(type, code)	(type == T_WATCHPOINT)
+
+#define	inst_trap_return(ins)	(ins == 0x10000073)	/* eret */
+#define	inst_return(ins)	(ins == 0x00008067)	/* ret */
+#define	inst_call(ins)		(((ins) & 0x7f) == 111 || \
+				 ((ins) & 0x7f) == 103) /* jal, jalr */
+
+#define	inst_load(ins) ({							\
+	uint32_t tmp_instr = db_get_value(PC_REGS(), sizeof(uint32_t), FALSE);	\
+	is_load_instr(tmp_instr);						\
+})
+
+#define	inst_store(ins) ({							\
+	uint32_t tmp_instr = db_get_value(PC_REGS(), sizeof(uint32_t), FALSE);	\
+	is_store_instr(tmp_instr);						\
+})
+
+#define	is_load_instr(ins)	(((ins) & 0x7f) == 3)
+#define	is_store_instr(ins)	(((ins) & 0x7f) == 35)
+
+#define	next_instr_address(pc, bd)	((bd) ? (pc) : ((pc) + 4))
+
+#define	DB_SMALL_VALUE_MAX	(0x7fffffff)
+#define	DB_SMALL_VALUE_MIN	(-0x40001)
+
+#define	DB_ELFSIZE		64
+
 #endif /* !_MACHINE_DB_MACHDEP_H_ */

Added: head/sys/riscv/include/riscv_opcode.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/riscv/include/riscv_opcode.h	Thu Mar 10 15:51:43 2016	(r296614)
@@ -0,0 +1,116 @@
+/*-
+ * Copyright (c) 2016 Ruslan Bukin <br at bsdpad.com>
+ * All rights reserved.
+ *
+ * Portions of this software were developed by SRI International and the
+ * University of Cambridge Computer Laboratory under DARPA/AFRL contract
+ * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by the University of Cambridge
+ * Computer Laboratory as part of the CTSRD Project, with support from the
+ * UK Higher Education Innovation Fund (HEIF).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_RISCV_OPCODE_H_
+#define	_MACHINE_RISCV_OPCODE_H_
+
+/*
+ * Define the instruction formats and opcode values for the
+ * RISC-V instruction set.
+ */
+#include <machine/endian.h>
+
+/*
+ * Define the instruction formats.
+ */
+typedef union {
+	unsigned word;
+
+	struct {
+		unsigned opcode: 7;
+		unsigned rd: 5;
+		unsigned funct3: 3;
+		unsigned rs1: 5;
+		unsigned rs2: 5;
+		unsigned funct7: 7;
+	} RType;
+
+	struct {
+		unsigned opcode: 7;
+		unsigned rd: 5;
+		unsigned funct3: 3;
+		unsigned rs1: 5;
+		unsigned rs2: 6;
+		unsigned funct7: 6;
+	} R2Type;
+
+	struct {
+		unsigned opcode: 7;
+		unsigned rd: 5;
+		unsigned funct3: 3;
+		unsigned rs1: 5;
+		unsigned imm: 12;
+	} IType;
+
+	struct {
+		unsigned opcode: 7;
+		unsigned imm0_4: 5;
+		unsigned funct3: 3;
+		unsigned rs1: 5;
+		unsigned rs2: 5;
+		unsigned imm5_11: 7;
+	} SType;
+
+	struct {
+		unsigned opcode: 7;
+		unsigned imm11: 1;
+		unsigned imm1_4: 4;
+		unsigned funct3: 3;
+		unsigned rs1: 5;
+		unsigned rs2: 5;
+		unsigned imm5_10: 6;
+		unsigned imm12: 1;
+	} SBType;
+
+	struct {
+		unsigned opcode: 7;
+		unsigned rd: 5;
+		unsigned imm12_31: 20;
+	} UType;
+
+	struct {
+		unsigned opcode: 7;
+		unsigned rd: 5;
+		unsigned imm12_19: 8;
+		unsigned imm11: 1;
+		unsigned imm1_10: 10;
+		unsigned imm20: 1;
+	} UJType;
+} InstFmt;
+
+#define	RISCV_OPCODE(r)		(r & 0x7f)
+
+#endif /* !_MACHINE_RISCV_OPCODE_H_ */

Modified: head/sys/riscv/include/riscvreg.h
==============================================================================
--- head/sys/riscv/include/riscvreg.h	Thu Mar 10 14:18:14 2016	(r296613)
+++ head/sys/riscv/include/riscvreg.h	Thu Mar 10 15:51:43 2016	(r296614)
@@ -117,9 +117,10 @@
 #define	SIP_SSIP	(1 << 1)
 #define	SIP_STIP	(1 << 5)
 
-#define	NCSRS	4096
-#define	CSR_IPI	0x783
-#define	XLEN	8
+#define	NCSRS		4096
+#define	CSR_IPI		0x783
+#define	XLEN		8
+#define	INSN_SIZE	4
 
 #define	CSR_ZIMM(val)							\
 	(__builtin_constant_p(val) && ((u_long)(val) < 32))

Added: head/sys/riscv/include/stack.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/riscv/include/stack.h	Thu Mar 10 15:51:43 2016	(r296614)
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2016 Ruslan Bukin <br at bsdpad.com>
+ * All rights reserved.
+ *
+ * Portions of this software were developed by SRI International and the
+ * University of Cambridge Computer Laboratory under DARPA/AFRL contract
+ * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by the University of Cambridge
+ * Computer Laboratory as part of the CTSRD Project, with support from the
+ * UK Higher Education Innovation Fund (HEIF).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_STACK_H_
+#define	_MACHINE_STACK_H_
+
+#define	INKERNEL(va)	((va) >= VM_MIN_KERNEL_ADDRESS && \
+			 (va) <= VM_MAX_KERNEL_ADDRESS)
+
+struct unwind_state {
+	uint64_t fp;
+	uint64_t sp;
+	uint64_t pc;
+};
+
+int unwind_frame(struct unwind_state *);
+
+#endif /* !_MACHINE_STACK_H_ */

Added: head/sys/riscv/riscv/db_disasm.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/riscv/riscv/db_disasm.c	Thu Mar 10 15:51:43 2016	(r296614)
@@ -0,0 +1,475 @@
+/*-
+ * Copyright (c) 2016 Ruslan Bukin <br at bsdpad.com>
+ * All rights reserved.
+ *
+ * Portions of this software were developed by SRI International and the
+ * University of Cambridge Computer Laboratory under DARPA/AFRL contract
+ * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by the University of Cambridge
+ * Computer Laboratory as part of the CTSRD Project, with support from the
+ * UK Higher Education Innovation Fund (HEIF).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <ddb/ddb.h>
+#include <ddb/db_access.h>
+#include <ddb/db_sym.h>
+
+#include <machine/riscvreg.h>
+#include <machine/riscv_opcode.h>
+
+struct riscv_op {
+	char *name;
+	char *type;
+	char *fmt;
+	int opcode;
+	int funct3;
+	int funct7; /* Or imm, depending on type. */
+};
+
+/*
+ * Keep sorted by opcode, funct3, funct7 so some instructions
+ * aliases will be supported (e.g. "mv" instruction alias)
+ * Use same print format as binutils do.
+ */
+static struct riscv_op riscv_opcodes[] = {
+	{ "lb",		"I",	"d,o(s)",	3,   0, -1 },
+	{ "lh",		"I",	"d,o(s)",	3,   1, -1 },
+	{ "lw",		"I",	"d,o(s)",	3,   2, -1 },
+	{ "ld",		"I",	"d,o(s)",	3,   3, -1 },
+	{ "lbu",	"I",	"d,o(s)",	3,   4, -1 },
+	{ "lhu",	"I",	"d,o(s)",	3,   5, -1 },
+	{ "lwu",	"I",	"d,o(s)",	3,   6, -1 },
+	{ "ldu",	"I",	"d,o(s)",	3,   7, -1 },
+	{ "fence",	"I",	"",		15,  0, -1 },
+	{ "fence.i",	"I",	"",		15,  1, -1 },
+	{ "mv",		"I",	"d,s",		19,  0,  0 },
+	{ "addi",	"I",	"d,s,j",	19,  0, -1 },
+	{ "slli",	"R2",	"d,s,>",	19,  1,  0 },
+	{ "slti",	"I",	"d,s,j",	19,  2, -1 },
+	{ "sltiu",	"I",	"d,s,j",	19,  3, -1 },
+	{ "xori",	"I",	"d,s,j",	19,  4, -1 },
+	{ "srli",	"R2",	"d,s,>",	19,  5,  0 },
+	{ "srai",	"R2",	"d,s,>",	19,  5, 0b010000 },
+	{ "ori",	"I",	"d,s,j",	19,  6, -1 },
+	{ "andi",	"I",	"d,s,j",	19,  7, -1 },
+	{ "auipc",	"U",	"d,u",		23, -1, -1 },
+	{ "sext.w",	"I",	"d,s",		27,  0,  0 },
+	{ "addiw",	"I",	"d,s,j",	27,  0, -1 },
+	{ "slliw",	"R",	"d,s,<",	27,  1,  0 },
+	{ "srliw",	"R",	"d,s,<",	27,  5,  0 },
+	{ "sraiw",	"R",	"d,s,<",	27,  5, 0b0100000 },
+	{ "sb",		"S",	"t,q(s)",	35,  0, -1 },
+	{ "sh",		"S",	"t,q(s)",	35,  1, -1 },
+	{ "sw",		"S",	"t,q(s)",	35,  2, -1 },
+	{ "sd",		"S",	"t,q(s)",	35,  3, -1 },
+	{ "sbu",	"S",	"t,q(s)",	35,  4, -1 },
+	{ "shu",	"S",	"t,q(s)",	35,  5, -1 },
+	{ "swu",	"S",	"t,q(s)",	35,  6, -1 },
+	{ "sdu",	"S",	"t,q(s)",	35,  7, -1 },
+	{ "lr.w",	"R",	"d,t,0(s)",	47,  2, 0b0001000 },
+	{ "sc.w",	"R",	"d,t,0(s)",	47,  2, 0b0001100 },
+	{ "amoswap.w",	"R",	"d,t,0(s)",	47,  2, 0b0000100 },
+	{ "amoadd.w",	"R",	"d,t,0(s)",	47,  2, 0b0000000 },
+	{ "amoxor.w",	"R",	"d,t,0(s)",	47,  2, 0b0010000 },
+	{ "amoand.w",	"R",	"d,t,0(s)",	47,  2, 0b0110000 },
+	{ "amoor.w",	"R",	"d,t,0(s)",	47,  2, 0b0100000 },
+	{ "amomin.w",	"R",	"d,t,0(s)",	47,  2, 0b1000000 },
+	{ "amomax.w",	"R",	"d,t,0(s)",	47,  2, 0b1010000 },
+	{ "amominu.w",	"R",	"d,t,0(s)",	47,  2, 0b1100000 },
+	{ "amomaxu.w",	"R",	"d,t,0(s)",	47,  2, 0b1110000 },
+	{ "lr.w.aq",	"R",	"d,t,0(s)",	47,  2, 0b0001000 },
+	{ "sc.w.aq",	"R",	"d,t,0(s)",	47,  2, 0b0001100 },
+	{ "amoswap.w.aq","R",	"d,t,0(s)",	47,  2, 0b0000110 },
+	{ "amoadd.w.aq","R",	"d,t,0(s)",	47,  2, 0b0000010 },
+	{ "amoxor.w.aq","R",	"d,t,0(s)",	47,  2, 0b0010010 },
+	{ "amoand.w.aq","R",	"d,t,0(s)",	47,  2, 0b0110010 },
+	{ "amoor.w.aq",	"R",	"d,t,0(s)",	47,  2, 0b0100010 },
+	{ "amomin.w.aq","R",	"d,t,0(s)",	47,  2, 0b1000010 },
+	{ "amomax.w.aq","R",	"d,t,0(s)",	47,  2, 0b1010010 },
+	{ "amominu.w.aq","R",	"d,t,0(s)",	47,  2, 0b1100010 },
+	{ "amomaxu.w.aq","R",	"d,t,0(s)",	47,  2, 0b1110010 },
+	{ "amoswap.w.rl","R",	"d,t,0(s)",	47,  2, 0b0000110 },
+	{ "amoadd.w.rl","R",	"d,t,0(s)",	47,  2, 0b0000001 },
+	{ "amoxor.w.rl","R",	"d,t,0(s)",	47,  2, 0b0010001 },
+	{ "amoand.w.rl","R",	"d,t,0(s)",	47,  2, 0b0110001 },
+	{ "amoor.w.rl",	"R",	"d,t,0(s)",	47,  2, 0b0100001 },
+	{ "amomin.w.rl","R",	"d,t,0(s)",	47,  2, 0b1000001 },
+	{ "amomax.w.rl","R",	"d,t,0(s)",	47,  2, 0b1010001 },
+	{ "amominu.w.rl","R",	"d,t,0(s)",	47,  2, 0b1100001 },
+	{ "amomaxu.w.rl","R",	"d,t,0(s)",	47,  2, 0b1110001 },
+	{ "amoswap.d",	"R",	"d,t,0(s)",	47,  3, 0b0000100 },
+	{ "amoadd.d",	"R",	"d,t,0(s)",	47,  3, 0b0000000 },
+	{ "amoxor.d",	"R",	"d,t,0(s)",	47,  3, 0b0010000 },
+	{ "amoand.d",	"R",	"d,t,0(s)",	47,  3, 0b0110000 },
+	{ "amoor.d",	"R",	"d,t,0(s)",	47,  3, 0b0100000 },
+	{ "amomin.d",	"R",	"d,t,0(s)",	47,  3, 0b1000000 },
+	{ "amomax.d",	"R",	"d,t,0(s)",	47,  3, 0b1010000 },
+	{ "amominu.d",	"R",	"d,t,0(s)",	47,  3, 0b1100000 },
+	{ "amomaxu.d",	"R",	"d,t,0(s)",	47,  3, 0b1110000 },
+	{ "lr.d.aq",	"R",	"d,t,0(s)",	47,  3, 0b0001000 },
+	{ "sc.d.aq",	"R",	"d,t,0(s)",	47,  3, 0b0001100 },
+	{ "amoswap.d.aq","R",	"d,t,0(s)",	47,  3, 0b0000110 },
+	{ "amoadd.d.aq","R",	"d,t,0(s)",	47,  3, 0b0000010 },
+	{ "amoxor.d.aq","R",	"d,t,0(s)",	47,  3, 0b0010010 },
+	{ "amoand.d.aq","R",	"d,t,0(s)",	47,  3, 0b0110010 },
+	{ "amoor.d.aq",	"R",	"d,t,0(s)",	47,  3, 0b0100010 },
+	{ "amomin.d.aq","R",	"d,t,0(s)",	47,  3, 0b1000010 },
+	{ "amomax.d.aq","R",	"d,t,0(s)",	47,  3, 0b1010010 },
+	{ "amominu.d.aq","R",	"d,t,0(s)",	47,  3, 0b1100010 },
+	{ "amomaxu.d.aq","R",	"d,t,0(s)",	47,  3, 0b1110010 },
+	{ "amoswap.d.rl","R",	"d,t,0(s)",	47,  3, 0b0000110 },
+	{ "amoadd.d.rl","R",	"d,t,0(s)",	47,  3, 0b0000001 },
+	{ "amoxor.d.rl","R",	"d,t,0(s)",	47,  3, 0b0010001 },
+	{ "amoand.d.rl","R",	"d,t,0(s)",	47,  3, 0b0110001 },
+	{ "amoor.d.rl",	"R",	"d,t,0(s)",	47,  3, 0b0100001 },
+	{ "amomin.d.rl","R",	"d,t,0(s)",	47,  3, 0b1000001 },
+	{ "amomax.d.rl","R",	"d,t,0(s)",	47,  3, 0b1010001 },
+	{ "amominu.d.rl","R",	"d,t,0(s)",	47,  3, 0b1100001 },
+	{ "amomaxu.d.rl","R",	"d,t,0(s)",	47,  3, 0b1110001 },
+	{ "add",	"R",	"d,s,t",	51,  0,  0 },
+	{ "sub",	"R",	"d,s,t",	51,  0,  0b0100000 },
+	{ "mul",	"R",	"d,s,t",	51,  0,  0b0000001 },
+	{ "sll",	"R",	"d,s,t",	51,  1,  0 },
+	{ "slt",	"R",	"d,s,t",	51,  2,  0 },
+	{ "sltu",	"R",	"d,s,t",	51,  3,  0 },
+	{ "xor",	"R",	"d,s,t",	51,  4,  0 },
+	{ "srl",	"R",	"d,s,t",	51,  5,  0 },
+	{ "sra",	"R",	"d,s,t",	51,  5,  0b0100000 },
+	{ "or",		"R",	"d,s,t",	51,  6,  0 },
+	{ "and",	"R",	"d,s,t",	51,  7,  0 },
+	{ "lui",	"U",	"d,u",		55, -1, -1 },
+	{ "addw",	"R",	"d,s,t",	59,  0,  0 },
+	{ "subw",	"R",	"d,s,t",	59,  0,  0b0100000 },
+	{ "mulw",	"R",	"d,s,t",	59,  0,  1 },
+	{ "sllw",	"R",	"d,s,t",	59,  1,  0 },
+	{ "srlw",	"R",	"d,s,t",	59,  5,  0 },
+	{ "sraw",	"R",	"d,s,t",	59,  5,  0b0100000 },
+	{ "beq",	"SB",	"s,t,p",	99,  0,  -1 },
+	{ "bne",	"SB",	"s,t,p",	99,  1,  -1 },
+	{ "blt",	"SB",	"s,t,p",	99,  4,  -1 },
+	{ "bge",	"SB",	"s,t,p",	99,  5,  -1 },
+	{ "bltu",	"SB",	"s,t,p",	99,  6,  -1 },
+	{ "bgeu",	"SB",	"s,t,p",	99,  7,  -1 },
+	{ "jalr",	"I",	"d,s,j",	103,  0, -1 },
+	{ "jal",	"UJ",	"a",		111, -1, -1 },
+	{ "eret",	"I",	"",		115,  0, 0b000100000000 },
+	{ "sfence.vm",	"I",	"",		115,  0, 0b000100000001 },
+	{ "wfi",	"I",	"",		115,  0, 0b000100000010 },
+	{ "csrrw",	"I",	"d,E,s",	115,  1, -1},
+	{ "csrrs",	"I",	"d,E,s",	115,  2, -1},
+	{ "csrrc",	"I",	"d,E,s",	115,  3, -1},
+	{ "csrrwi",	"I",	"d,E,Z",	115,  5, -1},
+	{ "csrrsi",	"I",	"d,E,Z",	115,  6, -1},
+	{ "csrrci",	"I",	"d,E,Z",	115,  7, -1},
+	{ NULL, NULL, NULL, 0, 0, 0 }
+};
+
+struct csr_op {
+	char *name;
+	int imm;
+};
+
+static struct csr_op csr_name[] = {
+	{ "fflags",		0x001 },
+	{ "frm",		0x002 },
+	{ "fcsr",		0x003 },
+	{ "cycle",		0xc00 },
+	{ "time",		0xc01 },
+	{ "instret",		0xc02 },
+	{ "stats",		0x0c0 },
+	{ "uarch0",		0xcc0 },
+	{ "uarch1",		0xcc1 },
+	{ "uarch2",		0xcc2 },
+	{ "uarch3",		0xcc3 },
+	{ "uarch4",		0xcc4 },
+	{ "uarch5",		0xcc5 },
+	{ "uarch6",		0xcc6 },
+	{ "uarch7",		0xcc7 },
+	{ "uarch8",		0xcc8 },
+	{ "uarch9",		0xcc9 },
+	{ "uarch10",		0xcca },
+	{ "uarch11",		0xccb },
+	{ "uarch12",		0xccc },
+	{ "uarch13",		0xccd },
+	{ "uarch14",		0xcce },
+	{ "uarch15",		0xccf },
+	{ "sstatus",		0x100 },
+	{ "stvec",		0x101 },
+	{ "sie",		0x104 },
+	{ "sscratch",		0x140 },
+	{ "sepc",		0x141 },
+	{ "sip",		0x144 },
+	{ "sptbr",		0x180 },
+	{ "sasid",		0x181 },
+	{ "cyclew",		0x900 },
+	{ "timew",		0x901 },
+	{ "instretw",		0x902 },
+	{ "stime",		0xd01 },
+	{ "scause",		0xd42 },
+	{ "sbadaddr",		0xd43 },
+	{ "stimew",		0xa01 },
+	{ "mstatus",		0x300 },
+	{ "mtvec",		0x301 },
+	{ "mtdeleg",		0x302 },
+	{ "mie",		0x304 },
+	{ "mtimecmp",		0x321 },
+	{ "mscratch",		0x340 },
+	{ "mepc",		0x341 },
+	{ "mcause",		0x342 },
+	{ "mbadaddr",		0x343 },
+	{ "mip",		0x344 },
+	{ "mtime",		0x701 },
+	{ "mcpuid",		0xf00 },
+	{ "mimpid",		0xf01 },
+	{ "mhartid",		0xf10 },
+	{ "mtohost",		0x780 },
+	{ "mfromhost",		0x781 },
+	{ "mreset",		0x782 },
+	{ "send_ipi",		0x783 },
+	{ "miobase",		0x784 },
+	{ "cycleh",		0xc80 },
+	{ "timeh",		0xc81 },
+	{ "instreth",		0xc82 },
+	{ "cyclehw",		0x980 },
+	{ "timehw",		0x981 },
+	{ "instrethw",		0x982 },
+	{ "stimeh",		0xd81 },
+	{ "stimehw",		0xa81 },
+	{ "mtimecmph",		0x361 },
+	{ "mtimeh",		0x741 },
+	{ NULL,	0 }
+};
+
+static char *reg_name[32] = {
+	"zero",	"ra",	"sp",	"gp",	"tp",	"t0",	"t1",	"t2",
+	"s0",	"s1",	"a0",	"a1",	"a2",	"a3",	"a4",	"a5",
+	"a6",	"a7",	"s2",	"s3",	"s4",	"s5",	"s6",	"s7",
+	"s8",	"s9",	"s10",	"s11",	"t3",	"t4",	"t5",	"t6"
+};
+
+static int32_t
+get_imm(InstFmt i, char *type, uint32_t *val)
+{
+	int imm;
+
+	imm = 0;
+
+	if (strcmp(type, "I") == 0) {
+		imm = i.IType.imm;
+		*val = imm;
+		if (imm & (1 << 11))
+			imm |= (0xfffff << 12);	/* sign extend */
+
+	} else if (strcmp(type, "S") == 0) {
+		imm = i.SType.imm0_4;
+		imm |= (i.SType.imm5_11 << 5);
+		*val = imm;
+		if (imm & (1 << 11))
+			imm |= (0xfffff << 12);	/* sign extend */
+
+	} else if (strcmp(type, "U") == 0) {
+		imm = i.UType.imm12_31;
+		*val = imm;
+
+	} else if (strcmp(type, "UJ") == 0) {
+		imm = i.UJType.imm12_19 << 12;
+		imm |= i.UJType.imm11 << 11;
+		imm |= i.UJType.imm1_10 << 1;
+		imm |= i.UJType.imm20 << 20;
+		*val = imm;
+		if (imm & (1 << 20))
+			imm |= (0xfff << 21);	/* sign extend */
+
+	} else if (strcmp(type, "SB") == 0) {
+		imm = i.SBType.imm11 << 11;
+		imm |= i.SBType.imm1_4 << 1;
+		imm |= i.SBType.imm5_10 << 5;
+		imm |= i.SBType.imm12 << 12;
+		*val = imm;
+		if (imm & (1 << 12))
+			imm |= (0xfffff << 12);	/* sign extend */
+	}
+
+	return (imm);
+}
+
+static int
+oprint(struct riscv_op *op, vm_offset_t loc, int rd,
+    int rs1, int rs2, uint32_t val, vm_offset_t imm)
+{
+	char *p;
+	int i;
+
+	p = op->fmt;
+
+	db_printf("%s\t", op->name);
+
+	while (*p) {
+		if (strncmp("d", p, 1) == 0)
+			db_printf("%s", reg_name[rd]);
+
+		else if (strncmp("s", p, 1) == 0)
+			db_printf("%s", reg_name[rs1]);
+
+		else if (strncmp("t", p, 1) == 0)
+			db_printf("%s", reg_name[rs2]);
+
+		else if (strncmp(">", p, 1) == 0)
+			db_printf("0x%x", rs2);
+
+		else if (strncmp("E", p, 1) == 0) {
+			for (i = 0; csr_name[i].name != NULL; i++)
+				if (csr_name[i].imm == val)
+					db_printf("%s",
+					    csr_name[i].name);
+		} else if (strncmp("Z", p, 1) == 0)
+			db_printf("%d", rs1);
+
+		else if (strncmp("<", p, 1) == 0)
+			db_printf("0x%x", rs2);
+
+		else if (strncmp("j", p, 1) == 0)
+			db_printf("%d", imm);
+
+		else if (strncmp("u", p, 1) == 0)
+			db_printf("0x%x", imm);
+
+		else if (strncmp("a", p, 1) == 0)
+			db_printf("0x%016lx", imm);
+
+		else if (strncmp("p", p, 1) == 0)
+			db_printf("0x%016lx", (loc + imm));
+
+		else if (strlen(p) >= 4) {
+			if (strncmp("o(s)", p, 4) == 0)
+				db_printf("%d(%s)", imm, reg_name[rs1]);
+			else if (strncmp("q(s)", p, 4) == 0)
+				db_printf("%d(%s)", imm, reg_name[rs1]);
+			else if (strncmp("0(s)", p, 4) == 0)
+				db_printf("(%s)", reg_name[rs1]);
+		}
+
+		while (*p && strncmp(p, ",", 1) != 0)
+			p++;
+
+		if (*p) {
+			db_printf(", ");
+			p++;
+		}
+	}
+
+
+	return (0);
+}
+
+static int
+match_type(InstFmt i, struct riscv_op *op, vm_offset_t loc)
+{
+	uint32_t val;
+	int found;
+	int imm;
+
+	val = 0;
+	imm = get_imm(i, op->type, &val);
+
+	if (strcmp(op->type, "U") == 0) {
+		oprint(op, loc, i.UType.rd, 0, 0, val, imm);
+		return (1);
+	}
+	if (strcmp(op->type, "UJ") == 0) {
+		oprint(op, loc, 0, 0, 0, val, (loc + imm));
+		return (1);
+	}
+	if ((strcmp(op->type, "I") == 0) && \
+	    (op->funct3 == i.IType.funct3)) {
+		found = 0;
+		if (op->funct7 != -1) {
+			if (op->funct7 == i.IType.imm)
+				found = 1;
+		} else
+			found = 1;
+
+		if (found) {
+			oprint(op, loc, i.IType.rd,
+			    i.IType.rs1, 0, val, imm);
+			return (1);
+		}
+	}
+	if ((strcmp(op->type, "S") == 0) && \
+	    (op->funct3 == i.SType.funct3)) {
+		oprint(op, loc, 0, i.SType.rs1, i.SType.rs2,
+		    val, imm);
+		return (1);
+	}
+	if ((strcmp(op->type, "SB") == 0) && \
+	    (op->funct3 == i.SBType.funct3)) {
+		oprint(op, loc, 0, i.SBType.rs1, i.SBType.rs2,
+		    val, imm);
+		return (1);
+	}
+	if ((strcmp(op->type, "R2") == 0) && \
+	    (op->funct3 == i.R2Type.funct3) && \
+	    (op->funct7 == i.R2Type.funct7)) {
+		oprint(op, loc, i.R2Type.rd, i.R2Type.rs1,
+		    i.R2Type.rs2, val, imm);
+		return (1);
+	}
+	if ((strcmp(op->type, "R") == 0) && \
+	    (op->funct3 == i.RType.funct3) && \
+	    (op->funct7 == i.RType.funct7)) {
+		oprint(op, loc, i.RType.rd, i.RType.rs1,
+		    val, i.RType.rs2, imm);
+		return (1);
+	}
+
+	return (0);
+}
+
+vm_offset_t
+db_disasm(vm_offset_t loc, bool altfmt)
+{
+	struct riscv_op *op;
+	InstFmt i;
+	int j;
+
+	i.word = db_get_value(loc, INSN_SIZE, 0);
+
+	/* First match opcode */
+	for (j = 0; riscv_opcodes[j].name != NULL; j++) {
+		op = &riscv_opcodes[j];
+		if (op->opcode == i.RType.opcode) {
+			if (match_type(i, op, loc))
+				break;
+		}
+	}
+
+	db_printf("\n");
+	return(loc + INSN_SIZE);
+}

Added: head/sys/riscv/riscv/db_interface.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/riscv/riscv/db_interface.c	Thu Mar 10 15:51:43 2016	(r296614)
@@ -0,0 +1,163 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_map.h>
+
+#ifdef KDB
+#include <sys/kdb.h>
+#endif
+
+#include <ddb/ddb.h>
+#include <ddb/db_variables.h>
+
+#include <machine/cpu.h>
+#include <machine/pcb.h>
+#include <machine/stack.h>
+#include <machine/vmparam.h>
+
+static int
+db_frame(struct db_variable *vp, db_expr_t *valuep, int op)
+{
+	long *reg;
+
+	if (kdb_frame == NULL)
+		return (0);
+
+	reg = (long *)((uintptr_t)kdb_frame + (db_expr_t)vp->valuep);
+	if (op == DB_VAR_GET)
+		*valuep = *reg;
+	else
+		*reg = *valuep;
+	return (1);
+}
+
+#define DB_OFFSET(x)	(db_expr_t *)offsetof(struct trapframe, x)
+struct db_variable db_regs[] = {
+	{ "ra",		DB_OFFSET(tf_ra),	db_frame },
+	{ "sp",		DB_OFFSET(tf_sp),	db_frame },
+	{ "gp",		DB_OFFSET(tf_gp),	db_frame },
+	{ "tp",		DB_OFFSET(tf_tp),	db_frame },
+	{ "t0",		DB_OFFSET(tf_t[0]),	db_frame },
+	{ "t1",		DB_OFFSET(tf_t[1]),	db_frame },
+	{ "t2",		DB_OFFSET(tf_t[2]),	db_frame },
+	{ "t3",		DB_OFFSET(tf_t[3]),	db_frame },
+	{ "t4",		DB_OFFSET(tf_t[4]),	db_frame },
+	{ "t5",		DB_OFFSET(tf_t[5]),	db_frame },
+	{ "t6",		DB_OFFSET(tf_t[6]),	db_frame },
+	{ "s0",		DB_OFFSET(tf_s[0]),	db_frame },
+	{ "s1",		DB_OFFSET(tf_s[1]),	db_frame },
+	{ "s2",		DB_OFFSET(tf_s[2]),	db_frame },
+	{ "s3",		DB_OFFSET(tf_s[3]),	db_frame },
+	{ "s4",		DB_OFFSET(tf_s[4]),	db_frame },
+	{ "s5",		DB_OFFSET(tf_s[5]),	db_frame },
+	{ "s6",		DB_OFFSET(tf_s[6]),	db_frame },
+	{ "s7",		DB_OFFSET(tf_s[7]),	db_frame },
+	{ "s8",		DB_OFFSET(tf_s[8]),	db_frame },
+	{ "s9",		DB_OFFSET(tf_s[9]),	db_frame },
+	{ "s10",	DB_OFFSET(tf_s[10]),	db_frame },
+	{ "s11",	DB_OFFSET(tf_s[11]),	db_frame },
+	{ "a0",		DB_OFFSET(tf_a[0]),	db_frame },
+	{ "a1",		DB_OFFSET(tf_a[1]),	db_frame },
+	{ "a2",		DB_OFFSET(tf_a[2]),	db_frame },
+	{ "a3",		DB_OFFSET(tf_a[3]),	db_frame },
+	{ "a4",		DB_OFFSET(tf_a[4]),	db_frame },
+	{ "a5",		DB_OFFSET(tf_a[5]),	db_frame },
+	{ "a6",		DB_OFFSET(tf_a[6]),	db_frame },
+	{ "a7",		DB_OFFSET(tf_a[7]),	db_frame },
+	{ "sepc",	DB_OFFSET(tf_sepc),	db_frame },
+	{ "sstatus",	DB_OFFSET(tf_sstatus),	db_frame },
+	{ "sbadaddr",	DB_OFFSET(tf_sbadaddr),	db_frame },
+	{ "scause",	DB_OFFSET(tf_scause),	db_frame },
+};
+
+struct db_variable *db_eregs = db_regs + nitems(db_regs);
+
+void
+db_show_mdpcpu(struct pcpu *pc)
+{
+}
+
+/*
+ * Read bytes from kernel address space for debugger.
+ */
+int
+db_read_bytes(vm_offset_t addr, size_t size, char *data)
+{
+	jmp_buf jb;
+	void *prev_jb;
+	const char *src;
+	int ret;
+
+	prev_jb = kdb_jmpbuf(jb);
+	ret = setjmp(jb);
+
+	if (ret == 0) {
+		src = (const char *)addr;
+		while (size-- > 0)
+			*data++ = *src++;
+	}
+	(void)kdb_jmpbuf(prev_jb);
+
+	return (ret);
+}
+
+/*
+ * Write bytes to kernel address space for debugger.
+ */
+int
+db_write_bytes(vm_offset_t addr, size_t size, char *data)
+{
+	jmp_buf jb;
+	void *prev_jb;
+	char *dst;
+	int ret;
+
+	prev_jb = kdb_jmpbuf(jb);
+	ret = setjmp(jb);
+	if (ret == 0) {
+		dst = (char *)addr;
+		while (size-- > 0)
+			*dst++ = *data++;
+
+		fence();
+
+		/* Clean D-cache and invalidate I-cache */
+		cpu_dcache_wb_range(addr, (vm_size_t)size);
+		cpu_icache_sync_range(addr, (vm_size_t)size);
+	}
+	(void)kdb_jmpbuf(prev_jb);
+
+	return (ret);
+}

Added: head/sys/riscv/riscv/db_trace.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/riscv/riscv/db_trace.c	Thu Mar 10 15:51:43 2016	(r296614)
@@ -0,0 +1,135 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * Copyright (c) 2016 Ruslan Bukin <br at bsdpad.com>
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Portions of this software were developed by SRI International and the
+ * University of Cambridge Computer Laboratory under DARPA/AFRL contract
+ * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by the University of Cambridge
+ * Computer Laboratory as part of the CTSRD Project, with support from the
+ * UK Higher Education Innovation Fund (HEIF).
+ *
+ * Redistribution and use in source and binary forms, with or without

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-head mailing list