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 call load_idt 40 push %esp 41 call setup_tss 42 addl $4, %esp 43 ltr %ax 44 add $(max_cpus * 8), %ax 45 mov %ax, %gs 46.endm 47 48.macro setup_segments 49 mov $0x10, %ax 50 mov %ax, %ds 51 mov %ax, %es 52 mov %ax, %fs 53 mov %ax, %gs 54 mov %ax, %ss 55.endm 56 57.globl start 58start: 59 lgdtl gdt_descr 60 setup_segments 61 mov $stacktop, %esp 62 63 push %ebx 64 call setup_multiboot 65 addl $4, %esp 66 call setup_libcflat 67 mov mb_cmdline(%ebx), %eax 68 mov %eax, __args 69 call __setup_args 70 call prepare_32 71 jmpl $8, $start32 72 73prepare_32: 74 mov $(1 << 4), %eax // pse 75 mov %eax, %cr4 76 77 mov $pt, %eax 78 mov %eax, %cr3 79 80 mov %cr0, %eax 81 bts $0, %eax 82 bts $31, %eax 83 mov %eax, %cr0 84 ret 85 86smp_stacktop: .long stacktop - per_cpu_size 87 88save_id: 89 movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax 90 movl (%eax), %eax 91 shrl $24, %eax 92 lock btsl %eax, online_cpus 93 retl 94 95ap_start32: 96 setup_segments 97 mov $-per_cpu_size, %esp 98 lock xaddl %esp, smp_stacktop 99 setup_tr_and_percpu 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 reset_apic 113 call save_id 114 call mask_pic_interrupts 115 call enable_apic 116 call bsp_rest_init 117 push $__environ 118 push $__argv 119 push __argc 120 call main 121 push %eax 122 call exit 123 124#include "trampolines.S" 125