diff options
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/apic/madt.c | 8 | ||||
| -rw-r--r-- | kernel/src/boot/boot.S | 14 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 4 | ||||
| -rw-r--r-- | kernel/src/scheduler/ap_init.S | 69 | ||||
| -rw-r--r-- | kernel/src/scheduler/ap_startup.c | 14 |
5 files changed, 70 insertions, 39 deletions
diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c index 6d701b7..3929cd8 100644 --- a/kernel/src/apic/madt.c +++ b/kernel/src/apic/madt.c @@ -5,6 +5,10 @@ #include <libk/stdio.h> #include <apic.h> #include <timer.h> +#include <atomic.h> + +mutex_t cnt_lock; +uint64_t cnt; uint8_t curr_cpu_apic_id(void); uint8_t curr_cpu_apic_id() @@ -146,6 +150,7 @@ void parse_madt() } kfree(madt); + init_mutex(&cnt_lock); uint8_t bspid = curr_cpu_apic_id(); uint8_t* bspdone = (uint8_t*)0x3000100; @@ -202,6 +207,7 @@ void parse_madt() } } *bspdone = 1; - wait(1); + wait(100); printf("aprunning: %d\n", *aprunning); + printf("cnt: %d\n", cnt); } diff --git a/kernel/src/boot/boot.S b/kernel/src/boot/boot.S index 1833f73..f4cb290 100644 --- a/kernel/src/boot/boot.S +++ b/kernel/src/boot/boot.S @@ -3,10 +3,12 @@ .section .boot32.text, "a" +.set STACK_TOP, 0x03008000 + .global _start _start: cli - mov $stack_top, %esp + mov $STACK_TOP, %esp pushl $0 pushl %eax pushl $0 @@ -37,7 +39,7 @@ setup_page_tables: leal (%edx, %ecx, 8), %edx movl %eax, (%edx) inc %ecx - cmp $1, %ecx + cmp $25, %ecx jne 1b // first 2mb in hh @@ -58,11 +60,12 @@ setup_page_tables: leal (%edx, %ecx, 8), %edx movl %eax, (%edx) inc %ecx - cmp $1, %ecx + cmp $25, %ecx jne 2b ret +.global enable_paging enable_paging: // enable PAE mov %cr4, %edx @@ -104,6 +107,7 @@ gdt_data = . - gdt .byte 0x92 .byte 0xAF .byte 0 +.global gdtp gdtp: .word . - gdt - 1 .quad gdt @@ -122,7 +126,3 @@ pt_lvl2: .skip 4096 pt_lvl2_hh: .skip 4096 - -stack_bottom: - .skip 4096*8 -stack_top: diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index 1445410..3a29771 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -50,8 +50,8 @@ void init_paging(void) { page_table_lvl4[511] = (uint64_t)page_table_lvl3 - KERNEL_VMA + (FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER); page_table_lvl3[510] = (uint64_t)page_table_lvl2 - KERNEL_VMA + (FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER); - // 16mb kernel + 32mb heap - for (size_t i = 0; i < 24; i++) { + // 16mb kernel + 32mb heap + 2mb (32kb stack * 64 threads) = first 50mb + for (size_t i = 0; i < 25; i++) { page_table_lvl2[i] = (uint64_t)0x0 + PAGE_SIZE * i + (FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER | FLAG_HUGE); } 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;"); + } } |
