summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bochsrc1
-rw-r--r--kernel/include/atomic.h3
-rw-r--r--kernel/src/apic/madt.c8
-rw-r--r--kernel/src/boot/boot.S14
-rw-r--r--kernel/src/mem/paging.c4
-rw-r--r--kernel/src/scheduler/ap_init.S69
-rw-r--r--kernel/src/scheduler/ap_startup.c14
7 files changed, 74 insertions, 39 deletions
diff --git a/.bochsrc b/.bochsrc
index 9354374..0524112 100644
--- a/.bochsrc
+++ b/.bochsrc
@@ -6,3 +6,4 @@ megs: 128
magic_break: enabled=1
com1: enabled=1, mode=file, dev=serial.log
display_library: x, options="gui_debug"
+cpu: count=4
diff --git a/kernel/include/atomic.h b/kernel/include/atomic.h
index 5ddc620..99f83fb 100644
--- a/kernel/include/atomic.h
+++ b/kernel/include/atomic.h
@@ -14,4 +14,7 @@ bool test_and_set(mutex_t mutex, bool value);
void lock(mutex_t mutex);
void unlock(mutex_t mutex);
+extern mutex_t cnt_lock;
+extern uint64_t cnt;
+
#endif
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;");
+ }
}