From 7c870116b4ae0fd1a9121e50930c8f362eb862c0 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Wed, 15 Jan 2025 16:32:07 +0300 Subject: [PATCH 1/3] Add cpu_full_halt --- kernel/arch/amd64/cpu/control.c | 10 ++++++++-- kernel/include/arch/cpu/control.h | 1 + kernel/include/kreflock.h | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/arch/amd64/cpu/control.c b/kernel/arch/amd64/cpu/control.c index f0f38e2..02aecc1 100644 --- a/kernel/arch/amd64/cpu/control.c +++ b/kernel/arch/amd64/cpu/control.c @@ -64,5 +64,11 @@ void cpu_interrupt_lock_force_release() { } void cpu_halt() { - asm("hlt"); -} \ No newline at end of file + asm volatile ("hlt"); +} + +void cpu_full_halt() { + reflock_acquire(&lock); + lock.allow_force_unlock = false; + cpu_halt(); +} diff --git a/kernel/include/arch/cpu/control.h b/kernel/include/arch/cpu/control.h index a9d0ec7..a51085f 100644 --- a/kernel/include/arch/cpu/control.h +++ b/kernel/include/arch/cpu/control.h @@ -9,5 +9,6 @@ extern void cpu_interrupt_lock_release(); extern void cpu_interrupt_lock_force_release(); void cpu_halt(); +void cpu_full_halt(); #endif \ No newline at end of file diff --git a/kernel/include/kreflock.h b/kernel/include/kreflock.h index b1fd26f..5da4ce0 100644 --- a/kernel/include/kreflock.h +++ b/kernel/include/kreflock.h @@ -28,7 +28,7 @@ typedef struct { void (*on_unlock)(); const bool strict; // if strict, panic if released empty lock - const bool allow_force_unlock; + bool allow_force_unlock; uint8_t data[12]; } reflock_t; From d6671643adc6131f169d59cf64f7c07eb788ab8b Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Wed, 15 Jan 2025 16:32:38 +0300 Subject: [PATCH 2/3] Fix issue #26 --- kernel/include/sys/panic.h | 9 ++++++++- kernel/kernel.c | 2 +- kernel/klibc/reflock.c | 8 ++++---- kernel/sys/panic.c | 9 ++++++--- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/kernel/include/sys/panic.h b/kernel/include/sys/panic.h index 7fc8245..29cda38 100644 --- a/kernel/include/sys/panic.h +++ b/kernel/include/sys/panic.h @@ -1,4 +1,11 @@ +#ifndef __SYS_PANIC +#define __SYS_PANIC + #include void __attribute__((noreturn)) panic_int(uint8_t int_no, const char *msg); -void __attribute__((noreturn)) panic(const char *msg); \ No newline at end of file +void __attribute__((noreturn)) panic(const char *msg, const char *func, const int line); + +#define PANIC(msg) panic(msg, __func__, __LINE__) + +#endif diff --git a/kernel/kernel.c b/kernel/kernel.c index b8bc1b1..b85d800 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -18,7 +18,7 @@ void kernel_main64(uint64_t *multiboot2, uint32_t magic, void *esp, serial_printf("[ERR]\n"); } - panic("AAAAAAAAAAAAAAAaa"); + PANIC("AAAAAAAAAAAAAAAaa"); for (;;) {} } diff --git a/kernel/klibc/reflock.c b/kernel/klibc/reflock.c index a637b04..dd73c53 100644 --- a/kernel/klibc/reflock.c +++ b/kernel/klibc/reflock.c @@ -50,7 +50,7 @@ void reflock_acquire(reflock_t *lock) { struct reflock_private *private = reflock_get_private_ptr(lock); if (!reflock_validate_magic(lock)) { - panic("broken reflock (invalid magic)"); + PANIC("broken reflock (invalid magic)"); } if (!private->data.refcount && lock->on_lock) { @@ -64,12 +64,12 @@ void reflock_release(reflock_t *lock) { struct reflock_private *private = reflock_get_private_ptr(lock); if (!reflock_validate_magic(lock)) { - panic("broken reflock (invalid magic field)"); + PANIC("broken reflock (invalid magic field)"); } if (!private->data.refcount) { if (lock->strict) { - panic("Attempted to release empty strict reflock"); + PANIC("Attempted to release empty strict reflock"); } return; @@ -89,7 +89,7 @@ void reflock_force_unlock(reflock_t *lock) { struct reflock_private *private = reflock_get_private_ptr(lock); if (!lock->allow_force_unlock) { - panic("Attempted disallowed force-unlock of a reflock"); + PANIC("Attempted disallowed force-unlock of a reflock"); } private->data.refcount = 0; diff --git a/kernel/sys/panic.c b/kernel/sys/panic.c index b264a68..768d87c 100644 --- a/kernel/sys/panic.c +++ b/kernel/sys/panic.c @@ -6,6 +6,8 @@ // TODO: make printf-like void __attribute__((noreturn)) panic_int(uint8_t int_no, const char *msg) { + cpu_interrupt_lock_acquire(); + serial_printf("\n\rKernel panic (in interrupt) [INT=0x%02X] - %s\n", int_no, msg); cpu_state_print(); @@ -13,9 +15,10 @@ void __attribute__((noreturn)) panic_int(uint8_t int_no, const char *msg) { for (;;) cpu_halt(); } -void __attribute__((noreturn)) panic(const char *msg) { - serial_printf("\n\rKernel panic - %s\n", msg); - cpu_state_print(); +void __attribute__((noreturn)) panic(const char *msg, const char *func, const int line) { + cpu_interrupt_lock_acquire(); + serial_printf("\n\rKernel panic - %s in %s:%d\n", msg, func, line); + cpu_state_print(); for (;;) cpu_halt(); } \ No newline at end of file From 088286aca370610036ed415af6f05a5834bf5c76 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Wed, 15 Jan 2025 16:33:01 +0300 Subject: [PATCH 3/3] Fix warning: found `movsd'; assuming `movsl' was meant --- kernel/klibc/string.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/klibc/string.c b/kernel/klibc/string.c index 99a6971..15bf75e 100644 --- a/kernel/klibc/string.c +++ b/kernel/klibc/string.c @@ -48,13 +48,13 @@ void xmemcpy(void *dest, const void *src, size_t size, opsize_t opsize) { : "memory"); break; case OPSIZE_DWORD: - asm volatile("rep movsd" + asm volatile("rep movsl" : "=&c"(d0), "=&D"(d1), "=&S"(d2) : "0"(size), "1"(dest), "2"(src) : "memory"); break; case OPSIZE_QWORD: - asm volatile("rep movsd" + asm volatile("rep movsl" : "=&c"(d0), "=&D"(d1), "=&S"(d2) : "0"(size), "1"(dest), "2"(src) : "memory");