Subversion Repositories HelenOS

Rev

Rev 1806 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1805 decky 1
#
2
# Copyright (C) 2001-2004 Jakub Jermar
3
# Copyright (C) 2005-2006 Martin Decky
4
# All rights reserved.
5
#
6
# Redistribution and use in source and binary forms, with or without
7
# modification, are permitted provided that the following conditions
8
# are met:
9
#
10
# - Redistributions of source code must retain the above copyright
11
#   notice, this list of conditions and the following disclaimer.
12
# - Redistributions in binary form must reproduce the above copyright
13
#   notice, this list of conditions and the following disclaimer in the
14
#   documentation and/or other materials provided with the distribution.
15
# - The name of the author may not be used to endorse or promote products
16
#   derived from this software without specific prior written permission.
17
#
18
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#
29
 
30
#include <arch/boot/boot.h>
31
#include <arch/mm/page.h>
32
#include <arch/pm.h>
33
 
34
.section __xen_guest
35
	.ascii  "GUEST_OS=HelenOS,"
36
	.ascii  "XEN_VER=xen-3.0,"
37
	.ascii  "HYPERCALL_PAGE=0x2,"
38
	.ascii  "LOADER=generic,"
39
	.ascii  "PT_MODE_WRITABLE"
40
	.byte   0
41
 
42
.section K_TEXT_START, "ax"
43
 
44
KTEXT=8
45
KDATA=16
46
 
47
.code32
48
.align 4
1809 decky 49
.global kernel_image_start
1805 decky 50
 
1809 decky 51
kernel_image_start:
1805 decky 52
	lgdt KA2PA(bootstrap_gdtr)		# initialize Global Descriptor Table register
53
 
54
	movw $KDATA, %cx
55
	movw %cx, %es
56
	movw %cx, %fs
57
	movw %cx, %gs
58
	movw %cx, %ds					# kernel data + stack
59
	movw %cx, %ss
60
 
61
	jmpl $KTEXT, $multiboot_meeting_point
62
	multiboot_meeting_point:
63
 
64
	pushl %ebx							# save parameters from GRUB
65
	pushl %eax
66
 
67
#ifdef CONFIG_FB
68
	mov $vesa_init, %esi
69
	mov $VESA_INIT_SEGMENT << 4, %edi
70
	mov $e_vesa_init - vesa_init, %ecx
71
	cld
72
	rep movsb
73
 
74
	mov $VESA_INIT_SEGMENT << 4, %edi
75
	jmpl %edi
76
 
77
	vesa_meeting_point:
78
 
79
	mov %esi, KA2PA(vesa_ph_addr)
80
	mov %di, KA2PA(vesa_height)
81
	shr $16, %edi
82
	mov %di, KA2PA(vesa_width)
83
	mov %bx, KA2PA(vesa_scanline)
84
	shr $16, %ebx
85
	mov %bx, KA2PA(vesa_bpp)
86
#endif	
87
 
88
	call map_kernel							# map kernel and turn paging on
89
 
90
	popl %eax
91
	popl %ebx
92
 
93
	call main_bsp								# never returns
94
 
95
	cli
96
	hlt
97
 
98
.global map_kernel
99
map_kernel:
100
	#
101
	# Here we setup mapping for both the unmapped and mapped sections of the kernel.
102
	# For simplicity, we map the entire 4G space.
103
	#
104
	movl %cr4, %ecx
105
	orl $(1<<4), %ecx
106
	movl %ecx, %cr4							# turn PSE on
107
 
108
	movl $(page_directory+0), %esi
109
	movl $(page_directory+2048), %edi
110
	xorl %ecx, %ecx
111
	xorl %ebx, %ebx
112
0:
113
	movl $((1<<7)|(1<<0)), %eax
114
	orl %ebx, %eax
115
	movl %eax, (%esi,%ecx,4)					# mapping 0x00000000+%ecx*4M => 0x00000000+%ecx*4M
116
	movl %eax, (%edi,%ecx,4)					# mapping 0x80000000+%ecx*4M => 0x00000000+%ecx*4M
117
	addl $(4*1024*1024), %ebx
118
 
119
	incl %ecx
120
	cmpl $512, %ecx
121
	jl 0b
122
 
123
	movl %esi, %cr3
124
 
125
	# turn paging on
126
	movl %cr0, %ebx
127
	orl $(1<<31), %ebx
128
	movl %ebx, %cr0
129
	ret
130
 
131
#ifdef CONFIG_FB
132
vesa_init:
133
	jmp $selector(VESA_INIT_DES), $vesa_init_real - vesa_init
134
 
135
.code16
136
vesa_init_real:
137
 
138
	mov %cr0, %eax
139
	and $~1, %eax
140
	mov %eax, %cr0
141
 
142
	jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init
143
 
144
vesa_init_real2:
145
 
146
	mov $VESA_INIT_SEGMENT, %bx
147
 
148
	mov %bx, %es
149
	mov %bx, %fs
150
	mov %bx, %gs
151
	mov %bx, %ds
152
	mov %bx, %ss
153
 
154
	movl %esp, %eax
155
	movl $0x0000fffc, %esp
156
	movl $0x0000fffc, %ebp
157
	pushl %eax
158
 
159
#define VESA_INFO_SIZE 1024
160
 
161
#define VESA_MODE_LIST_PTR_OFFSET 14
162
#define VESA_MODE_WIDTH_OFFSET 18
163
#define VESA_MODE_HEIGHT_OFFSET 20
164
#define VESA_MODE_BPP_OFFSET 25
165
#define VESA_MODE_SCANLINE_OFFSET 16
166
#define VESA_MODE_PHADDR_OFFSET 40
167
 
168
#define VESA_END_OF_MODES 0xffff
169
 
170
#define VESA_OK 0x4f
171
 
172
#define VESA_GET_INFO 0x4f00
173
#define VESA_GET_MODE_INFO 0x4f01
174
#define VESA_SET_MODE 0x4f02
175
 
176
#define CONFIG_VESA_BPP_a 255
177
 
178
#if CONFIG_VESA_BPP == 24
179
#undef CONFIG_VESA_BPP_a
180
#define CONFIG_VESA_BPP_a 32
181
#endif
182
 
183
	mov $VESA_GET_INFO, %ax
184
	mov $e_vesa_init - vesa_init, %di
185
	push %di
186
	int $0x10
187
 
188
	pop %di
189
	cmp $VESA_OK, %al
190
	jnz 0f
191
 
192
	mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si
193
	mov %si, %gs
194
	mov VESA_MODE_LIST_PTR_OFFSET(%di), %si
195
 
196
	add $VESA_INFO_SIZE, %di
197
 
198
1:# Try next mode
199
	mov %gs:(%si), %cx
200
	cmp $VESA_END_OF_MODES, %cx
201
	jz 0f
202
 
203
	inc %si
204
	inc %si
205
	push %cx
206
	push %di
207
	push %si
208
	mov $VESA_GET_MODE_INFO, %ax
209
	int $0x10
210
 
211
	pop %si
212
	pop %di
213
	pop %cx
214
	cmp $VESA_OK, %al
215
	jnz 0f
216
 
217
	mov $CONFIG_VESA_WIDTH, %ax
218
	cmp VESA_MODE_WIDTH_OFFSET(%di), %ax
219
	jnz 1b
220
 
221
	mov $CONFIG_VESA_HEIGHT,%ax
222
	cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax
223
	jnz 1b
224
 
225
	mov $CONFIG_VESA_BPP, %al
226
	cmp VESA_MODE_BPP_OFFSET(%di), %al
227
	jz 2f
228
 
229
	mov $CONFIG_VESA_BPP_a, %al
230
	cmp VESA_MODE_BPP_OFFSET(%di), %al
231
	jnz 1b
232
 
233
2:
234
 
235
	mov %cx, %bx
236
	or $0xc000, %bx
237
	push %di
238
	mov $VESA_SET_MODE, %ax
239
	int $0x10
240
 
241
	pop %di
242
	cmp $VESA_OK, %al
243
	jnz 0f
244
 
245
	mov VESA_MODE_PHADDR_OFFSET(%di), %esi
246
	mov VESA_MODE_WIDTH_OFFSET(%di), %ax
247
	shl $16, %eax
248
	mov VESA_MODE_HEIGHT_OFFSET(%di), %ax
249
	mov VESA_MODE_BPP_OFFSET(%di), %bl
250
	xor %bh, %bh
251
	shl $16, %ebx
252
	mov VESA_MODE_SCANLINE_OFFSET(%di), %bx
253
	mov %eax, %edi
254
 
255
8:	
256
 
257
	mov %cr0, %eax
258
	or $1, %eax
259
	mov %eax, %cr0
260
 
261
	jmp 9f
262
9:
263
 
264
	ljmpl $KTEXT, $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4)
265
 
266
0:# No prefered mode found
267
	mov $0x111, %cx
268
	push %di
269
	push %cx
270
	mov $VESA_GET_MODE_INFO, %ax
271
	int $0x10
272
 
273
	pop %cx
274
	pop %di
275
	cmp $VESA_OK, %al
276
	jnz 1f
277
	jz 2b						# Force relative jump
278
 
279
1:
280
	mov $0x0003, %ax
281
	int $0x10
282
	mov $0xffffffff, %edi		# EGA text mode used, because of problems with VESA
283
	xor %ax, %ax
284
	jz 8b						# Force relative jump
285
 
286
 
287
.code32
288
vesa_init_protect:
289
	popl %esp
290
 
291
	movw $KDATA, %cx
292
	movw %cx, %es
293
	movw %cx, %fs
294
	movw %cx, %gs
295
	movw %cx, %ds					# kernel data + stack
296
	movw %cx, %ss
297
 
298
	jmpl $KTEXT, $vesa_meeting_point
299
 
300
.align 4
301
e_vesa_init:
302
#endif	
303
 
304
.section K_DATA_START, "aw", @progbits
305
 
306
.align 4096
307
page_directory:
308
	.space 4096, 0