diff options
Diffstat (limited to 'kernel/src/scheduler')
| -rw-r--r-- | kernel/src/scheduler/ap_init.S | 69 | ||||
| -rw-r--r-- | kernel/src/scheduler/ap_startup.c | 14 |
2 files changed, 54 insertions, 29 deletions
diff --git a/kernel/src/scheduler/ap_init.S b/kernel/src/scheduler/ap_init.S index 8cb4314..17cffab 100644 --- a/kernel/src/scheduler/ap_init.S +++ b/kernel/src/scheduler/ap_init.S @@ -6,34 +6,34 @@ .SET bspdone, 0x3000100 .SET aprunning, 0x3000200 -# this code will be relocated to 0x8000, sets up environment for calling a C function .code16 ap_trampoline: cli cld - ljmp $0, $0x8040 + ljmp $0, $_start16 .align 16 -_L8010_GDT_table: +gdt32: .long 0, 0 .long 0x0000FFFF, 0x00CF9A00 # flat code .long 0x0000FFFF, 0x008F9200 # flat data .long 0x00000068, 0x00CF8900 # tss -_L8030_GDT_value: - .word _L8030_GDT_value - _L8010_GDT_table - 1 +gdt32p: + .word gdt32p - gdt32 - 1 .long 0x8010 .long 0, 0 .align 64 -_L8040: +_start16: xorw %ax, %ax movw %ax, %ds - lgdtl 0x8030 + lgdtl gdt32p movl %cr0, %eax orl $1, %eax movl %eax, %cr0 - ljmp $8, $0x8060 - .align 32 - .code32 -_L8060: + ljmp $8, $_start32 + +.align 32 +.code32 +_start32: movw $16, %ax movw %ax, %ds movw %ax, %ss @@ -46,26 +46,45 @@ _L8060: # set up 32k stack, one for each core. It is important that all core must have its own stack movl $stack_top, %esp - mov %edi, %ecx -2: + movl %ebx, %ecx +22: addl $stack_off, %esp decl %ecx cmp $0, %ecx - jne 2b + jne 22b + - shll $15, %ebx - subl %ebx, %esp - pushl %edi - # spinlock, wait for the BSP to finish -1: +# spinlock, wait for the BSP to finish +11: pause cmpb $0, bspdone - jz 1b - lock incb aprunning + jz 11b + + call enable_paging + lgdt gdtp -3: - hlt - jmp 3b # jump into C code (should never return) - # ljmp $8, $ap_startup + ljmp $8, $_start64 + +.set KERNEL_VMA, 0xffffffff80000000 + +.align 64 +.code64 +_start64: + mov $0x10, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %ss + mov %ax, %fs + mov %ax, %gs + + + add $KERNEL_VMA, %rsp + movabs $_higher_half, %rax + jmp *%rax + +.section .text +_higher_half: + lock incb aprunning + call ap_startup diff --git a/kernel/src/scheduler/ap_startup.c b/kernel/src/scheduler/ap_startup.c index 43b1a51..3bb4ab2 100644 --- a/kernel/src/scheduler/ap_startup.c +++ b/kernel/src/scheduler/ap_startup.c @@ -1,5 +1,11 @@ -// this C code can be anywhere you want it, no relocation needed -void ap_startup(int apicid) { - // do what you want to do on the AP - while(1); +#include <atomic.h> + +void ap_startup(void) { + lock(cnt_lock); + cnt++; + unlock(cnt_lock); + + for(;;) { + __asm__ volatile ("hlt;"); + } } |
