TO RESET: unhandled_page_fault: show instruction address
Change-Id: I29a8d30d9b3e5cfbe5e16b1faaa253e794b8fc5b
This commit is contained in:
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
19
kernel/mem.c
19
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 */
|
||||
|
||||
Reference in New Issue
Block a user