[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [patch] pae: tlbflush linear page table updates
> No, it's actually the changeset > 6056:a1f7e01b0990a378584e718e6d48eac38824fdb9 which broke it. And it isn't the mod_l3 update which broke PAE, it's the __not_mapped() removal. Applying the bits below reversed makes PAE boot again. Gerd diff -r 663f0fb1e444 -r a1f7e01b0990 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Tue Aug 9 09:34:06 2005 +++ b/xen/arch/x86/mm.c Tue Aug 9 10:42:51 2005 @@ -2902,42 +2887,13 @@ .cmpxchg8b_emulated = ptwr_emulated_cmpxchg8b }; -#if defined(__x86_64__) -/* - * Returns zero on if mapped, or -1 otherwise - */ -static int __not_mapped(l2_pgentry_t *pl2e) -{ - unsigned long page = read_cr3(); - - page &= PAGE_MASK; - page = ((unsigned long *) __va(page))[l4_table_offset((unsigned long)pl2e)]; - if ( !(page & _PAGE_PRESENT) ) - return -1; - - page &= PAGE_MASK; - page = ((unsigned long *) __va(page))[l3_table_offset((unsigned long)pl2e)]; - if ( !(page & _PAGE_PRESENT) ) - return -1; - - page &= PAGE_MASK; - page = ((unsigned long *) __va(page))[l2_table_offset((unsigned long)pl2e)]; - if ( !(page & _PAGE_PRESENT) ) - return -1; - - return 0; -} -#else -#define __not_mapped(p) (0) -#endif - /* Write page fault handler: check if guest is trying to modify a PTE. */ int ptwr_do_page_fault(struct domain *d, unsigned long addr) { unsigned long pfn; struct pfn_info *page; l1_pgentry_t pte; - l2_pgentry_t *pl2e; + l2_pgentry_t *pl2e, l2e; int which; unsigned long l2_idx; @@ -2984,10 +2940,7 @@ pl2e = &__linear_l2_table[l2_idx]; which = PTWR_PT_INACTIVE; - if ( unlikely(__not_mapped(pl2e)) ) - goto inactive; - - if ( (l2e_get_pfn(*pl2e)) == pfn ) + if ( (__get_user(l2e.l2, &pl2e->l2) == 0) && (l2e_get_pfn(l2e) == pfn) ) { /* * Check the PRESENT bit to set ACTIVE mode. @@ -2995,13 +2948,11 @@ * ACTIVE p.t. (it may be the same p.t. mapped at another virt addr). * The ptwr_flush call below will restore the PRESENT bit. */ - if ( likely(l2e_get_flags(*pl2e) & _PAGE_PRESENT) || + if ( likely(l2e_get_flags(l2e) & _PAGE_PRESENT) || (d->arch.ptwr[PTWR_PT_ACTIVE].l1va && (l2_idx == d->arch.ptwr[PTWR_PT_ACTIVE].l2_idx)) ) which = PTWR_PT_ACTIVE; } - - inactive: /* * If this is a multi-processor guest then ensure that the page is hooked _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |