| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | #include "common.h"#include "io.h"#include "sys.h"#include "console.h"#include "esp.h"#include "irq.h"/* Don't mark no_return or gcc moves it to SDRAM */static void __hot __text_hot killed(const char *how){    /* Cannot use con_printf() here */    const uint16_t *pcp;    size_t mtval;    size_t mepc;    size_t pc;    /* Try to move back to the previous instruction (wrong for jumps...) */    asm volatile("csrr %0,mepc" : "=r" (mepc));    pc = mepc-4 + (mepc & 1);    pcp = (const uint16_t *)pc;    con_puts(hotstr("ERROR: "));    con_puts(how);    con_puts(hotstr(" at 0x"));    con_print_hex(pc);    con_puts(hotstr(" (0x"));    con_print_hex((pcp[1] << 16) + pcp[0]);    con_puts(hotstr(")\nBad address: 0x"));    asm volatile("csrr %0,mtval" : "=r" (mtval));    con_print_hex(mtval);    con_putc('\n');    for (int i = 0; i < 32; i += 8) {	for (int j = 0; j < 8; j++) {	    uint32_t v = rdxreg(i+j);	    con_print_hex(v);	    con_putc((j == 7) ? '\n' : ' ');	}    }    con_flush();    udelay(5000000);    reset(SYS_RESET_SOFT);}IRQHANDLER(buserr,0){    killed(hotstr("misaligned"));}IRQHANDLER(ebreak,0){    killed(hotstr("invalid instruction"));}
 |