From 53069ae43ea997d51d2b985a26fffdb86a59b023 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Wed, 22 Feb 2023 18:36:16 +0100 Subject: spinlocks in printf --- kernel/src/apic/apic.c | 14 +++++--------- kernel/src/apic/ioapic.c | 4 ++-- kernel/src/apic/madt.c | 3 --- kernel/src/libk/serial_stdio.c | 4 ++++ kernel/src/libk/stdio.c | 4 ++++ kernel/src/main.c | 2 ++ kernel/src/scheduler/ap_init.S | 11 ----------- kernel/src/scheduler/ap_startup.c | 8 ++++++-- 8 files changed, 23 insertions(+), 27 deletions(-) (limited to 'kernel/src') 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 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 #include +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 #include +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(;;) { -- cgit v1.2.3