blob: ceee58f94011cb8cad169afb4b98fd2cd8d4532f [file] [log] [blame]
#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"