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: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
Palmer Dabbelt 2023-02-21 16:53:58 -08:00
commit b19aa282c5
No known key found for this signature in database
GPG Key ID: 2E1319F35FBB1889
2 changed files with 35 additions and 2 deletions

View File

@ -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);

View File

@ -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