#include "apic-defs.h" | |
.global online_cpus | |
ipi_vector = 0x20 | |
max_cpus = MAX_TEST_CPUS | |
.bss | |
. = . + 4096 * max_cpus | |
.align 16 | |
stacktop: | |
.data | |
.align 4096 | |
pt: | |
i = 0 | |
.rept 1024 | |
.long 0x1e7 | (i << 22) | |
i = i + 1 | |
.endr | |
.section .init | |
.code32 | |
mb_magic = 0x1BADB002 | |
mb_flags = 0x0 | |
# multiboot header | |
.long mb_magic, mb_flags, 0 - (mb_magic + mb_flags) | |
mb_cmdline = 16 | |
.macro setup_tr_and_percpu | |
call load_idt | |
push %esp | |
call setup_tss | |
addl $4, %esp | |
ltr %ax | |
add $(max_cpus * 8), %ax | |
mov %ax, %gs | |
.endm | |
.macro setup_segments | |
mov $0x10, %ax | |
mov %ax, %ds | |
mov %ax, %es | |
mov %ax, %fs | |
mov %ax, %gs | |
mov %ax, %ss | |
.endm | |
.globl start | |
start: | |
lgdtl gdt_descr | |
setup_segments | |
mov $stacktop, %esp | |
push %ebx | |
call setup_multiboot | |
addl $4, %esp | |
call setup_libcflat | |
mov mb_cmdline(%ebx), %eax | |
mov %eax, __args | |
call __setup_args | |
call prepare_32 | |
jmpl $8, $start32 | |
prepare_32: | |
mov $(1 << 4), %eax // pse | |
mov %eax, %cr4 | |
mov $pt, %eax | |
mov %eax, %cr3 | |
mov %cr0, %eax | |
bts $0, %eax | |
bts $31, %eax | |
mov %eax, %cr0 | |
ret | |
smp_stacktop: .long stacktop - 4096 | |
save_id: | |
movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax | |
movl (%eax), %eax | |
shrl $24, %eax | |
lock btsl %eax, online_cpus | |
retl | |
ap_start32: | |
setup_segments | |
mov $-4096, %esp | |
lock xaddl %esp, smp_stacktop | |
setup_tr_and_percpu | |
call prepare_32 | |
call reset_apic | |
call save_id | |
call enable_apic | |
call enable_x2apic | |
call ap_online | |
/* ap_online() should never return */ | |
ud2 | |
start32: | |
setup_tr_and_percpu | |
call reset_apic | |
call save_id | |
call mask_pic_interrupts | |
call enable_apic | |
call bsp_rest_init | |
push $__environ | |
push $__argv | |
push __argc | |
call main | |
push %eax | |
call exit | |
#include "trampolines.S" |