linux/arch/i386/mm/init.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/i386/mm/init.c
   3 *
   4 *  Copyright (C) 1995  Linus Torvalds
   5 *
   6 *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/signal.h>
  11#include <linux/sched.h>
  12#include <linux/kernel.h>
  13#include <linux/errno.h>
  14#include <linux/string.h>
  15#include <linux/types.h>
  16#include <linux/ptrace.h>
  17#include <linux/mman.h>
  18#include <linux/mm.h>
  19#include <linux/hugetlb.h>
  20#include <linux/swap.h>
  21#include <linux/smp.h>
  22#include <linux/init.h>
  23#include <linux/highmem.h>
  24#include <linux/pagemap.h>
  25#include <linux/poison.h>
  26#include <linux/bootmem.h>
  27#include <linux/slab.h>
  28#include <linux/proc_fs.h>
  29#include <linux/efi.h>
  30#include <linux/memory_hotplug.h>
  31#include <linux/initrd.h>
  32#include <linux/cpumask.h>
  33
  34#include <asm/processor.h>
  35#include <asm/system.h>
  36#include <asm/uaccess.h>
  37#include <asm/pgtable.h>
  38#include <asm/dma.h>
  39#include <asm/fixmap.h>
  40#include <asm/e820.h>
  41#include <asm/apic.h>
  42#include <asm/tlb.h>
  43#include <asm/tlbflush.h>
  44#include <asm/sections.h>
  45
  46unsigned int __VMALLOC_RESERVE = 128 << 20;
  47
  48DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
  49unsigned long highstart_pfn, highend_pfn;
  50
  51static int noinline do_test_wp_bit(void);
  52
  53/*
  54 * Creates a middle page table and puts a pointer to it in the
  55 * given global directory entry. This only returns the gd entry
  56 * in non-PAE compilation mode, since the middle layer is folded.
  57 */
  58static pmd_t * __init one_md_table_init(pgd_t *pgd)
  59{
  60        pud_t *pud;
  61        pmd_t *pmd_table;
  62                
  63#ifdef CONFIG_X86_PAE
  64        pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
  65        set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
  66        pud = pud_offset(pgd, 0);
  67        if (pmd_table != pmd_offset(pud, 0)) 
  68                BUG();
  69#else
  70        pud = pud_offset(pgd, 0);
  71        pmd_table = pmd_offset(pud, 0);
  72#endif
  73
  74        return pmd_table;
  75}
  76
  77/*
  78 * Create a page table and place a pointer to it in a middle page
  79 * directory entry.
  80 */
  81static pte_t * __init one_page_table_init(pmd_t *pmd)
  82{
  83        if (pmd_none(*pmd)) {
  84                pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
  85                set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
  86                if (page_table != pte_offset_kernel(pmd, 0))
  87                        BUG();  
  88
  89                return page_table;
  90        }
  91        
  92        return pte_offset_kernel(pmd, 0);
  93}
  94
  95/*
  96 * This function initializes a certain range of kernel virtual memory 
  97 * with new bootmem page tables, everywhere page tables are missing in
  98 * the given range.
  99 */
 100
 101/*
 102 * NOTE: The pagetables are allocated contiguous on the physical space 
 103 * so we can cache the place of the first one and move around without 
 104 * checking the pgd every time.
 105 */
 106static void __init page_table_range_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
 107{
 108        pgd_t *pgd;
 109        pud_t *pud;
 110        pmd_t *pmd;
 111        int pgd_idx, pmd_idx;
 112        unsigned long vaddr;
 113
 114        vaddr = start;
 115        pgd_idx = pgd_index(vaddr);
 116        pmd_idx = pmd_index(vaddr);
 117        pgd = pgd_base + pgd_idx;
 118
 119        for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) {
 120                if (pgd_none(*pgd)) 
 121                        one_md_table_init(pgd);
 122                pud = pud_offset(pgd, vaddr);
 123                pmd = pmd_offset(pud, vaddr);
 124                for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) {
 125                        if (pmd_none(*pmd)) 
 126                                one_page_table_init(pmd);
 127
 128                        vaddr += PMD_SIZE;
 129                }
 130                pmd_idx = 0;
 131        }
 132}
 133
 134static inline int is_kernel_text(unsigned long addr)
 135{
 136        if (addr >= PAGE_OFFSET && addr <= (unsigned long)__init_end)
 137                return 1;
 138        return 0;
 139}
 140
 141/*
 142 * This maps the physical memory to kernel virtual address space, a total 
 143 * of max_low_pfn pages, by creating page tables starting from address 
 144 * PAGE_OFFSET.
 145 */
 146static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
 147{
 148        unsigned long pfn;
 149        pgd_t *pgd;
 150        pmd_t *pmd;
 151        pte_t *pte;
 152        int pgd_idx, pmd_idx, pte_ofs;
 153
 154        pgd_idx = pgd_index(PAGE_OFFSET);
 155        pgd = pgd_base + pgd_idx;
 156        pfn = 0;
 157
 158        for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) {
 159                pmd = one_md_table_init(pgd);
 160                if (pfn >= max_low_pfn)
 161                        continue;
 162                for (pmd_idx = 0; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++) {
 163                        unsigned int address = pfn * PAGE_SIZE + PAGE_OFFSET;
 164
 165                        /* Map with big pages if possible, otherwise create normal page tables. */
 166                        if (cpu_has_pse) {
 167                                unsigned int address2 = (pfn + PTRS_PER_PTE - 1) * PAGE_SIZE + PAGE_OFFSET + PAGE_SIZE-1;
 168
 169                                if (is_kernel_text(address) || is_kernel_text(address2))
 170                                        set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE_EXEC));
 171                                else
 172                                        set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
 173                                pfn += PTRS_PER_PTE;
 174                        } else {
 175                                pte = one_page_table_init(pmd);
 176
 177                                for (pte_ofs = 0; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++) {
 178                                                if (is_kernel_text(address))
 179                                                        set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
 180                                                else
 181                                                        set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
 182                                }
 183                        }
 184                }
 185        }
 186}
 187
 188static inline int page_kills_ppro(unsigned long pagenr)
 189{
 190        if (pagenr >= 0x70000 && pagenr <= 0x7003F)
 191                return 1;
 192        return 0;
 193}
 194
 195int page_is_ram(unsigned long pagenr)
 196{
 197        int i;
 198        unsigned long addr, end;
 199
 200        if (efi_enabled) {
 201                efi_memory_desc_t *md;
 202                void *p;
 203
 204                for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
 205                        md = p;
 206                        if (!is_available_memory(md))
 207                                continue;
 208                        addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT;
 209                        end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT;
 210
 211                        if ((pagenr >= addr) && (pagenr < end))
 212                                return 1;
 213                }
 214                return 0;
 215        }
 216
 217        for (i = 0; i < e820.nr_map; i++) {
 218
 219                if (e820.map[i].type != E820_RAM)       /* not usable memory */
 220                        continue;
 221                /*
 222                 *      !!!FIXME!!! Some BIOSen report areas as RAM that
 223                 *      are not. Notably the 640->1Mb area. We need a sanity
 224                 *      check here.
 225                 */
 226                addr = (e820.map[i].addr+PAGE_SIZE-1) >> PAGE_SHIFT;
 227                end = (e820.map[i].addr+e820.map[i].size) >> PAGE_SHIFT;
 228                if  ((pagenr >= addr) && (pagenr < end))
 229                        return 1;
 230        }
 231        return 0;
 232}
 233
 234#ifdef CONFIG_HIGHMEM
 235pte_t *kmap_pte;
 236pgprot_t kmap_prot;
 237
 238#define kmap_get_fixmap_pte(vaddr)                                      \
 239        pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), vaddr), (vaddr)), (vaddr))
 240
 241static void __init kmap_init(void)
 242{
 243        unsigned long kmap_vstart;
 244
 245        /* cache the first kmap pte */
 246        kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
 247        kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
 248
 249        kmap_prot = PAGE_KERNEL;
 250}
 251
 252static void __init permanent_kmaps_init(pgd_t *pgd_base)
 253{
 254        pgd_t *pgd;
 255        pud_t *pud;
 256        pmd_t *pmd;
 257        pte_t *pte;
 258        unsigned long vaddr;
 259
 260        vaddr = PKMAP_BASE;
 261        page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
 262
 263        pgd = swapper_pg_dir + pgd_index(vaddr);
 264        pud = pud_offset(pgd, vaddr);
 265        pmd = pmd_offset(pud, vaddr);
 266        pte = pte_offset_kernel(pmd, vaddr);
 267        pkmap_page_table = pte; 
 268}
 269
 270static void __meminit free_new_highpage(struct page *page)
 271{
 272        init_page_count(page);
 273        __free_page(page);
 274        totalhigh_pages++;
 275}
 276
 277void __init add_one_highpage_init(struct page *page, int pfn, int bad_ppro)
 278{
 279        if (page_is_ram(pfn) && !(bad_ppro && page_kills_ppro(pfn))) {
 280                ClearPageReserved(page);
 281                free_new_highpage(page);
 282        } else
 283                SetPageReserved(page);
 284}
 285
 286static int __meminit add_one_highpage_hotplug(struct page *page, unsigned long pfn)
 287{
 288        free_new_highpage(page);
 289        totalram_pages++;
 290#ifdef CONFIG_FLATMEM
 291        max_mapnr = max(pfn, max_mapnr);
 292#endif
 293        num_physpages++;
 294        return 0;
 295}
 296
 297/*
 298 * Not currently handling the NUMA case.
 299 * Assuming single node and all memory that
 300 * has been added dynamically that would be
 301 * onlined here is in HIGHMEM
 302 */
 303void __meminit online_page(struct page *page)
 304{
 305        ClearPageReserved(page);
 306        add_one_highpage_hotplug(page, page_to_pfn(page));
 307}
 308
 309
 310#ifdef CONFIG_NUMA
 311extern void set_highmem_pages_init(int);
 312#else
 313static void __init set_highmem_pages_init(int bad_ppro)
 314{
 315        int pfn;
 316        for (pfn = highstart_pfn; pfn < highend_pfn; pfn++)
 317                add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
 318        totalram_pages += totalhigh_pages;
 319}
 320#endif /* CONFIG_FLATMEM */
 321
 322#else
 323#define kmap_init() do { } while (0)
 324#define permanent_kmaps_init(pgd_base) do { } while (0)
 325#define set_highmem_pages_init(bad_ppro) do { } while (0)
 326#endif /* CONFIG_HIGHMEM */
 327
 328unsigned long long __PAGE_KERNEL = _PAGE_KERNEL;
 329EXPORT_SYMBOL(__PAGE_KERNEL);
 330unsigned long long __PAGE_KERNEL_EXEC = _PAGE_KERNEL_EXEC;
 331
 332#ifdef CONFIG_NUMA
 333extern void __init remap_numa_kva(void);
 334#else
 335#define remap_numa_kva() do {} while (0)
 336#endif
 337
 338static void __init pagetable_init (void)
 339{
 340        unsigned long vaddr;
 341        pgd_t *pgd_base = swapper_pg_dir;
 342
 343#ifdef CONFIG_X86_PAE
 344        int i;
 345        /* Init entries of the first-level page table to the zero page */
 346        for (i = 0; i < PTRS_PER_PGD; i++)
 347                set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
 348#endif
 349
 350        /* Enable PSE if available */
 351        if (cpu_has_pse) {
 352                set_in_cr4(X86_CR4_PSE);
 353        }
 354
 355        /* Enable PGE if available */
 356        if (cpu_has_pge) {
 357                set_in_cr4(X86_CR4_PGE);
 358                __PAGE_KERNEL |= _PAGE_GLOBAL;
 359                __PAGE_KERNEL_EXEC |= _PAGE_GLOBAL;
 360        }
 361
 362        kernel_physical_mapping_init(pgd_base);
 363        remap_numa_kva();
 364
 365        /*
 366         * Fixed mappings, only the page table structure has to be
 367         * created - mappings will be set by set_fixmap():
 368         */
 369        vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
 370        page_table_range_init(vaddr, 0, pgd_base);
 371
 372        permanent_kmaps_init(pgd_base);
 373
 374#ifdef CONFIG_X86_PAE
 375        /*
 376         * Add low memory identity-mappings - SMP needs it when
 377         * starting up on an AP from real-mode. In the non-PAE
 378         * case we already have these mappings through head.S.
 379         * All user-space mappings are explicitly cleared after
 380         * SMP startup.
 381         */
 382        set_pgd(&pgd_base[0], pgd_base[USER_PTRS_PER_PGD]);
 383#endif
 384}
 385
 386#if defined(CONFIG_SOFTWARE_SUSPEND) || defined(CONFIG_ACPI_SLEEP)
 387/*
 388 * Swap suspend & friends need this for resume because things like the intel-agp
 389 * driver might have split up a kernel 4MB mapping.
 390 */
 391char __nosavedata swsusp_pg_dir[PAGE_SIZE]
 392        __attribute__ ((aligned (PAGE_SIZE)));
 393
 394static inline void save_pg_dir(void)
 395{
 396        memcpy(swsusp_pg_dir, swapper_pg_dir, PAGE_SIZE);
 397}
 398#else
 399static inline void save_pg_dir(void)
 400{
 401}
 402#endif
 403
 404void zap_low_mappings (void)
 405{
 406        int i;
 407
 408        save_pg_dir();
 409
 410        /*
 411         * Zap initial low-memory mappings.
 412         *
 413         * Note that "pgd_clear()" doesn't do it for
 414         * us, because pgd_clear() is a no-op on i386.
 415         */
 416        for (i = 0; i < USER_PTRS_PER_PGD; i++)
 417#ifdef CONFIG_X86_PAE
 418                set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page)));
 419#else
 420                set_pgd(swapper_pg_dir+i, __pgd(0));
 421#endif
 422        flush_tlb_all();
 423}
 424
 425static int disable_nx __initdata = 0;
 426u64 __supported_pte_mask __read_mostly = ~_PAGE_NX;
 427
 428/*
 429 * noexec = on|off
 430 *
 431 * Control non executable mappings.
 432 *
 433 * on      Enable
 434 * off     Disable
 435 */
 436static int __init noexec_setup(char *str)
 437{
 438        if (!str || !strcmp(str, "on")) {
 439                if (cpu_has_nx) {
 440                        __supported_pte_mask |= _PAGE_NX;
 441                        disable_nx = 0;
 442                }
 443        } else if (!strcmp(str,"off")) {
 444                disable_nx = 1;
 445                __supported_pte_mask &= ~_PAGE_NX;
 446        } else
 447                return -EINVAL;
 448
 449        return 0;
 450}
 451early_param("noexec", noexec_setup);
 452
 453int nx_enabled = 0;
 454#ifdef CONFIG_X86_PAE
 455
 456static void __init set_nx(void)
 457{
 458        unsigned int v[4], l, h;
 459
 460        if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) {
 461                cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]);
 462                if ((v[3] & (1 << 20)) && !disable_nx) {
 463                        rdmsr(MSR_EFER, l, h);
 464                        l |= EFER_NX;
 465                        wrmsr(MSR_EFER, l, h);
 466                        nx_enabled = 1;
 467                        __supported_pte_mask |= _PAGE_NX;
 468                }
 469        }
 470}
 471
 472/*
 473 * Enables/disables executability of a given kernel page and
 474 * returns the previous setting.
 475 */
 476int __init set_kernel_exec(unsigned long vaddr, int enable)
 477{
 478        pte_t *pte;
 479        int ret = 1;
 480
 481        if (!nx_enabled)
 482                goto out;
 483
 484        pte = lookup_address(vaddr);
 485        BUG_ON(!pte);
 486
 487        if (!pte_exec_kernel(*pte))
 488                ret = 0;
 489
 490        if (enable)
 491                pte->pte_high &= ~(1 << (_PAGE_BIT_NX - 32));
 492        else
 493                pte->pte_high |= 1 << (_PAGE_BIT_NX - 32);
 494        pte_update_defer(&init_mm, vaddr, pte);
 495        __flush_tlb_all();
 496out:
 497        return ret;
 498}
 499
 500#endif
 501
 502/*
 503 * paging_init() sets up the page tables - note that the first 8MB are
 504 * already mapped by head.S.
 505 *
 506 * This routines also unmaps the page at virtual kernel address 0, so
 507 * that we can trap those pesky NULL-reference errors in the kernel.
 508 */
 509void __init paging_init(void)
 510{
 511#ifdef CONFIG_X86_PAE
 512        set_nx();
 513        if (nx_enabled)
 514                printk("NX (Execute Disable) protection: active\n");
 515#endif
 516
 517        pagetable_init();
 518
 519        load_cr3(swapper_pg_dir);
 520
 521#ifdef CONFIG_X86_PAE
 522        /*
 523         * We will bail out later - printk doesn't work right now so
 524         * the user would just see a hanging kernel.
 525         */
 526        if (cpu_has_pae)
 527                set_in_cr4(X86_CR4_PAE);
 528#endif
 529        __flush_tlb_all();
 530
 531        kmap_init();
 532}
 533
 534/*
 535 * Test if the WP bit works in supervisor mode. It isn't supported on 386's
 536 * and also on some strange 486's (NexGen etc.). All 586+'s are OK. This
 537 * used to involve black magic jumps to work around some nasty CPU bugs,
 538 * but fortunately the switch to using exceptions got rid of all that.
 539 */
 540
 541static void __init test_wp_bit(void)
 542{
 543        printk("Checking if this processor honours the WP bit even in supervisor mode... ");
 544
 545        /* Any page-aligned address will do, the test is non-destructive */
 546        __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_READONLY);
 547        boot_cpu_data.wp_works_ok = do_test_wp_bit();
 548        clear_fixmap(FIX_WP_TEST);
 549
 550        if (!boot_cpu_data.wp_works_ok) {
 551                printk("No.\n");
 552#ifdef CONFIG_X86_WP_WORKS_OK
 553                panic("This kernel doesn't support CPU's with broken WP. Recompile it for a 386!");
 554#endif
 555        } else {
 556                printk("Ok.\n");
 557        }
 558}
 559
 560static struct kcore_list kcore_mem, kcore_vmalloc; 
 561
 562void __init mem_init(void)
 563{
 564        extern int ppro_with_ram_bug(void);
 565        int codesize, reservedpages, datasize, initsize;
 566        int tmp;
 567        int bad_ppro;
 568
 569#ifdef CONFIG_FLATMEM
 570        BUG_ON(!mem_map);
 571#endif
 572        
 573        bad_ppro = ppro_with_ram_bug();
 574
 575#ifdef CONFIG_HIGHMEM
 576        /* check that fixmap and pkmap do not overlap */
 577        if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) {
 578                printk(KERN_ERR "fixmap and kmap areas overlap - this will crash\n");
 579                printk(KERN_ERR "pkstart: %lxh pkend: %lxh fixstart %lxh\n",
 580                                PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE, FIXADDR_START);
 581                BUG();
 582        }
 583#endif
 584 
 585        /* this will put all low memory onto the freelists */
 586        totalram_pages += free_all_bootmem();
 587
 588        reservedpages = 0;
 589        for (tmp = 0; tmp < max_low_pfn; tmp++)
 590                /*
 591                 * Only count reserved RAM pages
 592                 */
 593                if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
 594                        reservedpages++;
 595
 596        set_highmem_pages_init(bad_ppro);
 597
 598        codesize =  (unsigned long) &_etext - (unsigned long) &_text;
 599        datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
 600        initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
 601
 602        kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); 
 603        kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, 
 604                   VMALLOC_END-VMALLOC_START);
 605
 606        printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n",
 607                (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
 608                num_physpages << (PAGE_SHIFT-10),
 609                codesize >> 10,
 610                reservedpages << (PAGE_SHIFT-10),
 611                datasize >> 10,
 612                initsize >> 10,
 613                (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
 614               );
 615
 616#if 1 /* double-sanity-check paranoia */
 617        printk("virtual kernel memory layout:\n"
 618               "    fixmap  : 0x%08lx - 0x%08lx   (%4ld kB)\n"
 619#ifdef CONFIG_HIGHMEM
 620               "    pkmap   : 0x%08lx - 0x%08lx   (%4ld kB)\n"
 621#endif
 622               "    vmalloc : 0x%08lx - 0x%08lx   (%4ld MB)\n"
 623               "    lowmem  : 0x%08lx - 0x%08lx   (%4ld MB)\n"
 624               "      .init : 0x%08lx - 0x%08lx   (%4ld kB)\n"
 625               "      .data : 0x%08lx - 0x%08lx   (%4ld kB)\n"
 626               "      .text : 0x%08lx - 0x%08lx   (%4ld kB)\n",
 627               FIXADDR_START, FIXADDR_TOP,
 628               (FIXADDR_TOP - FIXADDR_START) >> 10,
 629
 630#ifdef CONFIG_HIGHMEM
 631               PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE,
 632               (LAST_PKMAP*PAGE_SIZE) >> 10,
 633#endif
 634
 635               VMALLOC_START, VMALLOC_END,
 636               (VMALLOC_END - VMALLOC_START) >> 20,
 637
 638               (unsigned long)__va(0), (unsigned long)high_memory,
 639               ((unsigned long)high_memory - (unsigned long)__va(0)) >> 20,
 640
 641               (unsigned long)&__init_begin, (unsigned long)&__init_end,
 642               ((unsigned long)&__init_end - (unsigned long)&__init_begin) >> 10,
 643
 644               (unsigned long)&_etext, (unsigned long)&_edata,
 645               ((unsigned long)&_edata - (unsigned long)&_etext) >> 10,
 646
 647               (unsigned long)&_text, (unsigned long)&_etext,
 648               ((unsigned long)&_etext - (unsigned long)&_text) >> 10);
 649
 650#ifdef CONFIG_HIGHMEM
 651        BUG_ON(PKMAP_BASE+LAST_PKMAP*PAGE_SIZE > FIXADDR_START);
 652        BUG_ON(VMALLOC_END                     > PKMAP_BASE);
 653#endif
 654        BUG_ON(VMALLOC_START                   > VMALLOC_END);
 655        BUG_ON((unsigned long)high_memory      > VMALLOC_START);
 656#endif /* double-sanity-check paranoia */
 657
 658#ifdef CONFIG_X86_PAE
 659        if (!cpu_has_pae)
 660                panic("cannot execute a PAE-enabled kernel on a PAE-less CPU!");
 661#endif
 662        if (boot_cpu_data.wp_works_ok < 0)
 663                test_wp_bit();
 664
 665        /*
 666         * Subtle. SMP is doing it's boot stuff late (because it has to
 667         * fork idle threads) - but it also needs low mappings for the
 668         * protected-mode entry to work. We zap these entries only after
 669         * the WP-bit has been tested.
 670         */
 671#ifndef CONFIG_SMP
 672        zap_low_mappings();
 673#endif
 674}
 675
 676#ifdef CONFIG_MEMORY_HOTPLUG
 677int arch_add_memory(int nid, u64 start, u64 size)
 678{
 679        struct pglist_data *pgdata = NODE_DATA(nid);
 680        struct zone *zone = pgdata->node_zones + ZONE_HIGHMEM;
 681        unsigned long start_pfn = start >> PAGE_SHIFT;
 682        unsigned long nr_pages = size >> PAGE_SHIFT;
 683
 684        return __add_pages(zone, start_pfn, nr_pages);
 685}
 686
 687int remove_memory(u64 start, u64 size)
 688{
 689        return -EINVAL;
 690}
 691EXPORT_SYMBOL_GPL(remove_memory);
 692#endif
 693
 694struct kmem_cache *pgd_cache;
 695struct kmem_cache *pmd_cache;
 696
 697void __init pgtable_cache_init(void)
 698{
 699        if (PTRS_PER_PMD > 1) {
 700                pmd_cache = kmem_cache_create("pmd",
 701                                        PTRS_PER_PMD*sizeof(pmd_t),
 702                                        PTRS_PER_PMD*sizeof(pmd_t),
 703                                        0,
 704                                        pmd_ctor,
 705                                        NULL);
 706                if (!pmd_cache)
 707                        panic("pgtable_cache_init(): cannot create pmd cache");
 708        }
 709        pgd_cache = kmem_cache_create("pgd",
 710                                PTRS_PER_PGD*sizeof(pgd_t),
 711                                PTRS_PER_PGD*sizeof(pgd_t),
 712                                0,
 713                                pgd_ctor,
 714                                PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
 715        if (!pgd_cache)
 716                panic("pgtable_cache_init(): Cannot create pgd cache");
 717}
 718
 719/*
 720 * This function cannot be __init, since exceptions don't work in that
 721 * section.  Put this after the callers, so that it cannot be inlined.
 722 */
 723static int noinline do_test_wp_bit(void)
 724{
 725        char tmp_reg;
 726        int flag;
 727
 728        __asm__ __volatile__(
 729                "       movb %0,%1      \n"
 730                "1:     movb %1,%0      \n"
 731                "       xorl %2,%2      \n"
 732                "2:                     \n"
 733                ".section __ex_table,\"a\"\n"
 734                "       .align 4        \n"
 735                "       .long 1b,2b     \n"
 736                ".previous              \n"
 737                :"=m" (*(char *)fix_to_virt(FIX_WP_TEST)),
 738                 "=q" (tmp_reg),
 739                 "=r" (flag)
 740                :"2" (1)
 741                :"memory");
 742        
 743        return flag;
 744}
 745
 746#ifdef CONFIG_DEBUG_RODATA
 747
 748void mark_rodata_ro(void)
 749{
 750        unsigned long addr = (unsigned long)__start_rodata;
 751
 752        for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE)
 753                change_page_attr(virt_to_page(addr), 1, PAGE_KERNEL_RO);
 754
 755        printk("Write protecting the kernel read-only data: %uk\n",
 756                        (__end_rodata - __start_rodata) >> 10);
 757
 758        /*
 759         * change_page_attr() requires a global_flush_tlb() call after it.
 760         * We do this after the printk so that if something went wrong in the
 761         * change, the printk gets out at least to give a better debug hint
 762         * of who is the culprit.
 763         */
 764        global_flush_tlb();
 765}
 766#endif
 767
 768void free_init_pages(char *what, unsigned long begin, unsigned long end)
 769{
 770        unsigned long addr;
 771
 772        for (addr = begin; addr < end; addr += PAGE_SIZE) {
 773                ClearPageReserved(virt_to_page(addr));
 774                init_page_count(virt_to_page(addr));
 775                memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
 776                free_page(addr);
 777                totalram_pages++;
 778        }
 779        printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
 780}
 781
 782void free_initmem(void)
 783{
 784        free_init_pages("unused kernel memory",
 785                        (unsigned long)(&__init_begin),
 786                        (unsigned long)(&__init_end));
 787}
 788
 789#ifdef CONFIG_BLK_DEV_INITRD
 790void free_initrd_mem(unsigned long start, unsigned long end)
 791{
 792        free_init_pages("initrd memory", start, end);
 793}
 794#endif
 795
 796
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.