Rev 1290 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1290 | Rev 1639 | ||
---|---|---|---|
Line 56... | Line 56... | ||
56 | movl $START_STACK, %esp # initialize stack pointer |
56 | movl $START_STACK, %esp # initialize stack pointer |
57 | lgdt KA2PA(bootstrap_gdtr) # initialize Global Descriptor Table register |
57 | lgdt KA2PA(bootstrap_gdtr) # initialize Global Descriptor Table register |
58 | 58 | ||
59 | movw $KDATA, %cx |
59 | movw $KDATA, %cx |
60 | movw %cx, %es |
60 | movw %cx, %es |
61 | movw %cx, %gs |
- | |
62 | movw %cx, %fs |
61 | movw %cx, %fs |
- | 62 | movw %cx, %gs |
|
63 | movw %cx, %ds # kernel data + stack |
63 | movw %cx, %ds # kernel data + stack |
64 | movw %cx, %ss |
64 | movw %cx, %ss |
65 | 65 | ||
66 | jmpl $KTEXT, $multiboot_meeting_point |
66 | jmpl $KTEXT, $multiboot_meeting_point |
67 | multiboot_meeting_point: |
67 | multiboot_meeting_point: |
68 | 68 | ||
69 | pushl %ebx # save parameters from GRUB |
69 | pushl %ebx # save parameters from GRUB |
70 | pushl %eax |
70 | pushl %eax |
71 | 71 | ||
72 | #ifdef CONFIG_FB |
72 | #ifdef CONFIG_FB |
73 | mov $vesa_init,%esi; |
73 | mov $vesa_init, %esi |
74 | mov $VESA_INIT_SEGMENT<<4,%edi; |
74 | mov $VESA_INIT_SEGMENT << 4, %edi |
75 | mov $e_vesa_init-vesa_init,%ecx; |
75 | mov $e_vesa_init - vesa_init, %ecx |
76 | cld; |
76 | cld |
77 | rep movsb; |
77 | rep movsb |
78 | 78 | ||
79 | mov $VESA_INIT_SEGMENT<<4,%edi; |
79 | mov $VESA_INIT_SEGMENT << 4, %edi |
80 | call *%edi; |
80 | jmpl %edi |
- | 81 | ||
- | 82 | vesa_meeting_point: |
|
- | 83 | ||
81 | mov %esi,KA2PA(vesa_ph_addr); |
84 | mov %esi, KA2PA(vesa_ph_addr) |
82 | mov %di,KA2PA(vesa_height); |
85 | mov %di, KA2PA(vesa_height) |
83 | shr $16,%edi; |
86 | shr $16, %edi |
84 | mov %di,KA2PA(vesa_width); |
87 | mov %di, KA2PA(vesa_width) |
85 | mov %bx,KA2PA(vesa_scanline); |
88 | mov %bx, KA2PA(vesa_scanline) |
86 | shr $16,%ebx; |
89 | shr $16, %ebx |
87 | mov %bx,KA2PA(vesa_bpp); |
90 | mov %bx, KA2PA(vesa_bpp) |
88 | #endif |
91 | #endif |
89 | 92 | ||
90 | call map_kernel # map kernel and turn paging on |
93 | call map_kernel # map kernel and turn paging on |
91 | 94 | ||
92 | popl %eax |
95 | popl %eax |
Line 248... | Line 251... | ||
248 | movl %ebx, %cr0 |
251 | movl %ebx, %cr0 |
249 | ret |
252 | ret |
250 | 253 | ||
251 | #ifdef CONFIG_FB |
254 | #ifdef CONFIG_FB |
252 | vesa_init: |
255 | vesa_init: |
253 | jmp $selector(VESA_INIT_DES),$vesa_init_real-vesa_init; |
256 | jmp $selector(VESA_INIT_DES), $vesa_init_real - vesa_init |
- | 257 | ||
254 | .code16 |
258 | .code16 |
255 | vesa_init_real: |
259 | vesa_init_real: |
256 | 260 | ||
257 | mov %cr0,%eax; |
261 | mov %cr0, %eax |
258 | and $~1,%eax; |
262 | and $~1, %eax |
259 | mov %eax,%cr0; |
263 | mov %eax, %cr0 |
260 | - | ||
261 | 264 | ||
262 | jmp $VESA_INIT_SEGMENT,$vesa_init_real2-vesa_init; |
265 | jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init |
263 | 266 | ||
264 | vesa_init_real2: |
267 | vesa_init_real2: |
265 | 268 | ||
- | 269 | mov $VESA_INIT_SEGMENT, %bx |
|
266 | 270 | ||
267 | mov %esp,%ebp; |
271 | mov %bx, %es |
268 | mov %ss,%cx; |
272 | mov %bx, %fs |
269 | mov $VESA_INIT_SEGMENT,%bx; |
- | |
270 | mov %bx,%ss; |
273 | mov %bx, %gs |
271 | mov $0x0000fffc,%esp; |
- | |
272 | push %ds; |
274 | mov %bx, %ds |
273 | push %es; |
- | |
274 | push %fs; |
- | |
275 | push %gs; |
- | |
276 | push %ebp; |
- | |
277 | push %cx; |
275 | mov %bx, %ss |
278 | 276 | ||
279 | mov %bx,%ds; |
277 | movl %esp, %eax |
280 | mov %bx,%es; |
278 | movl $0x0000fffc, %esp |
281 | mov %bx,%fs; |
279 | movl $0x0000fffc, %ebp |
282 | mov %bx,%gs; |
280 | pushl %eax |
283 | - | ||
284 | 281 | ||
285 | mov $vesa_idt-vesa_init,%ebx; |
- | |
286 | lidtl (%ebx); |
- | |
287 | - | ||
288 | #define VESA_INFO_SIZE 1024 |
282 | #define VESA_INFO_SIZE 1024 |
289 | 283 | ||
290 | #define VESA_MODE_LIST_PTR_OFFSET 14 |
284 | #define VESA_MODE_LIST_PTR_OFFSET 14 |
291 | #define VESA_MODE_WIDTH_OFFSET 18 |
285 | #define VESA_MODE_WIDTH_OFFSET 18 |
292 | #define VESA_MODE_HEIGHT_OFFSET 20 |
286 | #define VESA_MODE_HEIGHT_OFFSET 20 |
293 | #define VESA_MODE_BPP_OFFSET 25 |
287 | #define VESA_MODE_BPP_OFFSET 25 |
294 | #define VESA_MODE_SCANLINE_OFFSET 16 |
288 | #define VESA_MODE_SCANLINE_OFFSET 16 |
295 | #define VESA_MODE_PHADDR_OFFSET 40 |
289 | #define VESA_MODE_PHADDR_OFFSET 40 |
296 | 290 | ||
297 | #define VESA_END_OF_MODES 0xffff |
291 | #define VESA_END_OF_MODES 0xffff |
298 | 292 | ||
299 | #define VESA_OK 0x4f |
293 | #define VESA_OK 0x4f |
300 | 294 | ||
301 | #define VESA_GET_INFO 0x4f00 |
295 | #define VESA_GET_INFO 0x4f00 |
302 | #define VESA_GET_MODE_INFO 0x4f01 |
296 | #define VESA_GET_MODE_INFO 0x4f01 |
303 | #define VESA_SET_MODE 0x4f02 |
297 | #define VESA_SET_MODE 0x4f02 |
304 | 298 | ||
305 | #define CONFIG_VESA_BPP_a 255 |
299 | #define CONFIG_VESA_BPP_a 255 |
306 | 300 | ||
307 | #if CONFIG_VESA_BPP==24 |
301 | #if CONFIG_VESA_BPP == 24 |
308 | #undef CONFIG_VESA_BPP_a |
302 | #undef CONFIG_VESA_BPP_a |
309 | #define CONFIG_VESA_BPP_a 32 |
303 | #define CONFIG_VESA_BPP_a 32 |
310 | #endif |
304 | #endif |
311 | 305 | ||
312 | - | ||
313 | mov $VESA_GET_INFO,%ax; |
306 | mov $VESA_GET_INFO, %ax |
314 | mov $e_vesa_init-vesa_init,%di |
307 | mov $e_vesa_init - vesa_init, %di |
315 | push %di; |
308 | push %di |
316 | int $0x10; |
309 | int $0x10 |
- | 310 | ||
317 | pop %di; |
311 | pop %di |
318 | cmp $VESA_OK,%al; |
312 | cmp $VESA_OK, %al |
319 | jnz 0f; |
313 | jnz 0f |
- | 314 | ||
320 | mov 2+VESA_MODE_LIST_PTR_OFFSET(%di),%si; |
315 | mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si |
321 | mov %si,%gs; |
316 | mov %si, %gs |
322 | mov VESA_MODE_LIST_PTR_OFFSET(%di),%si; |
317 | mov VESA_MODE_LIST_PTR_OFFSET(%di), %si |
323 | 318 | ||
324 | add $VESA_INFO_SIZE,%di; |
319 | add $VESA_INFO_SIZE, %di |
325 | 320 | ||
326 | 1:# Try next mode |
321 | 1:# Try next mode |
327 | mov %gs:(%si),%cx; |
322 | mov %gs:(%si), %cx |
328 | cmp $VESA_END_OF_MODES,%cx; |
323 | cmp $VESA_END_OF_MODES, %cx |
329 | jz 0f; |
324 | jz 0f |
- | 325 | ||
330 | inc %si; |
326 | inc %si |
331 | inc %si; |
327 | inc %si |
332 | push %cx; |
328 | push %cx |
333 | push %di; |
329 | push %di |
334 | push %si; |
330 | push %si |
335 | mov $VESA_GET_MODE_INFO,%ax; |
331 | mov $VESA_GET_MODE_INFO, %ax |
336 | int $0x10; |
332 | int $0x10 |
- | 333 | ||
337 | pop %si; |
334 | pop %si |
338 | pop %di; |
335 | pop %di |
339 | pop %cx; |
336 | pop %cx |
340 | cmp $VESA_OK,%al; |
337 | cmp $VESA_OK, %al |
341 | jnz 0f; |
338 | jnz 0f |
342 | - | ||
343 | 339 | ||
344 | mov $CONFIG_VESA_WIDTH,%ax; |
340 | mov $CONFIG_VESA_WIDTH, %ax |
345 | cmp VESA_MODE_WIDTH_OFFSET(%di),%ax; |
341 | cmp VESA_MODE_WIDTH_OFFSET(%di), %ax |
346 | jnz 1b; |
342 | jnz 1b |
- | 343 | ||
347 | mov $CONFIG_VESA_HEIGHT,%ax; |
344 | mov $CONFIG_VESA_HEIGHT,%ax |
348 | cmp VESA_MODE_HEIGHT_OFFSET(%di),%ax; |
345 | cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax |
349 | jnz 1b; |
346 | jnz 1b |
- | 347 | ||
350 | mov $CONFIG_VESA_BPP,%al; |
348 | mov $CONFIG_VESA_BPP, %al |
351 | cmp VESA_MODE_BPP_OFFSET(%di),%al; |
349 | cmp VESA_MODE_BPP_OFFSET(%di), %al |
352 | jz 2f; |
350 | jz 2f |
- | 351 | ||
353 | mov $CONFIG_VESA_BPP_a,%al; |
352 | mov $CONFIG_VESA_BPP_a, %al |
354 | cmp VESA_MODE_BPP_OFFSET(%di),%al; |
353 | cmp VESA_MODE_BPP_OFFSET(%di), %al |
355 | jnz 1b; |
354 | jnz 1b |
356 | 355 | ||
357 | 2: |
356 | 2: |
358 | - | ||
359 | mov %cx,%bx; |
- | |
360 | or $0xC000,%bx; |
- | |
361 | push %di; |
- | |
362 | mov $VESA_SET_MODE,%ax; |
- | |
363 | int $0x10; |
- | |
364 | pop %di; |
- | |
365 | cmp $VESA_OK,%al; |
- | |
366 | jnz 0f; |
- | |
367 | - | ||
368 | mov VESA_MODE_PHADDR_OFFSET(%di),%esi; |
- | |
369 | mov VESA_MODE_WIDTH_OFFSET(%di),%ax; |
- | |
370 | shl $16,%eax; |
- | |
371 | mov VESA_MODE_HEIGHT_OFFSET(%di),%ax; |
- | |
372 | mov VESA_MODE_BPP_OFFSET(%di),%bl; |
- | |
373 | xor %bh,%bh; |
- | |
374 | shl $16,%ebx; |
- | |
375 | mov VESA_MODE_SCANLINE_OFFSET(%di),%bx; |
- | |
376 | mov %eax,%edi; |
- | |
377 | 357 | ||
- | 358 | mov %cx, %bx |
|
- | 359 | or $0xc000, %bx |
|
- | 360 | push %di |
|
- | 361 | mov $VESA_SET_MODE, %ax |
|
- | 362 | int $0x10 |
|
- | 363 | ||
- | 364 | pop %di |
|
- | 365 | cmp $VESA_OK, %al |
|
- | 366 | jnz 0f |
|
- | 367 | ||
- | 368 | mov VESA_MODE_PHADDR_OFFSET(%di), %esi |
|
- | 369 | mov VESA_MODE_WIDTH_OFFSET(%di), %ax |
|
- | 370 | shl $16, %eax |
|
- | 371 | mov VESA_MODE_HEIGHT_OFFSET(%di), %ax |
|
- | 372 | mov VESA_MODE_BPP_OFFSET(%di), %bl |
|
- | 373 | xor %bh, %bh |
|
- | 374 | shl $16, %ebx |
|
- | 375 | mov VESA_MODE_SCANLINE_OFFSET(%di), %bx |
|
- | 376 | mov %eax, %edi |
|
378 | 377 | ||
379 | - | ||
380 | 8: |
378 | 8: |
381 | 379 | ||
382 | mov %cr0,%eax; |
380 | mov %cr0, %eax |
383 | or $1,%eax; |
381 | or $1, %eax |
384 | mov %eax,%cr0; |
382 | mov %eax,%cr0 |
385 | 383 | ||
386 | jmp 9f; |
384 | jmp 9f |
387 | 9: |
385 | 9: |
- | 386 | ||
- | 387 | ljmpl $KTEXT, $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4) |
|
388 | 388 | ||
389 | pop %cx; |
- | |
390 | pop %ebp; |
- | |
391 | pop %gs; |
- | |
392 | pop %fs; |
- | |
393 | pop %es; |
- | |
394 | pop %ds; |
- | |
395 | mov %cx,%ss; |
- | |
396 | mov %ebp,%esp; |
- | |
397 | - | ||
398 | ljmpl $KTEXT,$(vesa_init_protect-vesa_init+VESA_INIT_SEGMENT<<4); |
- | |
399 | - | ||
400 | - | ||
401 | 0: #Error no Prefered mode found |
389 | 0:# No prefered mode found |
402 | mov $0x111,%cx; |
390 | mov $0x111, %cx |
403 | push %di; |
391 | push %di |
404 | push %cx; |
392 | push %cx |
405 | mov $VESA_GET_MODE_INFO,%ax; |
393 | mov $VESA_GET_MODE_INFO, %ax |
406 | int $0x10; |
394 | int $0x10 |
- | 395 | ||
407 | pop %cx; |
396 | pop %cx |
408 | pop %di; |
397 | pop %di |
409 | cmp $VESA_OK,%al; |
398 | cmp $VESA_OK, %al |
410 | jnz 1f; |
399 | jnz 1f |
411 | jz 2b; /* Force relative jump */ |
400 | jz 2b # Force relative jump |
412 | 401 | ||
- | 402 | 1: |
|
413 | 1:mov $0x0003,%ax; |
403 | mov $0x0003, %ax |
414 | int $0x10; |
404 | int $0x10 |
415 | mov $0xffffffff,%edi; /* EGA text mode used, because of problems with VESA */ |
405 | mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA |
416 | xor %ax,%ax |
406 | xor %ax, %ax |
417 | jz 8b; /* Force relative jump */ |
407 | jz 8b # Force relative jump |
- | 408 | ||
418 | 409 | ||
419 | vesa_init_protect: |
- | |
420 | .code32 |
410 | .code32 |
- | 411 | vesa_init_protect: |
|
- | 412 | popl %esp |
|
- | 413 | ||
- | 414 | movw $KDATA, %cx |
|
- | 415 | movw %cx, %es |
|
- | 416 | movw %cx, %fs |
|
- | 417 | movw %cx, %gs |
|
- | 418 | movw %cx, %ds # kernel data + stack |
|
- | 419 | movw %cx, %ss |
|
421 | ret; |
420 | |
- | 421 | jmpl $KTEXT, $vesa_meeting_point |
|
422 | 422 | ||
423 | vesa_idt: |
- | |
424 | .word 0x03ff |
- | |
425 | .long 0 |
- | |
426 | .align 4 |
423 | .align 4 |
427 | e_vesa_init: |
424 | e_vesa_init: |
428 | #endif |
425 | #endif |
429 | 426 | ||
430 | .section K_DATA_START, "aw", @progbits |
427 | .section K_DATA_START, "aw", @progbits |