diff -urpN pgcl-2.5.61-2/arch/i386/mm/init.c pgcl-2.5.61-3/arch/i386/mm/init.c --- pgcl-2.5.61-2/arch/i386/mm/init.c 2003-02-14 20:55:01.000000000 -0800 +++ pgcl-2.5.61-3/arch/i386/mm/init.c 2003-02-16 21:42:09.000000000 -0800 @@ -532,6 +532,8 @@ void pgd_ctor(void *, kmem_cache_t *, un void __init pgtable_cache_init(void) { + WARN_ON(!pgd_val(swapper_pg_dir[PTRS_PER_PGD-1])); + if (PTRS_PER_PMD > 1) { pmd_cache = kmem_cache_create("pae_pmd", PTRS_PER_PMD*sizeof(pmd_t), diff -urpN pgcl-2.5.61-2/arch/i386/mm/pgtable.c pgcl-2.5.61-3/arch/i386/mm/pgtable.c --- pgcl-2.5.61-2/arch/i386/mm/pgtable.c 2003-02-14 20:44:43.000000000 -0800 +++ pgcl-2.5.61-3/arch/i386/mm/pgtable.c 2003-02-17 03:30:48.000000000 -0800 @@ -175,13 +175,16 @@ extern kmem_cache_t *pgd_cache; void pmd_ctor(void *__pmd, kmem_cache_t *pmd_cache, unsigned long flags) { - clear_page(__pmd); + WARN_ON((unsigned long)__pmd & ~MMUPAGE_MASK); + memset(__pmd, 0, PTRS_PER_PMD*sizeof(pmd_t)); } void pgd_ctor(void *__pgd, kmem_cache_t *pgd_cache, unsigned long flags) { pgd_t *pgd = __pgd; + WARN_ON((unsigned long)pgd & ((PTRS_PER_PGD*sizeof(pgd_t)) - 1)); + if (PTRS_PER_PMD == 1) memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); memcpy(pgd + USER_PTRS_PER_PGD,