From fad73cacc1dc2a71b0d7b5d013286c218c709354 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Wed, 7 Dec 2016 11:32:02 +0900 Subject: [PATCH] x86: display call stack for IRQ 133 (for debug) --- arch/x86/kernel/cpu.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arch/x86/kernel/cpu.c b/arch/x86/kernel/cpu.c index da4e2e26..4eadf095 100644 --- a/arch/x86/kernel/cpu.c +++ b/arch/x86/kernel/cpu.c @@ -844,6 +844,25 @@ void set_signal(int sig, void *regs, struct siginfo *info); void check_signal(unsigned long, void *, int); extern void tlb_flush_handler(int vector); +void __show_stack(uintptr_t *sp) { + while (((uintptr_t)sp >= 0xffff800000000000) + && ((uintptr_t)sp < 0xffffffff80000000)) { + uintptr_t fp; + uintptr_t ip; + + fp = sp[0]; + ip = sp[1]; + kprintf("IP: %016lx, SP: %016lx, FP: %016lx\n", ip, (uintptr_t)sp, fp); + sp = (void *)fp; + } + return; +} + +void show_context_stack(uintptr_t *rbp) { + __show_stack(rbp); + return; +} + void handle_interrupt(int vector, struct x86_user_context *regs) { struct ihk_mc_interrupt_handler *h; @@ -952,6 +971,9 @@ void handle_interrupt(int vector, struct x86_user_context *regs) tlb_flush_handler(vector); } + else if (vector == 133) { + show_context_stack(regs->gpr.rbp); + } else { list_for_each_entry(h, &handlers[vector - 32], list) { if (h->func) {