123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731 |
- #include "common/asm.h"
- #define MULTIBOOT_SEARCH 32768
- #define MULTIBOOT_HEADER_ALIGN 8
- #define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
- #define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
- #define MULTIBOOT_MOD_ALIGN 0x00001000
- #define MULTIBOOT_INFO_ALIGN 0x00000008
- #define MULTIBOOT_TAG_ALIGN 8
- #define MULTIBOOT_TAG_TYPE_END 0
- #define MULTIBOOT_TAG_TYPE_CMDLINE 1
- #define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
- #define MULTIBOOT_TAG_TYPE_MODULE 3
- #define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
- #define MULTIBOOT_TAG_TYPE_BOOTDEV 5
- #define MULTIBOOT_TAG_TYPE_MMAP 6
- #define MULTIBOOT_TAG_TYPE_VBE 7
- #define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
- #define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
- #define MULTIBOOT_TAG_TYPE_APM 10
- #define MULTIBOOT_TAG_TYPE_EFI32 11
- #define MULTIBOOT_TAG_TYPE_EFI64 12
- #define MULTIBOOT_TAG_TYPE_SMBIOS 13
- #define MULTIBOOT_TAG_TYPE_ACPI_OLD 14
- #define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
- #define MULTIBOOT_TAG_TYPE_NETWORK 16
- #define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
- #define MULTIBOOT_TAG_TYPE_EFI_BS 18
- #define MULTIBOOT_TAG_TYPE_EFI32_IH 19
- #define MULTIBOOT_TAG_TYPE_EFI64_IH 20
- #define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21
- #define MULTIBOOT_HEADER_TAG_END 0
- #define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
- #define MULTIBOOT_HEADER_TAG_ADDRESS 2
- #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
- #define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
- #define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
- #define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
- #define MULTIBOOT_HEADER_TAG_EFI_BS 7
- #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
- #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
- #define MULTIBOOT_HEADER_TAG_RELOCATABLE 10
- #define MULTIBOOT_ARCHITECTURE_I386 0
- #define MULTIBOOT_ARCHITECTURE_MIPS32 4
- #define MULTIBOOT_HEADER_TAG_OPTIONAL 1
- #define MULTIBOOT_LOAD_PREFERENCE_NONE 0
- #define MULTIBOOT_LOAD_PREFERENCE_LOW 1
- #define MULTIBOOT_LOAD_PREFERENCE_HIGH 2
- #define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
- #define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
- #define MULTIBOOT_SEARCH 32768
- #define MULTIBOOT_HEADER_ALIGN 8
- #define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
- #define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
- #define MULTIBOOT_MOD_ALIGN 0x00001000
- #define MULTIBOOT_INFO_ALIGN 0x00000008
- #define MULTIBOOT_TAG_ALIGN 8
- #define MULTIBOOT_TAG_TYPE_END 0
- #define MULTIBOOT_TAG_TYPE_CMDLINE 1
- #define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
- #define MULTIBOOT_TAG_TYPE_MODULE 3
- #define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
- #define MULTIBOOT_TAG_TYPE_BOOTDEV 5
- #define MULTIBOOT_TAG_TYPE_MMAP 6
- #define MULTIBOOT_TAG_TYPE_VBE 7
- #define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
- #define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
- #define MULTIBOOT_TAG_TYPE_APM 10
- #define MULTIBOOT_TAG_TYPE_EFI32 11
- #define MULTIBOOT_TAG_TYPE_EFI64 12
- #define MULTIBOOT_TAG_TYPE_SMBIOS 13
- #define MULTIBOOT_TAG_TYPE_ACPI_OLD 14
- #define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
- #define MULTIBOOT_TAG_TYPE_NETWORK 16
- #define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
- #define MULTIBOOT_TAG_TYPE_EFI_BS 18
- #define MULTIBOOT_TAG_TYPE_EFI32_IH 19
- #define MULTIBOOT_TAG_TYPE_EFI64_IH 20
- #define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21
- #define MULTIBOOT_HEADER_TAG_END 0
- #define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
- #define MULTIBOOT_HEADER_TAG_ADDRESS 2
- #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
- #define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
- #define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
- #define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
- #define MULTIBOOT_HEADER_TAG_EFI_BS 7
- #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
- #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
- #define MULTIBOOT_HEADER_TAG_RELOCATABLE 10
- #define MULTIBOOT_ARCHITECTURE_I386 0
- #define MULTIBOOT_ARCHITECTURE_MIPS32 4
- #define MULTIBOOT_HEADER_TAG_OPTIONAL 1
- #define MULTIBOOT_LOAD_PREFERENCE_NONE 0
- #define MULTIBOOT_LOAD_PREFERENCE_LOW 1
- #define MULTIBOOT_LOAD_PREFERENCE_HIGH 2
- #define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
- #define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
- .code32
- .SET HEADER_LENGTH, multiboot_header_end - multiboot_header
- .SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + HEADER_LENGTH)
- .section .multiboot_header
- .align MULTIBOOT_HEADER_ALIGN
- multiboot_header:
-
- .long MULTIBOOT2_HEADER_MAGIC
-
- .long MULTIBOOT_ARCHITECTURE_I386
-
- .long HEADER_LENGTH
-
- .long CHECKSUM
-
- .align 8
- framebuffer_tag_start:
- .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
- .short MULTIBOOT_HEADER_TAG_OPTIONAL
- .long framebuffer_tag_end - framebuffer_tag_start
- .long 1440
- .long 900
- .long 32
- framebuffer_tag_end:
- .align 8
- .short MULTIBOOT_HEADER_TAG_END
-
- .short 0
- .long 8
- multiboot_header_end:
- .section .bootstrap
- .global _start
- .type _start, @function
- # 在 multiboot2.cpp 中定义
- .extern _start64
- .extern boot_info_addr
- .extern multiboot2_magic
- ENTRY(_start)
-
- cli
-
- mov %ebx, mb2_info
-
-
- mov %eax, mb2_magic
-
- / 从保护模式跳转到长模式
-
- mov %cr4, %eax
- or $(1<<5), %eax
- mov %eax, %cr4
-
-
- mov $pml4, %eax
- mov $pdpt, %ebx
- or $0x3, %ebx
- mov %ebx, 0(%eax)
-
- mov $pdpt, %eax
- mov $pd, %ebx
- or $0x3, %ebx
- mov %ebx, 0(%eax)
-
- mov $pd, %eax
- mov $pt, %ebx
- or $0x3, %ebx
- mov %ebx, 0(%eax)
-
-
- mov $512, %ecx
- mov $pt, %eax
- mov $0x3, %ebx
- .fill_pt:
- mov %ebx, 0(%eax)
- add $0x1000, %ebx
- add $8, %eax
- loop .fill_pt
- .global enter_head_from_ap_boot
- enter_head_from_ap_boot:
-
- mov $pml4, %eax
- mov %eax, %cr3
-
- mov $0xC0000080, %ecx
- rdmsr
- or $(1<<8), %eax
- wrmsr
-
- mov %cr0, %eax
- or $(1<<31), %eax
- mov %eax, %cr0
-
- mov $gdt64_pointer, %eax
- lgdt 0(%eax)
- jmp $0x8, $ready_to_start_64
- hlt
- ret
- .code64
- .global ready_to_start_64
- ready_to_start_64:
- mov $0x10, %ax
- mov %ax, %ds
- mov %ax, %es
- mov %ax, %fs
- mov %ax, %ss
- mov $0x7e00, %esp
-
-
- movq switch_to_start64(%rip), %rax
- pushq $0x08
- pushq %rax
- lretq
- switch_to_start64:
- .quad _start64
- .code64
- is_from_ap:
-
- hlt
- .global _start64
- .type _start64, @function
- .extern Start_Kernel
- ENTRY(_start64)
-
- mov $0x10, %ax
- mov %ax, %ds
- mov %ax, %es
- mov %ax, %fs
- mov %ax, %ss
- mov $0x7e00, %esp
- lgdt GDT_POINTER(%rip)
-
- lidt IDT_POINTER(%rip)
-
- movq GDT_POINTER(%rip), %r12
- movq _stack_start(%rip), %rsp
-
- movq $0x1b, %rcx
- rdmsr
- bt $8, %rax
- jnc load_cr3
-
-
- mov $__PML4E, %eax
- mov $__PDPTE, %ebx
- or $0x3, %ebx
- mov %ebx, 0(%eax)
- mov %ebx, 256(%eax)
-
- mov $__PDPTE, %eax
- mov $__PDE, %ebx
- or $0x3, %ebx
- mov %ebx, 0(%eax)
- load_cr3:
-
- movq $__PML4E, %rax
-
- movq %rax, %cr3
-
- movq switch_seg(%rip), %rax
-
-
- pushq $0x08
- pushq %rax
- lretq
- switch_seg:
- .quad entry64
- entry64:
- movq $0x10, %rax
- movq %rax, %ds
- movq %rax, %es
- movq %rax, %gs
- movq %rax, %ss
- movq _stack_start(%rip), %rsp
-
-
- leaq GDT_Table(%rip), %r8
- leaq GDT_END(%rip), %r9
- subq %r8, %r9
- movq %r9, %r13
- leaq IDT_Table(%rip), %r8
- leaq IDT_END(%rip), %r9
- subq %r8, %r9
- movq %r9, %r12
- lgdt GDT_POINTER64(%rip)
- lidt IDT_POINTER64(%rip)
-
- movq $0x1b, %rcx
- rdmsr
- bt $8, %rax
- jnc start_smp
- setup_IDT:
- leaq m_ignore_int(%rip), %rdx
- movq $(0x08 << 16), %rax
- movw %dx, %ax
- movq $ (0x8e00 << 32), %rcx
- addq %rcx, %rax
-
- movl %edx, %ecx
- shrl $16, %ecx
- shlq $48, %rcx
- addq %rcx, %rax
- shrq $32, %rdx
- leaq IDT_Table(%rip), %rdi
- mov $256, %rcx
- repeat_set_idt:
-
- movq %rax, (%rdi)
- movq %rdx, 8(%rdi)
- addq $0x10, %rdi
- dec %rcx
- jne repeat_set_idt
- SetUp_TSS64:
-
-
- leaq TSS64_Table(%rip), %rdx
- movq $0xffff800000000000, %r8
- addq %r8, %rdx
- xorq %rax, %rax
- xorq %rcx, %rcx
-
- movq $0x89, %rax
- shlq $40, %rax
-
- movl %edx, %ecx
- shrl $24, %ecx
- shlq $56, %rcx
- addq %rcx, %rax
- xorq %rcx, %rcx
-
- movl %edx, %ecx
- andl $0xffffff, %ecx
- shlq $16, %rcx
- addq %rcx, %rax
- addq $103, %rax
- leaq GDT_Table(%rip), %rdi
- movq %rax, 80(%rdi)
- shrq $32, %rdx
- movq %rdx, 88(%rdi)
-
-
-
-
-
- movq %cr0, %rax
- and $0xFFFB, %ax
- or $0x2, %ax
- movq %rax, %cr0
- movq %cr4, %rax
- or $(3 << 9), %ax
- movq %rax, %cr4
-
- movq go_to_kernel(%rip), %rax
- pushq $0x08
- pushq %rax
-
- movq mb2_info, %r15
- movq mb2_magic, %r14
-
- lretq
- go_to_kernel:
- .quad Start_Kernel
- start_smp:
-
- movq %cr0, %rax
- and $0xFFFB, %ax
- or $0x2, %ax
- movq %rax, %cr0
- movq %cr4, %rax
- or $(3 << 9), %ax
- movq %rax, %cr4
- movq go_to_smp_kernel(%rip), %rax
- pushq $0x08
- pushq %rax
- lretq
- go_to_smp_kernel:
- .quad smp_ap_start
- m_ignore_int:
- movq go_to_ignore_int(%rip), %rax
- pushq $0x08
- pushq %rax
- lretq
- lretq
- go_to_ignore_int:
- .quad ignore_int
- ENTRY(_stack_start)
- .quad initial_proc_union + 32768
- .align 0x1000
- __PML4E:
- .quad 0x103007
- .fill 255,8,0
- .quad 0x103003
- .fill 255,8,0
- .org 0x2000
- __PDPTE:
- .quad 0x104003
- .fill 511,8,0
- .org 0x3000
- __PDE:
- .quad 0x000083
- .quad 0x200083
- .quad 0x400083
- .quad 0x600083
- .quad 0x800083
- .quad 0xa00083
- .quad 0xc00083
- .quad 0xe00083
- .quad 0x1000083
- .quad 0x1200083
- .quad 0x1400083
- .quad 0x1600083
- .quad 0x1800083
- .quad 0x1a00083
- .quad 0x1c00083
- .quad 0x1e00083
- .quad 0x2000083
- .quad 0x2200083
- .quad 0x2400083
- .quad 0x2600083
- .quad 0x2800083
- .quad 0x2a00083
- .quad 0x2c00083
- .quad 0x2e00083
- .quad 0x3000083
- .quad 0x3200083
- .quad 0x3400083
- .quad 0x3600083
- .quad 0xe0000083
- .quad 0xe0200083
- .quad 0xe0400083
- .quad 0xe0600083
- .quad 0xe0800083
- .quad 0xe0a00083
- .quad 0xe0c00083
- .quad 0xe0e00083
- .quad 0xe1000083
- .quad 0xe1200083
- .quad 0xe1400083
- .quad 0xe1600083
- .quad 0xe1800083
- .quad 0xe1a00083
- .quad 0xe1c00083
- .quad 0xe1e00083
- .fill 468,8,0
- .align 16
- .global GDT_Table
- GDT_Table:
- .quad 0x0000000000000000
- .quad 0x0020980000000000
- .quad 0x0000920000000000
- .quad 0x0000000000000000
- .quad 0x0000000000000000
- .quad 0x0020f80000000000
- .quad 0x0000f20000000000
- .quad 0x00cf9a000000ffff
- .quad 0x00cf92000000ffff
- .fill 100, 8, 0
- GDT_END:
- .global GDT_POINTER
- GDT_POINTER:
- GDT_LIMIT: .word GDT_END - GDT_Table - 1
- GDT_BASE: .quad GDT_Table
- .global GDT_POINTER64
- GDT_POINTER64:
- GDT_LIMIT64: .word GDT_END - GDT_Table - 1
- GDT_BASE64: .quad GDT_Table + 0xffff800000000000
- .global IDT_Table
- IDT_Table:
- .fill 512, 8, 0
- IDT_END:
- .global IDT_POINTER
- IDT_POINTER:
- IDT_LIMIT: .word IDT_END - IDT_Table - 1
- IDT_BASE: .quad IDT_Table
- .global IDT_POINTER64
- IDT_POINTER64:
- IDT_LIMIT64: .word IDT_END - IDT_Table - 1
- IDT_BASE64: .quad IDT_Table + 0xffff800000000000
- .global TSS64_Table
- TSS64_Table:
- .fill 13, 8, 0
- TSS64_END:
- .section .bootstrap.data
- mb2_magic: .quad 0
- mb2_info: .quad 0
- .code32
- .align 0x1000
- .global pml4
- pml4:
- .skip 0x1000
- pdpt:
- .skip 0x1000
- pd:
- .skip 0x1000
- pt:
- .skip 0x1000
- .align 16
- gdt64:
- null_desc:
- .short 0xFFFF
- .short 0
- .byte 0
- .byte 0
- .byte 0
- .byte 0
- code_desc:
- .short 0
- .short 0
- .byte 0
- .byte 0x9A
- .byte 0x20
- .byte 0
- data_desc:
- .short 0
- .short 0
- .byte 0
- .byte 0x92
- .byte 0
- .byte 0
- user_code_desc:
- .short 0
- .short 0
- .byte 0
- .byte 0xFA
- .byte 0x20
- .byte 0
- user_data_desc:
- .short 0
- .short 0
- .byte 0
- .byte 0xF2
- .byte 0
- .byte 0
- gdt64_pointer:
- .short gdt64_pointer-gdt64-1
- .quad gdt64
- gdt64_pointer64:
- .short gdt64_pointer-gdt64-1
- .quad gdt64
|