diff --git a/arch/arm64/kernel/cpu.c b/arch/arm64/kernel/cpu.c index 05196d29..bb1767ee 100644 --- a/arch/arm64/kernel/cpu.c +++ b/arch/arm64/kernel/cpu.c @@ -1448,6 +1448,14 @@ void arch_print_stack(void) { } +#ifdef ENABLE_FUGAKU_HACKS +unsigned long arch_get_instruction_address(const void *reg) +{ + const struct pt_regs *regs = (struct pt_regs *)reg; + return regs->pc; +} +#endif + void arch_show_interrupt_context(const void *reg) { const struct pt_regs *regs = (struct pt_regs *)reg; diff --git a/arch/x86_64/kernel/cpu.c b/arch/x86_64/kernel/cpu.c index 1876652f..d3b3157b 100644 --- a/arch/x86_64/kernel/cpu.c +++ b/arch/x86_64/kernel/cpu.c @@ -1575,6 +1575,16 @@ void arch_print_stack(void) __print_stack(rbp, 0); } +#ifdef ENABLE_FUGAKU_HACKS +unsigned long arch_get_instruction_address(const void *reg) +{ + const struct x86_user_context *uctx = reg; + const struct x86_basic_regs *regs = &uctx->gpr; + + return regs->rip; +} +#endif + /*@ @ requires \valid(reg); @ assigns \nothing; diff --git a/kernel/mem.c b/kernel/mem.c index 7e0b83cc..a6241f6e 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -1289,6 +1289,9 @@ void tlb_flush_handler(int vector) } #endif // PROFILE_ENABLE } +#ifdef ENABLE_FUGAKU_HACKS +extern unsigned long arch_get_instruction_address(const void *reg); +#endif static void unhandled_page_fault(struct thread *thread, void *fault_addr, uint64_t reason, void *regs) @@ -1320,6 +1323,22 @@ static void unhandled_page_fault(struct thread *thread, void *fault_addr, __kprintf("address is out of range!\n"); } +#ifdef ENABLE_FUGAKU_HACKS + { + unsigned long pc = arch_get_instruction_address(regs); + range = lookup_process_memory_range(vm, pc, pc + 1); + if (range) { + __kprintf("PC: 0x%lx (%lx in %s)\n", + pc, + (range->memobj && range->memobj->flags & MF_REG_FILE) ? + pc - range->start + range->objoff : + pc - range->start, + (range->memobj && range->memobj->path) ? + range->memobj->path : "(unknown)"); + } + } +#endif + kprintf_unlock(irqflags); /* TODO */