mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 05:33:09 +00:00
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:
commit
b19aa282c5
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user