1 2#include "apic-defs.h" 3 4.global online_cpus 5 6ipi_vector = 0x20 7 8max_cpus = MAX_TEST_CPUS 9 10.bss 11 12 . = . + 4096 * max_cpus 13 .align 16 14stacktop: 15 16.data 17 18.align 4096 19pt: 20i = 0 21 .rept 1024 22 .long 0x1e7 | (i << 22) 23 i = i + 1 24 .endr 25 26.section .init 27 28.code32 29 30mb_magic = 0x1BADB002 31mb_flags = 0x0 32 33 # multiboot header 34 .long mb_magic, mb_flags, 0 - (mb_magic + mb_flags) 35mb_cmdline = 16 36 37.macro setup_tr_and_percpu 38 call load_idt 39 push %esp 40 call setup_tss 41 addl $4, %esp 42 ltr %ax 43 add $(max_cpus * 8), %ax 44 mov %ax, %gs 45.endm 46 47.macro setup_segments 48 mov $0x10, %ax 49 mov %ax, %ds 50 mov %ax, %es 51 mov %ax, %fs 52 mov %ax, %gs 53 mov %ax, %ss 54.endm 55 56.globl start 57start: 58 lgdtl gdt_descr 59 setup_segments 60 mov $stacktop, %esp 61 62 push %ebx 63 call setup_multiboot 64 addl $4, %esp 65 call setup_libcflat 66 mov mb_cmdline(%ebx), %eax 67 mov %eax, __args 68 call __setup_args 69 call prepare_32 70 jmpl $8, $start32 71 72prepare_32: 73 mov $(1 << 4), %eax // pse 74 mov %eax, %cr4 75 76 mov $pt, %eax 77 mov %eax, %cr3 78 79 mov %cr0, %eax 80 bts $0, %eax 81 bts $31, %eax 82 mov %eax, %cr0 83 ret 84 85smp_stacktop: .long stacktop - 4096 86 87save_id: 88 movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax 89 movl (%eax), %eax 90 shrl $24, %eax 91 lock btsl %eax, online_cpus 92 retl 93 94ap_start32: 95 setup_segments 96 mov $-4096, %esp 97 lock xaddl %esp, smp_stacktop 98 setup_tr_and_percpu 99 call prepare_32 100 call reset_apic 101 call save_id 102 call enable_apic 103 call enable_x2apic 104 call ap_online 105 106 /* ap_online() should never return */ 107 ud2 108 109start32: 110 setup_tr_and_percpu 111 call reset_apic 112 call save_id 113 call mask_pic_interrupts 114 call enable_apic 115 call bsp_rest_init 116 push $__environ 117 push $__argv 118 push __argc 119 call main 120 push %eax 121 call exit 122 123#include "trampolines.S" 124