summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Gerst <bgerst@didntduck.org>2002-05-28 08:02:37 -0700
committerPatrick Mochel <mochel@osdl.org>2002-05-28 08:02:37 -0700
commitbbe302ee05888f0201ebc0cdd4a90e7ef081833f (patch)
treed6e587106aa91a6ff6224b635a10eedaf4330b04
parent131ca9c01cb0a5f92fba696172b383a732ec4999 (diff)
[PATCH] i386 mm init cleanup part 2
The remaining cleanups are to switch to using pfn instead of vaddr, and improve readability.
-rw-r--r--arch/i386/mm/init.c47
1 files changed, 14 insertions, 33 deletions
diff --git a/arch/i386/mm/init.c b/arch/i386/mm/init.c
index 8dab03ca7428..8ab6419b0c68 100644
--- a/arch/i386/mm/init.c
+++ b/arch/i386/mm/init.c
@@ -181,22 +181,16 @@ unsigned long __PAGE_KERNEL = _PAGE_KERNEL;
static void __init pagetable_init (void)
{
- unsigned long vaddr, end;
+ unsigned long vaddr, pfn;
pgd_t *pgd, *pgd_base;
int i, j, k;
pmd_t *pmd;
pte_t *pte, *pte_base;
- /*
- * This can be zero as well - no problem, in that case we exit
- * the loops anyway due to the PTRS_PER_* conditions.
- */
- end = (unsigned long)__va(max_low_pfn*PAGE_SIZE);
-
pgd_base = swapper_pg_dir;
#if CONFIG_X86_PAE
for (i = 0; i < PTRS_PER_PGD; i++)
- set_pgd(pgd_base + i, __pgd(1 + __pa(empty_zero_page)));
+ set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
#endif
if (cpu_has_pse) {
set_in_cr4(X86_CR4_PSE);
@@ -207,41 +201,28 @@ static void __init pagetable_init (void)
}
i = __pgd_offset(PAGE_OFFSET);
+ pfn = 0;
pgd = pgd_base + i;
- for (; i < PTRS_PER_PGD; pgd++, i++) {
- vaddr = i*PGDIR_SIZE;
- if (end && (vaddr >= end))
- break;
+ for (; i < PTRS_PER_PGD && pfn < max_low_pfn; pgd++, i++) {
#if CONFIG_X86_PAE
pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
- set_pgd(pgd, __pgd(__pa(pmd) + 0x1));
+ set_pgd(pgd, __pgd(__pa(pmd) | _PAGE_PRESENT));
#else
- pmd = (pmd_t *)pgd;
+ pmd = (pmd_t *) pgd;
#endif
- if (pmd != pmd_offset(pgd, 0))
- BUG();
- for (j = 0; j < PTRS_PER_PMD; pmd++, j++) {
- vaddr = i*PGDIR_SIZE + j*PMD_SIZE;
- if (end && (vaddr >= end))
- break;
+ for (j = 0; j < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, j++) {
if (cpu_has_pse) {
- set_pmd(pmd, pfn_pmd(__pa(vaddr) >> PAGE_SHIFT, PAGE_KERNEL_LARGE));
- continue;
- }
+ set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
+ pfn += PTRS_PER_PTE;
+ } else {
+ pte_base = pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
- pte_base = pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+ for (k = 0; k < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, k++)
+ set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
- for (k = 0; k < PTRS_PER_PTE; pte++, k++) {
- vaddr = i*PGDIR_SIZE + j*PMD_SIZE + k*PAGE_SIZE;
- if (end && (vaddr >= end))
- break;
- *pte = pfn_pte(__pa(vaddr) >> PAGE_SHIFT, PAGE_KERNEL);
+ set_pmd(pmd, __pmd(__pa(pte_base) | _KERNPG_TABLE));
}
- set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte_base)));
- if (pte_base != pte_offset_kernel(pmd, 0))
- BUG();
-
}
}