summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-22 18:36:16 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-22 18:36:16 +0100
commit53069ae43ea997d51d2b985a26fffdb86a59b023 (patch)
tree173e9a3c452e2116db9a82f06de3761b97d6605b /kernel
parent57e6722453c27d35a3b02309ce21263d225a23e3 (diff)
spinlocks in printf
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/apic.h3
-rw-r--r--kernel/include/atomic.h4
-rw-r--r--kernel/include/libk/serial_stdio.h3
-rw-r--r--kernel/include/libk/stdio.h3
-rw-r--r--kernel/src/apic/apic.c14
-rw-r--r--kernel/src/apic/ioapic.c4
-rw-r--r--kernel/src/apic/madt.c3
-rw-r--r--kernel/src/libk/serial_stdio.c4
-rw-r--r--kernel/src/libk/stdio.c4
-rw-r--r--kernel/src/main.c2
-rw-r--r--kernel/src/scheduler/ap_init.S11
-rw-r--r--kernel/src/scheduler/ap_startup.c8
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(;;) {