diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-04-01 10:39:31 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-04-01 10:39:31 +0100 |
commit | 76d1c06d0996af696fddddaeb04025426e0db5fe (patch) | |
tree | 131f069c5751206ce379fd931b3c8f3e3d7988d6 | |
parent | 17e838d026118840e044a1fd2799671fe02915e5 (diff) | |
download | xen-76d1c06d0996af696fddddaeb04025426e0db5fe.tar.gz xen-76d1c06d0996af696fddddaeb04025426e0db5fe.tar.bz2 xen-76d1c06d0996af696fddddaeb04025426e0db5fe.zip |
Minor minios traps.c fix for x86/64.
Signed-off-by: Aravindh Puthiyaparambil
<aravindh.puthiyaparambil@unisys.com>
-rw-r--r-- | extras/mini-os/traps.c | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/extras/mini-os/traps.c b/extras/mini-os/traps.c index 43d2dca40e..e11192040b 100644 --- a/extras/mini-os/traps.c +++ b/extras/mini-os/traps.c @@ -4,6 +4,7 @@ #include <hypervisor.h> #include <mm.h> #include <lib.h> +#include <sched.h> /* * These are assembler stubs in entry.S. @@ -31,6 +32,8 @@ void machine_check(void); void dump_regs(struct pt_regs *regs) { + printk("Thread: %s\n", current->name); +#ifdef __i386__ printk("EIP: %x, EFLAGS %x.\n", regs->eip, regs->eflags); printk("EBX: %08x ECX: %08x EDX: %08x\n", regs->ebx, regs->ecx, regs->edx); @@ -40,9 +43,22 @@ void dump_regs(struct pt_regs *regs) regs->xds, regs->xes, regs->orig_eax, regs->eip); printk("CS: %04x EFLAGS: %08x esp: %08x ss: %04x\n", regs->xcs, regs->eflags, regs->esp, regs->xss); - -} - +#else + printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip); + printk("\nRSP: %04lx:%016lx EFLAGS: %08lx\n", + regs->ss, regs->rsp, regs->eflags); + printk("RAX: %016lx RBX: %016lx RCX: %016lx\n", + regs->rax, regs->rbx, regs->rcx); + printk("RDX: %016lx RSI: %016lx RDI: %016lx\n", + regs->rdx, regs->rsi, regs->rdi); + printk("RBP: %016lx R08: %016lx R09: %016lx\n", + regs->rbp, regs->r8, regs->r9); + printk("R10: %016lx R11: %016lx R12: %016lx\n", + regs->r10, regs->r11, regs->r12); + printk("R13: %016lx R14: %016lx R15: %016lx\n", + regs->r13, regs->r14, regs->r15); +#endif +} static void do_trap(int trapnr, char *str, struct pt_regs * regs, unsigned long error_code) { @@ -110,36 +126,17 @@ void do_page_fault(struct pt_regs *regs, unsigned long error_code) printk("Page fault at linear address %p, regs %p, code %lx\n", addr, regs, error_code); dump_regs(regs); -#ifdef __x86_64__ - /* FIXME: _PAGE_PSE */ - { - unsigned long *tab = (unsigned long *)start_info.pt_base; - unsigned long page; - - printk("Pagetable walk from %p:\n", tab); - - page = tab[l4_table_offset(addr)]; - tab = to_virt(mfn_to_pfn(pte_to_mfn(page)) << PAGE_SHIFT); - printk(" L4 = %p (%p)\n", page, tab); - - page = tab[l3_table_offset(addr)]; - tab = to_virt(mfn_to_pfn(pte_to_mfn(page)) << PAGE_SHIFT); - printk(" L3 = %p (%p)\n", page, tab); - - page = tab[l2_table_offset(addr)]; - tab = to_virt(mfn_to_pfn(pte_to_mfn(page)) << PAGE_SHIFT); - printk(" L2 = %p (%p)\n", page, tab); - - page = tab[l1_table_offset(addr)]; - printk(" L1 = %p\n", page); - } -#endif + page_walk(addr); do_exit(); } void do_general_protection(struct pt_regs *regs, long error_code) { - printk("GPF %p, error_code=%lx\n", regs, error_code); +#ifdef __i386__ + printk("GPF eip: %p, error_code=%lx\n", regs->eip, error_code); +#else + printk("GPF rip: %p, error_code=%lx\n", regs->rip, error_code); +#endif dump_regs(regs); do_exit(); } |