[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86: adjust reserved bit page fault handling
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1202133421 0 # Node ID 99b8ffe250888d0c3fe86b726edf18f620072045 # Parent 7e6a705e8ec521f538519ca62ca5b7b59b45c36f x86: adjust reserved bit page fault handling Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/arch/x86/traps.c | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-) diff -r 7e6a705e8ec5 -r 99b8ffe25088 xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Mon Feb 04 13:51:17 2008 +0000 +++ b/xen/arch/x86/traps.c Mon Feb 04 13:57:01 2008 +0000 @@ -823,6 +823,15 @@ asmlinkage void do_machine_check(struct machine_check_vector(regs, regs->error_code); } +static void reserved_bit_page_fault( + unsigned long addr, struct cpu_user_regs *regs) +{ + printk("d%d:v%d: reserved bit in page table (ec=%04X)\n", + current->domain->domain_id, current->vcpu_id, regs->error_code); + show_page_walk(addr); + show_execution_state(regs); +} + void propagate_page_fault(unsigned long addr, u16 error_code) { struct trap_info *ti; @@ -848,10 +857,13 @@ void propagate_page_fault(unsigned long tb->flags |= TBF_INTERRUPT; if ( unlikely(null_trap_bounce(v, tb)) ) { - printk("Unhandled page fault in domain %d on VCPU %d (ec=%04X)\n", + printk("d%d:v%d: unhandled page fault (ec=%04X)\n", v->domain->domain_id, v->vcpu_id, error_code); show_page_walk(addr); } + + if ( unlikely(error_code & PFEC_reserved_bit) ) + reserved_bit_page_fault(addr, guest_cpu_user_regs()); } static int handle_gdt_ldt_mapping_fault( @@ -1047,7 +1059,8 @@ static int fixup_page_fault(unsigned lon trace_trap_two_addr(TRC_PV_PAGING_FIXUP, regs->eip, addr); return ret; } - if ( (addr >= GDT_LDT_VIRT_START) && (addr < GDT_LDT_VIRT_END) ) + if ( !(regs->error_code & PFEC_reserved_bit) && + (addr >= GDT_LDT_VIRT_START) && (addr < GDT_LDT_VIRT_END) ) return handle_gdt_ldt_mapping_fault( addr - GDT_LDT_VIRT_START, regs); return 0; @@ -1057,7 +1070,8 @@ static int fixup_page_fault(unsigned lon guest_kernel_mode(v, regs) && /* Do not check if access-protection fault since the page may legitimately be not present in shadow page tables */ - ((regs->error_code & PFEC_write_access) == PFEC_write_access) && + ((regs->error_code & (PFEC_write_access|PFEC_reserved_bit)) == + PFEC_write_access) && ptwr_do_page_fault(v, addr, regs) ) return EXCRET_fault_fixed; @@ -1101,6 +1115,8 @@ asmlinkage void do_page_fault(struct cpu if ( likely((fixup = search_exception_table(regs->eip)) != 0) ) { perfc_incr(copy_user_faults); + if ( unlikely(regs->error_code & PFEC_reserved_bit) ) + reserved_bit_page_fault(addr, regs); regs->eip = fixup; return; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |