From 43278fb351ec5af19b89f11ace098b70aa16534e Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 5 Sep 2023 23:48:55 +0200 Subject: [PATCH] add basic kernel crash screen --- src/kernel/include/internal/havarie.h | 7 +++++ src/kernel/include/internal/text_screen.h | 3 ++ src/kernel/kmain.c | 4 +++ src/kernel/lib/havarie.c | 37 +++++++++++++++++++++++ src/kernel/lib/text_screen.c | 13 +++++++- 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/kernel/include/internal/havarie.h create mode 100644 src/kernel/lib/havarie.c diff --git a/src/kernel/include/internal/havarie.h b/src/kernel/include/internal/havarie.h new file mode 100644 index 0000000..645b0c9 --- /dev/null +++ b/src/kernel/include/internal/havarie.h @@ -0,0 +1,7 @@ +#ifndef _CLIPPER_HAVARIE_H_ +#define _CLIPPER_HAVARIE_H_ + +void capsize() __attribute__((noreturn)); +void print_havarie_msg(); + +#endif // _CLIPPER_HAVARIE_H_ diff --git a/src/kernel/include/internal/text_screen.h b/src/kernel/include/internal/text_screen.h index 2a0d209..a980c47 100644 --- a/src/kernel/include/internal/text_screen.h +++ b/src/kernel/include/internal/text_screen.h @@ -33,6 +33,9 @@ enum text_screen_attribute { void tsinit(void); +void tsclear_screen(); +void tscursor_set(uint8_t x, uint8_t y); + void tsputch(char ch, uint8_t color); void tsputs(const char* str, uint8_t color); diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 9ca34e1..6297914 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -3,6 +3,8 @@ #include #include +#include "internal/havarie.h" + #if defined(__linux__) # error "Please use a platform agnostic compiler" #endif @@ -21,5 +23,7 @@ void kmain(void) { tsprintf("Test | Integers: %d, Unsigned: %u, Hexadecimal: %x\n", -48, 28493, 28493); + capsize(); + return; } diff --git a/src/kernel/lib/havarie.c b/src/kernel/lib/havarie.c new file mode 100644 index 0000000..ed3ffd6 --- /dev/null +++ b/src/kernel/lib/havarie.c @@ -0,0 +1,37 @@ +#include "internal/havarie.h" + +#include "internal/text_screen.h" + +void capsize() { + print_havarie_msg(); + + asm("cli\n" + "hlt"); + + for(;;); +} + +void print_havarie_msg() { + tsclear_screen(); + tscursor_set(0, 0); + tsputs("Havarie - the clipper has capsized\n\n\n", TEXT_SCREEN_BG_BLACK | TEXT_SCREEN_FG_LIGHT_CYAN); + + + int eax, ebx, ecx, edx, esi, edi, esp, ebp; + asm("mov %%eax, %[eax]\n" + "mov %%ebx, %[ebx]\n" + "mov %%ecx, %[ecx]\n" + "mov %%edx, %[edx]\n" + "mov %%esi, %[esi]\n" + "mov %%edi, %[edi]\n" + "mov %%esp, %[esp]\n" + "mov %%ebp, %[ebp]\n" + : [eax]"=m" (eax), [ebx]"=m" (ebx), [ecx]"=m" (ecx), [edx]"=m" (edx), + [esi]"=m" (esi), [edi]"=m" (edi), [esp]"=m" (esp), [ebp]"=m" (ebp) + ); + + tsprintf("eax=0x%x\t\tesi=0x%x\n", eax, esi); + tsprintf("ebx=0x%x\t\tedi=0x%x\n", ebx, edi); + tsprintf("ecx=0x%x\t\tesp=0x%x\n", ecx, esp); + tsprintf("edx=0x%x\t\tebp=0x%x\n", edx, ebp); +} diff --git a/src/kernel/lib/text_screen.c b/src/kernel/lib/text_screen.c index 6481ae9..3c033ec 100644 --- a/src/kernel/lib/text_screen.c +++ b/src/kernel/lib/text_screen.c @@ -28,6 +28,17 @@ void tsinit(void) { outb(0x3D5, 0x20); } +void tsclear_screen() { + for (uint32_t i = 0; i < ((SCREEN_WIDTH * SCREEN_HEIGHT) >> 2); i++) { + ((uint32_t*)videomem)[i] = (uint32_t)0; + } +} + +void tscursor_set(uint8_t x, uint8_t y) { + cursor_x = x; + cursor_y = y; +} + void tsputch(char ch, uint8_t color) { const char tmp[2] = { ch, 0 }; tsputs(tmp, color); @@ -46,7 +57,7 @@ void handle_special_char(char c) { } break; case '\r': cursor_x = 0; break; - case '\t': cursor_x += 4; break; + case '\t': cursor_x += 4; cursor_x -= cursor_x % 4; break; } }