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)
|
void arch_show_interrupt_context(const void *reg)
|
||||||
{
|
{
|
||||||
const struct pt_regs *regs = (struct pt_regs *)reg;
|
const struct pt_regs *regs = (struct pt_regs *)reg;
|
||||||
|
|||||||
@@ -1575,6 +1575,16 @@ void arch_print_stack(void)
|
|||||||
__print_stack(rbp, 0);
|
__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);
|
@ requires \valid(reg);
|
||||||
@ assigns \nothing;
|
@ assigns \nothing;
|
||||||
|
|||||||
19
kernel/mem.c
19
kernel/mem.c
@@ -1289,6 +1289,9 @@ void tlb_flush_handler(int vector)
|
|||||||
}
|
}
|
||||||
#endif // PROFILE_ENABLE
|
#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,
|
static void unhandled_page_fault(struct thread *thread, void *fault_addr,
|
||||||
uint64_t reason, void *regs)
|
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");
|
__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);
|
kprintf_unlock(irqflags);
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
|||||||
Reference in New Issue
Block a user