diff --git a/kernel/cpu.c b/kernel/cpu.c index cb043f6..1098dd3 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -1,6 +1,7 @@ #include "cpu.h" #include "serial.h" #include "terminal.h" +#include "utils.h" void cpuid(uint32_t function, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { asm volatile ( diff --git a/kernel/display.c b/kernel/display.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/display.h b/kernel/display.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/framebuffer.c b/kernel/framebuffer.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/framebuffer.h b/kernel/framebuffer.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/gui.c b/kernel/gui.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/gui.h b/kernel/gui.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/io.h b/kernel/io.h index 9e82fcb..aaaee3a 100644 --- a/kernel/io.h +++ b/kernel/io.h @@ -1,6 +1,8 @@ #ifndef IO_H #define IO_H +#include + static inline void outb(uint16_t port, uint8_t val) { asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port)); } diff --git a/kernel/isr.c b/kernel/isr.c index f23a850..636a189 100644 --- a/kernel/isr.c +++ b/kernel/isr.c @@ -2,13 +2,22 @@ #include "serial.h" #include "isr.h" #include "io.h" +#include "utils.h" static isr_callback_t interrupt_handlers[MAX_INTERRUPTS] = { 0 }; void isr_handler(uint32_t int_num, uint32_t err_code) { terminal_write("Interrupt occurred: "); + + print_hex(int_num); + terminal_write("\n"); + serial_write("INT triggered\n"); + terminal_write("Error code: "); + print_hex(err_code); + terminal_write("\n"); + if (interrupt_handlers[int_num]) { interrupt_handlers[int_num](); // Call registered handler } else { diff --git a/kernel/keyboard.c b/kernel/keyboard.c index 187dc77..d590b73 100644 --- a/kernel/keyboard.c +++ b/kernel/keyboard.c @@ -28,7 +28,7 @@ void keyboard_callback() { return; char c = scancode_map[scancode]; - if (c && buffer_index < sizeof(key_buffer)) { + if (c && buffer_index < sizeof(key_buffer) - 1) { key_buffer[buffer_index++] = c; terminal_putchar(c); // Echo to terminal (optional) } diff --git a/kernel/kmain.c b/kernel/kmain.c index 07d0cd5..ec3b932 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -8,6 +8,9 @@ #include "memmap.h" #include "gdt.h" #include "cpu.h" +#include "kmalloc.h" +#include "timer.h" +#include "utils.h" #define LPT1 0x378 diff --git a/kernel/memmap.c b/kernel/memmap.c index 001f95c..53cbacf 100644 --- a/kernel/memmap.c +++ b/kernel/memmap.c @@ -1,14 +1,21 @@ #include "memmap.h" uint32_t get_memory_map(memory_map_entry_t *map, uint32_t max_entries) { - // Fill with dummy values for now - map[0].base_addr = 0x00000000; - map[0].length = 0x0009FC00; - map[0].type = 1; + uint32_t count = 0; - map[1].base_addr = 0x00100000; - map[1].length = 0x1FF00000; - map[1].type = 1; + if (max_entries >= 1) { + map[count].base_addr = 0x00000000; + map[count].length = 0x0009FC00; + map[count].type = 1; + count++; + } - return 2; // 2 regions -} + if (max_entries >= 2) { + map[count].base_addr = 0x00100000; + map[count].length = 0x1FF00000; + map[count].type = 1; + count++; + } + + return count; +} \ No newline at end of file diff --git a/kernel/serial.c b/kernel/serial.c index f1036c8..703f3cd 100644 --- a/kernel/serial.c +++ b/kernel/serial.c @@ -1,5 +1,6 @@ #include "io.h" #include "serial.h" +#include #define COM1 0x3F8 #define COM2 0x2F8 diff --git a/kernel/shell.c b/kernel/shell.c index c634d95..ee445f1 100644 --- a/kernel/shell.c +++ b/kernel/shell.c @@ -17,7 +17,7 @@ void execute(char *input) { void shell_loop() { char input[256]; - int index = 0; + size_t index = 0; char c; while (1) diff --git a/kernel/terminal.c b/kernel/terminal.c index c649803..180b12a 100644 --- a/kernel/terminal.c +++ b/kernel/terminal.c @@ -96,7 +96,7 @@ void terminal_clear(void) { update_cursor(); } -static void update_cursor() { +void update_cursor() { uint16_t pos = cursor_y * VGA_WIDTH + cursor_x; outb(0x3D4, 0x0F); diff --git a/kernel/timer.c b/kernel/timer.c index afbe5b8..03e539c 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -2,6 +2,7 @@ #include "io.h" #include "isr.h" #include "terminal.h" +#include "stdio.h" static uint32_t tick = 0; diff --git a/kernel/types.c b/kernel/types.c new file mode 100644 index 0000000..6936871 --- /dev/null +++ b/kernel/types.c @@ -0,0 +1,9 @@ +#include "types.h" + +// Example: Basic memory helper (unnecessary if libc exists) +void *memset(void *dest, int value, size_t len) { + unsigned char *ptr = (unsigned char *)dest; + while (len-- > 0) + *ptr++ = (unsigned char)value; + return dest; +} diff --git a/kernel/types.h b/kernel/types.h new file mode 100644 index 0000000..32fc7ff --- /dev/null +++ b/kernel/types.h @@ -0,0 +1,62 @@ +#ifndef TYPES_H +#define TYPES_H + +// ---------------------------- +// Fixed-width integer types +// ---------------------------- +typedef unsigned char uint8_t; +typedef signed char int8_t; +typedef unsigned short uint16_t; +typedef signed short int16_t; +typedef unsigned int uint32_t; +typedef signed int int32_t; +typedef unsigned long long uint64_t; +typedef signed long long int64_t; + +// ---------------------------- +// Boolean & NULL definitions +// ---------------------------- +#ifndef __cplusplus +typedef enum { false = 0, true = 1 } bool; +#endif + +#ifndef NULL +#define NULL ((void*)0) +#endif + +// ---------------------------- +// OS subsystem types +// ---------------------------- +typedef uint32_t size_t; +typedef int32_t ssize_t; + +typedef uint32_t phys_addr_t; // Physical address +typedef uint32_t virt_addr_t; // Virtual address + +typedef uint32_t pid_t; // Process ID +typedef uint32_t tid_t; // Thread ID + +// ---------------------------- +// Bitfield & utility macros +// ---------------------------- +#define BIT(n) (1U << (n)) +#define BITS(m, n) (((1U << ((n) - (m) + 1)) - 1) << (m)) + +// Align value to next multiple of alignment +#define ALIGN_UP(val, align) (((val) + ((align)-1)) & ~((align)-1)) +#define ALIGN_DOWN(val, align) ((val) & ~((align)-1)) + +// ---------------------------- +// Attributes for structures +// ---------------------------- +#define PACKED __attribute__((packed)) +#define ALIGN(x) __attribute__((aligned(x))) + +// ---------------------------- +// Likely/unlikely branch hints +// (for future optimization use) +// ---------------------------- +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + +#endif // TYPES_H diff --git a/kernel/utils.c b/kernel/utils.c index 06d4494..04dd14c 100644 --- a/kernel/utils.c +++ b/kernel/utils.c @@ -1,4 +1,6 @@ #include "utils.h" +#include "serial.h" +#include "terminal.h" static void reverse(char* str, int len) { int start = 0;