Hello! With this patch GNU Mach will boot on Xen in a non-PAE configuration again. I can't check in a PAE configuration. Samuel, is this OK to be checked in?
Index: i386/intel/pmap.c
===================================================================
RCS file: /cvsroot/hurd/gnumach/i386/intel/pmap.c,v
retrieving revision 1.4.2.16.2.20
diff -u -p -r1.4.2.16.2.20 pmap.c
--- i386/intel/pmap.c 11 Nov 2008 02:46:32 -0000 1.4.2.16.2.20
+++ i386/intel/pmap.c 22 Nov 2008 21:33:12 -0000
@@ -793,6 +793,9 @@ void pmap_clear_bootstrap_pagetable(pt_e
void *pgt = (void*) ptoa(pfn);
if (pde & INTEL_PTE_VALID && pfn != -1)
hyp_free_page(atop(pgt), pgt);
+ else
+ /* Reached end of start of bootstrap
area */
+ break;
}
#if PAE
hyp_free_page(atop(dir), dir);
For reference, here is the old code vs. the new one:
Index: i386/intel/pmap.c
===================================================================
RCS file: /cvsroot/hurd/gnumach/i386/intel/pmap.c,v
retrieving revision 1.4.2.16.2.20
diff -u -p -r1.4.2.16.2.20 pmap.c
--- i386/intel/pmap.c 11 Nov 2008 02:46:32 -0000 1.4.2.16.2.20
+++ i386/intel/pmap.c 22 Nov 2008 21:32:51 -0000
@@ -789,10 +789,23 @@ void pmap_clear_bootstrap_pagetable(pt_e
#endif /* PAE */
for (i = 0; i < PAGE_SIZE / sizeof (pt_entry_t); i++) {
pt_entry_t pde = dir[i];
+#if 0 /* old */
+ unsigned long *ptable = (void*) (pde &
INTEL_PTE_PFN);
+ unsigned long pa = ma_to_pa(ptable);
+ if (pde & INTEL_PTE_VALID)
+ hyp_free_page(atop(pa), pa);
+ else
+ /* Reached end of start of bootstrap
area */
+ break;
+#elif 1 /* new */
unsigned long pfn = mfn_to_pfn(atop(pde));
void *pgt = (void*) ptoa(pfn);
if (pde & INTEL_PTE_VALID && pfn != -1)
hyp_free_page(atop(pgt), pgt);
+ else
+ /* Reached end of start of bootstrap
area */
+ break;
+#endif
}
#if PAE
hyp_free_page(atop(dir), dir);
Regards,
Thomas
signature.asc
Description: Digital signature
