[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [XEN] Do not emulate user-mode updates to page tables.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Node ID 6e3223a6946142eab3fb14df8fde5c817c53a44b # Parent 8c29bf7ede67044bc8364e7a5c203b90281f6fd6 [XEN] Do not emulate user-mode updates to page tables. Instead use as a hint that the page is no longer a page table. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- xen/arch/x86/mm/shadow/multi.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff -r 8c29bf7ede67 -r 6e3223a69461 xen/arch/x86/mm/shadow/multi.c --- a/xen/arch/x86/mm/shadow/multi.c Thu Sep 21 19:34:45 2006 +0100 +++ b/xen/arch/x86/mm/shadow/multi.c Thu Sep 21 19:51:10 2006 +0100 @@ -3037,7 +3037,14 @@ static int sh_page_fault(struct vcpu *v, SHADOW_PRINTK("emulate: eip=%#lx\n", emul_regs.eip); v->arch.shadow.propagate_fault = 0; - if ( x86_emulate_memop(&emul_ctxt, &shadow_emulator_ops) ) + + /* + * We do not emulate user writes. Instead we use them as a hint that the + * page is no longer a page table. This behaviour differs from native, but + * it seems very unlikely that any OS grants user access to page tables. + */ + if ( (regs->error_code & PFEC_user_mode) || + x86_emulate_memop(&emul_ctxt, &shadow_emulator_ops) ) { SHADOW_PRINTK("emulator failure, unshadowing mfn %#lx\n", mfn_x(gmfn)); @@ -3050,11 +3057,10 @@ static int sh_page_fault(struct vcpu *v, * guest to loop on the same page fault. */ goto done; } + + /* Emulation triggered another page fault? */ if ( v->arch.shadow.propagate_fault ) - { - /* Emulation triggered another page fault */ goto not_a_shadow_fault; - } /* Emulator has changed the user registers: write back */ if ( hvm_guest(v) ) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |