Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
h8300
mm
init.c
Go to the documentation of this file.
1
/*
2
* linux/arch/h8300/mm/init.c
3
*
4
* Copyright (C) 1998 D. Jeff Dionne <
[email protected]
>,
5
* Kenneth Albanowski <
[email protected]
>,
6
* Copyright (C) 2000 Lineo, Inc. (www.lineo.com)
7
*
8
* Based on:
9
*
10
* linux/arch/m68knommu/mm/init.c
11
* linux/arch/m68k/mm/init.c
12
*
13
* Copyright (C) 1995 Hamish Macdonald
14
*
15
* JAN/1999 -- hacked to support ColdFire (
[email protected]
)
16
* DEC/2000 -- linux 2.4 support <
[email protected]
>
17
*/
18
19
#include <linux/signal.h>
20
#include <linux/sched.h>
21
#include <linux/kernel.h>
22
#include <linux/errno.h>
23
#include <linux/string.h>
24
#include <linux/types.h>
25
#include <linux/ptrace.h>
26
#include <linux/mman.h>
27
#include <
linux/mm.h
>
28
#include <
linux/swap.h
>
29
#include <
linux/init.h
>
30
#include <
linux/highmem.h
>
31
#include <
linux/pagemap.h
>
32
#include <
linux/bootmem.h
>
33
#include <
linux/gfp.h
>
34
35
#include <asm/setup.h>
36
#include <asm/segment.h>
37
#include <asm/page.h>
38
#include <asm/pgtable.h>
39
#include <asm/sections.h>
40
41
#undef DEBUG
42
43
/*
44
* BAD_PAGE is the page that is used for page faults when linux
45
* is out-of-memory. Older versions of linux just did a
46
* do_exit(), but using this instead means there is less risk
47
* for a process dying in kernel mode, possibly leaving a inode
48
* unused etc..
49
*
50
* BAD_PAGETABLE is the accompanying page-table: it is initialized
51
* to point to BAD_PAGE entries.
52
*
53
* ZERO_PAGE is a special page that is used for zero-initialized
54
* data and COW.
55
*/
56
static
unsigned
long
empty_bad_page_table;
57
58
static
unsigned
long
empty_bad_page;
59
60
unsigned
long
empty_zero_page
;
61
62
extern
unsigned
long
rom_length
;
63
64
extern
unsigned
long
memory_start
;
65
extern
unsigned
long
memory_end
;
66
67
/*
68
* paging_init() continues the virtual memory environment setup which
69
* was begun by the code in arch/head.S.
70
* The parameters are pointers to where to stick the starting and ending
71
* addresses of available kernel virtual memory.
72
*/
73
void
__init
paging_init
(
void
)
74
{
75
/*
76
* Make sure start_mem is page aligned, otherwise bootmem and
77
* page_alloc get different views og the world.
78
*/
79
#ifdef DEBUG
80
unsigned
long
start_mem =
PAGE_ALIGN
(
memory_start
);
81
#endif
82
unsigned
long
end_mem =
memory_end
&
PAGE_MASK
;
83
84
#ifdef DEBUG
85
printk
(
"start_mem is %#lx\nvirtual_end is %#lx\n"
,
86
start_mem, end_mem);
87
#endif
88
89
/*
90
* Initialize the bad page table and bad page to point
91
* to a couple of allocated pages.
92
*/
93
empty_bad_page_table = (
unsigned
long
)
alloc_bootmem_pages
(
PAGE_SIZE
);
94
empty_bad_page = (
unsigned
long
)
alloc_bootmem_pages
(
PAGE_SIZE
);
95
empty_zero_page
= (
unsigned
long
)
alloc_bootmem_pages
(
PAGE_SIZE
);
96
memset
((
void
*)
empty_zero_page
, 0,
PAGE_SIZE
);
97
98
/*
99
* Set up SFC/DFC registers (user data space).
100
*/
101
set_fs
(
USER_DS
);
102
103
#ifdef DEBUG
104
printk
(
"before free_area_init\n"
);
105
106
printk
(
"free_area_init -> start_mem is %#lx\nvirtual_end is %#lx\n"
,
107
start_mem, end_mem);
108
#endif
109
110
{
111
unsigned
long
zones_size[MAX_NR_ZONES] = {0, };
112
113
zones_size[ZONE_DMA] = 0 >>
PAGE_SHIFT
;
114
zones_size[
ZONE_NORMAL
] = (end_mem -
PAGE_OFFSET
) >>
PAGE_SHIFT
;
115
#ifdef CONFIG_HIGHMEM
116
zones_size[ZONE_HIGHMEM] = 0;
117
#endif
118
free_area_init
(zones_size);
119
}
120
}
121
122
void
__init
mem_init
(
void
)
123
{
124
int
codek = 0, datak = 0, initk = 0;
125
/* DAVIDM look at setup memory map generically with reserved area */
126
unsigned
long
tmp
;
127
extern
unsigned
long
_ramend
,
_ramstart
;
128
unsigned
long
len
= &_ramend - &
_ramstart
;
129
unsigned
long
start_mem =
memory_start
;
/* DAVIDM - these must start at end of kernel */
130
unsigned
long
end_mem =
memory_end
;
/* DAVIDM - this must not include kernel stack at top */
131
132
#ifdef DEBUG
133
printk
(
KERN_DEBUG
"Mem_init: start=%lx, end=%lx\n"
, start_mem, end_mem);
134
#endif
135
136
end_mem &=
PAGE_MASK
;
137
high_memory
= (
void
*) end_mem;
138
139
start_mem =
PAGE_ALIGN
(start_mem);
140
max_mapnr
=
num_physpages
=
MAP_NR
(
high_memory
);
141
142
/* this will put all memory onto the freelists */
143
totalram_pages =
free_all_bootmem
();
144
145
codek = (
_etext
-
_stext
) >> 10;
146
datak = (
__bss_stop
-
_sdata
) >> 10;
147
initk = (
__init_begin
-
__init_end
) >> 10;
148
149
tmp = nr_free_pages() <<
PAGE_SHIFT
;
150
printk
(
KERN_INFO
"Memory available: %luk/%luk RAM, %luk/%luk ROM (%dk kernel code, %dk data)\n"
,
151
tmp >> 10,
152
len >> 10,
153
(
rom_length
> 0) ? ((
rom_length
>> 10) - codek) : 0,
154
rom_length
>> 10,
155
codek,
156
datak
157
);
158
}
159
160
161
#ifdef CONFIG_BLK_DEV_INITRD
162
void
free_initrd_mem
(
unsigned
long
start
,
unsigned
long
end
)
163
{
164
int
pages
= 0;
165
for
(; start <
end
; start +=
PAGE_SIZE
) {
166
ClearPageReserved(
virt_to_page
(start));
167
init_page_count(
virt_to_page
(start));
168
free_page
(start);
169
totalram_pages++;
170
pages++;
171
}
172
printk
(
"Freeing initrd memory: %dk freed\n"
, pages);
173
}
174
#endif
175
176
void
177
free_initmem
(
void
)
178
{
179
#ifdef CONFIG_RAMKERNEL
180
unsigned
long
addr
;
181
/*
182
* the following code should be cool even if these sections
183
* are not page aligned.
184
*/
185
addr =
PAGE_ALIGN
((
unsigned
long
)(
__init_begin
));
186
/* next to check that the page we free is not a partial page */
187
for
(; addr +
PAGE_SIZE
< (
unsigned
long
)
__init_end
; addr +=
PAGE_SIZE
) {
188
ClearPageReserved(
virt_to_page
(addr));
189
init_page_count(
virt_to_page
(addr));
190
free_page
(addr);
191
totalram_pages++;
192
}
193
printk
(
KERN_INFO
"Freeing unused kernel memory: %ldk freed (0x%x - 0x%x)\n"
,
194
(addr -
PAGE_ALIGN
((
long
)
__init_begin
)) >> 10,
195
(
int
)(
PAGE_ALIGN
((
unsigned
long
)__init_begin)),
196
(
int
)(addr -
PAGE_SIZE
));
197
#endif
198
}
199
Generated on Thu Jan 10 2013 12:53:59 for Linux Kernel by
1.8.2