diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/apic.h | 3 | ||||
| -rw-r--r-- | kernel/include/atomic.h | 4 | ||||
| -rw-r--r-- | kernel/include/libk/serial_stdio.h | 3 | ||||
| -rw-r--r-- | kernel/include/libk/stdio.h | 3 | ||||
| -rw-r--r-- | kernel/src/apic/apic.c | 14 | ||||
| -rw-r--r-- | kernel/src/apic/ioapic.c | 4 | ||||
| -rw-r--r-- | kernel/src/apic/madt.c | 3 | ||||
| -rw-r--r-- | kernel/src/libk/serial_stdio.c | 4 | ||||
| -rw-r--r-- | kernel/src/libk/stdio.c | 4 | ||||
| -rw-r--r-- | kernel/src/main.c | 2 | ||||
| -rw-r--r-- | kernel/src/scheduler/ap_init.S | 11 | ||||
| -rw-r--r-- | kernel/src/scheduler/ap_startup.c | 8 |
12 files changed, 33 insertions, 30 deletions
diff --git a/kernel/include/apic.h b/kernel/include/apic.h index 700d6d1..0025e53 100644 --- a/kernel/include/apic.h +++ b/kernel/include/apic.h @@ -8,7 +8,8 @@ uint8_t curr_cpu_apic_id(void); void init_ap_cpus(void); extern mutex_t cnt_lock; -extern uint32_t cnt; +extern uint32_t ap_cnt; +extern uint32_t bspdone; extern uint32_t ioapic_addr; extern uint64_t lapic_addr; extern uint32_t numcores; diff --git a/kernel/include/atomic.h b/kernel/include/atomic.h index 5ddc620..01a2433 100644 --- a/kernel/include/atomic.h +++ b/kernel/include/atomic.h @@ -1,5 +1,5 @@ -#ifndef ATOMIC -#define ATOMIC +#ifndef ATOMIC_H +#define ATOMIC_H #include <types.h> diff --git a/kernel/include/libk/serial_stdio.h b/kernel/include/libk/serial_stdio.h index 5a4dda4..638d46a 100644 --- a/kernel/include/libk/serial_stdio.h +++ b/kernel/include/libk/serial_stdio.h @@ -2,6 +2,7 @@ #define SERIAL_STDIO_H #include <types.h> +#include <atomic.h> void serial_print_char(char c); void serial_print_string(const char* s); @@ -10,4 +11,6 @@ void serial_print_hex(uint64_t num); void serial_printf(const char *s, ...); void serial_vprintf(const char *s, va_list list); +extern mutex_t serial_stdio_lock; + #endif diff --git a/kernel/include/libk/stdio.h b/kernel/include/libk/stdio.h index 64d16f1..f7b204e 100644 --- a/kernel/include/libk/stdio.h +++ b/kernel/include/libk/stdio.h @@ -2,6 +2,7 @@ #define STDIO_H #include <types.h> +#include <atomic.h> void print_char(char c); void print_string(const char* s); @@ -10,4 +11,6 @@ void print_hex(uint64_t num); void printf(const char *s, ...); void vprintf(const char *s, va_list list); +extern mutex_t stdio_lock; + #endif diff --git a/kernel/src/apic/apic.c b/kernel/src/apic/apic.c index ba9138d..7fa57bf 100644 --- a/kernel/src/apic/apic.c +++ b/kernel/src/apic/apic.c @@ -7,7 +7,8 @@ #include <timer.h> mutex_t cnt_lock; -uint32_t cnt = 0; +uint32_t ap_cnt = 0; +uint32_t bspdone = 0; uint32_t ioapic_addr = 0; uint64_t lapic_addr = 0; uint32_t numcores = 0; @@ -26,10 +27,6 @@ uint8_t curr_cpu_apic_id() void init_ap_cpus() { uint8_t bspid = curr_cpu_apic_id(); - uint8_t* bspdone = (uint8_t*)0x3000100; - uint8_t* aprunning = (uint8_t*)0x3000200; - *bspdone = 0; - *aprunning = 0; init_mutex(&cnt_lock); map_addr(lapic_addr, lapic_addr, FLAG_PRESENT); @@ -74,8 +71,7 @@ void init_ap_cpus() } } - *bspdone = 1; - wait(1000); - printf("aprunning: %d\n", *aprunning); - printf("cnt: %d\n", cnt); + bspdone = 1; + wait(10); + printf("ap_cnt: %d\n", ap_cnt); } diff --git a/kernel/src/apic/ioapic.c b/kernel/src/apic/ioapic.c index 73c58d0..4c3fd69 100644 --- a/kernel/src/apic/ioapic.c +++ b/kernel/src/apic/ioapic.c @@ -58,11 +58,11 @@ void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector) void apic_remap_interrupts() { - uint8_t bspid = curr_cpu_apic_id(); - map_addr(ioapic_addr, ioapic_addr, FLAG_PRESENT); map_addr(lapic_addr, lapic_addr, FLAG_PRESENT); + uint8_t bspid = curr_cpu_apic_id(); + // irq is 2 because of gsi remap ioapic_set_irq(0x2, bspid, 0x20); // timer ioapic_set_irq(0x1, bspid, 0x21); // keyboard diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c index ad0720e..8a1e51d 100644 --- a/kernel/src/apic/madt.c +++ b/kernel/src/apic/madt.c @@ -18,9 +18,6 @@ void parse_madt() memcpy(madt, madt_addr, sizeof(struct MADT)); lapic_addr = madt->lapic_addr; - printf("curr_cpu_apic_id: 0x%x\n", curr_cpu_apic_id()); - printf("lapic_addr: 0x%x\n", lapic_addr); - for (size_t curr_size = sizeof(struct MADT); curr_size < madt->h.Length;) { struct MADT_type_header* m = (struct MADT_type_header*)kalloc(sizeof(struct MADT_type_header)); memcpy(m, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_type_header)); diff --git a/kernel/src/libk/serial_stdio.c b/kernel/src/libk/serial_stdio.c index 951a170..8c0c527 100644 --- a/kernel/src/libk/serial_stdio.c +++ b/kernel/src/libk/serial_stdio.c @@ -5,6 +5,8 @@ #include <graphics.h> #include <serial.h> +mutex_t serial_stdio_lock; + void serial_print_char(char c) { write_serial(c); @@ -43,6 +45,7 @@ void serial_printf(const char *s, ...) void serial_vprintf(const char *s, va_list list) { + lock(serial_stdio_lock); size_t count = 0; for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; @@ -63,4 +66,5 @@ void serial_vprintf(const char *s, va_list list) } else serial_print_char(s[i]); } + unlock(serial_stdio_lock); } diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c index 8ecd97c..18f3d3f 100644 --- a/kernel/src/libk/stdio.c +++ b/kernel/src/libk/stdio.c @@ -3,6 +3,8 @@ #include <graphics.h> #include <serial.h> +mutex_t stdio_lock; + void print_char(char c) { if (main_fb.x * 8 >= main_fb.width) { @@ -64,6 +66,7 @@ void printf(const char *s, ...) void vprintf(const char *s, va_list list) { + lock(stdio_lock); size_t count = 0; for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; @@ -84,4 +87,5 @@ void vprintf(const char *s, va_list list) } else print_char(s[i]); } + unlock(stdio_lock); } diff --git a/kernel/src/main.c b/kernel/src/main.c index f70bbee..a88dd51 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -34,6 +34,8 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) init_heap(); read_mb2(multiboot_bootinfo, multiboot_magic); clear_screen(main_fb); + init_mutex(&stdio_lock); + init_mutex(&serial_stdio_lock); // framebuffer is enabled from this point init_pmm(); memory_usage(); diff --git a/kernel/src/scheduler/ap_init.S b/kernel/src/scheduler/ap_init.S index 17cffab..47efc6f 100644 --- a/kernel/src/scheduler/ap_init.S +++ b/kernel/src/scheduler/ap_init.S @@ -3,8 +3,6 @@ .SET stack_top, 0x3008000 .SET stack_off, 0x8000 -.SET bspdone, 0x3000100 -.SET aprunning, 0x3000200 .code16 ap_trampoline: @@ -53,17 +51,9 @@ _start32: cmp $0, %ecx jne 22b - -# spinlock, wait for the BSP to finish -11: - pause - cmpb $0, bspdone - jz 11b - call enable_paging lgdt gdtp - # jump into C code (should never return) ljmp $8, $_start64 @@ -86,5 +76,4 @@ _start64: .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 0d37a6c..4e70f17 100644 --- a/kernel/src/scheduler/ap_startup.c +++ b/kernel/src/scheduler/ap_startup.c @@ -10,9 +10,13 @@ void ap_startup(void) { load_gdt(&gdt_pointer); load_pt_lvl4(page_table_lvl4); - lock(cnt_lock); + while (bspdone) { + __asm__ __volatile__ ("pause;"); + } + printf("curr_cpu_apic_id: 0x%x\n", curr_cpu_apic_id()); - cnt++; + lock(cnt_lock); + ap_cnt++; unlock(cnt_lock); for(;;) { |
