Changeset 421c833 in mainline
- Timestamp:
- 2009-03-13T12:58:43Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b6dfc32
- Parents:
- 99d6fd0
- Files:
-
- 6 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r99d6fd0 r421c833 421 421 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=monitor)&PLATFORM=sparc64&MACHINE=generic] CONFIG_FB (y/n) 422 422 423 % Framebuffer width 424 @ "640" 425 @ "800" 426 @ "1024" 427 @ "1152" 428 @ "1280" 429 @ "1400" 430 @ "1440" 431 @ "1600" 432 @ "2048" 433 ! [(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_HID_OUT!=none&CONFIG_FB=y] CONFIG_VESA_WIDTH (choice) 434 435 % Framebuffer height 436 @ "480" 437 @ "600" 438 @ "768" 439 @ "852" 440 @ "900" 441 @ "960" 442 @ "1024" 443 @ "1050" 444 @ "1200" 445 @ "1536" 446 ! [(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_HID_OUT!=none&CONFIG_FB=y] CONFIG_VESA_HEIGHT (choice) 447 448 % Framebuffer depth 423 % Default framebuffer mode 424 @ "640x480" 425 @ "800x600" 426 @ "1024x768" 427 @ "1152x720" 428 @ "1152x864" 429 @ "1280x960" 430 @ "1280x1024" 431 @ "1400x1050" 432 @ "1440x900" 433 @ "1440x1050" 434 @ "1600x1200" 435 @ "1920x1080" 436 @ "1920x1200" 437 ! [(PLATFORM=ia32|PLATFORM=amd64)&CONFIG_HID_OUT!=none&CONFIG_FB=y] CONFIG_VESA_MODE (choice) 438 439 % Default framebuffer depth 449 440 @ "8" 450 441 @ "16" -
defaults/amd64/Makefile.config
r99d6fd0 r421c833 50 50 CONFIG_FB = y 51 51 52 # Framebuffer width53 CONFIG_VESA_ WIDTH = 80052 # Default framebuffer mode 53 CONFIG_VESA_MODE = 800x600 54 54 55 # Framebuffer height 56 CONFIG_VESA_HEIGHT = 600 57 58 # Framebuffer depth 55 # Default framebuffer depth 59 56 CONFIG_VESA_BPP = 16 60 57 -
defaults/ia32/Makefile.config
r99d6fd0 r421c833 56 56 CONFIG_FB = y 57 57 58 # Framebuffer width59 CONFIG_VESA_ WIDTH = 80058 # Default framebuffer mode 59 CONFIG_VESA_MODE = 800x600 60 60 61 # Framebuffer height 62 CONFIG_VESA_HEIGHT = 600 63 64 # Framebuffer depth 61 # Default framebuffer depth 65 62 CONFIG_VESA_BPP = 16 66 63 -
kernel/arch/amd64/src/boot/boot.S
r99d6fd0 r421c833 38 38 39 39 #define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE) 40 40 41 41 .section K_TEXT_START, "ax" 42 42 … … 47 47 .long MULTIBOOT_HEADER_MAGIC 48 48 .long MULTIBOOT_HEADER_FLAGS 49 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) 49 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum 50 50 .long multiboot_header 51 51 .long unmapped_ktext_start … … 56 56 multiboot_image_start: 57 57 cld 58 movl $START_STACK, %esp 59 lgdtl bootstrap_gdtr 60 58 movl $START_STACK, %esp # initialize stack pointer 59 lgdtl bootstrap_gdtr # initialize Global Descriptor Table register 60 61 61 movw $gdtselector(KDATA_DES), %cx 62 62 movw %cx, %es 63 movw %cx, %ds 63 movw %cx, %ds # kernel data + stack 64 64 movw %cx, %ss 65 66 # 65 67 # Simics seems to remove hidden part of GS on entering user mode 66 # when _visible_ part of GS does not point to user-mode segment 68 # when _visible_ part of GS does not point to user-mode segment. 69 # 70 67 71 movw $gdtselector(UDATA_DES), %cx 68 72 movw %cx, %fs … … 72 76 multiboot_meeting_point: 73 77 74 movl %eax, grub_eax 78 movl %eax, grub_eax # save parameters from GRUB 75 79 movl %ebx, grub_ebx 76 80 81 # 77 82 # Protected 32-bit. We want to reuse the code-seg descriptor, 78 # the Default operand size must not be 1 when entering long mode 79 80 movl $(INTEL_CPUID_EXTENDED), %eax 81 cpuid 82 cmp $(INTEL_CPUID_EXTENDED), %eax 83 # the Default operand size must not be 1 when entering long mode. 84 # 85 86 movl $(INTEL_CPUID_EXTENDED), %eax 87 cpuid 88 cmp $(INTEL_CPUID_EXTENDED), %eax 83 89 ja extended_cpuid_supported 84 90 85 91 movl $extended_cpuid_msg, %esi 86 92 jmp error_halt … … 91 97 cpuid 92 98 bt $(AMD_EXT_LONG_MODE), %edx 93 94 99 jc long_mode_supported 100 95 101 movl $long_mode_msg, %esi 96 102 jmp error_halt 97 103 98 104 long_mode_supported: 99 105 … … 109 115 cpuid 110 116 bt $(INTEL_FXSAVE), %edx 111 117 jc fx_supported 112 118 113 119 movl $fx_msg, %esi … … 117 123 118 124 bt $(INTEL_SSE2), %edx 119 125 jc sse2_supported 120 126 121 127 movl $sse2_msg, %esi … … 123 129 124 130 sse2_supported: 125 126 #ifdef CONFIG_FB 127 mov $vesa_init, %esi 128 mov $VESA_INIT_SEGMENT << 4, %edi 129 mov $e_vesa_init - vesa_init, %ecx 130 rep movsb 131 132 mov $VESA_INIT_SEGMENT << 4, %edi 133 jmpl *%edi 134 135 vesa_meeting_point: 136 137 mov %esi, KA2PA(vesa_ph_addr) 138 mov %di, KA2PA(vesa_height) 139 shr $16, %edi 140 mov %di, KA2PA(vesa_width) 141 mov %bx, KA2PA(vesa_scanline) 142 shr $16, %ebx 143 mov %bx, KA2PA(vesa_bpp) 144 #endif 145 131 132 #include "vesa_prot.inc" 133 134 # 146 135 # Enable 64-bit page translation entries - CR4.PAE = 1. 147 # Paging is not enabled until after long mode is enabled 136 # Paging is not enabled until after long mode is enabled. 137 # 148 138 149 139 movl %cr4, %eax 150 140 btsl $5, %eax 151 141 movl %eax, %cr4 152 153 # Set up paging tables142 143 # set up paging tables 154 144 155 145 leal ptl_0, %eax 156 146 movl %eax, %cr3 157 147 158 # Enable long mode159 160 movl $EFER_MSR_NUM, %ecx 161 rdmsr # Read EFER162 btsl $AMD_LME_FLAG, %eax # Set LME = 1163 wrmsr # Write EFER164 165 # Enable paging to activate long mode (set CR0.PG = 1)148 # enable long mode 149 150 movl $EFER_MSR_NUM, %ecx # EFER MSR number 151 rdmsr # read EFER 152 btsl $AMD_LME_FLAG, %eax # set LME = 1 153 wrmsr # write EFER 154 155 # enable paging to activate long mode (set CR0.PG = 1) 166 156 167 157 movl %cr0, %eax … … 169 159 movl %eax, %cr0 170 160 171 # At this point we are in compatibility mode161 # at this point we are in compatibility mode 172 162 173 163 jmpl $gdtselector(KTEXT_DES), $start64 … … 176 166 start64: 177 167 movq $(PA2KA(START_STACK)), %rsp 178 179 # arch_pre_main(grub_eax, grub_ebx)168 169 # call arch_pre_main(grub_eax, grub_ebx) 180 170 xorq %rdi, %rdi 181 171 movl grub_eax, %edi … … 183 173 movl grub_ebx, %esi 184 174 call arch_pre_main 185 175 186 176 call main_bsp 187 188 # Not reached.177 178 # not reached 189 179 190 180 cli 191 hlt 192 193 #ifdef CONFIG_FB 194 .code32 195 vesa_init: 196 jmp $gdtselector(VESA_INIT_DES), $vesa_init_real - vesa_init 197 198 .code16 199 vesa_init_real: 200 201 mov %cr0, %eax 202 and $~1, %eax 203 mov %eax, %cr0 204 205 jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init 206 207 vesa_init_real2: 208 209 mov $VESA_INIT_SEGMENT, %bx 210 211 mov %bx, %es 212 mov %bx, %fs 213 mov %bx, %gs 214 mov %bx, %ds 215 mov %bx, %ss 216 217 movl $0x0000fffc, %esp 218 movl $0x0000fffc, %ebp 219 220 #define VESA_INFO_SIZE 1024 221 222 #define VESA_MODE_ATTRIBUTES_OFFSET 0 223 #define VESA_MODE_LIST_PTR_OFFSET 14 224 #define VESA_MODE_SCANLINE_OFFSET 16 225 #define VESA_MODE_WIDTH_OFFSET 18 226 #define VESA_MODE_HEIGHT_OFFSET 20 227 #define VESA_MODE_BPP_OFFSET 25 228 #define VESA_MODE_PHADDR_OFFSET 40 229 230 #define VESA_END_OF_MODES 0xffff 231 232 #define VESA_OK 0x4f 233 234 #define VESA_GET_INFO 0x4f00 235 #define VESA_GET_MODE_INFO 0x4f01 236 #define VESA_SET_MODE 0x4f02 237 #define VESA_SET_PALETTE 0x4f09 238 239 #define CONFIG_VESA_BPP_a 255 240 241 #if CONFIG_VESA_BPP == 24 242 #define CONFIG_VESA_BPP_VARIANT 32 243 #endif 244 245 mov $VESA_GET_INFO, %ax 246 mov $e_vesa_init - vesa_init, %di 247 push %di 248 int $0x10 249 250 pop %di 251 cmp $VESA_OK, %al 252 jnz 0f 253 254 mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si 255 mov %si, %gs 256 mov VESA_MODE_LIST_PTR_OFFSET(%di), %si 257 258 add $VESA_INFO_SIZE, %di 259 260 1:# Try next mode 261 mov %gs:(%si), %cx 262 cmp $VESA_END_OF_MODES, %cx 263 jz 0f 264 265 inc %si 266 inc %si 267 push %cx 268 push %di 269 push %si 270 mov $VESA_GET_MODE_INFO, %ax 271 int $0x10 272 273 pop %si 274 pop %di 275 pop %cx 276 cmp $VESA_OK, %al 277 jnz 0f 278 279 mov $CONFIG_VESA_WIDTH, %ax 280 cmp VESA_MODE_WIDTH_OFFSET(%di), %ax 281 jnz 1b 282 283 mov $CONFIG_VESA_HEIGHT, %ax 284 cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax 285 jnz 1b 286 287 mov $CONFIG_VESA_BPP, %al 288 cmp VESA_MODE_BPP_OFFSET(%di), %al 289 290 #ifdef CONFIG_VESA_BPP_VARIANT 291 jz 2f 292 293 mov $CONFIG_VESA_BPP_VARIANT, %al 294 cmp VESA_MODE_BPP_OFFSET(%di), %al 295 #endif 296 jnz 1b 297 298 2: 299 300 mov %cx, %bx 301 or $0xc000, %bx 302 push %di 303 mov $VESA_SET_MODE, %ax 304 int $0x10 305 306 pop %di 307 cmp $VESA_OK, %al 308 jnz 0f 309 310 #if CONFIG_VESA_BPP == 8 311 312 # Set 3:2:3 VGA palette 313 314 mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax 315 push %di 316 mov $vga323 - vesa_init, %di 317 mov $0x100, %ecx 318 319 bt $5, %ax # Test if VGA compatible registers are present 320 jnc vga_compat 321 322 # Try VESA routine to set palette 323 324 mov $VESA_SET_PALETTE, %ax 325 xor %bl, %bl 326 xor %dx, %dx 327 int $0x10 328 329 cmp $0x00, %ah 330 je vga_not_compat 331 332 vga_compat: 333 334 # Try VGA registers to set palette 335 336 movw $0x3c6, %dx # Set palette mask 337 movb $0xff, %al 338 outb %al, %dx 339 340 movw $0x3c8, %dx # First index to set 341 xor %al, %al 342 outb %al, %dx 343 344 movw $0x3c9, %dx # Data port 345 vga_loop: 346 movb %es:2(%di), %al 347 outb %al, %dx 348 349 movb %es:1(%di), %al 350 outb %al, %dx 351 352 movb %es:(%di), %al 353 outb %al, %dx 354 355 addw $4, %di 356 loop vga_loop 357 358 vga_not_compat: 359 360 pop %di 361 362 #endif 363 364 mov VESA_MODE_PHADDR_OFFSET(%di), %esi 365 mov VESA_MODE_WIDTH_OFFSET(%di), %ax 366 shl $16, %eax 367 mov VESA_MODE_HEIGHT_OFFSET(%di), %ax 368 mov VESA_MODE_BPP_OFFSET(%di), %bl 369 xor %bh, %bh 370 shl $16, %ebx 371 mov VESA_MODE_SCANLINE_OFFSET(%di), %bx 372 mov %eax, %edi 373 374 8: 375 376 mov %cr0, %eax 377 or $1, %eax 378 mov %eax, %cr0 379 380 jmp 9f 381 9: 382 383 ljmpl $gdtselector(KTEXT32_DES), $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4) 384 385 0:# No prefered mode found 386 mov $0x111, %cx 387 push %di 388 push %cx 389 mov $VESA_GET_MODE_INFO, %ax 390 int $0x10 391 392 pop %cx 393 pop %di 394 cmp $VESA_OK, %al 395 jnz 1f 396 jz 2b # Force relative jump 397 398 1: 399 mov $0x0003, %ax 400 int $0x10 401 mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA 402 xor %ax, %ax 403 jz 8b # Force relative jump 404 405 vga323: 406 #include "vga323.pal" 407 408 .code32 409 vesa_init_protect: 410 movw $gdtselector(KDATA_DES), %cx 411 movw %cx, %es 412 movw %cx, %ds # kernel data + stack 413 movw %cx, %ss 414 # Simics seems to remove hidden part of GS on entering user mode 415 # when _visible_ part of GS does not point to user-mode segment 416 movw $gdtselector(UDATA_DES), %cx 417 movw %cx, %fs 418 movw %cx, %gs 419 420 movl $START_STACK, %esp # initialize stack pointer 421 422 jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point 423 424 .align 4 425 e_vesa_init: 426 #endif 181 hlt0: 182 hlt 183 jmp hlt0 427 184 428 185 # Print string from %esi to EGA display (in red) and halt 429 186 error_halt: 430 movl $0xb8000, %edi 187 movl $0xb8000, %edi # base of EGA text mode memory 431 188 xorl %eax, %eax 432 189 433 movw $0x3d4, %dx 190 movw $0x3d4, %dx # read bits 8 - 15 of the cursor address 434 191 movb $0xe, %al 435 192 outb %al, %dx … … 439 196 shl $8, %ax 440 197 441 movw $0x3d4, %dx 198 movw $0x3d4, %dx # read bits 0 - 7 of the cursor address 442 199 movb $0xf, %al 443 200 outb %al, %dx … … 448 205 cmp $1920, %ax 449 206 jbe cursor_ok 450 movw $1920, %ax # sanity check for the cursor on the last line 207 208 movw $1920, %ax # sanity check for the cursor on the last line 209 451 210 cursor_ok: 452 211 … … 455 214 addl %eax, %edi 456 215 457 movw $0x0c00, %ax 216 movw $0x0c00, %ax # black background, light red foreground 458 217 459 218 ploop: … … 462 221 je ploop_end 463 222 stosw 464 inc %bx 223 inc %bx 465 224 jmp ploop 466 225 ploop_end: 467 226 468 movw $0x3d4, %dx 227 movw $0x3d4, %dx # write bits 8 - 15 of the cursor address 469 228 movb $0xe, %al 470 229 outb %al, %dx … … 474 233 outb %al, %dx 475 234 476 movw $0x3d4, %dx 235 movw $0x3d4, %dx # write bits 0 - 7 of the cursor address 477 236 movb $0xf, %al 478 237 outb %al, %dx … … 481 240 movb %bl, %al 482 241 outb %al, %dx 483 242 484 243 cli 485 hlt 486 244 hlt1: 245 hlt 246 jmp hlt1 247 248 #include "vesa_real.inc" 487 249 488 250 .section K_INI_PTLS, "aw", @progbits … … 490 252 # 491 253 # Macro for generating initial page table contents. 492 # @param cnt 493 # @param g 254 # @param cnt Number of entries to generat. Must be multiple of 8. 255 # @param g Number of GB that will be added to the mapping. 494 256 # 495 257 .macro ptl2gen cnt g … … 543 305 .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT) 544 306 .fill 1, 8, 0 545 307 546 308 .align 4096 547 309 .global ptl_0 -
kernel/arch/amd64/src/boot/memmap.c
r99d6fd0 r421c833 27 27 */ 28 28 29 /** @addtogroup amd64mm 29 /** @addtogroup amd64mm 30 30 * @{ 31 31 */ -
kernel/arch/ia32/src/boot/boot.S
r99d6fd0 r421c833 43 43 .long MULTIBOOT_HEADER_MAGIC 44 44 .long MULTIBOOT_HEADER_FLAGS 45 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) 45 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum 46 46 .long multiboot_header 47 47 .long unmapped_ktext_start … … 49 49 .long 0 50 50 .long multiboot_image_start 51 51 52 52 multiboot_image_start: 53 53 cld 54 movl $START_STACK, %esp 55 lgdt KA2PA(bootstrap_gdtr) 56 57 movw $ selector(KDATA_DES), %cx54 movl $START_STACK, %esp # initialize stack pointer 55 lgdt KA2PA(bootstrap_gdtr) # initialize Global Descriptor Table register 56 57 movw $gdtselector(KDATA_DES), %cx 58 58 movw %cx, %es 59 59 movw %cx, %fs 60 60 movw %cx, %gs 61 movw %cx, %ds 61 movw %cx, %ds # kernel data + stack 62 62 movw %cx, %ss 63 63 64 jmpl $ selector(KTEXT_DES), $multiboot_meeting_point64 jmpl $gdtselector(KTEXT_DES), $multiboot_meeting_point 65 65 multiboot_meeting_point: 66 66 67 movl %eax, grub_eax 67 movl %eax, grub_eax # save parameters from GRUB 68 68 movl %ebx, grub_ebx 69 69 70 xorl %eax, %eax 71 72 cmp $0x0, %eax# any function > 0?70 xorl %eax, %eax 71 cpuid 72 cmp $0x0, %eax # any function > 0? 73 73 jbe pse_unsupported 74 movl $0x1, %eax # Basic function code 174 movl $0x1, %eax # basic function code 1 75 75 cpuid 76 bt $3, %edx # Test if PSE is supported76 bt $3, %edx # test if PSE is supported 77 77 jc pse_supported 78 78 79 79 pse_unsupported: 80 80 movl $pse_msg, %esi … … 82 82 83 83 pse_supported: 84 85 #ifdef CONFIG_FB 86 mov $vesa_init, %esi 87 mov $VESA_INIT_SEGMENT << 4, %edi 88 mov $e_vesa_init - vesa_init, %ecx 89 rep movsb 90 91 mov $VESA_INIT_SEGMENT << 4, %edi 92 jmpl *%edi 93 94 vesa_meeting_point: 95 96 mov %esi, KA2PA(vesa_ph_addr) 97 mov %di, KA2PA(vesa_height) 98 shr $16, %edi 99 mov %di, KA2PA(vesa_width) 100 mov %bx, KA2PA(vesa_scanline) 101 shr $16, %ebx 102 mov %bx, KA2PA(vesa_bpp) 103 #endif 104 105 call map_kernel # map kernel and turn paging on 106 107 # arch_pre_main(grub_eax, grub_ebx) 84 85 #include "vesa_prot.inc" 86 87 # map kernel and turn paging on 88 call map_kernel 89 90 # call arch_pre_main(grub_eax, grub_ebx) 108 91 pushl grub_ebx 109 92 pushl grub_eax … … 112 95 call main_bsp 113 96 114 # Not reached. 115 97 # not reached 116 98 cli 117 hlt 99 hlt0: 100 hlt 101 jmp hlt0 118 102 119 103 .global map_kernel … … 124 108 # 125 109 movl %cr4, %ecx 126 orl $(1 << 4), %ecx 127 andl $(~(1 << 5)), %ecx 110 orl $(1 << 4), %ecx # turn PSE on 111 andl $(~(1 << 5)), %ecx # turn PAE off 128 112 movl %ecx, %cr4 129 113 … … 132 116 xorl %ecx, %ecx 133 117 xorl %ebx, %ebx 134 0: 135 movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax 136 orl %ebx, %eax 137 movl %eax, (%esi, %ecx, 4) # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 138 movl %eax, (%edi, %ecx, 4) # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 139 addl $(4 * 1024 * 1024), %ebx 140 141 incl %ecx 142 cmpl $512, %ecx 143 jl 0b 144 118 119 floop: 120 movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax 121 orl %ebx, %eax 122 movl %eax, (%esi, %ecx, 4) # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 123 movl %eax, (%edi, %ecx, 4) # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M 124 addl $(4 * 1024 * 1024), %ebx 125 126 incl %ecx 127 cmpl $512, %ecx 128 jl floop 129 145 130 movl %esi, %cr3 146 131 147 132 movl %cr0, %ebx 148 orl $(1 << 31), %ebx 133 orl $(1 << 31), %ebx # turn paging on 149 134 movl %ebx, %cr0 150 135 ret … … 152 137 # Print string from %esi to EGA display (in red) and halt 153 138 error_halt: 154 movl $0xb8000, %edi 139 movl $0xb8000, %edi # base of EGA text mode memory 155 140 xorl %eax, %eax 156 141 157 movw $0x3d4, %dx 142 movw $0x3d4, %dx # read bits 8 - 15 of the cursor address 158 143 movb $0xe, %al 159 144 outb %al, %dx … … 163 148 shl $8, %ax 164 149 165 movw $0x3d4, %dx 150 movw $0x3d4, %dx # read bits 0 - 7 of the cursor address 166 151 movb $0xf, %al 167 152 outb %al, %dx … … 172 157 cmp $1920, %ax 173 158 jbe cursor_ok 174 movw $1920, %ax # sanity check for the cursor on the last line 159 160 movw $1920, %ax # sanity check for the cursor on the last line 161 175 162 cursor_ok: 176 163 … … 179 166 addl %eax, %edi 180 167 181 movw $0x0c00, %ax 168 movw $0x0c00, %ax # black background, light red foreground 182 169 183 170 ploop: … … 186 173 je ploop_end 187 174 stosw 188 inc %bx 175 inc %bx 189 176 jmp ploop 190 177 ploop_end: 191 178 192 movw $0x3d4, %dx 179 movw $0x3d4, %dx # write bits 8 - 15 of the cursor address 193 180 movb $0xe, %al 194 181 outb %al, %dx … … 198 185 outb %al, %dx 199 186 200 movw $0x3d4, %dx 187 movw $0x3d4, %dx # write bits 0 - 7 of the cursor address 201 188 movb $0xf, %al 202 189 outb %al, %dx … … 205 192 movb %bl, %al 206 193 outb %al, %dx 207 194 208 195 cli 209 hlt 210 211 #ifdef CONFIG_FB 212 vesa_init: 213 jmp $selector(VESA_INIT_DES), $vesa_init_real - vesa_init 214 215 .code16 216 vesa_init_real: 217 218 mov %cr0, %eax 219 and $~1, %eax 220 mov %eax, %cr0 221 222 jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init 223 224 vesa_init_real2: 225 226 mov $VESA_INIT_SEGMENT, %bx 227 228 mov %bx, %es 229 mov %bx, %fs 230 mov %bx, %gs 231 mov %bx, %ds 232 mov %bx, %ss 233 234 movl %esp, %eax 235 movl $0x0000fffc, %esp 236 movl $0x0000fffc, %ebp 237 pushl %eax 238 239 #define VESA_INFO_SIZE 1024 240 241 #define VESA_MODE_ATTRIBUTES_OFFSET 0 242 #define VESA_MODE_LIST_PTR_OFFSET 14 243 #define VESA_MODE_SCANLINE_OFFSET 16 244 #define VESA_MODE_WIDTH_OFFSET 18 245 #define VESA_MODE_HEIGHT_OFFSET 20 246 #define VESA_MODE_BPP_OFFSET 25 247 #define VESA_MODE_PHADDR_OFFSET 40 248 249 #define VESA_END_OF_MODES 0xffff 250 251 #define VESA_OK 0x4f 252 253 #define VESA_GET_INFO 0x4f00 254 #define VESA_GET_MODE_INFO 0x4f01 255 #define VESA_SET_MODE 0x4f02 256 #define VESA_SET_PALETTE 0x4f09 257 258 #if CONFIG_VESA_BPP == 24 259 #define CONFIG_VESA_BPP_VARIANT 32 260 #endif 261 262 mov $VESA_GET_INFO, %ax 263 mov $e_vesa_init - vesa_init, %di 264 push %di 265 int $0x10 266 267 pop %di 268 cmp $VESA_OK, %al 269 jnz 0f 270 271 mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si 272 mov %si, %gs 273 mov VESA_MODE_LIST_PTR_OFFSET(%di), %si 274 275 add $VESA_INFO_SIZE, %di 276 277 1:# Try next mode 278 mov %gs:(%si), %cx 279 cmp $VESA_END_OF_MODES, %cx 280 jz 0f 281 282 inc %si 283 inc %si 284 push %cx 285 push %di 286 push %si 287 mov $VESA_GET_MODE_INFO, %ax 288 int $0x10 289 290 pop %si 291 pop %di 292 pop %cx 293 cmp $VESA_OK, %al 294 jnz 0f 295 296 mov $CONFIG_VESA_WIDTH, %ax 297 cmp VESA_MODE_WIDTH_OFFSET(%di), %ax 298 jnz 1b 299 300 mov $CONFIG_VESA_HEIGHT, %ax 301 cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax 302 jnz 1b 303 304 mov $CONFIG_VESA_BPP, %al 305 cmp VESA_MODE_BPP_OFFSET(%di), %al 306 307 #ifdef CONFIG_VESA_BPP_VARIANT 308 jz 2f 309 310 mov $CONFIG_VESA_BPP_VARIANT, %al 311 cmp VESA_MODE_BPP_OFFSET(%di), %al 312 #endif 313 jnz 1b 314 315 2: 316 317 mov %cx, %bx 318 or $0xc000, %bx 319 push %di 320 mov $VESA_SET_MODE, %ax 321 int $0x10 322 323 pop %di 324 cmp $VESA_OK, %al 325 jnz 0f 326 327 #if CONFIG_VESA_BPP == 8 328 329 # Set 3:2:3 VGA palette 330 331 mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax 332 push %di 333 mov $vga323 - vesa_init, %di 334 mov $0x100, %ecx 335 336 bt $5, %ax # Test if VGA compatible registers are present 337 jnc vga_compat 338 339 # Try VESA routine to set palette 340 341 mov $VESA_SET_PALETTE, %ax 342 xor %bl, %bl 343 xor %dx, %dx 344 int $0x10 345 346 cmp $0x00, %ah 347 je vga_not_compat 348 349 vga_compat: 350 351 # Try VGA registers to set palette 352 353 movw $0x3c6, %dx # Set palette mask 354 movb $0xff, %al 355 outb %al, %dx 356 357 movw $0x3c8, %dx # First index to set 358 xor %al, %al 359 outb %al, %dx 360 361 movw $0x3c9, %dx # Data port 362 vga_loop: 363 movb %es:2(%di), %al 364 outb %al, %dx 365 366 movb %es:1(%di), %al 367 outb %al, %dx 368 369 movb %es:(%di), %al 370 outb %al, %dx 371 372 addw $4, %di 373 loop vga_loop 374 375 vga_not_compat: 376 377 pop %di 378 379 #endif 380 381 mov VESA_MODE_PHADDR_OFFSET(%di), %esi 382 mov VESA_MODE_WIDTH_OFFSET(%di), %ax 383 shl $16, %eax 384 mov VESA_MODE_HEIGHT_OFFSET(%di), %ax 385 mov VESA_MODE_BPP_OFFSET(%di), %bl 386 xor %bh, %bh 387 shl $16, %ebx 388 mov VESA_MODE_SCANLINE_OFFSET(%di), %bx 389 mov %eax, %edi 390 391 8: 392 393 mov %cr0, %eax 394 or $1, %eax 395 mov %eax, %cr0 396 397 jmp 9f 398 9: 399 400 ljmpl $selector(KTEXT_DES), $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4) 401 402 0:# No prefered mode found 403 mov $0x111, %cx 404 push %di 405 push %cx 406 mov $VESA_GET_MODE_INFO, %ax 407 int $0x10 408 409 pop %cx 410 pop %di 411 cmp $VESA_OK, %al 412 jnz 1f 413 jz 2b # Force relative jump 414 415 1: 416 mov $0x0003, %ax 417 int $0x10 418 mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA 419 xor %ax, %ax 420 jz 8b # Force relative jump 421 422 vga323: 423 #include "vga323.pal" 424 425 .code32 426 vesa_init_protect: 427 movw $selector(KDATA_DES), %cx 428 movw %cx, %es 429 movw %cx, %fs 430 movw %cx, %gs 431 movw %cx, %ds # kernel data + stack 432 movw %cx, %ss 433 434 movl $START_STACK, %esp # initialize stack pointer 435 436 jmpl $selector(KTEXT_DES), $vesa_meeting_point 437 438 .align 4 439 e_vesa_init: 440 #endif 196 hlt1: 197 hlt 198 jmp hlt1 199 200 #include "vesa_real.inc" 441 201 442 202 .section K_DATA_START, "aw", @progbits
Note:
See TracChangeset
for help on using the changeset viewer.