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
x86
kernel
head64.c
Go to the documentation of this file.
1
/*
2
* prepare to run common code
3
*
4
* Copyright (C) 2000 Andrea Arcangeli <
[email protected]
> SuSE
5
*/
6
7
#include <
linux/init.h
>
8
#include <linux/linkage.h>
9
#include <linux/types.h>
10
#include <linux/kernel.h>
11
#include <linux/string.h>
12
#include <
linux/percpu.h
>
13
#include <
linux/start_kernel.h
>
14
#include <
linux/io.h
>
15
#include <
linux/memblock.h
>
16
17
#include <asm/processor.h>
18
#include <
asm/proto.h
>
19
#include <asm/smp.h>
20
#include <asm/setup.h>
21
#include <asm/desc.h>
22
#include <asm/pgtable.h>
23
#include <asm/tlbflush.h>
24
#include <asm/sections.h>
25
#include <asm/kdebug.h>
26
#include <
asm/e820.h
>
27
#include <
asm/bios_ebda.h
>
28
29
static
void
__init
zap_identity_mappings(
void
)
30
{
31
pgd_t
*pgd =
pgd_offset_k
(0
UL
);
32
pgd_clear
(pgd);
33
__flush_tlb_all
();
34
}
35
36
/* Don't add a printk in there. printk relies on the PDA which is not initialized
37
yet. */
38
static
void
__init
clear_bss(
void
)
39
{
40
memset
(__bss_start, 0,
41
(
unsigned
long
) __bss_stop - (
unsigned
long
) __bss_start);
42
}
43
44
static
void
__init
copy_bootdata(
char
*real_mode_data)
45
{
46
char
*
command_line
;
47
48
memcpy
(&
boot_params
, real_mode_data,
sizeof
boot_params
);
49
if
(
boot_params
.
hdr
.cmd_line_ptr) {
50
command_line =
__va
(
boot_params
.
hdr
.cmd_line_ptr);
51
memcpy
(
boot_command_line
, command_line,
COMMAND_LINE_SIZE
);
52
}
53
}
54
55
void
__init
x86_64_start_kernel
(
char
* real_mode_data)
56
{
57
int
i
;
58
59
/*
60
* Build-time sanity checks on the kernel image and module
61
* area mappings. (these are purely build-time and produce no code)
62
*/
63
BUILD_BUG_ON
(
MODULES_VADDR
<
KERNEL_IMAGE_START
);
64
BUILD_BUG_ON
(
MODULES_VADDR
-
KERNEL_IMAGE_START
<
KERNEL_IMAGE_SIZE
);
65
BUILD_BUG_ON
(
MODULES_LEN
+
KERNEL_IMAGE_SIZE
> 2*
PUD_SIZE
);
66
BUILD_BUG_ON
((
KERNEL_IMAGE_START
& ~
PMD_MASK
) != 0);
67
BUILD_BUG_ON
((
MODULES_VADDR
& ~
PMD_MASK
) != 0);
68
BUILD_BUG_ON
(!(
MODULES_VADDR
>
__START_KERNEL
));
69
BUILD_BUG_ON
(!(((
MODULES_END
- 1) &
PGDIR_MASK
) ==
70
(
__START_KERNEL
&
PGDIR_MASK
)));
71
BUILD_BUG_ON
(
__fix_to_virt
(
__end_of_fixed_addresses
) <=
MODULES_END
);
72
73
/* clear bss before set_intr_gate with early_idt_handler */
74
clear_bss();
75
76
/* Make NULL pointers segfault */
77
zap_identity_mappings();
78
79
max_pfn_mapped
=
KERNEL_IMAGE_SIZE
>>
PAGE_SHIFT
;
80
81
for
(i = 0; i <
NUM_EXCEPTION_VECTORS
; i++) {
82
#ifdef CONFIG_EARLY_PRINTK
83
set_intr_gate(i, &early_idt_handlers[i]);
84
#else
85
set_intr_gate(i,
early_idt_handler
);
86
#endif
87
}
88
load_idt
((
const
struct
desc_ptr
*)&
idt_descr
);
89
90
if
(
console_loglevel
== 10)
91
early_printk
(
"Kernel alive\n"
);
92
93
x86_64_start_reservations
(real_mode_data);
94
}
95
96
void
__init
x86_64_start_reservations
(
char
*real_mode_data)
97
{
98
copy_bootdata(
__va
(real_mode_data));
99
100
memblock_reserve
(
__pa_symbol
(&
_text
),
101
__pa_symbol
(&
__bss_stop
) -
__pa_symbol
(&
_text
));
102
103
#ifdef CONFIG_BLK_DEV_INITRD
104
/* Reserve INITRD */
105
if
(
boot_params
.
hdr
.type_of_loader &&
boot_params
.
hdr
.ramdisk_image) {
106
/* Assume only end is not page aligned */
107
unsigned
long
ramdisk_image
=
boot_params
.
hdr
.ramdisk_image;
108
unsigned
long
ramdisk_size
=
boot_params
.
hdr
.ramdisk_size;
109
unsigned
long
ramdisk_end =
PAGE_ALIGN
(ramdisk_image + ramdisk_size);
110
memblock_reserve
(ramdisk_image, ramdisk_end - ramdisk_image);
111
}
112
#endif
113
114
reserve_ebda_region
();
115
116
/*
117
* At this point everything still needed from the boot loader
118
* or BIOS or kernel text should be early reserved or marked not
119
* RAM in e820. All other memory is free game.
120
*/
121
122
start_kernel
();
123
}
Generated on Thu Jan 10 2013 13:20:43 for Linux Kernel by
1.8.2