The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arch/score/mm/init.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * arch/score/mm/init.c
    3  *
    4  * Score Processor version.
    5  *
    6  * Copyright (C) 2009 Sunplus Core Technology Co., Ltd.
    7  *  Lennox Wu <lennox.wu@sunplusct.com>
    8  *  Chen Liqin <liqin.chen@sunplusct.com>
    9  *
   10  * This program is free software; you can redistribute it and/or modify
   11  * it under the terms of the GNU General Public License as published by
   12  * the Free Software Foundation; either version 2 of the License, or
   13  * (at your option) any later version.
   14  *
   15  * This program is distributed in the hope that it will be useful,
   16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18  * GNU General Public License for more details.
   19  *
   20  * You should have received a copy of the GNU General Public License
   21  * along with this program; if not, see the file COPYING, or write
   22  * to the Free Software Foundation, Inc.,
   23  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   24  */
   25 
   26 #include <linux/errno.h>
   27 #include <linux/bootmem.h>
   28 #include <linux/kernel.h>
   29 #include <linux/gfp.h>
   30 #include <linux/init.h>
   31 #include <linux/mm.h>
   32 #include <linux/mman.h>
   33 #include <linux/pagemap.h>
   34 #include <linux/proc_fs.h>
   35 #include <linux/sched.h>
   36 #include <linux/initrd.h>
   37 
   38 #include <asm/sections.h>
   39 #include <asm/tlb.h>
   40 
   41 unsigned long empty_zero_page;
   42 EXPORT_SYMBOL_GPL(empty_zero_page);
   43 
   44 static struct kcore_list kcore_mem, kcore_vmalloc;
   45 
   46 static unsigned long setup_zero_page(void)
   47 {
   48         struct page *page;
   49 
   50         empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, 0);
   51         if (!empty_zero_page)
   52                 panic("Oh boy, that early out of memory?");
   53 
   54         page = virt_to_page((void *) empty_zero_page);
   55         SetPageReserved(page);
   56 
   57         return 1UL;
   58 }
   59 
   60 #ifndef CONFIG_NEED_MULTIPLE_NODES
   61 int page_is_ram(unsigned long pagenr)
   62 {
   63         if (pagenr >= min_low_pfn && pagenr < max_low_pfn)
   64                 return 1;
   65         else
   66                 return 0;
   67 }
   68 
   69 void __init paging_init(void)
   70 {
   71         unsigned long max_zone_pfns[MAX_NR_ZONES];
   72         unsigned long lastpfn;
   73 
   74         pagetable_init();
   75         max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
   76         lastpfn = max_low_pfn;
   77         free_area_init_nodes(max_zone_pfns);
   78 }
   79 
   80 void __init mem_init(void)
   81 {
   82         unsigned long codesize, reservedpages, datasize, initsize;
   83         unsigned long tmp, ram = 0;
   84 
   85         high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
   86         totalram_pages += free_all_bootmem();
   87         totalram_pages -= setup_zero_page();    /* Setup zeroed pages. */
   88         reservedpages = 0;
   89 
   90         for (tmp = 0; tmp < max_low_pfn; tmp++)
   91                 if (page_is_ram(tmp)) {
   92                         ram++;
   93                         if (PageReserved(pfn_to_page(tmp)))
   94                                 reservedpages++;
   95                 }
   96 
   97         num_physpages = ram;
   98         codesize = (unsigned long) &_etext - (unsigned long) &_text;
   99         datasize = (unsigned long) &_edata - (unsigned long) &_etext;
  100         initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin;
  101 
  102         printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
  103                         "%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n",
  104                         (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
  105                         ram << (PAGE_SHIFT-10), codesize >> 10,
  106                         reservedpages << (PAGE_SHIFT-10), datasize >> 10,
  107                         initsize >> 10,
  108                         totalhigh_pages << (PAGE_SHIFT-10));
  109 }
  110 #endif /* !CONFIG_NEED_MULTIPLE_NODES */
  111 
  112 static void free_init_pages(const char *what, unsigned long begin, unsigned long end)
  113 {
  114         unsigned long pfn;
  115 
  116         for (pfn = PFN_UP(begin); pfn < PFN_DOWN(end); pfn++) {
  117                 struct page *page = pfn_to_page(pfn);
  118                 void *addr = phys_to_virt(PFN_PHYS(pfn));
  119 
  120                 ClearPageReserved(page);
  121                 init_page_count(page);
  122                 memset(addr, POISON_FREE_INITMEM, PAGE_SIZE);
  123                 __free_page(page);
  124                 totalram_pages++;
  125         }
  126         printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
  127 }
  128 
  129 #ifdef CONFIG_BLK_DEV_INITRD
  130 void free_initrd_mem(unsigned long start, unsigned long end)
  131 {
  132         free_init_pages("initrd memory",
  133                 virt_to_phys((void *) start),
  134                 virt_to_phys((void *) end));
  135 }
  136 #endif
  137 
  138 void __init_refok free_initmem(void)
  139 {
  140         free_init_pages("unused kernel memory",
  141         __pa(&__init_begin),
  142         __pa(&__init_end));
  143 }
  144 
  145 unsigned long pgd_current;
  146 
  147 #define __page_aligned(order) __attribute__((__aligned__(PAGE_SIZE<<order)))
  148 
  149 /*
  150  * gcc 3.3 and older have trouble determining that PTRS_PER_PGD and PGD_ORDER
  151  * are constants.  So we use the variants from asm-offset.h until that gcc
  152  * will officially be retired.
  153  */
  154 pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned(PTE_ORDER);
  155 pte_t invalid_pte_table[PTRS_PER_PTE] __page_aligned(PTE_ORDER);

Cache object: 5c882e8c346f4a8e7a82037da229b528


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.