1 2#include "apic-defs.h" 3#include "smp.h" 4 5.global online_cpus 6 7ipi_vector = 0x20 8 9per_cpu_size = PER_CPU_SIZE 10max_cpus = MAX_TEST_CPUS 11 12.bss 13.align 4096 14 . = . + PER_CPU_SIZE * max_cpus 15stacktop: 16 17.data 18 19.align 4096 20pt: 21i = 0 22 .rept 1024 23 .long 0x1e7 | (i << 22) 24 i = i + 1 25 .endr 26 27.section .init 28 29.code32 30 31mb_magic = 0x1BADB002 32mb_flags = 0x0 33 34 # multiboot header 35 .long mb_magic, mb_flags, 0 - (mb_magic + mb_flags) 36mb_cmdline = 16 37 38.macro setup_tr_and_percpu 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 - per_cpu_size 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 $-per_cpu_size, %esp 97 lock xaddl %esp, smp_stacktop 98 setup_tr_and_percpu 99 call load_idt 100 call prepare_32 101 call reset_apic 102 call save_id 103 call enable_apic 104 call enable_x2apic 105 call ap_online 106 107 /* ap_online() should never return */ 108 ud2 109 110start32: 111 setup_tr_and_percpu 112 call setup_idt 113 call reset_apic 114 call save_id 115 call mask_pic_interrupts 116 call enable_apic 117 call bsp_rest_init 118 push $__environ 119 push $__argv 120 push __argc 121 call main 122 push %eax 123 call exit 124 125#include "trampolines.S" 126