From ba16aa366f958f51c2e8a23d1242e9622ac3811a Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 1 Oct 2023 19:09:28 -0300 Subject: [PATCH] logging: make term and printf smp safe --- kernel-src/arch/x86-64/main.c | 3 +++ kernel-src/include/logging.h | 18 ++++++++++++++++++ kernel-src/include/semaphore.h | 1 + kernel-src/include/x86-64/arch/cpu.h | 1 + kernel-src/io/logging.c | 8 ++++++++ kernel-src/io/term.c | 5 +++++ kernel-src/mm/vmm.c | 5 +++-- 7 files changed, 39 insertions(+), 2 deletions(-) diff --git a/kernel-src/arch/x86-64/main.c b/kernel-src/arch/x86-64/main.c index 234c99d2..39f95f62 100644 --- a/kernel-src/arch/x86-64/main.c +++ b/kernel-src/arch/x86-64/main.c @@ -30,11 +30,14 @@ #include #include #include +#include +#include static cpu_t bsp_cpu; void kernel_entry() { cpu_set(&bsp_cpu); + logging_init(); logging_sethook(arch_e9_putc); arch_gdt_reload(); arch_idt_setup(); diff --git a/kernel-src/include/logging.h b/kernel-src/include/logging.h index f1595a67..71d53397 100644 --- a/kernel-src/include/logging.h +++ b/kernel-src/include/logging.h @@ -3,9 +3,27 @@ #include #include +#include +#include void _putchar(char c); void logging_sethook(void (*fun)(char)); +void logging_init(); +extern mutex_t printf_mutex; + +#ifdef printf +#undef printf +#endif + +#define printf(...) { \ + if (_cpu()->thread) {\ + MUTEX_ACQUIRE(&printf_mutex, false); \ + } else { \ + while (MUTEX_TRY(&printf_mutex) == false) CPU_PAUSE(); \ + } \ + printf_(__VA_ARGS__); \ + MUTEX_RELEASE(&printf_mutex); \ +} #define __assert(x) \ if (!(x)){ \ diff --git a/kernel-src/include/semaphore.h b/kernel-src/include/semaphore.h index 88a6e347..9f2d650e 100644 --- a/kernel-src/include/semaphore.h +++ b/kernel-src/include/semaphore.h @@ -1,6 +1,7 @@ #ifndef _SEMAPHORE_H #define _SEMAPHORE_H +#include #include #include diff --git a/kernel-src/include/x86-64/arch/cpu.h b/kernel-src/include/x86-64/arch/cpu.h index af7ea754..0e4ac5c1 100644 --- a/kernel-src/include/x86-64/arch/cpu.h +++ b/kernel-src/include/x86-64/arch/cpu.h @@ -34,6 +34,7 @@ typedef struct cpu_t { } cpu_t; #define CPU_HALT() asm volatile("hlt") +#define CPU_PAUSE() asm volatile("pause") static inline cpu_t *_cpu() { return (cpu_t *)rdmsr(MSR_GSBASE); diff --git a/kernel-src/io/logging.c b/kernel-src/io/logging.c index 3c868f94..26e94c67 100644 --- a/kernel-src/io/logging.c +++ b/kernel-src/io/logging.c @@ -1,3 +1,7 @@ +#include + +mutex_t printf_mutex; + static void nohook(char c) { } @@ -12,3 +16,7 @@ void _putchar(char c) { void logging_sethook(void (*fun)(char)) { hook = fun; } + +void logging_init() { + MUTEX_INIT(&printf_mutex); +} diff --git a/kernel-src/io/term.c b/kernel-src/io/term.c index 7fa44984..52dbd23a 100644 --- a/kernel-src/io/term.c +++ b/kernel-src/io/term.c @@ -20,9 +20,12 @@ static void *internalalloc(size_t n) { } static struct flanterm_context *term_ctx; +static mutex_t term_mutex; void term_write(char *str, size_t count) { + MUTEX_ACQUIRE(&term_mutex, false); flanterm_write(term_ctx, str, count); + MUTEX_RELEASE(&term_mutex); } void term_putchar(char c) { @@ -55,4 +58,6 @@ void term_init() { ys = term_ctx->rows; fbxs = fb->width; fbys = fb->height; + + MUTEX_INIT(&term_mutex); } diff --git a/kernel-src/mm/vmm.c b/kernel-src/mm/vmm.c index bd1cdeb5..188bfc27 100644 --- a/kernel-src/mm/vmm.c +++ b/kernel-src/mm/vmm.c @@ -339,10 +339,11 @@ bool vmm_pagefault(void *addr, bool user, int actions) { } else { // anonymous memory. map the zero'd page status = arch_mmu_map(_cpu()->vmmctx->pagetable, zeropage, addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE); - if (!status) + if (!status) { printf("vmm: out of memory to map zero page into address space\n"); - else + } else { pmm_hold(zeropage); + } } } else if (arch_mmu_iswritable(_cpu()->vmmctx->pagetable, addr) == false){ // page present but not writeable in the page tables