[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [MINIOS] Fix the pagefault handler to detect recursive faults.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID aab3cd33d2ba65340d355ffbfc859ef6e7b64df3 # Parent 3dca5b4add2be8b6da2052aeddffc497920b9ce1 [MINIOS] Fix the pagefault handler to detect recursive faults. Signed-off-by: Grzegorz Milos <gm281@xxxxxxxxx> --- extras/mini-os/console/console.c | 10 ++++++++-- extras/mini-os/traps.c | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff -r 3dca5b4add2b -r aab3cd33d2ba extras/mini-os/console/console.c --- a/extras/mini-os/console/console.c Tue May 16 14:07:56 2006 +0100 +++ b/extras/mini-os/console/console.c Tue May 16 16:34:27 2006 +0100 @@ -45,6 +45,10 @@ #include <xen/io/console.h> +/* Copies all print output to the Xen emergency console apart + of standard dom0 handled console */ +#define USE_XEN_CONSOLE + /* Low level functions defined in xencons_ring.c */ extern int xencons_ring_init(void); extern int xencons_ring_send(const char *data, unsigned len); @@ -117,7 +121,9 @@ void print(int direct, const char *fmt, (void)HYPERVISOR_console_io(CONSOLEIO_write, strlen(buf), buf); return; } else { - if(!console_initialised) +#ifndef USE_XEN_CONSOLE + if(!console_initialised) +#endif (void)HYPERVISOR_console_io(CONSOLEIO_write, strlen(buf), buf); console_print(buf, strlen(buf)); @@ -128,7 +134,7 @@ void printk(const char *fmt, ...) { va_list args; va_start(args, fmt); - print(1, fmt, args); + print(0, fmt, args); va_end(args); } diff -r 3dca5b4add2b -r aab3cd33d2ba extras/mini-os/traps.c --- a/extras/mini-os/traps.c Tue May 16 14:07:56 2006 +0100 +++ b/extras/mini-os/traps.c Tue May 16 16:34:27 2006 +0100 @@ -120,9 +120,21 @@ void page_walk(unsigned long virt_addres #define read_cr2() \ (HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].arch.cr2) +static int handling_pg_fault = 0; + void do_page_fault(struct pt_regs *regs, unsigned long error_code) { unsigned long addr = read_cr2(); + /* If we are already handling a page fault, and got another one + that means we faulted in pagetable walk. Continuing here would cause + a recursive fault */ + if(handling_pg_fault) + { + printk("Page fault in pagetable walk (access to invalid memory?).\n"); + do_exit(); + } + handling_pg_fault = 1; + #if defined(__x86_64__) printk("Page fault at linear address %p, rip %p, code %lx\n", addr, regs->rip, error_code); @@ -130,9 +142,12 @@ void do_page_fault(struct pt_regs *regs, printk("Page fault at linear address %p, eip %p, code %lx\n", addr, regs->eip, error_code); #endif + dump_regs(regs); page_walk(addr); do_exit(); + /* We should never get here ... but still */ + handling_pg_fault = 0; } void do_general_protection(struct pt_regs *regs, long error_code) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |