Changeset bd48f4c in mainline for kernel/arch/amd64/src
- Timestamp:
- 2010-07-12T10:53:30Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/fix-logger-deadlock, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bd11d3e
- Parents:
- c40e6ef (diff), bee2d4c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/arch/amd64/src
- Files:
-
- 1 added
- 1 deleted
- 15 edited
-
amd64.c (modified) (3 diffs)
-
asm.S (added)
-
asm_utils.S (deleted)
-
boot/boot.S (modified) (19 diffs)
-
boot/vesa_ret.inc (modified) (2 diffs)
-
context.S (modified) (2 diffs)
-
cpu/cpu.c (modified) (2 diffs)
-
debug/stacktrace.c (modified) (3 diffs)
-
debugger.c (modified) (4 diffs)
-
delay.S (modified) (1 diff)
-
fpu_context.c (modified) (1 diff)
-
interrupt.c (modified) (6 diffs)
-
mm/page.c (modified) (4 diffs)
-
proc/scheduler.c (modified) (2 diffs)
-
proc/task.c (modified) (1 diff)
-
proc/thread.c (modified) (1 diff)
-
smp/ap.S (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/amd64.c
rc40e6ef rbd48f4c 122 122 /* Enable FPU */ 123 123 cpu_setup_fpu(); 124 124 125 125 /* Initialize segmentation */ 126 126 pm_init(); … … 132 132 /* Disable alignment check */ 133 133 clean_AM_flag(); 134 134 135 135 if (config.cpu_active == 1) { 136 136 interrupt_init(); … … 260 260 THREAD->arch.tls = addr; 261 261 write_msr(AMD_MSR_FS, addr); 262 262 263 return 0; 263 264 } -
kernel/arch/amd64/src/boot/boot.S
rc40e6ef rbd48f4c 1 # 2 #Copyright (c) 2005 Ondrej Palkovsky3 #Copyright (c) 2006 Martin Decky4 #Copyright (c) 2008 Jakub Jermar5 #All rights reserved.6 # 7 #Redistribution and use in source and binary forms, with or without8 #modification, are permitted provided that the following conditions9 #are met:10 # 11 #- Redistributions of source code must retain the above copyright12 #notice, this list of conditions and the following disclaimer.13 #- Redistributions in binary form must reproduce the above copyright14 #notice, this list of conditions and the following disclaimer in the15 #documentation and/or other materials provided with the distribution.16 #- The name of the author may not be used to endorse or promote products17 #derived from this software without specific prior written permission.18 # 19 #THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR20 #IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES21 #OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.22 #IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,23 #INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT24 #NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,25 #DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY26 #THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT27 #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF28 #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.29 # 1 /* 2 * Copyright (c) 2005 Ondrej Palkovsky 3 * Copyright (c) 2006 Martin Decky 4 * Copyright (c) 2008 Jakub Jermar 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * - Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * - Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * - The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 30 31 31 #include <arch/boot/boot.h> 32 32 #include <arch/boot/memmap.h> 33 #include <arch/mm/page.h> 33 #include <arch/mm/page.h> 34 34 #include <arch/mm/ptl.h> 35 35 #include <arch/pm.h> … … 37 37 #include <arch/cpuid.h> 38 38 39 #define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE)39 #define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE) 40 40 41 41 .section K_TEXT_START, "ax" 42 42 43 43 .code32 44 45 .macro pm_error msg 46 movl \msg, %esi 47 jmp pm_error_halt 48 .endm 49 50 .macro pm_status msg 51 #ifdef CONFIG_EGA 52 pushl %esi 53 movl \msg, %esi 54 call pm_early_puts 55 popl %esi 56 #endif 57 .endm 58 59 .macro pm2_status msg 60 #ifndef CONFIG_FB 61 pm_status \msg 62 #endif 63 .endm 64 44 65 .align 4 45 66 .global multiboot_image_start … … 47 68 .long MULTIBOOT_HEADER_MAGIC 48 69 .long MULTIBOOT_HEADER_FLAGS 49 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum70 .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) /* checksum */ 50 71 .long multiboot_header 51 72 .long unmapped_ktext_start … … 56 77 multiboot_image_start: 57 78 cld 58 movl $START_STACK, %esp # initialize stack pointer 59 lgdtl bootstrap_gdtr # initialize Global Descriptor Table register 60 79 80 /* Initialize stack pointer */ 81 movl $START_STACK, %esp 82 83 /* Initialize Global Descriptor Table register */ 84 lgdtl bootstrap_gdtr 85 86 /* Kernel data + stack */ 61 87 movw $gdtselector(KDATA_DES), %cx 62 88 movw %cx, %es 63 movw %cx, %ds # kernel data + stack89 movw %cx, %ds 64 90 movw %cx, %ss 65 91 66 # 67 # Simics seems to remove hidden part of GS on entering user mode 68 # when _visible_ part of GS does not point to user-mode segment. 69 # 70 92 /* 93 * Simics seems to remove hidden part of GS on entering user mode 94 * when _visible_ part of GS does not point to user-mode segment. 95 */ 71 96 movw $gdtselector(UDATA_DES), %cx 72 97 movw %cx, %fs … … 76 101 multiboot_meeting_point: 77 102 78 movl %eax, grub_eax # save parameters from GRUB 103 /* Save GRUB arguments */ 104 movl %eax, grub_eax 79 105 movl %ebx, grub_ebx 80 106 81 # 82 # Protected 32-bit. We want to reuse the code-seg descriptor, 83 # the Default operand size must not be 1 when entering long mode. 84 # 107 pm_status $status_prot 85 108 86 109 movl $(INTEL_CPUID_EXTENDED), %eax … … 89 112 ja extended_cpuid_supported 90 113 91 movl $extended_cpuid_msg, %esi 92 jmp error_halt 114 pm_error $err_extended_cpuid 93 115 94 116 extended_cpuid_supported: … … 99 121 jc long_mode_supported 100 122 101 movl $long_mode_msg, %esi 102 jmp error_halt 123 pm_error $err_long_mode 103 124 104 125 long_mode_supported: … … 107 128 jc noexecute_supported 108 129 109 movl $noexecute_msg, %esi 110 jmp error_halt 130 pm_error $err_noexecute 111 131 112 132 noexecute_supported: … … 117 137 jc fx_supported 118 138 119 movl $fx_msg, %esi 120 jmp error_halt 139 pm_error $err_fx 121 140 122 141 fx_supported: … … 125 144 jc sse2_supported 126 145 127 movl $sse2_msg, %esi 128 jmp error_halt 146 pm_error $err_sse2 129 147 130 148 sse2_supported: 131 149 132 150 #include "vesa_prot.inc" 133 134 # 135 # Enable 64-bit page translation entries - CR4.PAE = 1. 136 # Paging is not enabled until after long mode is enabled. 137 # 151 152 /* 153 * Protected 32-bit. We want to reuse the code-seg descriptor, 154 * the Default operand size must not be 1 when entering long mode. 155 */ 156 157 pm2_status $status_prot2 158 159 /* 160 * Enable 64-bit page translation entries - CR4.PAE = 1. 161 * Paging is not enabled until after long mode is enabled. 162 */ 138 163 139 164 movl %cr4, %eax … … 141 166 movl %eax, %cr4 142 167 143 # set up paging tables 144 168 /* Set up paging tables */ 145 169 leal ptl_0, %eax 146 170 movl %eax, %cr3 147 171 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) 156 172 /* Enable long mode */ 173 movl $EFER_MSR_NUM, %ecx 174 rdmsr /* read EFER */ 175 btsl $AMD_LME_FLAG, %eax /* set LME = 1 */ 176 wrmsr 177 178 /* Enable paging to activate long mode (set CR0.PG = 1) */ 157 179 movl %cr0, %eax 158 180 btsl $31, %eax 159 181 movl %eax, %cr0 160 182 161 # at this point we are in compatibility mode 162 183 /* At this point we are in compatibility mode */ 163 184 jmpl $gdtselector(KTEXT_DES), $start64 164 185 186 /** Print string to EGA display (in light red) and halt. 187 * 188 * Should be executed from 32 bit protected mode with paging 189 * turned off. Stack is not required. This routine is used even 190 * if CONFIG_EGA is not enabled. Since we are going to halt the 191 * CPU anyway, it is always better to at least try to print 192 * some hints. 193 * 194 * @param %esi Pointer to the NULL-terminated string 195 * to be print. 196 * 197 */ 198 pm_error_halt: 199 movl $0xb8000, %edi /* base of EGA text mode memory */ 200 xorl %eax, %eax 201 202 /* Read bits 8 - 15 of the cursor address */ 203 movw $0x3d4, %dx 204 movb $0xe, %al 205 outb %al, %dx 206 207 movw $0x3d5, %dx 208 inb %dx, %al 209 shl $8, %ax 210 211 /* Read bits 0 - 7 of the cursor address */ 212 movw $0x3d4, %dx 213 movb $0xf, %al 214 outb %al, %dx 215 216 movw $0x3d5, %dx 217 inb %dx, %al 218 219 /* Sanity check for the cursor on screen */ 220 cmp $2000, %ax 221 jb err_cursor_ok 222 223 movw $1998, %ax 224 225 err_cursor_ok: 226 227 movw %ax, %bx 228 shl $1, %eax 229 addl %eax, %edi 230 231 err_ploop: 232 lodsb 233 234 cmp $0, %al 235 je err_ploop_end 236 237 movb $0x0c, %ah /* black background, light red foreground */ 238 stosw 239 240 /* Sanity check for the cursor on the last line */ 241 inc %bx 242 cmp $2000, %bx 243 jb err_ploop 244 245 /* Scroll the screen (24 rows) */ 246 movl %esi, %edx 247 movl $0xb80a0, %esi 248 movl $0xb8000, %edi 249 movl $960, %ecx 250 rep movsl 251 252 /* Clear the 24th row */ 253 xorl %eax, %eax 254 movl $40, %ecx 255 rep stosl 256 257 /* Go to row 24 */ 258 movl %edx, %esi 259 movl $0xb8f00, %edi 260 movw $1920, %bx 261 262 jmp err_ploop 263 err_ploop_end: 264 265 /* Write bits 8 - 15 of the cursor address */ 266 movw $0x3d4, %dx 267 movb $0xe, %al 268 outb %al, %dx 269 270 movw $0x3d5, %dx 271 movb %bh, %al 272 outb %al, %dx 273 274 /* Write bits 0 - 7 of the cursor address */ 275 movw $0x3d4, %dx 276 movb $0xf, %al 277 outb %al, %dx 278 279 movw $0x3d5, %dx 280 movb %bl, %al 281 outb %al, %dx 282 283 cli 284 hlt1: 285 hlt 286 jmp hlt1 287 288 /** Print string to EGA display (in light green). 289 * 290 * Should be called from 32 bit protected mode with paging 291 * turned off. A stack space of at least 24 bytes is required, 292 * but the function does not establish a stack frame. 293 * 294 * Macros such as pm_status and pm2_status take care that 295 * this function is used only when CONFIG_EGA is enabled 296 * and CONFIG_FB is disabled. 297 * 298 * @param %esi Pointer to the NULL-terminated string 299 * to be print. 300 * 301 */ 302 pm_early_puts: 303 pushl %eax 304 pushl %ebx 305 pushl %ecx 306 pushl %edx 307 pushl %edi 308 309 movl $0xb8000, %edi /* base of EGA text mode memory */ 310 xorl %eax, %eax 311 312 /* Read bits 8 - 15 of the cursor address */ 313 movw $0x3d4, %dx 314 movb $0xe, %al 315 outb %al, %dx 316 317 movw $0x3d5, %dx 318 inb %dx, %al 319 shl $8, %ax 320 321 /* Read bits 0 - 7 of the cursor address */ 322 movw $0x3d4, %dx 323 movb $0xf, %al 324 outb %al, %dx 325 326 movw $0x3d5, %dx 327 inb %dx, %al 328 329 /* Sanity check for the cursor on screen */ 330 cmp $2000, %ax 331 jb pm_puts_cursor_ok 332 333 movw $1998, %ax 334 335 pm_puts_cursor_ok: 336 337 movw %ax, %bx 338 shl $1, %eax 339 addl %eax, %edi 340 341 pm_puts_ploop: 342 lodsb 343 344 cmp $0, %al 345 je pm_puts_ploop_end 346 347 movb $0x0a, %ah /* black background, light green foreground */ 348 stosw 349 350 /* Sanity check for the cursor on the last line */ 351 inc %bx 352 cmp $2000, %bx 353 jb pm_puts_ploop 354 355 /* Scroll the screen (24 rows) */ 356 movl %esi, %edx 357 movl $0xb80a0, %esi 358 movl $0xb8000, %edi 359 movl $960, %ecx 360 rep movsl 361 362 /* Clear the 24th row */ 363 xorl %eax, %eax 364 movl $40, %ecx 365 rep stosl 366 367 /* Go to row 24 */ 368 movl %edx, %esi 369 movl $0xb8f00, %edi 370 movw $1920, %bx 371 372 jmp pm_puts_ploop 373 pm_puts_ploop_end: 374 375 /* Write bits 8 - 15 of the cursor address */ 376 movw $0x3d4, %dx 377 movb $0xe, %al 378 outb %al, %dx 379 380 movw $0x3d5, %dx 381 movb %bh, %al 382 outb %al, %dx 383 384 /* Write bits 0 - 7 of the cursor address */ 385 movw $0x3d4, %dx 386 movb $0xf, %al 387 outb %al, %dx 388 389 movw $0x3d5, %dx 390 movb %bl, %al 391 outb %al, %dx 392 393 popl %edi 394 popl %edx 395 popl %ecx 396 popl %ebx 397 popl %eax 398 399 ret 400 165 401 .code64 402 403 .macro long_status msg 404 pushq %rdi 405 movq \msg, %rdi 406 call early_puts 407 popq %rdi 408 .endm 409 166 410 start64: 411 412 /* 413 * Long mode. 414 */ 415 167 416 movq $(PA2KA(START_STACK)), %rsp 168 417 169 # call arch_pre_main(grub_eax, grub_ebx) 418 /* Create the first stack frame */ 419 pushq $0 420 movq %rsp, %rbp 421 422 long_status $status_long 423 424 /* Call arch_pre_main(grub_eax, grub_ebx) */ 170 425 xorq %rdi, %rdi 171 426 movl grub_eax, %edi 172 427 xorq %rsi, %rsi 173 428 movl grub_ebx, %esi 174 call arch_pre_main 175 176 # create the first stack frame 177 pushq $0 178 movq %rsp, %rbp 179 180 call main_bsp 181 182 # not reached 183 429 430 movabsq $arch_pre_main, %rax 431 callq *%rax 432 433 long_status $status_main 434 435 /* Call main_bsp() */ 436 movabsq $main_bsp, %rax 437 call *%rax 438 439 /* Not reached */ 184 440 cli 185 441 hlt0: … … 187 443 jmp hlt0 188 444 189 # Print string from %esi to EGA display (in red) and halt 190 error_halt: 191 movl $0xb8000, %edi # base of EGA text mode memory 192 xorl %eax, %eax 193 194 movw $0x3d4, %dx # read bits 8 - 15 of the cursor address 445 /** Print string to EGA display. 446 * 447 * Should be called from long mode (with paging enabled 448 * and stack established). This function is ABI compliant 449 * (without red-zone). 450 * 451 * If CONFIG_EGA is undefined or CONFIG_FB is defined 452 * then this function does nothing. 453 * 454 * @param %rdi Pointer to the NULL-terminated string 455 * to be printed. 456 * 457 */ 458 early_puts: 459 460 #if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB))) 461 462 /* Prologue, save preserved registers */ 463 pushq %rbp 464 movq %rsp, %rbp 465 pushq %rbx 466 467 movq %rdi, %rsi 468 movq $(PA2KA(0xb8000)), %rdi /* base of EGA text mode memory */ 469 xorq %rax, %rax 470 471 /* Read bits 8 - 15 of the cursor address */ 472 movw $0x3d4, %dx 195 473 movb $0xe, %al 196 474 outb %al, %dx … … 200 478 shl $8, %ax 201 479 202 movw $0x3d4, %dx # read bits 0 - 7 of the cursor address 480 /* Read bits 0 - 7 of the cursor address */ 481 movw $0x3d4, %dx 203 482 movb $0xf, %al 204 483 outb %al, %dx … … 207 486 inb %dx, %al 208 487 209 cmp $1920, %ax 210 jbe cursor_ok 211 212 movw $1920, %ax # sanity check for the cursor on the last line 213 214 cursor_ok: 488 /* Sanity check for the cursor on screen */ 489 cmp $2000, %ax 490 jb early_puts_cursor_ok 491 492 movw $1998, %ax 493 494 early_puts_cursor_ok: 215 495 216 496 movw %ax, %bx 217 shl $1, %eax 218 addl %eax, %edi 219 220 movw $0x0c00, %ax # black background, light red foreground 221 222 ploop: 497 shl $1, %rax 498 addq %rax, %rdi 499 500 early_puts_ploop: 223 501 lodsb 502 224 503 cmp $0, %al 225 je ploop_end 504 je early_puts_ploop_end 505 506 movb $0x0e, %ah /* black background, yellow foreground */ 226 507 stosw 508 509 /* Sanity check for the cursor on the last line */ 227 510 inc %bx 228 jmp ploop 229 ploop_end: 230 231 movw $0x3d4, %dx # write bits 8 - 15 of the cursor address 511 cmp $2000, %bx 512 jb early_puts_ploop 513 514 /* Scroll the screen (24 rows) */ 515 movq %rsi, %rdx 516 movq $(PA2KA(0xb80a0)), %rsi 517 movq $(PA2KA(0xb8000)), %rdi 518 movq $480, %rcx 519 rep movsq 520 521 /* Clear the 24th row */ 522 xorq %rax, %rax 523 movq $20, %rcx 524 rep stosq 525 526 /* Go to row 24 */ 527 movq %rdx, %rsi 528 movq $(PA2KA(0xb8f00)), %rdi 529 movw $1920, %bx 530 531 jmp early_puts_ploop 532 early_puts_ploop_end: 533 534 /* Write bits 8 - 15 of the cursor address */ 535 movw $0x3d4, %dx 232 536 movb $0xe, %al 233 537 outb %al, %dx … … 237 541 outb %al, %dx 238 542 239 movw $0x3d4, %dx # write bits 0 - 7 of the cursor address 543 /* Write bits 0 - 7 of the cursor address */ 544 movw $0x3d4, %dx 240 545 movb $0xf, %al 241 546 outb %al, %dx … … 245 550 outb %al, %dx 246 551 247 cli 248 hlt1: 249 hlt 250 jmp hlt1 552 /* Epilogue, restore preserved registers */ 553 popq %rbx 554 leave 555 556 #endif 557 558 ret 251 559 252 560 #include "vesa_real.inc" … … 254 562 .section K_INI_PTLS, "aw", @progbits 255 563 256 # 257 # Macro for generating initial page table contents. 258 # @param cnt Number of entries to generat. Must be multiple of 8. 259 # @param g Number of GB that will be added to the mapping. 260 # 261 .macro ptl2gen cnt g 262 .if \cnt 263 ptl2gen "\cnt - 8" \g 264 .quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 265 .quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 266 .quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 267 .quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 268 .quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 269 .quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 270 .quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 271 .quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 272 .endif 564 /** Generate initial page table contents. 565 * 566 * @param cnt Number of entries to generate. Must be multiple of 8. 567 * @param g Number of GB that will be added to the mapping. 568 * 569 */ 570 .macro ptl2gen cnt g 571 .if \cnt 572 ptl2gen "\cnt - 8" \g 573 .quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 574 .quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 575 .quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 576 .quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 577 .quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 578 .quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 579 .quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 580 .quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) 581 .endif 273 582 .endm 274 583 275 # Page table for pages in the first gigabyte. 276 .align 4096 277 .global ptl_2_0g 278 ptl_2_0g: 584 /* Page table for pages in the 1st gigabyte. */ 585 .align 4096 586 ptl_2_0g: 279 587 ptl2gen 512 0 280 588 281 # Page table for pages in the second gigabyte. 282 .align 4096 283 .global ptl_2_1g 589 /* Page table for pages in the 2nd gigabyte. */ 590 .align 4096 284 591 ptl_2_1g: 285 592 ptl2gen 512 1 286 593 287 # Page table for pages in the third gigabyte. 288 .align 4096 289 .global ptl_2_2g 594 /* Page table for pages in the 3rd gigabyte. */ 595 .align 4096 290 596 ptl_2_2g: 291 597 ptl2gen 512 2 292 598 293 # Page table for pages in the fourth gigabyte. 294 .align 4096 295 .global ptl_2_3g 599 /* Page table for pages in the 4th gigabyte. */ 600 .align 4096 296 601 ptl_2_3g: 297 602 ptl2gen 512 3 298 603 299 .align 4096 300 .global ptl_1 604 /* Page table for pages in the 5th gigabyte. */ 605 .align 4096 606 ptl_2_4g: 607 ptl2gen 512 4 608 609 /* Page table for pages in the 6th gigabyte. */ 610 .align 4096 611 ptl_2_5g: 612 ptl2gen 512 5 613 614 /* Page table for pages in the 7th gigabyte. */ 615 .align 4096 616 ptl_2_6g: 617 ptl2gen 512 6 618 619 /* Page table for pages in the 8th gigabyte. */ 620 .align 4096 621 ptl_2_7g: 622 ptl2gen 512 7 623 624 .align 4096 301 625 ptl_1: 302 # Identity mapping for [0; 4G)626 /* Identity mapping for [0; 8G) */ 303 627 .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT) 304 .quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT) 628 .quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT) 305 629 .quad ptl_2_2g + (PTL_WRITABLE | PTL_PRESENT) 306 630 .quad ptl_2_3g + (PTL_WRITABLE | PTL_PRESENT) 307 .fill 506, 8, 0 308 # Mapping of [0; 1G) at -2G 309 .quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT) 310 .fill 1, 8, 0 631 .quad ptl_2_4g + (PTL_WRITABLE | PTL_PRESENT) 632 .quad ptl_2_5g + (PTL_WRITABLE | PTL_PRESENT) 633 .quad ptl_2_6g + (PTL_WRITABLE | PTL_PRESENT) 634 .quad ptl_2_7g + (PTL_WRITABLE | PTL_PRESENT) 635 .fill 504, 8, 0 311 636 312 637 .align 4096 … … 314 639 ptl_0: 315 640 .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) 316 .fill 255, 8,0641 .fill 255, 8, 0 317 642 .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) 318 .fill 254,8,0 319 .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) 643 .fill 255, 8, 0 320 644 321 645 .section K_DATA_START, "aw", @progbits … … 332 656 .long 0 333 657 334 e xtended_cpuid_msg:658 err_extended_cpuid: 335 659 .asciz "Error: Extended CPUID not supported -- CPU is not 64-bit. System halted." 336 long_mode_msg:660 err_long_mode: 337 661 .asciz "Error: 64-bit long mode not supported. System halted." 338 noexecute_msg:662 err_noexecute: 339 663 .asciz "Error: No-execute pages not supported. System halted." 340 fx_msg:664 err_fx: 341 665 .asciz "Error: FXSAVE/FXRESTORE instructions not supported. System halted." 342 sse2_msg:666 err_sse2: 343 667 .asciz "Error: SSE2 instructions not supported. System halted." 668 669 status_prot: 670 .asciz "[prot] " 671 status_vesa_copy: 672 .asciz "[vesa_copy] " 673 status_grub_cmdline: 674 .asciz "[grub_cmdline] " 675 status_vesa_real: 676 .asciz "[vesa_real] " 677 status_prot2: 678 .asciz "[prot2] " 679 status_long: 680 .asciz "[long] " 681 status_main: 682 .asciz "[main] " -
kernel/arch/amd64/src/boot/vesa_ret.inc
rc40e6ef rbd48f4c 1 1 .code32 2 2 vesa_init_protected: 3 cld 4 5 /* Initialize stack pointer */ 6 movl $START_STACK, %esp 7 8 /* Kernel data + stack */ 3 9 movw $gdtselector(KDATA_DES), %cx 4 10 movw %cx, %es 5 movw %cx, %ds # kernel data + stack11 movw %cx, %ds 6 12 movw %cx, %ss 7 13 8 #9 #Simics seems to remove hidden part of GS on entering user mode10 #when _visible_ part of GS does not point to user-mode segment.11 #14 /* 15 * Simics seems to remove hidden part of GS on entering user mode 16 * when _visible_ part of GS does not point to user-mode segment. 17 */ 12 18 13 19 movw $gdtselector(UDATA_DES), %cx … … 15 21 movw %cx, %gs 16 22 17 movl $START_STACK, %esp # initialize stack pointer18 19 23 jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point -
kernel/arch/amd64/src/context.S
rc40e6ef rbd48f4c 41 41 context_save_arch: 42 42 movq (%rsp), %rdx # the caller's return %eip 43 44 # In %edi is passed 1st argument45 CONTEXT_SAVE_ARCH_CORE %rdi %rdx46 43 47 xorq %rax,%rax # context_save returns 1 44 # 1st argument passed in %edi 45 CONTEXT_SAVE_ARCH_CORE %rdi %rdx 46 47 xorq %rax, %rax # context_save returns 1 48 48 incq %rax 49 49 ret … … 55 55 # pointed by the 1st argument. Returns 0 in EAX. 56 56 # 57 context_restore_arch: 58 57 context_restore_arch: 59 58 CONTEXT_RESTORE_ARCH_CORE %rdi %rdx 60 61 movq %rdx, (%rsp)62 63 xorq %rax, %rax# context_restore returns 059 60 movq %rdx, (%rsp) 61 62 xorq %rax, %rax # context_restore returns 0 64 63 ret -
kernel/arch/amd64/src/cpu/cpu.c
rc40e6ef rbd48f4c 47 47 * Contains only non-MP-Specification specific SMP code. 48 48 */ 49 #define AMD_CPUID_EBX 0x6874754150 #define AMD_CPUID_ECX 0x444d416351 #define AMD_CPUID_EDX 0x69746e6549 #define AMD_CPUID_EBX 0x68747541 50 #define AMD_CPUID_ECX 0x444d4163 51 #define AMD_CPUID_EDX 0x69746e65 52 52 53 #define INTEL_CPUID_EBX 0x756e654754 #define INTEL_CPUID_ECX 0x6c65746e55 #define INTEL_CPUID_EDX 0x49656e6953 #define INTEL_CPUID_EBX 0x756e6547 54 #define INTEL_CPUID_ECX 0x6c65746e 55 #define INTEL_CPUID_EDX 0x49656e69 56 56 57 57 … … 127 127 { 128 128 cpu_info_t info; 129 129 130 130 CPU->arch.vendor = VendorUnknown; 131 131 if (has_cpuid()) { 132 132 cpuid(INTEL_CPUID_LEVEL, &info); 133 133 134 134 /* 135 135 * Check for AMD processor. 136 136 */ 137 if ( info.cpuid_ebx == AMD_CPUID_EBX&&138 info.cpuid_ecx == AMD_CPUID_ECX&&139 info.cpuid_edx == AMD_CPUID_EDX) {137 if ((info.cpuid_ebx == AMD_CPUID_EBX) && 138 (info.cpuid_ecx == AMD_CPUID_ECX) && 139 (info.cpuid_edx == AMD_CPUID_EDX)) { 140 140 CPU->arch.vendor = VendorAMD; 141 141 } 142 142 143 143 /* 144 144 * Check for Intel processor. 145 */ 146 if ( info.cpuid_ebx == INTEL_CPUID_EBX&&147 info.cpuid_ecx == INTEL_CPUID_ECX&&148 info.cpuid_edx == INTEL_CPUID_EDX) {145 */ 146 if ((info.cpuid_ebx == INTEL_CPUID_EBX) && 147 (info.cpuid_ecx == INTEL_CPUID_ECX) && 148 (info.cpuid_edx == INTEL_CPUID_EDX)) { 149 149 CPU->arch.vendor = VendorIntel; 150 150 } 151 151 152 152 cpuid(INTEL_CPUID_STANDARD, &info); 153 153 CPU->arch.family = (info.cpuid_eax >> 8) & 0xf; 154 154 CPU->arch.model = (info.cpuid_eax >> 4) & 0xf; 155 CPU->arch.stepping = (info.cpuid_eax >> 0) & 0xf; 155 CPU->arch.stepping = (info.cpuid_eax >> 0) & 0xf; 156 156 } 157 157 } -
kernel/arch/amd64/src/debug/stacktrace.c
rc40e6ef rbd48f4c 37 37 #include <typedefs.h> 38 38 39 #define FRAME_OFFSET_FP_PREV 040 #define FRAME_OFFSET_RA 139 #define FRAME_OFFSET_FP_PREV 0 40 #define FRAME_OFFSET_RA 1 41 41 42 42 bool kernel_frame_pointer_validate(uintptr_t fp) … … 49 49 uint64_t *stack = (void *) fp; 50 50 *prev = stack[FRAME_OFFSET_FP_PREV]; 51 51 52 return true; 52 53 } … … 56 57 uint64_t *stack = (void *) fp; 57 58 *ra = stack[FRAME_OFFSET_RA]; 59 58 60 return true; 59 61 } -
kernel/arch/amd64/src/debugger.c
rc40e6ef rbd48f4c 230 230 return; 231 231 232 printf("*** Found ZERO on address % lx(slot %d) ***\n",232 printf("*** Found ZERO on address %" PRIp " (slot %d) ***\n", 233 233 breakpoints[slot].address, slot); 234 234 } else { 235 printf("Data watchpoint - new data: % lx\n",235 printf("Data watchpoint - new data: %" PRIp "\n", 236 236 *((unative_t *) breakpoints[slot].address)); 237 237 } 238 238 } 239 239 240 printf("Reached breakpoint %d:% lx(%s)\n", slot, getip(istate),240 printf("Reached breakpoint %d:%" PRIp " (%s)\n", slot, getip(istate), 241 241 symtab_fmt_name_lookup(getip(istate))); 242 242 … … 349 349 { 350 350 #ifdef __32_BITS__ 351 printf("# Count Address In symbol\n"); 352 printf("-- ----- ---------- ---------\n"); 351 printf("[nr] [count] [address ] [in symbol\n"); 353 352 #endif 354 353 355 354 #ifdef __64_BITS__ 356 printf("# Count Address In symbol\n"); 357 printf("-- ----- ------------------ ---------\n"); 355 printf("[nr] [count] [address ] [in symbol\n"); 358 356 #endif 359 357 … … 365 363 366 364 #ifdef __32_BITS__ 367 printf("%- 2u %-5" PRIs " %p %s\n", i,365 printf("%-4u %7" PRIs " %p %s\n", i, 368 366 breakpoints[i].counter, breakpoints[i].address, 369 367 symbol); … … 371 369 372 370 #ifdef __64_BITS__ 373 printf("%- 2u %-5" PRIs " %p %s\n", i,371 printf("%-4u %7" PRIs " %p %s\n", i, 374 372 breakpoints[i].counter, breakpoints[i].address, 375 373 symbol); -
kernel/arch/amd64/src/delay.S
rc40e6ef rbd48f4c 37 37 38 38 asm_delay_loop: 39 0: dec %rdi 40 jnz 0b 39 0: 40 dec %rdi 41 jnz 0b 42 41 43 ret 42 44 43 45 asm_fake_loop: 44 0: dec %rdi 45 jz 0b 46 0: 47 dec %rdi 48 jz 0b 49 46 50 ret -
kernel/arch/amd64/src/fpu_context.c
rc40e6ef rbd48f4c 27 27 */ 28 28 29 /** @addtogroup amd64 29 /** @addtogroup amd64 30 30 * @{ 31 31 */ -
kernel/arch/amd64/src/interrupt.c
rc40e6ef rbd48f4c 63 63 void (* eoi_function)(void) = NULL; 64 64 65 void decode_istate(int n, istate_t *istate) 66 { 67 const char *symbol = symtab_fmt_name_lookup(istate->rip); 68 69 printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n", n, __func__); 70 printf("%%rip: %#llx (%s)\n", istate->rip, symbol); 71 printf("ERROR_WORD=%#llx\n", istate->error_word); 72 printf("%%cs=%#llx, rflags=%#llx, %%cr0=%#llx\n", istate->cs, 73 istate->rflags, read_cr0()); 74 printf("%%rax=%#llx, %%rcx=%#llx, %%rdx=%#llx\n", istate->rax, 65 void istate_decode(istate_t *istate) 66 { 67 printf("error_word=%#llx\n", istate->error_word); 68 printf("cs =%#0.16llx\trflags=%#0.16llx\n", istate->cs, 69 istate->rflags); 70 printf("rax=%#0.16llx\trbx=%#0.16llx\trcx=%#0.16llx\n", istate->rax, 75 71 istate->rcx, istate->rdx); 76 printf(" %%rsi=%#llx, %%rdi=%#llx, %%r8=%#llx\n", istate->rsi,72 printf("rsi=%#0.16llx\trdi=%#0.16llx\tr8 =%#0.16llx\n", istate->rsi, 77 73 istate->rdi, istate->r8); 78 printf(" %%r9=%#llx, %%r10=%#llx, %%r11=%#llx\n", istate->r9,74 printf("r9 =%#0.16llx\tr10=%#0.16llx\tr11=%#0.16llx\n", istate->r9, 79 75 istate->r10, istate->r11); 80 printf("%%rsp=%#llx\n", &istate->stack[0]);81 82 stack_trace_istate(istate);83 76 } 84 77 … … 95 88 { 96 89 fault_if_from_uspace(istate, "Unserviced interrupt: %u.", n); 97 decode_istate(n, istate); 98 panic("Unserviced interrupt."); 90 panic_badtrap(istate, n, "Unserviced interrupt."); 99 91 } 100 92 … … 102 94 { 103 95 fault_if_from_uspace(istate, "Divide error."); 104 decode_istate(n, istate); 105 panic("Divide error."); 96 panic_badtrap(istate, n, "Divide error."); 106 97 } 107 98 … … 129 120 fault_if_from_uspace(istate, "General protection fault."); 130 121 } 131 132 decode_istate(n, istate); 133 panic("General protection fault."); 122 panic_badtrap(istate, n, "General protection fault."); 134 123 } 135 124 … … 137 126 { 138 127 fault_if_from_uspace(istate, "Stack fault."); 139 decode_istate(n, istate); 140 panic("Stack fault."); 128 panic_badtrap(istate, n, "Stack fault."); 141 129 } 142 130 … … 214 202 exc_register(12, "ss_fault", true, (iroutine_t) ss_fault); 215 203 exc_register(13, "gp_fault", true, (iroutine_t) gp_fault); 216 exc_register(14, "ident_mapper", true, (iroutine_t) ident_page_fault);217 204 218 205 #ifdef CONFIG_SMP -
kernel/arch/amd64/src/mm/page.c
rc40e6ef rbd48f4c 39 39 #include <mm/frame.h> 40 40 #include <mm/as.h> 41 #include <arch/interrupt.h>42 41 #include <arch/asm.h> 43 42 #include <config.h> … … 48 47 #include <align.h> 49 48 50 /* Definitions for identity page mapper */51 pte_t helper_ptl1[512] __attribute__((aligned (PAGE_SIZE)));52 pte_t helper_ptl2[512] __attribute__((aligned (PAGE_SIZE)));53 pte_t helper_ptl3[512] __attribute__((aligned (PAGE_SIZE)));54 extern pte_t ptl_0; /* From boot.S */55 56 #define PTL1_PRESENT(ptl0, page) (!(GET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page)) & PAGE_NOT_PRESENT))57 #define PTL2_PRESENT(ptl1, page) (!(GET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page)) & PAGE_NOT_PRESENT))58 #define PTL3_PRESENT(ptl2, page) (!(GET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page)) & PAGE_NOT_PRESENT))59 60 #define PTL1_ADDR(ptl0, page) ((pte_t *)PA2KA(GET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page))))61 #define PTL2_ADDR(ptl1, page) ((pte_t *)PA2KA(GET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page))))62 #define PTL3_ADDR(ptl2, page) ((pte_t *)PA2KA(GET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page))))63 64 #define SETUP_PTL1(ptl0, page, tgt) { \65 SET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \66 SET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \67 }68 #define SETUP_PTL2(ptl1, page, tgt) { \69 SET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \70 SET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \71 }72 #define SETUP_PTL3(ptl2, page, tgt) { \73 SET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \74 SET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \75 }76 #define SETUP_FRAME(ptl3, page, tgt) { \77 SET_FRAME_ADDRESS_ARCH(ptl3, PTL3_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \78 SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \79 }80 81 82 49 void page_arch_init(void) 83 50 { 84 uintptr_t cur;85 unsigned int i;86 int identity_flags = PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE;87 88 51 if (config.cpu_active == 1) { 52 uintptr_t cur; 53 unsigned int identity_flags = 54 PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE; 55 89 56 page_mapping_operations = &pt_mapping_operations; 90 57 91 58 page_table_lock(AS_KERNEL, true); 92 59 93 60 /* 94 61 * PA2KA(identity) mapping for all frames. 95 62 */ 96 for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { 97 /* Standard identity mapping */ 63 for (cur = 0; cur < last_frame; cur += FRAME_SIZE) 98 64 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, identity_flags); 99 }100 65 101 /* Upper kernel mapping 102 * - from zero to top of kernel (include bottom addresses 103 * because some are needed for init) 104 */ 105 for (cur = PA2KA_CODE(0); cur < config.base + config.kernel_size; cur += FRAME_SIZE) 106 page_mapping_insert(AS_KERNEL, cur, KA2PA(cur), identity_flags); 66 page_table_unlock(AS_KERNEL, true); 107 67 108 for (cur = config.stack_base; cur < config.stack_base + config.stack_size; cur += FRAME_SIZE)109 page_mapping_insert(AS_KERNEL, cur, KA2PA(cur), identity_flags);110 111 for (i = 0; i < init.cnt; i++) {112 for (cur = init.tasks[i].addr; cur < init.tasks[i].addr + init.tasks[i].size; cur += FRAME_SIZE)113 page_mapping_insert(AS_KERNEL, PA2KA_CODE(KA2PA(cur)), KA2PA(cur), identity_flags);114 }115 116 page_table_unlock(AS_KERNEL, true);117 118 68 exc_register(14, "page_fault", true, (iroutine_t) page_fault); 119 69 write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); … … 122 72 } 123 73 124 125 /** Identity page mapper126 *127 * We need to map whole physical memory identically before the page subsystem128 * is initializaed. This thing clears page table and fills in the specific129 * items.130 */131 void ident_page_fault(unsigned int n, istate_t *istate)132 {133 uintptr_t page;134 static uintptr_t oldpage = 0;135 pte_t *aptl_1, *aptl_2, *aptl_3;136 137 page = read_cr2();138 if (oldpage) {139 /* Unmap old address */140 aptl_1 = PTL1_ADDR(&ptl_0, oldpage);141 aptl_2 = PTL2_ADDR(aptl_1, oldpage);142 aptl_3 = PTL3_ADDR(aptl_2, oldpage);143 144 SET_FRAME_FLAGS_ARCH(aptl_3, PTL3_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);145 if (KA2PA(aptl_3) == KA2PA(helper_ptl3))146 SET_PTL3_FLAGS_ARCH(aptl_2, PTL2_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);147 if (KA2PA(aptl_2) == KA2PA(helper_ptl2))148 SET_PTL2_FLAGS_ARCH(aptl_1, PTL1_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);149 if (KA2PA(aptl_1) == KA2PA(helper_ptl1))150 SET_PTL1_FLAGS_ARCH(&ptl_0, PTL0_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT);151 }152 if (PTL1_PRESENT(&ptl_0, page))153 aptl_1 = PTL1_ADDR(&ptl_0, page);154 else {155 SETUP_PTL1(&ptl_0, page, helper_ptl1);156 aptl_1 = helper_ptl1;157 }158 159 if (PTL2_PRESENT(aptl_1, page))160 aptl_2 = PTL2_ADDR(aptl_1, page);161 else {162 SETUP_PTL2(aptl_1, page, helper_ptl2);163 aptl_2 = helper_ptl2;164 }165 166 if (PTL3_PRESENT(aptl_2, page))167 aptl_3 = PTL3_ADDR(aptl_2, page);168 else {169 SETUP_PTL3(aptl_2, page, helper_ptl3);170 aptl_3 = helper_ptl3;171 }172 173 SETUP_FRAME(aptl_3, page, page);174 175 oldpage = page;176 }177 178 179 74 void page_fault(unsigned int n, istate_t *istate) 180 75 { 181 uintptr_t page; 182 pf_access_t access; 183 184 page = read_cr2(); 76 uintptr_t page = read_cr2(); 185 77 186 78 if (istate->error_word & PFERR_CODE_RSVD) 187 79 panic("Reserved bit set in page table entry."); 80 81 pf_access_t access; 188 82 189 83 if (istate->error_word & PFERR_CODE_RW) … … 196 90 if (as_page_fault(page, access, istate) == AS_PF_FAULT) { 197 91 fault_if_from_uspace(istate, "Page fault: %#x.", page); 198 199 decode_istate(n, istate); 200 printf("Page fault address: %llx.\n", page); 201 panic("Page fault."); 92 panic_memtrap(istate, access, page, "Page fault."); 202 93 } 203 94 } 204 205 95 206 96 uintptr_t hw_map(uintptr_t physaddr, size_t size) 207 97 { 208 98 if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) 209 panic("Unable to map physical memory %p (% dbytes).", physaddr,99 panic("Unable to map physical memory %p (%" PRIs " bytes).", physaddr, 210 100 size); 211 101 212 102 uintptr_t virtaddr = PA2KA(last_frame); 213 103 pfn_t i; 214 104 215 105 page_table_lock(AS_KERNEL, true); 106 216 107 for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) 217 108 page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE); 109 218 110 page_table_unlock(AS_KERNEL, true); 219 111 -
kernel/arch/amd64/src/proc/scheduler.c
rc40e6ef rbd48f4c 38 38 #include <proc/thread.h> 39 39 #include <arch.h> 40 #include <arch/context.h> /* SP_DELTA */40 #include <arch/context.h> 41 41 #include <arch/asm.h> 42 42 #include <print.h> … … 58 58 CPU->arch.tss->rsp0 = 59 59 (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA]; 60 60 61 61 /* 62 62 * Syscall support. 63 63 */ 64 64 swapgs(); 65 write_msr(AMD_MSR_GS, (uintptr_t) THREAD->arch.syscall_rsp);65 write_msr(AMD_MSR_GS, (uintptr_t) THREAD->arch.syscall_rsp); 66 66 swapgs(); 67 67 68 68 /* TLS support - set FS to thread local storage */ 69 69 write_msr(AMD_MSR_FS, THREAD->arch.tls); -
kernel/arch/amd64/src/proc/task.c
rc40e6ef rbd48f4c 39 39 /** Perform amd64 specific task initialization. 40 40 * 41 * @param t Task to be initialized. 41 * @param task Task to be initialized. 42 * 42 43 */ 43 void task_create_arch(task_t *t )44 void task_create_arch(task_t *task) 44 45 { 45 t ->arch.iomapver = 0;46 bitmap_initialize(&t ->arch.iomap, NULL, 0);46 task->arch.iomapver = 0; 47 bitmap_initialize(&task->arch.iomap, NULL, 0); 47 48 } 48 49 49 50 /** Perform amd64 specific task destruction. 50 51 * 51 * @param t Task to be initialized. 52 * @param task Task to be initialized. 53 * 52 54 */ 53 void task_destroy_arch(task_t *t )55 void task_destroy_arch(task_t *task) 54 56 { 55 if (t ->arch.iomap.map)56 free(t ->arch.iomap.map);57 if (task->arch.iomap.map) 58 free(task->arch.iomap.map); 57 59 } 58 60 -
kernel/arch/amd64/src/proc/thread.c
rc40e6ef rbd48f4c 37 37 /** Perform amd64 specific thread initialization. 38 38 * 39 * @param t Thread to be initialized. 39 * @param thread Thread to be initialized. 40 * 40 41 */ 41 void thread_create_arch(thread_t *t )42 void thread_create_arch(thread_t *thread) 42 43 { 43 t->arch.tls = 0; 44 t->arch.syscall_rsp[SYSCALL_USTACK_RSP] = 0; 44 thread->arch.tls = 0; 45 thread->arch.syscall_rsp[SYSCALL_USTACK_RSP] = 0; 46 45 47 /* 46 48 * Kernel RSP can be precalculated at thread creation time. 47 49 */ 48 t ->arch.syscall_rsp[SYSCALL_KSTACK_RSP] =49 (uintptr_t) &t ->kstack[PAGE_SIZE - sizeof(uint64_t)];50 thread->arch.syscall_rsp[SYSCALL_KSTACK_RSP] = 51 (uintptr_t) &thread->kstack[PAGE_SIZE - sizeof(uint64_t)]; 50 52 } 51 53 -
kernel/arch/amd64/src/smp/ap.S
rc40e6ef rbd48f4c 55 55 xorw %ax, %ax 56 56 movw %ax, %ds 57 58 lgdtl ap_gdtr # initialize Global Descriptor Table register57 58 lgdtl ap_gdtr # initialize Global Descriptor Table register 59 59 60 60 movl %cr0, %eax 61 61 orl $1, %eax 62 movl %eax, %cr0 # switch to protected mode62 movl %eax, %cr0 # switch to protected mode 63 63 jmpl $gdtselector(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET 64 64 65 65 jump_to_kernel: 66 66 .code32 … … 72 72 movw %ax, %gs 73 73 74 # Enable 64-bit page transaltion entries - CR4.PAE = 1.74 # Enable 64-bit page transaltion entries (CR4.PAE = 1). 75 75 # Paging is not enabled until after long mode is enabled 76 76 … … 78 78 btsl $5, %eax 79 79 movl %eax, %cr4 80 80 81 81 leal ptl_0, %eax 82 82 movl %eax, %cr3 83 83 84 84 # Enable long mode 85 movl $EFER_MSR_NUM, %ecx # EFER MSR number86 rdmsr # Read EFER87 btsl $AMD_LME_FLAG, %eax # Set LME=188 wrmsr # Write EFER85 movl $EFER_MSR_NUM, %ecx # EFER MSR number 86 rdmsr # Read EFER 87 btsl $AMD_LME_FLAG, %eax # Set LME=1 88 wrmsr # Write EFER 89 89 90 # Enable paging to activate long mode (set CR0.PG =1)90 # Enable paging to activate long mode (set CR0.PG = 1) 91 91 movl %cr0, %eax 92 92 btsl $31, %eax … … 98 98 .code64 99 99 start64: 100 movq (ctx), %rsp 100 movabsq $ctx, %rsp 101 movq (%rsp), %rsp 102 101 103 pushq $0 102 104 movq %rsp, %rbp 103 call main_ap - AP_BOOT_OFFSET + BOOT_OFFSET # never returns 105 106 movabsq $main_ap, %rax 107 callq *%rax # never returns 104 108 105 109 #endif /* CONFIG_SMP */
Note:
See TracChangeset
for help on using the changeset viewer.
