|
|
|
|
|
|
|
|
|
|
xen-devel
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
|
<Prev in Thread] |
Current Thread |
[Next in Thread>
|
- [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Keir Fraser
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Keir Fraser
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Keir Fraser
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Keir Fraser
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates,
Gerd Knorr <=
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Keir Fraser
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Keir Fraser
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Gerd Knorr
- Re: [Xen-devel] [patch] pae: tlbflush linear page table updates, Keir Fraser
|
|
|
|
|