1 2#include "apic-defs.h" 3 4ipi_vector = 0x20 5 6max_cpus = MAX_TEST_CPUS 7 8.bss 9 10 . = . + 4096 * max_cpus 11 .align 16 12stacktop: 13 14.data 15 16.align 4096 17ptl2: 18i = 0 19 .rept 512 * 4 20 .quad 0x1e7 | (i << 21) 21 i = i + 1 22 .endr 23 24.align 4096 25ptl3: 26 .quad ptl2 + 7 + 0 * 4096 27 .quad ptl2 + 7 + 1 * 4096 28 .quad ptl2 + 7 + 2 * 4096 29 .quad ptl2 + 7 + 3 * 4096 30 31.align 4096 32ptl4: 33 .quad ptl3 + 7 34 35.align 4096 36ptl5: 37 .quad ptl4 + 7 38 39.align 4096 40 41mb_boot_info: .quad 0 42 43pt_root: .quad ptl4 44 45#include "trampolines.S" 46 47.section .init 48.code32 49 50mb_magic = 0x1BADB002 51mb_flags = 0x0 52 53 # multiboot header 54 .long mb_magic, mb_flags, 0 - (mb_magic + mb_flags) 55mb_cmdline = 16 56 57.macro load_tss 58 movq %rsp, %rdi 59 call setup_tss 60 ltr %ax 61.endm 62 63.globl start 64start: 65 mov %ebx, mb_boot_info 66 mov $stacktop, %esp 67 setup_percpu_area 68 call prepare_64 69 jmpl $8, $start64 70 71switch_to_5level: 72 /* Disable CR4.PCIDE */ 73 mov %cr4, %eax 74 btr $17, %eax 75 mov %eax, %cr4 76 77 mov %cr0, %eax 78 btr $31, %eax 79 mov %eax, %cr0 80 81 mov $ptl5, %eax 82 mov %eax, pt_root 83 84 /* Enable CR4.LA57 */ 85 mov %cr4, %eax 86 bts $12, %eax 87 mov %eax, %cr4 88 89 mov $0x10, %ax 90 mov %ax, %ss 91 92 call enter_long_mode 93 jmpl $8, $lvl5 94 95smp_stacktop: .long stacktop - 4096 96 97.align 16 98 99gdt32: 100 .quad 0 101 .quad 0x00cf9b000000ffff // flat 32-bit code segment 102 .quad 0x00cf93000000ffff // flat 32-bit data segment 103gdt32_end: 104 105.code64 106start64: 107 call load_idt 108 load_tss 109 call reset_apic 110 call mask_pic_interrupts 111 call enable_apic 112 call save_id 113 mov mb_boot_info(%rip), %rbx 114 mov %rbx, %rdi 115 call setup_multiboot 116 call setup_libcflat 117 mov mb_cmdline(%rbx), %eax 118 mov %rax, __args(%rip) 119 call __setup_args 120 121 call bsp_rest_init 122 123 mov __argc(%rip), %edi 124 lea __argv(%rip), %rsi 125 lea __environ(%rip), %rdx 126 call main 127 mov %eax, %edi 128 call exit 129 130.globl setup_5level_page_table 131setup_5level_page_table: 132 /* Check if 5-level paging has already enabled */ 133 mov %cr4, %rax 134 test $0x1000, %eax 135 jnz lvl5 136 137 pushq $32 138 pushq $switch_to_5level 139 lretq 140lvl5: 141 retq 142