Unverified Commit b19aa282 authored by Palmer Dabbelt's avatar Palmer Dabbelt
Browse files

Merge patch series "riscv: Dump faulting instructions in oops handler"

Björn Töpel <bjorn@kernel.org> says:

From: Björn Töpel <bjorn@rivosinc.com>

RISC-V does not dump faulting instructions in the oops handler. This
series adds "Code:" dumps to the oops output together with
scripts/decodecode support.

* b4-shazam-merge:
  scripts/decodecode: Add support for RISC-V
  riscv: Add instruction dump to RISC-V splats

Link: https://lore.kernel.org/r/20230119074738.708301-1-bjorn@kernel.org


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parents 91612cfb 00b24250
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -29,6 +29,27 @@ int show_unhandled_signals = 1;

static DEFINE_SPINLOCK(die_lock);

static void dump_kernel_instr(const char *loglvl, struct pt_regs *regs)
{
	char str[sizeof("0000 ") * 12 + 2 + 1], *p = str;
	const u16 *insns = (u16 *)instruction_pointer(regs);
	long bad;
	u16 val;
	int i;

	for (i = -10; i < 2; i++) {
		bad = get_kernel_nofault(val, &insns[i]);
		if (!bad) {
			p += sprintf(p, i == 0 ? "(%04hx) " : "%04hx ", val);
		} else {
			printk("%sCode: Unable to access instruction at 0x%px.\n",
			       loglvl, &insns[i]);
			return;
		}
	}
	printk("%sCode: %s\n", loglvl, str);
}

void die(struct pt_regs *regs, const char *str)
{
	static int die_counter;
@@ -44,8 +65,10 @@ void die(struct pt_regs *regs, const char *str)

	pr_emerg("%s [#%d]\n", str, ++die_counter);
	print_modules();
	if (regs)
	if (regs) {
		show_regs(regs);
		dump_kernel_instr(KERN_EMERG, regs);
	}

	cause = regs ? regs->cause : -1;
	ret = notify_die(DIE_OOPS, str, regs, 0, cause, SIGSEGV);
+11 −1
Original line number Diff line number Diff line
@@ -93,6 +93,11 @@ disas() {
		${CROSS_COMPILE}strip $t.o
	fi

	if [ "$ARCH" = "riscv" ]; then
		OBJDUMPFLAGS="-M no-aliases --section=.text -D"
		${CROSS_COMPILE}strip $t.o
	fi

	if [ $pc_sub -ne 0 ]; then
		if [ $PC ]; then
			adj_vma=$(( $PC - $pc_sub ))
@@ -126,8 +131,13 @@ get_substr_opcode_bytes_num()
	do
		substr+="$opc"

		opcode="$substr"
		if [ "$ARCH" = "riscv" ]; then
			opcode=$(echo $opcode | tr ' ' '\n' | tac | tr -d '\n')
		fi

		# return if opcode bytes do not match @opline anymore
		if ! echo $opline | grep -q "$substr";
		if ! echo $opline | grep -q "$opcode";
		then
			break
		fi