Rev 695 | Rev 798 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 695 | Rev 696 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | # |
1 | # |
| 2 | # Copyright (C) 2005 Ondrej Palkovsky |
2 | # Copyright (C) 2005 Ondrej Palkovsky |
| - | 3 | # Copyright (C) 2006 Martin Decky |
|
| 3 | # All rights reserved. |
4 | # All rights reserved. |
| 4 | # |
5 | # |
| 5 | # Redistribution and use in source and binary forms, with or without |
6 | # Redistribution and use in source and binary forms, with or without |
| 6 | # modification, are permitted provided that the following conditions |
7 | # modification, are permitted provided that the following conditions |
| 7 | # are met: |
8 | # are met: |
| Line 35... | Line 36... | ||
| 35 | #include <arch/cpuid.h> |
36 | #include <arch/cpuid.h> |
| 36 | 37 | ||
| 37 | #define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE) |
38 | #define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE) |
| 38 | 39 | ||
| 39 | .section K_TEXT_START, "ax" |
40 | .section K_TEXT_START, "ax" |
| 40 | # .code16 |
- | |
| 41 | # .global kernel_image_start |
- | |
| 42 | # .global multiboot_image_start |
- | |
| 43 | # kernel_image_start: |
- | |
| 44 | 41 | ||
| 45 | # movl $0x80000000, %eax |
- | |
| 46 | # cpuid |
- | |
| 47 | # cmp $0x80000000, %eax # any function > 80000000h? |
- | |
| 48 | # jbe no_long_mode |
- | |
| 49 | # movl $(AMD_CPUID_EXTENDED), %eax # Extended function code 80000001 |
- | |
| 50 | # cpuid |
- | |
| 51 | # bt $29, %edx # Test if long mode is supported. |
- | |
| 52 | # jnc no_long_mode |
- | |
| 53 | # |
- | |
| 54 | # |
- | |
| 55 | # no_long_mode: |
- | |
| 56 | # 1: |
- | |
| 57 | # jmp 1b |
- | |
| 58 | # |
- | |
| 59 | .code32 |
42 | .code32 |
| 60 | .align 4 |
43 | .align 4 |
| 61 | .global multiboot_image_start |
44 | .global multiboot_image_start |
| 62 | multiboot_header: |
45 | multiboot_header: |
| 63 | .long MULTIBOOT_HEADER_MAGIC |
46 | .long MULTIBOOT_HEADER_MAGIC |
| Line 87... | Line 70... | ||
| 87 | movl %ebx, grub_ebx |
70 | movl %ebx, grub_ebx |
| 88 | 71 | ||
| 89 | # Protected 32-bit. We want to reuse the code-seg descriptor, |
72 | # Protected 32-bit. We want to reuse the code-seg descriptor, |
| 90 | # the Default operand size must not be 1 when entering long mode |
73 | # the Default operand size must not be 1 when entering long mode |
| 91 | 74 | ||
| - | 75 | movl $0x80000000, %eax |
|
| - | 76 | cpuid |
|
| - | 77 | cmp $0x80000000, %eax # any function > 80000000h? |
|
| - | 78 | jbe long_mode_unsupported |
|
| - | 79 | movl $(AMD_CPUID_EXTENDED), %eax # Extended function code 80000001 |
|
| - | 80 | cpuid |
|
| - | 81 | bt $29, %edx # Test if long mode is supported. |
|
| - | 82 | jc long_mode_supported |
|
| - | 83 | ||
| - | 84 | long_mode_unsupported: |
|
| - | 85 | cli |
|
| - | 86 | hlt |
|
| - | 87 | ||
| - | 88 | long_mode_supported: |
|
| - | 89 | ||
| 92 | # Enable 64-bit page transaltion entries - CR4.PAE = 1. |
90 | # Enable 64-bit page transaltion entries - CR4.PAE = 1. |
| 93 | # Paging is not enabled until after long mode is enabled |
91 | # Paging is not enabled until after long mode is enabled |
| 94 | 92 | ||
| 95 | movl %cr4, %eax |
93 | movl %cr4, %eax |
| 96 | btsl $5, %eax |
94 | btsl $5, %eax |
| Line 216... | Line 214... | ||
| 216 | mmap_invalid: |
214 | mmap_invalid: |
| 217 | movl %edx, e820counter |
215 | movl %edx, e820counter |
| 218 | 216 | ||
| 219 | invalid_boot: |
217 | invalid_boot: |
| 220 | 218 | ||
| - | 219 | #ifdef CONFIG_SMP |
|
| - | 220 | ||
| - | 221 | # copy AP bootstrap routines below 1 MB |
|
| - | 222 | ||
| - | 223 | movq $BOOT_OFFSET, %rsi |
|
| - | 224 | movq $AP_BOOT_OFFSET, %rdi |
|
| - | 225 | movq $_hardcoded_unmapped_size, %rcx |
|
| - | 226 | cld |
|
| - | 227 | rep movsb |
|
| - | 228 | ||
| - | 229 | #endif |
|
| - | 230 | ||
| 221 | call main_bsp # never returns |
231 | call main_bsp # never returns |
| 222 | 232 | ||
| 223 | cli |
233 | cli |
| 224 | hlt |
234 | hlt |
| 225 | 235 | ||