From e8a55d72a5f73f477fd7c44a490d2ce0335ec58a Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Sun, 27 Oct 2024 10:23:56 +0100 Subject: [PATCH] Major libk restructuring, also rewrote drivers/serial.h --- boot/stage3.c | 62 +++++++++++++++++- kern.img | Bin 1470464 -> 1470464 bytes kernel/kernel.c | 38 +++++------ .../sound => libc/include/sys}/notes.h | 0 libk/{interrupt => cpu}/idt.c | 4 +- libk/{interrupt => cpu}/isr.c | 11 ++-- libk/{interrupt => cpu}/isr.s | 0 libk/cpu/system.c | 49 ++++++++++++++ libk/{disk => drivers}/disk.c | 4 +- libk/{keyboard => drivers}/keyboard.c | 20 +++--- libk/{sound => drivers}/pcspk.c | 8 +-- libk/{interrupt => drivers}/rtc.c | 15 ++--- libk/drivers/serial.c | 50 ++++++++++++++ libk/{interrupt/pit.c => drivers/timer.c} | 8 +-- libk/error/bigerr.c | 58 ---------------- libk/error/debug.c | 19 ------ libk/error/panic.c | 7 -- libk/fs/{impl.c => kernfs.c} | 6 +- libk/include/{interrupt => cpu}/idt.h | 7 +- libk/include/{interrupt => cpu}/isr.h | 6 +- libk/include/cpu/system.h | 19 ++++++ libk/include/{disk => drivers}/disk.h | 4 +- .../{keyboard/keys.h => drivers/keyboard.h} | 14 +++- libk/include/{sound => drivers}/pcspk.h | 6 +- libk/include/{interrupt => drivers}/rtc.h | 9 ++- libk/include/drivers/serial.h | 23 +++++++ .../{interrupt/pit.h => drivers/timer.h} | 6 +- libk/include/error/bigerr.h | 14 ---- libk/include/error/debug.h | 6 -- libk/include/error/panic.h | 6 -- libk/include/fs/fs.h | 4 +- libk/include/fs/{impl.h => kernfs.h} | 5 +- libk/include/interrupt/exceptions.h | 6 -- libk/include/keyboard/keyboard.h | 14 ---- libk/include/memory/addresses.h | 6 +- libk/include/memory/malloc.h | 4 +- libk/include/memory/physical.h | 4 +- libk/include/memory/virtual.h | 6 +- libk/include/ports/io.h | 13 ---- libk/include/ports/serial.h | 24 ------- libk/include/screen/gfxmode.h | 4 +- libk/include/screen/graphics.h | 6 +- libk/include/screen/text.h | 4 +- libk/include/{tty => screen}/tty.h | 4 +- libk/include/syscalls/syscalls.h | 6 +- libk/makefile | 2 +- libk/ports/io.c | 29 -------- libk/ports/serial.c | 46 ------------- libk/screen/text.c | 4 +- libk/{tty => screen}/tty.c | 4 +- libk/syscalls/sys_close.c | 2 +- libk/syscalls/sys_exit.c | 4 +- libk/syscalls/sys_free.c | 2 +- libk/syscalls/sys_malloc.c | 2 +- libk/syscalls/sys_open.c | 2 +- libk/syscalls/sys_read.c | 2 +- libk/syscalls/sys_seek.c | 2 +- libk/syscalls/sys_sleep.c | 2 +- libk/syscalls/sys_write.c | 4 +- libk/syscalls/syscalls.c | 4 +- makefile | 2 +- todo.txt | 12 ++-- 62 files changed, 334 insertions(+), 380 deletions(-) rename {libk/include/sound => libc/include/sys}/notes.h (100%) rename libk/{interrupt => cpu}/idt.c (91%) rename libk/{interrupt => cpu}/isr.c (92%) rename libk/{interrupt => cpu}/isr.s (100%) create mode 100644 libk/cpu/system.c rename libk/{disk => drivers}/disk.c (97%) rename libk/{keyboard => drivers}/keyboard.c (53%) rename libk/{sound => drivers}/pcspk.c (81%) rename libk/{interrupt => drivers}/rtc.c (95%) create mode 100644 libk/drivers/serial.c rename libk/{interrupt/pit.c => drivers/timer.c} (90%) delete mode 100644 libk/error/bigerr.c delete mode 100644 libk/error/debug.c delete mode 100644 libk/error/panic.c rename libk/fs/{impl.c => kernfs.c} (97%) rename libk/include/{interrupt => cpu}/idt.h (91%) rename libk/include/{interrupt => cpu}/isr.h (91%) create mode 100644 libk/include/cpu/system.h rename libk/include/{disk => drivers}/disk.h (84%) rename libk/include/{keyboard/keys.h => drivers/keyboard.h} (88%) rename libk/include/{sound => drivers}/pcspk.h (69%) rename libk/include/{interrupt => drivers}/rtc.h (74%) create mode 100644 libk/include/drivers/serial.h rename libk/include/{interrupt/pit.h => drivers/timer.h} (76%) delete mode 100644 libk/include/error/bigerr.h delete mode 100644 libk/include/error/debug.h delete mode 100644 libk/include/error/panic.h rename libk/include/fs/{impl.h => kernfs.h} (83%) delete mode 100644 libk/include/interrupt/exceptions.h delete mode 100644 libk/include/keyboard/keyboard.h delete mode 100644 libk/include/ports/io.h delete mode 100644 libk/include/ports/serial.h rename libk/include/{tty => screen}/tty.h (91%) delete mode 100644 libk/ports/io.c delete mode 100644 libk/ports/serial.c rename libk/{tty => screen}/tty.c (98%) diff --git a/boot/stage3.c b/boot/stage3.c index 580a297..11be2a7 100644 --- a/boot/stage3.c +++ b/boot/stage3.c @@ -3,11 +3,12 @@ #include #include #include -#include -#include -#include +#include +#include #include +void bigError(uint32_t err); + __attribute__ ((section("entry"))) void main() { // Physical memory manager setup @@ -80,3 +81,58 @@ void main() { bigError(0xffffffff); } +void rect(uint32_t c, uint16_t x, uint16_t y, uint16_t w, uint16_t h) { + uint8_t* vidmem = (uint8_t*)gfxMode->physicalBasePtr; + uint8_t bytesPerPx = gfxMode->bpp / 8; + uint32_t convColor = convertColor(c); + + for (uint32_t dx = 0; dx < w; dx++) { + for (uint32_t dy = 0; dy < h; dy++) { + uint32_t offset = (((y + dy) * gfxMode->xRes) + (x + dx)) * bytesPerPx; + + for (uint8_t i = 0; i < gfxMode->bpp; i++) { + vidmem[offset + i] = (uint8_t)(convColor >> (i*8)); + } + } + } +} + +void bigError(uint32_t err) { + // Red BG + rect(0x00ff0000, 0, 0, gfxMode->xRes, gfxMode->yRes); + // E + rect(0x00ffffff, 20, 10, 10, 50); + rect(0x00ffffff, 30, 10, 30, 10); + rect(0x00ffffff, 30, 30, 30, 10); + rect(0x00ffffff, 30, 50, 30, 10); + // R + rect(0x00ffffff, 70, 10, 10, 50); + rect(0x00ffffff, 70, 10, 30, 10); + rect(0x00ffffff, 70, 30, 30, 10); + rect(0x00ffffff, 90, 10, 10, 30); + rect(0x00ffffff, 80, 40, 10, 10); + rect(0x00ffffff, 90, 50, 10, 10); + // R + rect(0x00ffffff, 110, 10, 10, 50); + rect(0x00ffffff, 110, 10, 30, 10); + rect(0x00ffffff, 110, 30, 30, 10); + rect(0x00ffffff, 130, 10, 10, 30); + rect(0x00ffffff, 120, 40, 10, 10); + rect(0x00ffffff, 130, 50, 10, 10); + // O + rect(0x00ffffff, 150, 10, 10, 50); + rect(0x00ffffff, 170, 10, 10, 50); + rect(0x00ffffff, 150, 10, 30, 10); + rect(0x00ffffff, 150, 50, 30, 10); + // R + rect(0x00ffffff, 190, 10, 10, 50); + rect(0x00ffffff, 190, 10, 30, 10); + rect(0x00ffffff, 190, 30, 30, 10); + rect(0x00ffffff, 210, 10, 10, 30); + rect(0x00ffffff, 200, 40, 10, 10); + rect(0x00ffffff, 210, 50, 10, 10); + + __asm__ volatile ("cli; hlt" :: "a"(err)); +} + + diff --git a/kern.img b/kern.img index 1f5f9d16c71eceb5c73e1afc9606800c1419d45f..7ab2777899b246df6cbdb0d3187733946ea51b04 100644 GIT binary patch delta 12066 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

bMnmmx>PO<>DFl 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 XwsD%AW@oUot+Smo#2NZh`x*ZZmJqY% diff --git a/kernel/kernel.c b/kernel/kernel.c index 9aa01bf..eba4285 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,29 +1,29 @@ -#include -#include -#include #include -#include +#include #include #include -#include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include +#include #include -#include -#include /* Little teaser #include @@ -64,8 +64,8 @@ void main() { // Setup serial output for debugf() if (setupSerial(PORT_COM1) != 0) { printf("\x1b[1MFailed to initialize serial interface\x1b[8M\n"); } else { - serialPrint(PORT_COM1, "\x1b[H\x1b[J"); // Clear - serialPrint(PORT_COM1, "kern. \x1b[36m(Serial console)\x1b[0m\n\n"); + debugf("\x1b[H\x1b[J"); // Clear + debugf("kern. \x1b[36m(Serial console)\x1b[0m\n\n"); } // Interrupt setup diff --git a/libk/include/sound/notes.h b/libc/include/sys/notes.h similarity index 100% rename from libk/include/sound/notes.h rename to libc/include/sys/notes.h diff --git a/libk/interrupt/idt.c b/libk/cpu/idt.c similarity index 91% rename from libk/interrupt/idt.c rename to libk/cpu/idt.c index 913712e..6547961 100644 --- a/libk/interrupt/idt.c +++ b/libk/cpu/idt.c @@ -1,8 +1,6 @@ -#include +#include #include -#define IDT_ENTRIES 256 - __attribute__ ((aligned(0x10))) // For performance idtEntry_t idt[IDT_ENTRIES] = { 0 }; idtp_t idtp; diff --git a/libk/interrupt/isr.c b/libk/cpu/isr.c similarity index 92% rename from libk/interrupt/isr.c rename to libk/cpu/isr.c index 67ae969..deeea7d 100644 --- a/libk/interrupt/isr.c +++ b/libk/cpu/isr.c @@ -1,11 +1,10 @@ -#include -#include #include -#include -#include -#include +#include +#include +#include +#include -const char* format = "\x1b[31mPanic: %s!\n"; +const char* format = "\x1b[31m[kernel] %s!\n\x1b[0m"; const char* exceptions[] = { "Division By Zero", "Debug", diff --git a/libk/interrupt/isr.s b/libk/cpu/isr.s similarity index 100% rename from libk/interrupt/isr.s rename to libk/cpu/isr.s diff --git a/libk/cpu/system.c b/libk/cpu/system.c new file mode 100644 index 0000000..fc201f8 --- /dev/null +++ b/libk/cpu/system.c @@ -0,0 +1,49 @@ +#include +#include +#include + +void cpuid(uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) { + __asm__ volatile ( + "cpuid" + : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) + : "a"(*eax) + ); +} + +uint8_t inb(uint16_t port) { + uint8_t result; + __asm__ volatile("inb %1, %0" : "=a"(result) : "Nd"(port)); + return result; +} +void outb(uint16_t port, uint8_t data) { + __asm__ volatile("outb %0, %1" :: "a"(data), "Nd"(port)); +} + +uint16_t inw(uint16_t port) { + uint16_t result; + __asm__ volatile("inw %1, %0" : "=a"(result) : "Nd"(port)); + return result; +} +void outw(uint16_t port, uint16_t data) { + __asm__ volatile("outw %0, %1" :: "a"(data), "Nd"(port)); +} + +uint32_t inl(uint16_t port) { + uint32_t result; + __asm__ volatile("inl %1, %0" : "=a"(result) : "Nd"(port)); + return result; +} +void outl(uint16_t port, uint32_t data) { + __asm__ volatile("outl %0, %1" :: "a"(data), "Nd"(port)); +} + +void ioWait() { + // Waits ~1 I/O Cycle (Linux uses this so it should be good) + __asm__ volatile("outb %%al, $0x80" : : "a"(0)); +} + +void panic() { + debugf("\x1b[31m[kernel] Kern panic!\x1b[0m\n"); + while (1) { __asm__ volatile ("cli; hlt"); } +} + diff --git a/libk/disk/disk.c b/libk/drivers/disk.c similarity index 97% rename from libk/disk/disk.c rename to libk/drivers/disk.c index 9a67b8f..ea1f892 100644 --- a/libk/disk/disk.c +++ b/libk/drivers/disk.c @@ -1,6 +1,6 @@ -#include +#include +#include #include -#include void diskRead(uint32_t lbaAddress, uint8_t sectorCount, char* dst) { outb(PIO_PORT + 6, ((lbaAddress >> 24) & 0x0f) | 0xe0); // 6 - Use LBA; 4 - Drive number; 3-0 - Highest lba address nibble diff --git a/libk/keyboard/keyboard.c b/libk/drivers/keyboard.c similarity index 53% rename from libk/keyboard/keyboard.c rename to libk/drivers/keyboard.c index 173afc3..e8b5ed9 100644 --- a/libk/keyboard/keyboard.c +++ b/libk/drivers/keyboard.c @@ -1,27 +1,23 @@ -#include -#include -#include +#include #include -#include -#include -#include +#include +#include static const uint8_t US_Keyboard[2][128] = US_KEYBOARD; keyboardState_t* keyboard = (keyboardState_t*)KEYBOARD_STATE_LOC; -void keyboardHandler(intFrame_t*) { // TODO: Make this better and be able to read multi-byte scancode +// TODO: Make this better and be able to read multi-byte scancode +void keyboardHandler(intFrame_t*) { uint8_t scancode = inb(0x60); char c = US_Keyboard[keyboard->shift][scancode]; if (scancode == LEFT_SHIFT_PRESS || scancode == RIGHT_SHIFT_PRESS) { - keyboard->shift = true; + keyboard->shift = 1; } else if (scancode == LEFT_SHIFT_RELEASE || scancode == RIGHT_SHIFT_RELEASE) { - keyboard->shift = false; + keyboard->shift = 0; } if (scancode & 0x80) { // Keyup - } else if (c != '\0') { - keyboard->character = c; - } + } else if (c != '\0') { keyboard->character = c; } } diff --git a/libk/sound/pcspk.c b/libk/drivers/pcspk.c similarity index 81% rename from libk/sound/pcspk.c rename to libk/drivers/pcspk.c index d46bea9..c0a3e32 100644 --- a/libk/sound/pcspk.c +++ b/libk/drivers/pcspk.c @@ -1,7 +1,7 @@ -#include -#include -#include -#include +#include +#include +#include +#include #include #include diff --git a/libk/interrupt/rtc.c b/libk/drivers/rtc.c similarity index 95% rename from libk/interrupt/rtc.c rename to libk/drivers/rtc.c index 5c7ce64..617f277 100644 --- a/libk/interrupt/rtc.c +++ b/libk/drivers/rtc.c @@ -1,15 +1,14 @@ -#include -#include -#include +#include #include -#include -#include -#include +#include +#include +#include +#include #include static datetime_t* datetime = (datetime_t*)DATETIME_LOC; -bool cmosUpdateProgress() { +int cmosUpdateProgress() { outb(CMOS_ADDRESS, 0x8a); // Read status reg A, disable NMI return inb(CMOS_DATA) & 0x80; } @@ -97,7 +96,7 @@ void rtcHandler(intFrame_t* iframe) { datetime->month = newDatetime.month; datetime->year = newDatetime.year; - if (true) { // TODO: Probably get rid of this idk + if (1) { // TODO: Probably get rid of this idk char buf[20] = { 0 }; // "12/12 2012 12:12:12" - Max string 20 chars with null byte strcat(buf, itoa(datetime->day, 10)); diff --git a/libk/drivers/serial.c b/libk/drivers/serial.c new file mode 100644 index 0000000..a5847f7 --- /dev/null +++ b/libk/drivers/serial.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +int serialEnable(int port) { + outb(port + 1, 0x00); // Disable all interrupts + outb(port + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(port + 0, 0x03); // Set divisor to 3 (low byte) 38400 baud + outb(port + 1, 0x00); // (high byte) + outb(port + 3, 0x03); // 8 bits, no parity, one stop bit + outb(port + 2, 0xC7); // Enable FIFO, clear them, with 14 byte threshold + outb(port + 4, 0x0B); // IRQs enabled, RTS/DSR set + outb(port + 4, 0x1E); // Set in loopback mode, test the serial chip + outb(port + 0, 0xAE); // Test serial chip (send byte 0xAE and check if it returns) + + if (inb(port + 0) != 0xAE) return 1; + outb(port + 4, 0x0F); // non-loopback, IRQs enabled, OUT#1 and OUT#2 bits enabled + + return 0; +} + +int setupSerial() { + if (serialEnable(PORT_COM1) != 0) { return 1; } + outb(PORT_COM1 + 1, 0x01); + + return 0; +} + +static int serialTransimitEmpty(int port) { return inb(port + 5) & 0x20; } +static int serialRecieved(int port) { return inb(port + 5) & 0x01; } + +void serialWrite(int port, char c) { while (!serialTransimitEmpty(port)); outb(port, c); } +char serialRead(int port) { while (!serialRecieved(port)); return inb(port); } +char serialReadAsync(int port) { return inb(port); } + +void _dbgPutc(char c, void* arg) { + (void)arg; + serialWrite(PORT_COM1, c); + if (c == '\n') serialWrite(PORT_COM1, '\r'); +} +int vdebugf(const char* fmt, va_list va) { return vpprintf(_dbgPutc, NULL, fmt, va); } +int debugf(const char* fmt, ...) { + va_list va; + va_start(va, fmt); + int ret = vdebugf(fmt, va); + va_end(va); + return ret; +} + diff --git a/libk/interrupt/pit.c b/libk/drivers/timer.c similarity index 90% rename from libk/interrupt/pit.c rename to libk/drivers/timer.c index f6c24cd..9d7a2db 100644 --- a/libk/interrupt/pit.c +++ b/libk/drivers/timer.c @@ -1,8 +1,8 @@ -#include -#include -#include +#include #include -#include +#include +#include +#include #include void timerHandler(intFrame_t*) { diff --git a/libk/error/bigerr.c b/libk/error/bigerr.c deleted file mode 100644 index 99a5e2e..0000000 --- a/libk/error/bigerr.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include - -void rect(uint32_t c, uint16_t x, uint16_t y, uint16_t w, uint16_t h) { - uint8_t* vidmem = (uint8_t*)gfxMode->physicalBasePtr; - uint8_t bytesPerPx = gfxMode->bpp / 8; - uint32_t convColor = convertColor(c); - - for (uint32_t dx = 0; dx < w; dx++) { - for (uint32_t dy = 0; dy < h; dy++) { - uint32_t offset = (((y + dy) * gfxMode->xRes) + (x + dx)) * bytesPerPx; - - for (uint8_t i = 0; i < gfxMode->bpp; i++) { - vidmem[offset + i] = (uint8_t)(convColor >> (i*8)); - } - } - } -} - -void bigError(uint32_t err) { - // Red BG - rect(0x00ff0000, 0, 0, gfxMode->xRes, gfxMode->yRes); - // E - rect(0x00ffffff, 20, 10, 10, 50); - rect(0x00ffffff, 30, 10, 30, 10); - rect(0x00ffffff, 30, 30, 30, 10); - rect(0x00ffffff, 30, 50, 30, 10); - // R - rect(0x00ffffff, 70, 10, 10, 50); - rect(0x00ffffff, 70, 10, 30, 10); - rect(0x00ffffff, 70, 30, 30, 10); - rect(0x00ffffff, 90, 10, 10, 30); - rect(0x00ffffff, 80, 40, 10, 10); - rect(0x00ffffff, 90, 50, 10, 10); - // R - rect(0x00ffffff, 110, 10, 10, 50); - rect(0x00ffffff, 110, 10, 30, 10); - rect(0x00ffffff, 110, 30, 30, 10); - rect(0x00ffffff, 130, 10, 10, 30); - rect(0x00ffffff, 120, 40, 10, 10); - rect(0x00ffffff, 130, 50, 10, 10); - // O - rect(0x00ffffff, 150, 10, 10, 50); - rect(0x00ffffff, 170, 10, 10, 50); - rect(0x00ffffff, 150, 10, 30, 10); - rect(0x00ffffff, 150, 50, 30, 10); - // R - rect(0x00ffffff, 190, 10, 10, 50); - rect(0x00ffffff, 190, 10, 30, 10); - rect(0x00ffffff, 190, 30, 30, 10); - rect(0x00ffffff, 210, 10, 10, 30); - rect(0x00ffffff, 200, 40, 10, 10); - rect(0x00ffffff, 210, 50, 10, 10); - - __asm__ volatile ("cli; hlt" :: "a"(err)); -} - diff --git a/libk/error/debug.c b/libk/error/debug.c deleted file mode 100644 index 4b6fd3e..0000000 --- a/libk/error/debug.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include -#include - -static void _dbgPutc(char c, void* arg) { - (void)arg; - serialWrite(PORT_COM1, c); - if (c == '\n') { serialWrite(PORT_COM1, '\r'); } -} - -int debugf(const char* fmt, ...) { - va_list va; - va_start(va, fmt); - int res = vpprintf(_dbgPutc, NULL, fmt, va); - va_end(va); - return res; -} - diff --git a/libk/error/panic.c b/libk/error/panic.c deleted file mode 100644 index 5c6ddb8..0000000 --- a/libk/error/panic.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -void panic() { - // TODO: print a message - while (1) { __asm__ volatile ("cli; hlt"); } -} - diff --git a/libk/fs/impl.c b/libk/fs/kernfs.c similarity index 97% rename from libk/fs/impl.c rename to libk/fs/kernfs.c index be4e342..c9d7819 100644 --- a/libk/fs/impl.c +++ b/libk/fs/kernfs.c @@ -1,7 +1,7 @@ -#include -#include +#include #include -#include +#include +#include #include #include #include diff --git a/libk/include/interrupt/idt.h b/libk/include/cpu/idt.h similarity index 91% rename from libk/include/interrupt/idt.h rename to libk/include/cpu/idt.h index 8cbb013..a86499a 100644 --- a/libk/include/interrupt/idt.h +++ b/libk/include/cpu/idt.h @@ -1,8 +1,10 @@ -#ifndef INTERRUPT_IDT_H -#define INTERRUPT_IDT_H +#ifndef _CPU_IDT_H +#define _CPU_IDT_H #include +#define IDT_ENTRIES 256 + #define TRAP_GATE_FLAGS 0x8f // P = 1, DPL = 00, S = 0, Type = 1111 (32-bit Trap gate) #define INT_GATE_FLAGS 0x8e // P = 1, DPL = 00, S = 0, Type = 1110 (32-bit Int gate) #define USR_INT_GATE_FLAGS 0xee // P = 1, DPL = 11, S = 0, Type = 1110 (32-bit Int gate) @@ -24,4 +26,3 @@ void idtSetGate(uint8_t i, void* handler, uint8_t flags); void setupIdt(); #endif - diff --git a/libk/include/interrupt/isr.h b/libk/include/cpu/isr.h similarity index 91% rename from libk/include/interrupt/isr.h rename to libk/include/cpu/isr.h index e8503ac..ef85b2d 100644 --- a/libk/include/interrupt/isr.h +++ b/libk/include/cpu/isr.h @@ -1,5 +1,5 @@ -#ifndef INTERRUPT_ISR_H -#define INTERRUPT_ISR_H +#ifndef _CPU_ISR_H +#define _CPU_ISR_H #include @@ -15,8 +15,8 @@ typedef struct { typedef void (*HandlerPtr)(intFrame_t* iframe); void setupIsrs(); -int handleInterrupt(intFrame_t iframe); void registerIrq(uint8_t id, HandlerPtr handler); +int handleInterrupt(intFrame_t iframe); // ISR Table extern void* asm_isrRedirectTable[48]; diff --git a/libk/include/cpu/system.h b/libk/include/cpu/system.h new file mode 100644 index 0000000..af64db4 --- /dev/null +++ b/libk/include/cpu/system.h @@ -0,0 +1,19 @@ +#ifndef _CPU_SYSTEM_H +#define _CPU_SYSTEM_H + +#include + +void cpuid(uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx); + +void outb(uint16_t port, uint8_t data); +void outw(uint16_t port, uint16_t data); +void outl(uint16_t port, uint32_t data); + +uint8_t inb(uint16_t port); +uint16_t inw(uint16_t port); +uint32_t inl(uint16_t port); + +void ioWait(); +void panic(); + +#endif diff --git a/libk/include/disk/disk.h b/libk/include/drivers/disk.h similarity index 84% rename from libk/include/disk/disk.h rename to libk/include/drivers/disk.h index dc35039..dc1bc89 100644 --- a/libk/include/disk/disk.h +++ b/libk/include/drivers/disk.h @@ -1,5 +1,5 @@ -#ifndef DISK_DISK_H -#define DISK_DISK_H +#ifndef _DRIVERS_DISK_H +#define _DRIVERS_DISK_H #include diff --git a/libk/include/keyboard/keys.h b/libk/include/drivers/keyboard.h similarity index 88% rename from libk/include/keyboard/keys.h rename to libk/include/drivers/keyboard.h index a488a8e..f50f82e 100644 --- a/libk/include/keyboard/keys.h +++ b/libk/include/drivers/keyboard.h @@ -1,6 +1,9 @@ -#ifndef KEYBOARD_KEYS_H -#define KEYBOARD_KEYS_H +#ifndef _DRIVERS_KEYBOARD_H +#define _DRIVERS_KEYBOARD_H +#include + +// Special keys #define LEFT_SHIFT_PRESS 0x2a #define LEFT_SHIFT_RELEASE (LEFT_SHIFT_PRESS | 0x80) #define RIGHT_SHIFT_PRESS 0x36 @@ -35,4 +38,11 @@ }\ } +typedef struct { + char character; + int shift; +} keyboardState_t; + +void keyboardHandler(intFrame_t*); + #endif diff --git a/libk/include/sound/pcspk.h b/libk/include/drivers/pcspk.h similarity index 69% rename from libk/include/sound/pcspk.h rename to libk/include/drivers/pcspk.h index f5bfc6d..2fece6f 100644 --- a/libk/include/sound/pcspk.h +++ b/libk/include/drivers/pcspk.h @@ -1,7 +1,7 @@ -#ifndef SOUND_PCSPK_H -#define SOUND_PCSPK_H +#ifndef _DRIVERS_PCSPK_H +#define _DRIVERS_PCSPK_H -#include +#include #include #define PC_SPEAKER 0x61 diff --git a/libk/include/interrupt/rtc.h b/libk/include/drivers/rtc.h similarity index 74% rename from libk/include/interrupt/rtc.h rename to libk/include/drivers/rtc.h index 77195e5..d8f6b49 100644 --- a/libk/include/interrupt/rtc.h +++ b/libk/include/drivers/rtc.h @@ -1,9 +1,8 @@ -#ifndef INTERRUPT_RTC_H -#define INTERRUPT_RTC_H +#ifndef _DRIVERS_RTC_H +#define _DRIVERS_RTC_H -#include +#include #include -#include #define CMOS_ADDRESS 0x70 #define CMOS_DATA 0x71 @@ -18,7 +17,7 @@ typedef struct { } __attribute__ ((packed)) datetime_t; void rtcHandler(intFrame_t*); -bool cmosUpdateProgress(); +int cmosUpdateProgress(); uint8_t getRtcRegister(uint8_t reg); void enableRtc(); void disableRtc(); diff --git a/libk/include/drivers/serial.h b/libk/include/drivers/serial.h new file mode 100644 index 0000000..19a053f --- /dev/null +++ b/libk/include/drivers/serial.h @@ -0,0 +1,23 @@ +#ifndef _DRIVERS_SERIAL_H +#define _DRIVERS_SERIAL_H + +#include + +#define PORT_COM1 0x3f8 +#define PORT_COM2 0x2f8 +#define PORT_COM3 0x3e8 +#define PORT_COM4 0x2e8 + +// IRQ4 -> COM1, IRQ3 -> COM2 +#define SERIAL_IRQ 4 + +int serialEnable(int port); +int setupSerial(); +void serialWrite(int port, char c); +char serialRead(int port); +char serialReadAsync(int port); + +int debugf(const char* fmt, ...); +int vdebugf(const char* fmt, va_list va); + +#endif diff --git a/libk/include/interrupt/pit.h b/libk/include/drivers/timer.h similarity index 76% rename from libk/include/interrupt/pit.h rename to libk/include/drivers/timer.h index fd39e73..e944f64 100644 --- a/libk/include/interrupt/pit.h +++ b/libk/include/drivers/timer.h @@ -1,7 +1,7 @@ -#ifndef INTERRUPT_PIT_H -#define INTERRUPT_PIT_H +#ifndef _DRIVERS_TIMER_H +#define _DRIVERS_TIMER_H -#include +#include #include #define CHANNEL_0 0x40 // Offset it by 1 or 2 for ch1 and ch2 diff --git a/libk/include/error/bigerr.h b/libk/include/error/bigerr.h deleted file mode 100644 index ef390c5..0000000 --- a/libk/include/error/bigerr.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ERROR_BIGERR_H -#define ERROR_BIGERR_H - -/* - * Something went VERY wrong. - * Eg. kernel.bin is missing, no filesystem, Virtual Memory failed, etc. - */ - -#include - -void rect(uint32_t c, uint16_t x, uint16_t y, uint16_t w, uint16_t h); -void bigError(uint32_t err); - -#endif diff --git a/libk/include/error/debug.h b/libk/include/error/debug.h deleted file mode 100644 index 1d7ae85..0000000 --- a/libk/include/error/debug.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ERROR_DEBUG_H -#define ERROR_DEBUG_H - -int debugf(const char* fmt, ...); - -#endif diff --git a/libk/include/error/panic.h b/libk/include/error/panic.h deleted file mode 100644 index 2cea8ab..0000000 --- a/libk/include/error/panic.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ERROR_PANIC_H -#define ERROR_PANIC_H - -void panic(); - -#endif diff --git a/libk/include/fs/fs.h b/libk/include/fs/fs.h index 9f165df..ad2fc94 100644 --- a/libk/include/fs/fs.h +++ b/libk/include/fs/fs.h @@ -1,5 +1,5 @@ -#ifndef FS_FS_H -#define FS_FS_H +#ifndef _FS_FS_H +#define _FS_FS_H /* * For info, read the fs-spec.txt document inside of docs/ diff --git a/libk/include/fs/impl.h b/libk/include/fs/kernfs.h similarity index 83% rename from libk/include/fs/impl.h rename to libk/include/fs/kernfs.h index c7d07c0..94c4312 100644 --- a/libk/include/fs/impl.h +++ b/libk/include/fs/kernfs.h @@ -1,5 +1,5 @@ -#ifndef FS_IMPL_H -#define FS_IMPL_H +#ifndef _FS_KERNFS_H +#define _FS_KERNFS_H #include #include @@ -17,5 +17,6 @@ extern fsInfo_t* fsInfo; inode_t* getInode(char* path, dirEntry_t* dentries); uint8_t loadFile(inode_t* inode, void* dest); +void initOpenFileTable(); #endif diff --git a/libk/include/interrupt/exceptions.h b/libk/include/interrupt/exceptions.h deleted file mode 100644 index a5ea882..0000000 --- a/libk/include/interrupt/exceptions.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef INTERRUPT_EXCEPTIONS_H -#define INTERRUPT_EXCEPTIONS_H - -void setupExceptions(); - -#endif diff --git a/libk/include/keyboard/keyboard.h b/libk/include/keyboard/keyboard.h deleted file mode 100644 index f688e10..0000000 --- a/libk/include/keyboard/keyboard.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef KEYBOARD_KEYBOARD_H -#define KEYBOARD_KEYBOARD_H - -#include -#include - -typedef struct { - char character; - bool shift; -} keyboardState_t; - -void keyboardHandler(intFrame_t*); - -#endif diff --git a/libk/include/memory/addresses.h b/libk/include/memory/addresses.h index 6b01b81..fb3208d 100644 --- a/libk/include/memory/addresses.h +++ b/libk/include/memory/addresses.h @@ -1,5 +1,5 @@ -#ifndef MEMORY_ADDRESSES_H -#define MEMORY_ADDRESSES_H +#ifndef _MEMORY_ADDRESSES_H +#define _MEMORY_ADDRESSES_H /* * Memory layout of addresses 0x0000 - 0x12000 @@ -25,7 +25,7 @@ #define PHYS_MEM_USED_BLOCKS 0x180C // Some structs 0x2000-0x2fff -#define TERMINAL_INFO_LOC 0x2000 +#define CONSOLE_INFO_LOC 0x2000 #define KEYBOARD_STATE_LOC 0x2100 #define DATETIME_LOC 0x2200 diff --git a/libk/include/memory/malloc.h b/libk/include/memory/malloc.h index c305403..a081411 100644 --- a/libk/include/memory/malloc.h +++ b/libk/include/memory/malloc.h @@ -1,5 +1,5 @@ -#ifndef MEMORY_MALLOC_H -#define MEMORY_MALLOC_H +#ifndef _MEMORY_MALLOC_H +#define _MEMORY_MALLOC_H #include #include diff --git a/libk/include/memory/physical.h b/libk/include/memory/physical.h index 4fac758..2a4a222 100644 --- a/libk/include/memory/physical.h +++ b/libk/include/memory/physical.h @@ -1,5 +1,5 @@ -#ifndef MEMORY_PHYSICAL_H -#define MEMORY_PHYSICAL_H +#ifndef _MEMORY_PHYSICAL_H +#define _MEMORY_PHYSICAL_H #include #include diff --git a/libk/include/memory/virtual.h b/libk/include/memory/virtual.h index 50a8e99..f875629 100644 --- a/libk/include/memory/virtual.h +++ b/libk/include/memory/virtual.h @@ -1,8 +1,8 @@ -#ifndef MEMORY_VIRTUAL_H -#define MEMORY_VIRTUAL_H +#ifndef _MEMORY_VIRTUAL_H +#define _MEMORY_VIRTUAL_H -#include #include +#include #define PAGES_PER_TABLE 1024 #define TABLES_PER_DIRECTORY 1024 diff --git a/libk/include/ports/io.h b/libk/include/ports/io.h deleted file mode 100644 index ba0dbd4..0000000 --- a/libk/include/ports/io.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PORTS_IO_H -#define PORTS_IO_H - -#include - -// Port functions -uint8_t inb(uint16_t port); -void outb(uint16_t port, uint8_t data); -uint16_t inw(uint16_t port); -void outw(uint16_t port, uint16_t data); -void ioWait(); - -#endif diff --git a/libk/include/ports/serial.h b/libk/include/ports/serial.h deleted file mode 100644 index 21d4040..0000000 --- a/libk/include/ports/serial.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef PORTS_SERIAL_H -#define PORTS_SERIAL_H - -#include - -#define PORT_COM1 0x3f8 -#define PORT_COM2 0x2f8 -#define PORT_COM3 0x3e8 -#define PORT_COM4 0x2e8 -#define PORT_COM5 0x5f8 -#define PORT_COM6 0x4f8 -#define PORT_COM7 0x5e8 -#define PORT_COM8 0x4e8 - -int setupSerial(uint32_t port); - -int serialTransmitEmpty(uint32_t port); -int serialRecieved(uint32_t port); - -void serialWrite(uint32_t port, char c); -void serialPrint(uint32_t port, const char* s); -char serialRead(uint32_t port); - -#endif diff --git a/libk/include/screen/gfxmode.h b/libk/include/screen/gfxmode.h index edfd384..6699246 100644 --- a/libk/include/screen/gfxmode.h +++ b/libk/include/screen/gfxmode.h @@ -1,5 +1,5 @@ -#ifndef SCREEN_GFXMODE_H -#define SCREEN_GFXMODE_H +#ifndef _SCREEN_GFXMODE_H +#define _SCREEN_GFXMODE_H #include #include diff --git a/libk/include/screen/graphics.h b/libk/include/screen/graphics.h index 7de1e7c..21fe9af 100644 --- a/libk/include/screen/graphics.h +++ b/libk/include/screen/graphics.h @@ -1,9 +1,9 @@ -#ifndef SCREEN_GRAPHICS_H -#define SCREEN_GRAPHICS_H +#ifndef _SCREEN_GRAPHICS_H +#define _SCREEN_GRAPHICS_H #include -#define rgb(r,g,b) ( ((r) << 16 | (g) << 8 | (b)) & 0x00ffffff ) +#define rgb(_r,_g,_b) ( ((_r) << 16 | (_g) << 8 | (_b)) & 0x00ffffff ) void drawPixel(int32_t x, int32_t y, uint32_t color); void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color); diff --git a/libk/include/screen/text.h b/libk/include/screen/text.h index bddfc9d..92d17c4 100644 --- a/libk/include/screen/text.h +++ b/libk/include/screen/text.h @@ -1,5 +1,5 @@ -#ifndef SCREEN_TEXT_H -#define SCREEN_TEXT_H +#ifndef _SCREEN_TEXT_H +#define _SCREEN_TEXT_H #include diff --git a/libk/include/tty/tty.h b/libk/include/screen/tty.h similarity index 91% rename from libk/include/tty/tty.h rename to libk/include/screen/tty.h index 0d32ed5..0eb289a 100644 --- a/libk/include/tty/tty.h +++ b/libk/include/screen/tty.h @@ -1,5 +1,5 @@ -#ifndef TERMINAL_TERMINAL_H -#define TERMINAL_TERMINAL_H +#ifndef _SCREEN_TTY_H +#define _SCREEN_TTY_H #include #include diff --git a/libk/include/syscalls/syscalls.h b/libk/include/syscalls/syscalls.h index 615dbbe..8b1a471 100644 --- a/libk/include/syscalls/syscalls.h +++ b/libk/include/syscalls/syscalls.h @@ -1,7 +1,7 @@ -#ifndef INTERRUPT_SYSCALLS_H -#define INTERRUPT_SYSCALLS_H +#ifndef _SYSCALLS_SYSCALLS_H +#define _SYSCALLS_SYSCALLS_H -#include +#include int sys_exit (intFrame_t* iframe); int sys_read (intFrame_t* iframe); diff --git a/libk/makefile b/libk/makefile index 93bcdd9..ebc1b84 100644 --- a/libk/makefile +++ b/libk/makefile @@ -4,7 +4,7 @@ include make.defaults -LIBK_ASM=$(LIBK_DIR)/interrupt/isr.s +LIBK_ASM=$(LIBK_DIR)/cpu/isr.s $(LIBK): $(LIBK_SRC) $(LIBK_ASM) $(LIBC) @echo "Building $(LIBK)..." diff --git a/libk/ports/io.c b/libk/ports/io.c deleted file mode 100644 index fd70921..0000000 --- a/libk/ports/io.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include - -// Port functions -uint8_t inb(uint16_t port) { - uint8_t result; - __asm__ volatile("inb %1, %0" : "=a"(result) : "Nd"(port)); - return result; -} - -void outb(uint16_t port, uint8_t data) { - __asm__ volatile("outb %0, %1" :: "a"(data), "Nd"(port)); -} - -uint16_t inw(uint16_t port) { - uint16_t result; - __asm__ volatile("inw %1, %0" : "=a"(result) : "Nd"(port)); - return result; -} - -void outw(uint16_t port, uint16_t data) { - __asm__ volatile("outw %0, %1" :: "a"(data), "Nd"(port)); -} - -void ioWait() { - // Waits ~1 I/O Cycle (Linux uses this so it should be good) - __asm__ volatile("outb %%al, $0x80" : : "a"(0)); -} - diff --git a/libk/ports/serial.c b/libk/ports/serial.c deleted file mode 100644 index af3bf8a..0000000 --- a/libk/ports/serial.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include -#include - -int setupSerial(uint32_t port) { - outb(port + 1, 0x00); // Disable all interrupts - outb(port + 3, 0x80); // Enable DLAB (set baud rate divisor) - outb(port + 0, 0x03); // Set divisor to 3 (low byte) 38400 baud - outb(port + 1, 0x00); // (high byte) - outb(port + 3, 0x03); // 8 bits, no parity, one stop bit - outb(port + 2, 0xC7); // Enable FIFO, clear them, with 14 byte threshold - outb(port + 4, 0x0B); // IRQs enabled, RTS/DSR set - outb(port + 4, 0x1E); // Set in loopback mode, test the serial chip - outb(port + 0, 0xAE); // Test serial chip (send byte 0xAE and check if it returns) - - if (inb(port + 0) != 0xAE) return 1; - outb(port + 4, 0x0F); // non-loopback, IRQs enabled, OUT#1 and OUT#2 bits enabled - - return 0; -} - -int serialTransmitEmpty(uint32_t port) { - return inb(port + 5) & 0x20; -} - -int serialRecieved(uint32_t port) { - return inb(port + 5) & 0x01; -} - -void serialWrite(uint32_t port, char c) { - while (serialTransmitEmpty(port) == 0); - outb(port, c); -} - -void serialPrint(uint32_t port, const char* s) { - while (*s != '\0') { - if (*s == '\n') serialWrite(port, '\r'); - serialWrite(port, *s++); - } -} - -char serialRead(uint32_t port) { - while (serialRecieved(port)); - return inb(port); -} - diff --git a/libk/screen/text.c b/libk/screen/text.c index a7c4082..6cb55ad 100644 --- a/libk/screen/text.c +++ b/libk/screen/text.c @@ -1,7 +1,7 @@ #include -#include -#include #include +#include +#include #include #include diff --git a/libk/tty/tty.c b/libk/screen/tty.c similarity index 98% rename from libk/tty/tty.c rename to libk/screen/tty.c index cce0ad8..501b960 100644 --- a/libk/tty/tty.c +++ b/libk/screen/tty.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -7,7 +7,7 @@ #include #include -console_t* console = (console_t*)TERMINAL_INFO_LOC; +console_t* console = (console_t*)CONSOLE_INFO_LOC; int32_t consoleWrite(const void* buf, uint32_t len) { // TODO fix font size console->width = gfxMode->xRes / 8;//*(uint8_t*)(FONT_LOC); diff --git a/libk/syscalls/sys_close.c b/libk/syscalls/sys_close.c index 77894c9..4321fd7 100644 --- a/libk/syscalls/sys_close.c +++ b/libk/syscalls/sys_close.c @@ -1,5 +1,5 @@ #include -#include +#include #include int sys_close(intFrame_t* iframe) { diff --git a/libk/syscalls/sys_exit.c b/libk/syscalls/sys_exit.c index 38ec0ff..af48010 100644 --- a/libk/syscalls/sys_exit.c +++ b/libk/syscalls/sys_exit.c @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include int sys_exit(intFrame_t* iframe) { debugf("Tried to exit with %d", iframe->eax); diff --git a/libk/syscalls/sys_free.c b/libk/syscalls/sys_free.c index 6a9ab40..e1081c4 100644 --- a/libk/syscalls/sys_free.c +++ b/libk/syscalls/sys_free.c @@ -1,6 +1,6 @@ #include -#include #include +#include int sys_free(intFrame_t* iframe) { void* ptr = (void*)iframe->ebx; diff --git a/libk/syscalls/sys_malloc.c b/libk/syscalls/sys_malloc.c index 0178e0c..a32f774 100644 --- a/libk/syscalls/sys_malloc.c +++ b/libk/syscalls/sys_malloc.c @@ -1,6 +1,6 @@ #include -#include #include +#include #include int sys_malloc(intFrame_t* iframe) { diff --git a/libk/syscalls/sys_open.c b/libk/syscalls/sys_open.c index 3b7c330..69b3f32 100644 --- a/libk/syscalls/sys_open.c +++ b/libk/syscalls/sys_open.c @@ -1,5 +1,5 @@ #include -#include +#include #include int sys_open(intFrame_t* iframe) { diff --git a/libk/syscalls/sys_read.c b/libk/syscalls/sys_read.c index 3b9ab83..e5d554c 100644 --- a/libk/syscalls/sys_read.c +++ b/libk/syscalls/sys_read.c @@ -1,5 +1,5 @@ #include -#include +#include #include int sys_read(intFrame_t* iframe) { diff --git a/libk/syscalls/sys_seek.c b/libk/syscalls/sys_seek.c index 841927d..ccc5c7e 100644 --- a/libk/syscalls/sys_seek.c +++ b/libk/syscalls/sys_seek.c @@ -1,5 +1,5 @@ #include -#include +#include int sys_seek(intFrame_t* iframe) { // TODO diff --git a/libk/syscalls/sys_sleep.c b/libk/syscalls/sys_sleep.c index da2e16f..4b9b686 100644 --- a/libk/syscalls/sys_sleep.c +++ b/libk/syscalls/sys_sleep.c @@ -1,6 +1,6 @@ #include -#include #include +#include #include int sys_sleep(intFrame_t* iframe) { diff --git a/libk/syscalls/sys_write.c b/libk/syscalls/sys_write.c index afbc52a..afa3e8a 100644 --- a/libk/syscalls/sys_write.c +++ b/libk/syscalls/sys_write.c @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include #include int sys_write(intFrame_t* iframe) { diff --git a/libk/syscalls/syscalls.c b/libk/syscalls/syscalls.c index d39946a..07659d8 100644 --- a/libk/syscalls/syscalls.c +++ b/libk/syscalls/syscalls.c @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include #include // System call table diff --git a/makefile b/makefile index e71c4e7..4ed952b 100644 --- a/makefile +++ b/makefile @@ -2,7 +2,7 @@ # Main kern makefile # -export VERSION = 0.2.1 +export VERSION = 0.2.2 # Configurable variables (eg. CC, CFLAGS, ...) include make.defaults diff --git a/todo.txt b/todo.txt index fcd21d6..dd27e2d 100644 --- a/todo.txt +++ b/todo.txt @@ -58,18 +58,14 @@ Legend: - [ ] types.h (syscall types) - [ ] gfx.h (basic graphics lib) -- [ ] LIBK - - [x] disk - disk r/w - - [ ] error - error handling (bigerr is not enough :( ) - - [ ] fs - filesystem +- [x] LIBK + - [x] drivers - everything that works with hardware + - [x] error - error handling (bigerr is not enough :( ) + - [x] fs - filesystem - [x] interrupt - handling and registering interupts - - [ ] input - handle ALL input devices (currently implemented as the keyboard dir) - [x] memory - memory managing (physical and virtual) - - [x] ports - handles IO ports (eg. serial console) - [x] screen - everything that displays on the screen - - [x] sound - handles everything related to sound - [x] syscall - system calls - - [x] tty - handles terminal output - [x] Multistage Bootloader - [x] Bootloader reads filesystem to find files