]> err.no Git - linux-2.6/blobdiff - arch/x86/mm/init_32.c
x86: demacro asm-x86/pgalloc_32.h
[linux-2.6] / arch / x86 / mm / init_32.c
index c7d19471261dc7050244bd3f0f0883bdac8c3ccb..459b384acda9ea40282becd59ba9190fa31ef860 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/bootmem.h>
 #include <linux/slab.h>
 #include <linux/proc_fs.h>
-#include <linux/efi.h>
 #include <linux/memory_hotplug.h>
 #include <linux/initrd.h>
 #include <linux/cpumask.h>
@@ -42,6 +41,7 @@
 #include <asm/apic.h>
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
+#include <asm/pgalloc.h>
 #include <asm/sections.h>
 #include <asm/paravirt.h>
 
@@ -66,7 +66,7 @@ static pmd_t * __init one_md_table_init(pgd_t *pgd)
        if (!(pgd_val(*pgd) & _PAGE_PRESENT)) {
                pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
 
-               paravirt_alloc_pd(__pa(pmd_table) >> PAGE_SHIFT);
+               paravirt_alloc_pd(&init_mm, __pa(pmd_table) >> PAGE_SHIFT);
                set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
                pud = pud_offset(pgd, 0);
                if (pmd_table != pmd_offset(pud, 0))
@@ -165,16 +165,25 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
                pmd = one_md_table_init(pgd);
                if (pfn >= max_low_pfn)
                        continue;
-               for (pmd_idx = 0; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++) {
+               for (pmd_idx = 0;
+                    pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn;
+                    pmd++, pmd_idx++) {
                        unsigned int address = pfn * PAGE_SIZE + PAGE_OFFSET;
 
-                       /* Map with big pages if possible, otherwise create normal page tables. */
+                       /* Map with big pages if possible, otherwise
+                          create normal page tables. */
                        if (cpu_has_pse) {
-                               unsigned int address2 = (pfn + PTRS_PER_PTE - 1) * PAGE_SIZE + PAGE_OFFSET + PAGE_SIZE-1;
-                               if (is_kernel_text(address) || is_kernel_text(address2))
-                                       set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE_EXEC));
-                               else
-                                       set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
+                               unsigned int address2;
+                               pgprot_t prot = PAGE_KERNEL_LARGE;
+
+                               address2 = (pfn + PTRS_PER_PTE - 1) * PAGE_SIZE +
+                                       PAGE_OFFSET + PAGE_SIZE-1;
+
+                               if (is_kernel_text(address) ||
+                                   is_kernel_text(address2))
+                                       prot = PAGE_KERNEL_LARGE_EXEC;
+
+                               set_pmd(pmd, pfn_pmd(pfn, prot));
 
                                pfn += PTRS_PER_PTE;
                        } else {
@@ -183,10 +192,12 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
                                for (pte_ofs = 0;
                                     pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn;
                                     pte++, pfn++, pte_ofs++, address += PAGE_SIZE) {
+                                       pgprot_t prot = PAGE_KERNEL;
+
                                        if (is_kernel_text(address))
-                                               set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
-                                       else
-                                               set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
+                                               prot = PAGE_KERNEL_EXEC;
+
+                                       set_pte(pte, pfn_pte(pfn, prot));
                                }
                        }
                }
@@ -205,23 +216,6 @@ int page_is_ram(unsigned long pagenr)
        int i;
        unsigned long addr, end;
 
-       if (efi_enabled) {
-               efi_memory_desc_t *md;
-               void *p;
-
-               for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
-                       md = p;
-                       if (!is_available_memory(md))
-                               continue;
-                       addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT;
-                       end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT;
-
-                       if ((pagenr >= addr) && (pagenr < end))
-                               return 1;
-               }
-               return 0;
-       }
-
        for (i = 0; i < e820.nr_map; i++) {
 
                if (e820.map[i].type != E820_RAM)       /* not usable memory */
@@ -321,8 +315,13 @@ extern void set_highmem_pages_init(int);
 static void __init set_highmem_pages_init(int bad_ppro)
 {
        int pfn;
-       for (pfn = highstart_pfn; pfn < highend_pfn; pfn++)
-               add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
+       for (pfn = highstart_pfn; pfn < highend_pfn; pfn++) {
+               /*
+                * Holes under sparsemem might not have no mem_map[]:
+                */
+               if (pfn_valid(pfn))
+                       add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
+       }
        totalram_pages += totalhigh_pages;
 }
 #endif /* CONFIG_FLATMEM */
@@ -367,7 +366,7 @@ void __init native_pagetable_setup_start(pgd_t *base)
        memset(&base[USER_PTRS_PER_PGD], 0,
               KERNEL_PGD_PTRS * sizeof(pgd_t));
 #else
-       paravirt_alloc_pd(__pa(swapper_pg_dir) >> PAGE_SHIFT);
+       paravirt_alloc_pd(&init_mm, __pa(base) >> PAGE_SHIFT);
 #endif
 }
 
@@ -480,11 +479,12 @@ void zap_low_mappings (void)
 
 int nx_enabled = 0;
 
+pteval_t __supported_pte_mask __read_mostly = ~_PAGE_NX;
+EXPORT_SYMBOL_GPL(__supported_pte_mask);
+
 #ifdef CONFIG_X86_PAE
 
 static int disable_nx __initdata = 0;
-u64 __supported_pte_mask __read_mostly = ~_PAGE_NX;
-EXPORT_SYMBOL_GPL(__supported_pte_mask);
 
 /*
  * noexec = on|off