Subversion Repositories HelenOS

Rev

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

Rev 406 Rev 417
1
#
1
#
2
# Copyright (C) 2005 Ondrej Palkovsky
2
# Copyright (C) 2005 Ondrej Palkovsky
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
#define __ASM__
29
#define __ASM__
30
 
30
 
31
#include <arch/mm/page.h>	
31
#include <arch/mm/page.h>	
32
#include <arch/mm/ptl.h>
32
#include <arch/mm/ptl.h>
33
#include <arch/pm.h>
33
#include <arch/pm.h>
34
#include <arch/cpu.h>
34
#include <arch/cpu.h>
35
#include <arch/cpuid.h>
35
#include <arch/cpuid.h>
36
#include <arch/boot/boot.h>
36
#include <arch/boot/boot.h>
37
 
37
 
38
#define START_STACK_64  0xffffffff80007c00
38
#define START_STACK_64  0xffffffff80007c00
39
					
39
					
40
#
40
#
41
# This is where we require any SPARTAN-kernel-compatible boot loader
41
# This is where we require any SPARTAN-kernel-compatible boot loader
42
# to pass control in real mode.
42
# to pass control in real mode.
43
#
43
#
44
# Protected mode tables are statically initialised during compile
44
# Protected mode tables are statically initialised during compile
45
# time. So we can just load the respective table registers and
45
# time. So we can just load the respective table registers and
46
# switch to protected mode.
46
# switch to protected mode.
47
#
47
#
48
 
48
 
49
#define START_STACK (BOOTSTRAP_OFFSET-0x400)
49
#define START_STACK (BOOTSTRAP_OFFSET-0x400)
50
	
50
	
51
.section K_TEXT_START, "ax"
51
.section K_TEXT_START, "ax"
52
.code16
52
.code16
53
.global kernel_image_start
53
.global kernel_image_start
54
kernel_image_start:
54
kernel_image_start:
55
	cli
55
	cli
56
	xorw %ax,%ax
56
	xorw %ax,%ax
57
	movw %ax,%ds
57
	movw %ax,%ds
58
	movw %ax,%es
58
	movw %ax,%es
59
	movw %ax,%ss            # initialize stack segment register
59
	movw %ax,%ss            # initialize stack segment register
60
	movl $(START_STACK), %esp	# initialize stack pointer
60
	movl $(START_STACK), %esp	# initialize stack pointer
61
	
61
	
62
	call memmap_arch_init
62
	call memmap_arch_init
63
	
63
	
64
	movl $0x80000000, %eax  
64
	movl $0x80000000, %eax  
65
	cpuid
65
	cpuid
66
	cmp $0x80000000, %eax 	# any function > 80000000h?
66
	cmp $0x80000000, %eax 	# any function > 80000000h?
67
	jbe no_long_mode
67
	jbe no_long_mode
68
	movl $(AMD_CPUID_EXTENDED), %eax # Extended function code 80000001
68
	movl $(AMD_CPUID_EXTENDED), %eax # Extended function code 80000001
69
	cpuid
69
	cpuid
70
	bt $29, %edx 		# Test if long mode is supported.
70
	bt $29, %edx 		# Test if long mode is supported.
71
	jnc no_long_mode
71
	jnc no_long_mode
72
 
72
 
73
	# Load gdtr, idtr
73
	# Load gdtr, idtr
74
	lgdt real_bootstrap_gdtr_boot
74
	lgdt real_bootstrap_gdtr_boot
75
	
75
	
76
	movl %cr0,%eax
76
	movl %cr0,%eax
77
	orl $0x1,%eax
77
	orl $0x1,%eax
78
	movl %eax,%cr0			# switch to protected mode
78
	movl %eax,%cr0			# switch to protected mode
79
 
79
 
80
	jmpl $gdtselector(KTEXT32_DES), $now_in_prot
80
	jmpl $gdtselector(KTEXT32_DES), $now_in_prot
81
 
81
 
82
no_long_mode:
82
no_long_mode:
83
1:
83
1:
84
	jmp 1b
84
	jmp 1b
85
 
85
 
86
# Protected 32-bit. We want to reuse the code-seg descriptor,
86
# Protected 32-bit. We want to reuse the code-seg descriptor,
87
# the Default operand size must not be 1 when entering long mode
87
# the Default operand size must not be 1 when entering long mode
88
.code32
88
.code32
89
now_in_prot:  
89
now_in_prot:  
90
	# Set up stack & data descriptors
90
	# Set up stack & data descriptors
91
	movw $gdtselector(KDATA_DES), %ax
91
	movw $gdtselector(KDATA_DES), %ax
92
	movw %ax, %ds
92
	movw %ax, %ds
93
	movw %ax, %ss
93
	movw %ax, %ss
94
 
94
 
95
	movb $0xd1, %al		# enable A20 using the keyboard controller
95
	movb $0xd1, %al		# enable A20 using the keyboard controller
96
	outb %al, $0x64
96
	outb %al, $0x64
97
	movb $0xdf, %al
97
	movb $0xdf, %al
98
	outb %al, $0x60
98
	outb %al, $0x60
99
 
99
 
100
	
100
	
101
	# Enable 64-bit page transaltion entries - CR4.PAE = 1.
101
	# Enable 64-bit page transaltion entries - CR4.PAE = 1.
102
	# Paging is not enabled until after long mode is enabled
102
	# Paging is not enabled until after long mode is enabled
103
	movl %cr4, %eax
103
	movl %cr4, %eax
104
	btsl $5, %eax
104
	btsl $5, %eax
105
	movl %eax, %cr4
105
	movl %eax, %cr4
106
 
106
 
107
	# Set up paging tables
107
	# Set up paging tables
108
	leal ptl_0, %eax
108
	leal ptl_0, %eax
109
	movl %eax, %cr3
109
	movl %eax, %cr3
110
	
110
	
111
	# Enable long mode
111
	# Enable long mode
112
	movl $EFER_MSR_NUM, %ecx   # EFER MSR number
112
	movl $EFER_MSR_NUM, %ecx   # EFER MSR number
113
	rdmsr                   # Read EFER
113
	rdmsr                   # Read EFER
114
	btsl $AMD_LME_FLAG, %eax            # Set LME=1
114
	btsl $AMD_LME_FLAG, %eax            # Set LME=1
115
	wrmsr                   # Write EFER
115
	wrmsr                   # Write EFER
116
	
116
	
117
	# Enable paging to activate long mode (set CR0.PG=1)
117
	# Enable paging to activate long mode (set CR0.PG=1)
118
	movl %cr0, %eax
118
	movl %cr0, %eax
119
	btsl $31, %eax
119
	btsl $31, %eax
120
	movl %eax, %cr0
120
	movl %eax, %cr0
121
	
121
	
122
	# At this point we are in compatibility mode
122
	# At this point we are in compatibility mode
123
	jmpl $gdtselector(KTEXT_DES), $start64
123
	jmpl $gdtselector(KTEXT_DES), $start64
124
 
124
 
125
.code64
125
.code64
126
start64:
126
start64:
127
	movq $(PA2KA(START_STACK)), %rsp
127
	movq $(PA2KA(START_STACK)), %rsp
128
 
128
 
129
	# Copy kernel to higher physical memory
129
	# Copy kernel to higher physical memory
130
	movq $BOOTSTRAP_OFFSET, %rsi
130
	movq $BOOTSTRAP_OFFSET, %rsi
131
	movq $BOOTSTRAP_OFFSET + BOOT_OFFSET, %rdi
131
	movq $BOOTSTRAP_OFFSET + BOOT_OFFSET, %rdi
132
	movq $_hardcoded_kernel_size, %rcx
132
	movq $_hardcoded_kernel_size, %rcx
133
	cld
133
	cld
134
	rep movsb
134
	rep movsb
135
	
135
	
136
	call main_bsp   # never returns
136
	call main_bsp   # never returns
137
1:
137
1:
138
	jmp 1b
138
	jmp 1b
139
				
139
				
140
.section K_DATA_START, "aw", @progbits
140
.section K_DATA_START, "aw", @progbits
141
.align 4096
141
.align 4096
142
 
142
 
143
# Identical mapping of first 16MB and the same of -2GB -> 0	
143
# Identical mapping of first 64MB and the same of -2GB -> 0	
144
.global ptl_2
144
.global ptl_2
145
ptl_2:	
145
ptl_2:	
146
	.quad 0x0 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
146
	.quad 0x0 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
147
	.quad 0x200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
147
	.quad 0x200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
148
	.quad 0x400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
148
	.quad 0x400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
149
	.quad 0x600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
149
	.quad 0x600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
150
	.quad 0x800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
150
	.quad 0x800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
151
	.quad 0xa00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
151
	.quad 0xa00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
152
	.quad 0xc00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
152
	.quad 0xc00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
153
	.quad 0xe00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
153
	.quad 0xe00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
154
	.quad 0x1000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
155
	.quad 0x1200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
156
	.quad 0x1400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
157
	.quad 0x1600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
158
	.quad 0x1800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
159
	.quad 0x1a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
160
	.quad 0x1c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
161
	.quad 0x1e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
162
	.quad 0x2000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
163
	.quad 0x2200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
164
	.quad 0x2400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
165
	.quad 0x2600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
166
	.quad 0x2800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
167
	.quad 0x2a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
168
	.quad 0x2c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
169
	.quad 0x2e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
170
	.quad 0x3000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
171
	.quad 0x3200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
172
	.quad 0x3400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
173
	.quad 0x3600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
174
	.quad 0x3800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
175
	.quad 0x3a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
176
	.quad 0x3c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
177
	.quad 0x3e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
154
	
178
	
155
.align 4096
179
.align 4096
156
.global ptl_1
180
.global ptl_1
157
ptl_1:
181
ptl_1:
158
	.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
182
	.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
159
	.fill 509,8,0
183
	.fill 509,8,0
160
	.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
184
	.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
161
	.fill 1,8,0
185
	.fill 1,8,0
162
	
186
	
163
.align 4096
187
.align 4096
164
.global ptl_0
188
.global ptl_0
165
ptl_0:
189
ptl_0:
166
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
190
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
167
	.fill 510,8,0
191
	.fill 510,8,0
168
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
192
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
169
 
193
 
170
.global real_bootstrap_gdtr_boot
194
.global real_bootstrap_gdtr_boot
171
real_bootstrap_gdtr_boot:
195
real_bootstrap_gdtr_boot:
172
	.word gdtselector(GDT_ITEMS)
196
	.word gdtselector(GDT_ITEMS)
173
	.long KA2PA(gdt)-BOOT_OFFSET
197
	.long KA2PA(gdt)-BOOT_OFFSET
174
 
198