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 |