Subversion Repositories HelenOS-historic

Rev

Rev 232 | Rev 267 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 232 Rev 235
1
#
1
#
2
# Copyright (C) 2001-2004 Jakub Jermar
2
# Copyright (C) 2001-2004 Jakub Jermar
3
# All rights reserved.
3
# All rights reserved.
4
#
4
#
5
# Redistribution and use in source and binary forms, with or without
5
# Redistribution and use in source and binary forms, with or without
6
# modification, are permitted provided that the following conditions
6
# modification, are permitted provided that the following conditions
7
# are met:
7
# are met:
8
#
8
#
9
# - Redistributions of source code must retain the above copyright
9
# - Redistributions of source code must retain the above copyright
10
#   notice, this list of conditions and the following disclaimer.
10
#   notice, this list of conditions and the following disclaimer.
11
# - Redistributions in binary form must reproduce the above copyright
11
# - Redistributions in binary form must reproduce the above copyright
12
#   notice, this list of conditions and the following disclaimer in the
12
#   notice, this list of conditions and the following disclaimer in the
13
#   documentation and/or other materials provided with the distribution.
13
#   documentation and/or other materials provided with the distribution.
14
# - The name of the author may not be used to endorse or promote products
14
# - The name of the author may not be used to endorse or promote products
15
#   derived from this software without specific prior written permission.
15
#   derived from this software without specific prior written permission.
16
#
16
#
17
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#
27
#
28
 
28
 
29
#include <arch/boot/boot.h>
29
#include <arch/boot/boot.h>
30
 
30
 
31
.section K_TEXT_START
31
.section K_TEXT_START
32
.global kernel_image_start
32
.global kernel_image_start
33
 
33
 
34
.code16
34
.code16
35
#
35
#
36
# This is where we require any SPARTAN-kernel-compatible boot loader
36
# This is where we require any SPARTAN-kernel-compatible boot loader
37
# to pass control in real mode.
37
# to pass control in real mode.
38
#
38
#
39
# Protected mode tables are statically initialised during compile
39
# Protected mode tables are statically initialised during compile
40
# time. So we can just load the respective table registers and
40
# time. So we can just load the respective table registers and
41
# switch to protected mode.
41
# switch to protected mode.
42
#
42
#
43
kernel_image_start:
43
kernel_image_start:
44
	cli
44
	cli
45
	xorw %ax,%ax
45
	xorw %ax, %ax
46
	movw %ax,%ds
46
	movw %ax, %ds
47
	movw %ax,%ss			# initialize stack segment register
47
	movw %ax, %ss			# initialize stack segment register
48
	movl $0x7c00,%esp		# initialize stack pointer
48
	movl $0x7c00, %esp		# initialize stack pointer
49
	
49
	
50
	call memmap_arch_init
50
	call memmap_arch_init
51
	
51
	
52
	lgdt gdtr			# initialize Global Descriptor Table register
52
	lgdt gdtr			# initialize Global Descriptor Table register
53
	
53
	
54
	movl %cr0,%eax
54
	movl %cr0, %eax
55
	orl $0x1,%eax
55
	orl $0x1, %eax
56
	movl %eax,%cr0			# switch to protected mode
56
	movl %eax, %cr0			# switch to protected mode
-
 
57
	
57
	jmpl $8,$meeting_point
58
	jmpl $8, $boot_image_start
58
 
59
	
59
.code32
60
.code32
60
.align 4
61
.align 4
61
multiboot_header:
62
multiboot_header:
62
	.long MULTIBOOT_HEADER_MAGIC
63
	.long MULTIBOOT_HEADER_MAGIC
63
	.long MULTIBOOT_HEADER_FLAGS
64
	.long MULTIBOOT_HEADER_FLAGS
64
	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)	# checksum
65
	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)	# checksum
65
	.long multiboot_header
66
	.long multiboot_header + BOOT_OFFSET
66
	.long unmapped_ktext_start
67
	.long unmapped_ktext_start + BOOT_OFFSET
67
	.long 0
68
	.long 0
68
	.long 0
69
	.long 0
69
	.long multiboot_image_start
70
	.long multiboot_image_start + BOOT_OFFSET
-
 
71
	
-
 
72
boot_image_start:
-
 
73
	movw $16, %ax
-
 
74
	movw %ax, %es
-
 
75
	movw %ax, %gs
-
 
76
	movw %ax, %fs
-
 
77
	movw %ax, %ds			# kernel data + stack
-
 
78
	movw %ax, %ss
-
 
79
	
-
 
80
	call map_kernel			# map kernel and turn paging on
-
 
81
	
-
 
82
	movb $0xd1, %al			# enable A20 using the keyboard controller
-
 
83
	outb %al, $0x64
-
 
84
	movb $0xdf, %al
-
 
85
	outb %al, $0x60
-
 
86
	
-
 
87
	movl $0x8000, %esi
-
 
88
	movl $0x8000 + BOOT_OFFSET, %edi
-
 
89
	movl $_hardcoded_kernel_size, %ecx
-
 
90
	cld
-
 
91
	rep movsb
-
 
92
	
-
 
93
	jmp protected
70
	
94
	
71
multiboot_image_start:
95
multiboot_image_start:
72
	movl $0x7c00, %esp		# initialize stack pointer
96
	movl $0x7c00, %esp		# initialize stack pointer
73
	
97
	
74
	lgdt gdtr
98
	lgdt gdtr
75
 
99
 
76
meeting_point:
-
 
77
	movw $16,%ax
100
	movw $16, %ax
78
	movw %ax,%es
101
	movw %ax, %es
79
	movw %ax,%gs
102
	movw %ax, %gs
80
	movw %ax,%fs
103
	movw %ax, %fs
81
	movw %ax,%ds			# kernel data + stack
104
	movw %ax, %ds			# kernel data + stack
82
	movw %ax,%ss
105
	movw %ax, %ss
83
 
106
	
84
	call map_kernel			# map kernel and turn paging on
107
	call map_kernel			# map kernel and turn paging on
85
 
108
	
-
 
109
protected:
86
	call main_bsp			# never returns
110
	call main_bsp			# never returns
87
 
111
 
88
	cli
112
	cli
89
	hlt
113
	hlt
90
 
114
 
91
.global map_kernel
115
.global map_kernel
92
map_kernel:
116
map_kernel:
93
	#
117
	#
94
	# Here we setup mapping for both the unmapped and mapped sections of the kernel.
118
	# Here we setup mapping for both the unmapped and mapped sections of the kernel.
95
	# For simplicity, we set only one 4M page for 0x00000000 and one for 0x80000000.
119
	# For simplicity, we set only one 4M page for 0x00000000 and one for 0x80000000.
96
	#
120
	#
97
	movl %cr4, %ecx
121
	movl %cr4, %ecx
98
	orl $(1<<4), %ecx
122
	orl $(1<<4), %ecx
99
	movl %ecx, %cr4				# turn PSE on
123
	movl %ecx, %cr4				# turn PSE on
100
	
124
	
101
	movl $((1<<7)|(1<<0)), %eax
125
	movl $((1<<7)|(1<<0)), %eax
102
	movl %eax, page_directory		# mapping 0x00000000 => 0x00000000
126
	movl %eax, page_directory		# mapping 0x00000000 => 0x00000000
103
 
127
 
104
	movl $(page_directory+(4096/2)), %edx
128
	movl $(page_directory+(4096/2)), %edx
105
	movl %eax, (%edx)			# mapping 0x80000000 => 0x00000000
129
	movl %eax, (%edx)			# mapping 0x80000000 => 0x00000000
106
 
130
 
107
	leal page_directory, %eax
131
	leal page_directory, %eax
108
	movl %eax, %cr3
132
	movl %eax, %cr3
109
	
133
	
110
	# turn paging on
134
	# turn paging on
111
	movl %cr0, %ebx
135
	movl %cr0, %ebx
112
	orl $(1<<31), %ebx
136
	orl $(1<<31), %ebx
113
	movl %ebx, %cr0
137
	movl %ebx, %cr0
114
	ret
138
	ret
115
 
139
 
116
 
140
 
117
.section K_DATA_START
141
.section K_DATA_START
118
 
142
 
119
.align 4096
143
.align 4096
120
page_directory:
144
page_directory:
121
	.space 4096, 0
145
	.space 4096, 0
122
 
146