Changeset 421c833 in mainline for kernel/arch/amd64/src/boot/boot.S
- Timestamp:
- 2009-03-13T12:58:43Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b6dfc32
- Parents:
- 99d6fd0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.