Blame view

kernel/linux-rt-4.4.41/arch/h8300/mm/init.c 3.27 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  /*
   *  linux/arch/h8300/mm/init.c
   *
   *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
   *                      Kenneth Albanowski <kjahds@kjahds.com>,
   *  Copyright (C) 2000  Lineo, Inc.  (www.lineo.com)
   *
   *  Based on:
   *
   *  linux/arch/m68knommu/mm/init.c
   *  linux/arch/m68k/mm/init.c
   *
   *  Copyright (C) 1995  Hamish Macdonald
   *
   *  JAN/1999 -- hacked to support ColdFire (gerg@snapgear.com)
   *  DEC/2000 -- linux 2.4 support <davidm@snapgear.com>
   */
  
  #include <linux/signal.h>
  #include <linux/sched.h>
  #include <linux/kernel.h>
  #include <linux/errno.h>
  #include <linux/string.h>
  #include <linux/types.h>
  #include <linux/ptrace.h>
  #include <linux/mman.h>
  #include <linux/mm.h>
  #include <linux/swap.h>
  #include <linux/init.h>
  #include <linux/highmem.h>
  #include <linux/pagemap.h>
  #include <linux/bootmem.h>
  #include <linux/gfp.h>
  
  #include <asm/setup.h>
  #include <asm/segment.h>
  #include <asm/page.h>
  #include <asm/pgtable.h>
  #include <asm/sections.h>
  
  /*
   * BAD_PAGE is the page that is used for page faults when linux
   * is out-of-memory. Older versions of linux just did a
   * do_exit(), but using this instead means there is less risk
   * for a process dying in kernel mode, possibly leaving a inode
   * unused etc..
   *
   * BAD_PAGETABLE is the accompanying page-table: it is initialized
   * to point to BAD_PAGE entries.
   *
   * ZERO_PAGE is a special page that is used for zero-initialized
   * data and COW.
   */
  static unsigned long empty_bad_page_table;
  static unsigned long empty_bad_page;
  unsigned long empty_zero_page;
  
  /*
   * paging_init() continues the virtual memory environment setup which
   * was begun by the code in arch/head.S.
   * The parameters are pointers to where to stick the starting and ending
   * addresses of available kernel virtual memory.
   */
  void __init paging_init(void)
  {
  	/*
  	 * Make sure start_mem is page aligned,  otherwise bootmem and
  	 * page_alloc get different views og the world.
  	 */
  	unsigned long start_mem = PAGE_ALIGN(memory_start);
  	unsigned long end_mem   = memory_end & PAGE_MASK;
  
  	pr_debug("start_mem is %#lx
  virtual_end is %#lx
  ",
  		 start_mem, end_mem);
  
  	/*
  	 * Initialize the bad page table and bad page to point
  	 * to a couple of allocated pages.
  	 */
  	empty_bad_page_table = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
  	empty_bad_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
  	empty_zero_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
  	memset((void *)empty_zero_page, 0, PAGE_SIZE);
  
  	/*
  	 * Set up SFC/DFC registers (user data space).
  	 */
  	set_fs(USER_DS);
  
  	pr_debug("before free_area_init
  ");
  
  	pr_debug("free_area_init -> start_mem is %#lx
  virtual_end is %#lx
  ",
  		 start_mem, end_mem);
  
  	{
  		unsigned long zones_size[MAX_NR_ZONES] = {0, };
  
  		zones_size[ZONE_NORMAL] = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
  		free_area_init(zones_size);
  	}
  }
  
  void __init mem_init(void)
  {
  	pr_devel("Mem_init: start=%lx, end=%lx
  ", memory_start, memory_end);
  
  	high_memory = (void *) (memory_end & PAGE_MASK);
  	max_mapnr = MAP_NR(high_memory);
  
  	/* this will put all low memory onto the freelists */
  	free_all_bootmem();
  
  	mem_init_print_info(NULL);
  }
  
  
  #ifdef CONFIG_BLK_DEV_INITRD
  void free_initrd_mem(unsigned long start, unsigned long end)
  {
  	free_reserved_area((void *)start, (void *)end, -1, "initrd");
  }
  #endif
  
  void
  free_initmem(void)
  {
  	free_initmem_default(-1);
  }