From 7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5 Mon Sep 17 00:00:00 2001 From: Tyler Murphy <=> Date: Mon, 17 Jul 2023 19:34:52 -0400 Subject: [PATCH] refactoring --- .env | 4 +- kernel/Makefile | 8 +- kernel/{ => arch/i686}/linker.ld | 14 +- kernel/{src/acpi => include/arch/i686}/acpi.h | 2 +- kernel/include/arch/i686/asm.h | 13 ++ .../arch/i686}/drivers/ps2ctrl.h | 0 kernel/include/arch/i686/drivers/rtc.h | 7 + kernel/include/arch/i686/idt.h | 6 + .../boot/tag.h => include/arch/i686/mboot.h} | 5 +- .../memory => include/arch/i686}/memory.h | 0 .../interrupt => include/arch/i686}/pic.h | 2 +- kernel/{src => include}/drivers/ps2kb.h | 0 kernel/{src => include}/drivers/ps2mouse.h | 0 kernel/include/drivers/vga.h | 32 +++++ kernel/include/memory.h | 6 + kernel/include/print.h | 14 -- kernel/include/sys.h | 10 ++ kernel/{src/tty => include}/term.h | 13 +- kernel/include/time.h | 23 ++- kernel/src/{acpi => arch/i686}/acpi.c | 67 +++------ .../sys.h => kernel/src/arch/i686/asm.c | 24 ++-- kernel/src/{ => arch/i686}/drivers/ps2ctrl.c | 8 +- kernel/src/{ => arch/i686}/drivers/ps2kb.c | 10 +- kernel/src/{ => arch/i686}/drivers/ps2mouse.c | 12 +- .../cmos.c => arch/i686/drivers/rtc.c} | 44 ++++-- kernel/src/arch/i686/drivers/vga.c | 50 +++++++ kernel/src/arch/i686/gdt.asm | 42 ++++++ kernel/src/{interrupt => arch/i686}/idt.asm | 0 kernel/src/{interrupt => arch/i686}/idt.c | 48 +++++-- kernel/src/{boot/tag.c => arch/i686/mboot.c} | 8 +- kernel/src/{memory => arch/i686}/memory.c | 15 +- kernel/src/arch/i686/paging.asm | 62 ++++++++ kernel/src/{interrupt => arch/i686}/pic.c | 15 +- kernel/src/arch/i686/start.asm | 82 +++++++++++ kernel/src/arch/i686/sys.c | 51 +++++++ kernel/src/arch/i686/time.c | 17 +++ kernel/src/cpu/cpu.c | 18 --- kernel/src/cpu/cpu.h | 8 -- kernel/src/cpu/fpu.asm | 19 --- kernel/src/cpu/sse.asm | 22 --- kernel/src/interrupt/idt.h | 36 ----- kernel/src/main.c | 46 ++---- kernel/src/{memory/allocator.c => memory.c} | 6 +- kernel/src/{print => }/panic.c | 10 +- kernel/src/{print => }/print.c | 47 +----- kernel/src/start.asm | 135 ------------------ kernel/src/{tty => }/term.c | 25 ++-- kernel/src/{print => }/time.c | 2 - kernel/src/tty/color.c | 67 --------- kernel/src/tty/color.h | 62 -------- kernel/src/tty/cursor.c | 30 ---- kernel/src/tty/cursor.h | 9 -- 52 files changed, 563 insertions(+), 693 deletions(-) rename kernel/{ => arch/i686}/linker.ld (72%) rename kernel/{src/acpi => include/arch/i686}/acpi.h (98%) create mode 100644 kernel/include/arch/i686/asm.h rename kernel/{src => include/arch/i686}/drivers/ps2ctrl.h (100%) create mode 100644 kernel/include/arch/i686/drivers/rtc.h create mode 100644 kernel/include/arch/i686/idt.h rename kernel/{src/boot/tag.h => include/arch/i686/mboot.h} (90%) rename kernel/{src/memory => include/arch/i686}/memory.h (100%) rename kernel/{src/interrupt => include/arch/i686}/pic.h (83%) rename kernel/{src => include}/drivers/ps2kb.h (100%) rename kernel/{src => include}/drivers/ps2mouse.h (100%) create mode 100644 kernel/include/drivers/vga.h create mode 100644 kernel/include/memory.h create mode 100644 kernel/include/sys.h rename kernel/{src/tty => include}/term.h (70%) rename kernel/src/{acpi => arch/i686}/acpi.c (63%) rename libk/include/sys.h => kernel/src/arch/i686/asm.c (55%) rename kernel/src/{ => arch/i686}/drivers/ps2ctrl.c (94%) rename kernel/src/{ => arch/i686}/drivers/ps2kb.c (98%) rename kernel/src/{ => arch/i686}/drivers/ps2mouse.c (91%) rename kernel/src/{drivers/cmos.c => arch/i686/drivers/rtc.c} (79%) create mode 100644 kernel/src/arch/i686/drivers/vga.c create mode 100644 kernel/src/arch/i686/gdt.asm rename kernel/src/{interrupt => arch/i686}/idt.asm (100%) rename kernel/src/{interrupt => arch/i686}/idt.c (72%) rename kernel/src/{boot/tag.c => arch/i686/mboot.c} (95%) rename kernel/src/{memory => arch/i686}/memory.c (95%) create mode 100644 kernel/src/arch/i686/paging.asm rename kernel/src/{interrupt => arch/i686}/pic.c (87%) create mode 100644 kernel/src/arch/i686/start.asm create mode 100644 kernel/src/arch/i686/sys.c create mode 100644 kernel/src/arch/i686/time.c delete mode 100644 kernel/src/cpu/cpu.c delete mode 100644 kernel/src/cpu/cpu.h delete mode 100644 kernel/src/cpu/fpu.asm delete mode 100644 kernel/src/cpu/sse.asm delete mode 100644 kernel/src/interrupt/idt.h rename kernel/src/{memory/allocator.c => memory.c} (98%) rename kernel/src/{print => }/panic.c (86%) rename kernel/src/{print => }/print.c (66%) delete mode 100644 kernel/src/start.asm rename kernel/src/{tty => }/term.c (85%) rename kernel/src/{print => }/time.c (99%) delete mode 100644 kernel/src/tty/color.c delete mode 100644 kernel/src/tty/color.h delete mode 100644 kernel/src/tty/cursor.c delete mode 100644 kernel/src/tty/cursor.h diff --git a/.env b/.env index f996395..972c2e5 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -ARCH = i386 +ARCH = i686 FORMAT = elf CC = $(ARCH)-$(FORMAT)-gcc LD = $(ARCH)-$(FORMAT)-ld @@ -8,4 +8,4 @@ AR = ar CFLAGS = -ffreestanding -m32 -O2 -Wall -Wextra -pedantic # -DKERNEL_LOG LDFLAGS = -nostdlib -QEMU = qemu-system-$(ARCH) +QEMU = qemu-system-i386 diff --git a/kernel/Makefile b/kernel/Makefile index d4cbdf4..2e7954e 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,9 +1,11 @@ include ../.env -C_SRC = $(shell find src -type f -name "*.c") +C_SRC = $(shell find src -type f -name "*.c" -not -path "src/arch/*") +C_SRC += $(shell find src/arch/$(ARCH) -type f -name "*.c") C_OBJ = $(patsubst %.c,bin/%.o, $(C_SRC)) -ASM_SRC = $(shell find src -type f -name "*.asm") +ASM_SRC = $(shell find src -type f -name "*.asm" -not -path "src/arch/*") +ASM_SRC += $(shell find src/arch/$(ARCH) -type f -name "*.asm") ASM_OBJ = $(patsubst %.asm,bin/%.asm.o, $(ASM_SRC)) CFLAGS += -Iinclude -Isrc -I../libk/include -std=gnu17 @@ -22,7 +24,7 @@ $(ASM_OBJ): bin/%.asm.o : %.asm bin/kernel.bin: $(C_OBJ) $(ASM_OBJ) @mkdir -p $(@D) - $(LD) -o bin/kernel.bin -T linker.ld $(C_OBJ) $(ASM_OBJ) ../libk/bin/libk.a $(LDFLAGS) + $(LD) -o bin/kernel.bin -T arch/$(ARCH)/linker.ld $(C_OBJ) $(ASM_OBJ) ../libk/bin/libk.a $(LDFLAGS) clean: rm -fr bin diff --git a/kernel/linker.ld b/kernel/arch/i686/linker.ld similarity index 72% rename from kernel/linker.ld rename to kernel/arch/i686/linker.ld index 541975e..ae48afb 100644 --- a/kernel/linker.ld +++ b/kernel/arch/i686/linker.ld @@ -6,13 +6,11 @@ SECTIONS { kernel_start = .; - .multiboot.data : { - *(.multiboot.data) - } - - .multiboot.text : { - *(.multiboot.text) - } + .bootstrap : { + *(.bootstrap.data) + *(.bootstrap.stack) + *(.bootstrap.text) + } . += 0xC0000000; @@ -32,7 +30,7 @@ SECTIONS { { *(COMMON) *(.bss) - *(.bootstrap_stack) + *(.stack) } kernel_end = .; diff --git a/kernel/src/acpi/acpi.h b/kernel/include/arch/i686/acpi.h similarity index 98% rename from kernel/src/acpi/acpi.h rename to kernel/include/arch/i686/acpi.h index 889497e..bb35010 100644 --- a/kernel/src/acpi/acpi.h +++ b/kernel/include/arch/i686/acpi.h @@ -102,5 +102,5 @@ struct FixedACPIDescriptionTable { struct GenericAddressStructure x_gpe1_block; }; -void acpi_init(void); +void acpi_init(void *rsdp); void acpi_poweroff(void); diff --git a/kernel/include/arch/i686/asm.h b/kernel/include/arch/i686/asm.h new file mode 100644 index 0000000..0e2d9db --- /dev/null +++ b/kernel/include/arch/i686/asm.h @@ -0,0 +1,13 @@ +#include + +extern uint8_t inb(uint16_t port); +extern void outb(uint16_t port, uint8_t val); +extern uint16_t inw(uint16_t port); +extern void outw(uint16_t port, uint16_t val); +extern uint32_t inl(uint16_t port); +extern void outl(uint16_t port, uint32_t val); +extern void io_wait(void); +extern void int_enable(void); +extern void int_disable(void); +extern void int_wait(void); +extern void halt(void); diff --git a/kernel/src/drivers/ps2ctrl.h b/kernel/include/arch/i686/drivers/ps2ctrl.h similarity index 100% rename from kernel/src/drivers/ps2ctrl.h rename to kernel/include/arch/i686/drivers/ps2ctrl.h diff --git a/kernel/include/arch/i686/drivers/rtc.h b/kernel/include/arch/i686/drivers/rtc.h new file mode 100644 index 0000000..29dbf8f --- /dev/null +++ b/kernel/include/arch/i686/drivers/rtc.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +extern void rtc_update(void); +extern struct Time rtc_utctime(void); +extern struct Time rtc_localtime(enum Timezone tz); diff --git a/kernel/include/arch/i686/idt.h b/kernel/include/arch/i686/idt.h new file mode 100644 index 0000000..8dcee02 --- /dev/null +++ b/kernel/include/arch/i686/idt.h @@ -0,0 +1,6 @@ +#pragma once + +#define IDT_SIZE 256 +#define IDT_INTERRUPTS 256 + +void idt_init(void); diff --git a/kernel/src/boot/tag.h b/kernel/include/arch/i686/mboot.h similarity index 90% rename from kernel/src/boot/tag.h rename to kernel/include/arch/i686/mboot.h index a81e443..394071f 100644 --- a/kernel/src/boot/tag.h +++ b/kernel/include/arch/i686/mboot.h @@ -2,9 +2,8 @@ #include #include - -#include "acpi/acpi.h" -#include "memory/memory.h" +#include +#include #define CMDLINE_MAX 32 diff --git a/kernel/src/memory/memory.h b/kernel/include/arch/i686/memory.h similarity index 100% rename from kernel/src/memory/memory.h rename to kernel/include/arch/i686/memory.h diff --git a/kernel/src/interrupt/pic.h b/kernel/include/arch/i686/pic.h similarity index 83% rename from kernel/src/interrupt/pic.h rename to kernel/include/arch/i686/pic.h index a87420d..593a33a 100644 --- a/kernel/src/interrupt/pic.h +++ b/kernel/include/arch/i686/pic.h @@ -4,7 +4,7 @@ #define PIC_REMAP_OFFSET 0x20 -void pic_remap(uint8_t offset); +void pic_remap(void); void pic_mask(int irq); void pic_unmask(int irq); void pic_disable(void); diff --git a/kernel/src/drivers/ps2kb.h b/kernel/include/drivers/ps2kb.h similarity index 100% rename from kernel/src/drivers/ps2kb.h rename to kernel/include/drivers/ps2kb.h diff --git a/kernel/src/drivers/ps2mouse.h b/kernel/include/drivers/ps2mouse.h similarity index 100% rename from kernel/src/drivers/ps2mouse.h rename to kernel/include/drivers/ps2mouse.h diff --git a/kernel/include/drivers/vga.h b/kernel/include/drivers/vga.h new file mode 100644 index 0000000..68e8690 --- /dev/null +++ b/kernel/include/drivers/vga.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +enum vga_color { + VGA_BLACK = 0, + VGA_BLUE = 1, + VGA_GREEN = 2, + VGA_CYAN = 3, + VGA_RED = 4, + VGA_MAGENTA = 5, + VGA_BROWN = 6, + VGA_LIGHT_GREY = 7, + VGA_DARK_GREY = 8, + VGA_LIGHT_BLUE = 9, + VGA_LIGHT_GREEN = 10, + VGA_LIGHT_CYAN = 11, + VGA_LIGHT_RED = 12, + VGA_LIGHT_MAGENTA = 13, + VGA_LIGHT_BROWN = 14, + VGA_WHITE = 15, +}; + +#define VGA_TEXT_W 80 +#define VGA_TEXT_H 25 + +void vgatext_write_char(char c, enum vga_color color, uint8_t x, uint8_t y); +void vgatext_write_data(uint16_t data, uint16_t index); +void vgatext_write_buf(const uint16_t *buffer); +void vgatext_cur_mov(uint8_t x, uint8_t y); +void vgatext_cur_resize(uint8_t start, uint8_t end); +void vgatext_cur_visible(bool visible); diff --git a/kernel/include/memory.h b/kernel/include/memory.h new file mode 100644 index 0000000..07a55c0 --- /dev/null +++ b/kernel/include/memory.h @@ -0,0 +1,6 @@ +#pragma once + +extern int memory_lock(void); +extern int memory_unlock(void); +extern void *memory_alloc_page(int); +extern int memory_free_page(void* ,int); diff --git a/kernel/include/print.h b/kernel/include/print.h index dc7f862..7dbd298 100644 --- a/kernel/include/print.h +++ b/kernel/include/print.h @@ -7,17 +7,3 @@ extern void putchar(int c); extern void puts(const char* s); extern void printk(const char *restrict format, ...); extern void vprintk(const char *restrict format, va_list ap); - -#ifdef KERNEL_LOG -#define debugk(msg, ...) _debugk_impl(msg, ## __VA_ARGS__) -#define succek(msg, ...) _succek_impl(msg, ## __VA_ARGS__) -#define errork(msg, ...) _errork_impl(msg, ## __VA_ARGS__) -#else -#define debugk(msg, ...) -#define succek(msg, ...) -#define errork(msg, ...) -#endif - -extern void _debugk_impl(char* msg, ...); -extern void _succek_impl(char* msg, ...); -extern void _errork_impl(char* msg, ...); diff --git a/kernel/include/sys.h b/kernel/include/sys.h new file mode 100644 index 0000000..003f85c --- /dev/null +++ b/kernel/include/sys.h @@ -0,0 +1,10 @@ +#pragma once + +extern void arch_init(void *boot_info); +extern void arch_update(void); +extern void arch_halt(void); +extern void arch_wait_io(void); +extern void arch_wait_int(void); +extern void arch_disable_int(void); +extern void arch_enable_int(void); +extern void arch_poweroff(void); diff --git a/kernel/src/tty/term.h b/kernel/include/term.h similarity index 70% rename from kernel/src/tty/term.h rename to kernel/include/term.h index ceda255..8a8f1ef 100644 --- a/kernel/src/tty/term.h +++ b/kernel/include/term.h @@ -2,18 +2,15 @@ #include #include +#include -#include "color.h" - -#define TERM_W 80 -#define TERM_H 25 +#define TERM_W VGA_TEXT_W +#define TERM_H VGA_TEXT_H void term_init(void); - void term_reset(void); -void term_setfg(enum VGAColor color); -void term_setbg(enum VGAColor color); - +void term_setfg(enum vga_color color); +void term_setbg(enum vga_color color); void term_clear(void); void term_scroll(int lines); void term_setpos(uint8_t x, uint8_t y); diff --git a/kernel/include/time.h b/kernel/include/time.h index 783d96f..2e86a69 100644 --- a/kernel/include/time.h +++ b/kernel/include/time.h @@ -16,10 +16,25 @@ struct Time { int leap; /// If year is a leap year (True == 1) }; -extern void rtc_update(void); -extern void rtc_set_timezone(int offset); -extern struct Time *rtc_utctime(void); -extern struct Time *rtc_localtime(void); +enum Timezone { + UTC = 0, + EST = -4 +}; + +/** + * Sets the current timezone + */ +extern void set_timezone(enum Timezone tz); + +/** + * Returns current time in UTC + */ +extern struct Time get_utctime(void); + +/** + * Returns current time from current Timezone + */ +extern struct Time get_localtime(void); /** * Converts the time into a string format diff --git a/kernel/src/acpi/acpi.c b/kernel/src/arch/i686/acpi.c similarity index 63% rename from kernel/src/acpi/acpi.c rename to kernel/src/arch/i686/acpi.c index ef1fb76..7807558 100644 --- a/kernel/src/acpi/acpi.c +++ b/kernel/src/arch/i686/acpi.c @@ -3,11 +3,10 @@ #include #include #include -#include +#include +#include -#include "acpi.h" -#include "boot/tag.h" -#include "print.h" +extern uintptr_t KERNEL_MAPPING; static struct RootSystemDescriptionTable *rsdt; static struct FixedACPIDescriptionTable *fadt; @@ -17,9 +16,7 @@ static uint16_t SLP_TYPb; static uint16_t SLP_EN; static uint16_t SCI_EN; -static bool is_init = false; - -bool checksum(uint8_t *data, size_t len) { +static bool checksum(uint8_t *data, size_t len) { unsigned char sum = 0; for (size_t i = 0; i < len; i++) sum += data[i]; @@ -39,7 +36,7 @@ static void *find_fadt(void) { return NULL; } -static int read_s5_addr(void) { +static void read_s5_addr(void) { uintptr_t ptr = fadt->dsdt; char *s5_addr = (void*) (ptr + 36); @@ -69,73 +66,41 @@ static int read_s5_addr(void) { SCI_EN = 1; } else { - errork("\\_S5 parse error."); - return 1; + panic("\\_S5 parse error."); } } else { - errork("\\_S5 not present."); - return 1; + panic("\\_S5 not present."); } - return 0; } -void acpi_init(void) { +void acpi_init(void *ptr) { - is_init = false; - - debugk("Loading ACPI"); - - struct BootTag *tag; - if(!get_boot_tag(ID_RSDP, &tag)) { - errork("Could not find RSDP"); - return; - } - - debugk("Loading RSDT"); - - struct RootSystemDescriptionPointer *rsdp = tag->data.rsdp; + struct RootSystemDescriptionPointer *rsdp = ptr; if (!checksum((uint8_t*) rsdp, sizeof(struct RootSystemDescriptionPointer))) { - errork("RSDP checksum failed to validate"); - return; + panic("RSDP checksum failed to validate"); } uintptr_t rsdt_ptr = rsdp->rsdt_address; rsdt = (void *) rsdt_ptr; if (!checksum((uint8_t*) &rsdt->header, rsdt->header.length)) { - errork("RSDT checksum failed to validate"); - return; + panic("RSDT checksum failed to validate"); } - debugk("Loading FADT"); - fadt = find_fadt(); if (fadt == NULL) { - errork("Could not find FADT"); - return; + panic("Could not find FADT"); } if (!checksum((uint8_t*) &fadt->header, fadt->header.length)) { - errork("FADT checksum failed to validate"); - return; + panic("FADT checksum failed to validate"); } - debugk("Reading \\_S5 Addr"); - - if (read_s5_addr()) { - return; - } + read_s5_addr(); outb(fadt->smi_command_port,fadt->acpi_enable); - - succek("ACPI has been loaded"); - is_init = true; } void acpi_poweroff(void) { - if (is_init) { - outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN); - panic("failed to shutdown"); - } else { - errork("Cannot shutdown, ACPI not loaded"); - } + outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN); + panic("failed to shutdown"); } diff --git a/libk/include/sys.h b/kernel/src/arch/i686/asm.c similarity index 55% rename from libk/include/sys.h rename to kernel/src/arch/i686/asm.c index 75618e8..8ed00d0 100644 --- a/libk/include/sys.h +++ b/kernel/src/arch/i686/asm.c @@ -1,51 +1,51 @@ -#include +#include -static inline uint8_t inb(uint16_t port) { +uint8_t inb(uint16_t port) { uint8_t ret; __asm__ volatile ("inb %1, %0" : "=a"(ret) : "Nd"(port)); return ret; } -static inline void outb(uint16_t port, uint8_t val) { +void outb(uint16_t port, uint8_t val) { __asm__ volatile ("outb %0, %1" : : "a"(val), "Nd"(port)); } -static inline uint16_t inw(uint16_t port) { +uint16_t inw(uint16_t port) { uint16_t ret; __asm__ volatile ("inw %1, %0" : "=a"(ret) : "Nd"(port)); return ret; } -static inline void outw(uint16_t port, uint16_t val) { +void outw(uint16_t port, uint16_t val) { __asm__ volatile ("outw %0, %1" : : "a"(val), "Nd"(port)); } -static inline uint32_t inl(uint16_t port) { +uint32_t inl(uint16_t port) { uint32_t ret; __asm__ volatile ("inl %1, %0" : "=a"(ret) : "Nd"(port)); return ret; } -static inline void outl(uint16_t port, uint32_t val) { +void outl(uint16_t port, uint32_t val) { __asm__ volatile ("outl %0, %1" : : "a"(val), "Nd"(port)); } -static inline void io_wait(void) { +void io_wait(void) { outb(0x80, 0); } -static inline void int_enable(void) { +void int_enable(void) { __asm__ volatile ("sti"); } -static inline void int_disable(void) { +void int_disable(void) { __asm__ volatile ("cli"); } -static inline void int_wait(void) { +void int_wait(void) { __asm__ volatile ("sti; hlt"); } -static inline void halt(void) { +void halt(void) { __asm__ volatile ("cli; hlt"); } diff --git a/kernel/src/drivers/ps2ctrl.c b/kernel/src/arch/i686/drivers/ps2ctrl.c similarity index 94% rename from kernel/src/drivers/ps2ctrl.c rename to kernel/src/arch/i686/drivers/ps2ctrl.c index 05ef25d..794aabd 100644 --- a/kernel/src/drivers/ps2ctrl.c +++ b/kernel/src/arch/i686/drivers/ps2ctrl.c @@ -1,9 +1,7 @@ #include -#include - -#include "print.h" -#include "ps2ctrl.h" -#include "interrupt/pic.h" +#include +#include +#include #define STATUS_OUT_BUF ((uint8_t)0x01) #define STATUS_IN_BUF ((uint8_t)0x02) diff --git a/kernel/src/drivers/ps2kb.c b/kernel/src/arch/i686/drivers/ps2kb.c similarity index 98% rename from kernel/src/drivers/ps2kb.c rename to kernel/src/arch/i686/drivers/ps2kb.c index f6fc514..50bdfb6 100644 --- a/kernel/src/drivers/ps2kb.c +++ b/kernel/src/arch/i686/drivers/ps2kb.c @@ -1,10 +1,8 @@ #include -#include - -#include "print.h" -#include "ps2kb.h" -#include "ps2ctrl.h" -#include "interrupt/pic.h" +#include +#include +#include +#include #define BUFFER_LEN 16 diff --git a/kernel/src/drivers/ps2mouse.c b/kernel/src/arch/i686/drivers/ps2mouse.c similarity index 91% rename from kernel/src/drivers/ps2mouse.c rename to kernel/src/arch/i686/drivers/ps2mouse.c index 1616cd6..d1082a1 100644 --- a/kernel/src/drivers/ps2mouse.c +++ b/kernel/src/arch/i686/drivers/ps2mouse.c @@ -1,12 +1,8 @@ #include -#include -#include -#include - -#include "print.h" -#include "ps2mouse.h" -#include "drivers/ps2ctrl.h" -#include "interrupt/pic.h" +#include +#include +#include +#include static bool is_init = false; diff --git a/kernel/src/drivers/cmos.c b/kernel/src/arch/i686/drivers/rtc.c similarity index 79% rename from kernel/src/drivers/cmos.c rename to kernel/src/arch/i686/drivers/rtc.c index 5ac12c3..ba69d15 100644 --- a/kernel/src/drivers/cmos.c +++ b/kernel/src/arch/i686/drivers/rtc.c @@ -1,7 +1,8 @@ -#include "print.h" +#include "time.h" #include #include -#include +#include +#include #define CMOS_WRITE_PORT 0x70 #define CMOS_READ_PORT 0x71 @@ -15,9 +16,16 @@ #define CMOS_REG_YEAR 0x09 #define CMOS_REG_CEN 0x32 +// Live buffers to work on data static struct Time time; static struct Time localtime; -static int cur_offset = 0; + +// Front buffers so interupts dont request data that is half done +static struct Time cur_time; +static struct Time cur_localtime; + +// Current set Time Zone +static enum Timezone last_timezone = UTC; static uint8_t cmos_read(uint8_t reg) { uint8_t hex, ret; @@ -46,10 +54,12 @@ static void update_localtime(void) { // set localtime localtime = time; - // do we acutally need to do anything - if (cur_offset == 0) return; - localtime.hour += cur_offset; - + // if tz is UTC, we dont need to do anythin + if (last_timezone == UTC) { + cur_localtime = localtime; + return; + } + // check if day rolled over change = localtime.hour < 0 ? -1 : localtime.hour >= 24 ? 1 : 0; if (!change) return; @@ -98,13 +108,11 @@ year: localtime.yday = 0; localtime.year -= 1900; + + cur_localtime = localtime; } -void rtc_set_timezone(int offset) { - cur_offset = offset; -} - void rtc_update(void) { time.sec = cmos_read(CMOS_REG_SEC); time.min = cmos_read(CMOS_REG_MIN); @@ -127,12 +135,18 @@ void rtc_update(void) { time.year -= 1900; update_localtime(); + + cur_time = time; } -struct Time *rtc_utctime(void) { - return &time; +struct Time rtc_utctime(void) { + return cur_time; } -struct Time *rtc_localtime(void) { - return &localtime; +struct Time rtc_localtime(enum Timezone tz) { + if (tz != last_timezone) { + last_timezone = tz; + update_localtime(); + } + return cur_localtime; } diff --git a/kernel/src/arch/i686/drivers/vga.c b/kernel/src/arch/i686/drivers/vga.c new file mode 100644 index 0000000..a41ce54 --- /dev/null +++ b/kernel/src/arch/i686/drivers/vga.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include + +static uint16_t *buffer = (uint16_t*) 0xC03FF000; +static uint8_t start, end; + +void vgatext_write(char c, enum vga_color color, uint8_t x, uint8_t y) { + const size_t index = y * VGA_TEXT_W + x; + buffer[index] = c | (uint16_t) color << 8; +} + +void vgatext_write_data(uint16_t data, uint16_t index) { + buffer[index] = data; +} + +void vgatext_write_buf(const uint16_t *src) { + memcpy(buffer, src, VGA_TEXT_W * VGA_TEXT_H * sizeof(uint16_t)); +} + +void vgatext_cur_mov(uint8_t x, uint8_t y) { +; const uint16_t pos = y * VGA_TEXT_W + x; + + outb(0x3D4, 0x0F); + outb(0x3D5, (uint8_t) (pos & 0xFF)); + outb(0x3D4, 0x0E); + outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF)); +} + +void vgatext_cur_resize(uint8_t s, uint8_t e) { + start = s; + end = e; + + outb(0x3D4, 0x0A); + outb(0x3D5, (inb(0x3D5) & 0xC0) | start); + + outb(0x3D4, 0x0B); + outb(0x3D5, (inb(0x3D5) & 0xE0) | end); +} + +void vgatext_cur_visible(bool visible) { + if (visible) { + vgatext_cur_resize(start, end); + } else { + outb(0x3D4, 0x0A); + outb(0x3D5, 0x20); + } +} diff --git a/kernel/src/arch/i686/gdt.asm b/kernel/src/arch/i686/gdt.asm new file mode 100644 index 0000000..ea8a86b --- /dev/null +++ b/kernel/src/arch/i686/gdt.asm @@ -0,0 +1,42 @@ +global load_gdt + +%macro gdt_entry 4 + db %2 & 0xff + db (%2 >> 8) & 0xff + db %1 & 0xff + db (%1 >> 8) & 0xff + db (%1 >> 16) & 0xff + db %3 + db ((%2 >> 16) & 0x0f) | (%4 << 4) + db (%1 >> 24) & 0xff +%endmacro + +section .rodata +align 16 +gdt_start: +gdt_entry 0, 0, 0, 0 +gdt_entry 0, 0xFFFFF, 0x9A, 0xC +gdt_entry 0, 0xFFFFF, 0x92, 0xC +gdt_end: +gdt_descriptor: + dw gdt_end - gdt_start - 1 + dd gdt_start + + +section .text +align 8 +load_gdt: + cli + lgdt [gdt_descriptor] + mov eax, cr0 + or al, 1 + mov cr0, eax + mov ax, 0x10 + mov ds, ax + mov ss, ax + mov es, ax + mov fs, ax + mov gs, ax + jmp 0x08:after_gdt +after_gdt: + ret diff --git a/kernel/src/interrupt/idt.asm b/kernel/src/arch/i686/idt.asm similarity index 100% rename from kernel/src/interrupt/idt.asm rename to kernel/src/arch/i686/idt.asm diff --git a/kernel/src/interrupt/idt.c b/kernel/src/arch/i686/idt.c similarity index 72% rename from kernel/src/interrupt/idt.c rename to kernel/src/arch/i686/idt.c index aaa7034..04fd5f8 100644 --- a/kernel/src/interrupt/idt.c +++ b/kernel/src/arch/i686/idt.c @@ -5,16 +5,42 @@ #include #include #include +#include +#include +#include +#include +#include -#include "acpi/acpi.h" -#include "drivers/ps2kb.h" -#include "drivers/ps2mouse.h" -#include "time.h" -#include "tty/color.h" -#include "idt.h" -#include "pic.h" #include "tty/term.h" +struct IdtEntry { + uint16_t isr_low; + uint16_t kernel_cs; + uint8_t _reserved; + uint8_t attributes; + uint16_t isr_high; +} __attribute__((packed)); + +struct Idtr { + uint16_t limit; + uint32_t base; +} __attribute__((packed)); + +enum IDTFlags { + IDT_FLAG_GATE_TASK = 0x5, + IDT_FLAG_GATE_16BIT_INT = 0x6, + IDT_FLAG_GATE_16BIT_TRAP = 0x7, + IDT_FLAG_GATE_32BIT_INT = 0xE, + IDT_FLAG_GATE_32BIT_TRAP = 0xF, + + IDT_FLAG_RING0 = (0 << 5), + IDT_FLAG_RING1 = (1 << 5), + IDT_FLAG_RING2 = (2 << 5), + IDT_FLAG_RING3 = (3 << 5), + + IDT_FLAG_PRESENT = 0x80, +}; + #define WIDTH 30 static char buf[WIDTH]; static int timer = -1; @@ -35,7 +61,8 @@ void idt_pic_timer(void) { for (size_t i = 0; i < WIDTH; i++) putchar(' '); term_setpos(TERM_W - WIDTH - 1, 0); - timetostr(rtc_localtime(), "%a %b %d %Y %H:%M:%S", buf, WIDTH); + struct Time t = get_localtime(); + timetostr(&t, "%a %b %d %Y %H:%M:%S", buf, WIDTH); printk("%s", buf); term_load(state); @@ -101,9 +128,6 @@ static void set_descriptor(uint8_t vector, void* isr, uint8_t flags) { } void idt_init(void) { - - debugk("Loading IDT"); - idtr.base = (uintptr_t)&idt[0]; idtr.limit = (uint16_t)sizeof(struct IdtEntry) * IDT_SIZE - 1; @@ -112,7 +136,5 @@ void idt_init(void) { } __asm__ volatile ("lidt %0" : : "m"(idtr)); - - succek("IDT has been loaded"); } diff --git a/kernel/src/boot/tag.c b/kernel/src/arch/i686/mboot.c similarity index 95% rename from kernel/src/boot/tag.c rename to kernel/src/arch/i686/mboot.c index a344d72..108812f 100644 --- a/kernel/src/boot/tag.c +++ b/kernel/src/arch/i686/mboot.c @@ -1,10 +1,8 @@ #include #include - -#include "print.h" -#include "tag.h" -#include "acpi/acpi.h" -#include "memory/memory.h" +#include +#include +#include static struct BootInfo info; diff --git a/kernel/src/memory/memory.c b/kernel/src/arch/i686/memory.c similarity index 95% rename from kernel/src/memory/memory.c rename to kernel/src/arch/i686/memory.c index 30da0fc..29f1f56 100644 --- a/kernel/src/memory/memory.c +++ b/kernel/src/arch/i686/memory.c @@ -1,11 +1,10 @@ +#include #include #include #include #include - -#include "memory.h" -#include "boot/tag.h" -#include "print.h" +#include +#include struct MemoryArea { uint32_t len; @@ -25,12 +24,12 @@ static uint32_t page_free_start; static struct MemoryArea *page_start; int memory_lock(void) { - int_disable(); + // int_disable(); return 0; } int memory_unlock(void) { - int_enable(); + // int_enable(); return 0; } @@ -114,8 +113,6 @@ int memory_free_page(void *ptr, int pages) { void memory_init(void) { - debugk("Loading memory pages"); - memory_lock(); bitmap = NULL; @@ -185,8 +182,6 @@ void memory_init(void) { memory_unlock(); - succek("Memory loaded. %k total %k free", total_memory, free_memory); - } uint32_t memory_total(void) { diff --git a/kernel/src/arch/i686/paging.asm b/kernel/src/arch/i686/paging.asm new file mode 100644 index 0000000..f74cc55 --- /dev/null +++ b/kernel/src/arch/i686/paging.asm @@ -0,0 +1,62 @@ +global page_directory +global paging_init +global paging_finish +global KERNEL_MAPPING + +KERNEL_MAPPING equ 0xC0000000 +VGABUF equ 0x000B8000 + +section .bss +align 4096 +page_directory: +resb 4096 +page_table1: +resb 4096 + +section .bootstrap.text +align 8 +paging_init: + extern kernel_start + extern kernel_end + +paging_load: + mov edi, page_table1 - KERNEL_MAPPING + mov esi, 0 + mov ecx, 1023 + +paging_cmp: + cmp esi, kernel_start + jl paging_add + cmp esi, kernel_end - KERNEL_MAPPING + jge paging_map + + mov edx, esi + or edx, 0x003 + mov [edi], edx + +paging_add: + add esi, 4096 + add edi, 4 + loop paging_cmp + +paging_map: + mov dword [page_table1 - KERNEL_MAPPING + 1023 * 4], VGABUF | 0x003 + mov dword [page_directory - KERNEL_MAPPING + 0], page_table1 - KERNEL_MAPPING + 0x003 + mov dword [page_directory - KERNEL_MAPPING + 768 * 4], page_table1 - KERNEL_MAPPING + 0x003 + + mov ecx, page_directory - KERNEL_MAPPING + mov cr3, ecx + + mov ecx, cr0 + or ecx, 0x80010000 + mov cr0, ecx + + ret + +section .text +align 8 +paging_finish: + mov dword [page_directory], 0 + mov ecx, cr3 + mov cr3, ecx + ret diff --git a/kernel/src/interrupt/pic.c b/kernel/src/arch/i686/pic.c similarity index 87% rename from kernel/src/interrupt/pic.c rename to kernel/src/arch/i686/pic.c index 86056a1..f5d0f94 100644 --- a/kernel/src/interrupt/pic.c +++ b/kernel/src/arch/i686/pic.c @@ -1,17 +1,14 @@ #include #include - -#include "pic.h" +#include +#include #define PIC1_COMMAND_PORT 0x20 #define PIC1_DATA_PORT 0x21 #define PIC2_COMMAND_PORT 0xA0 #define PIC2_DATA_PORT 0xA1 -void pic_remap(uint8_t offset) { - - debugk("Remapping PIC"); - +void pic_remap(void) { char a1 = inb(PIC1_DATA_PORT); char a2 = inb(PIC2_DATA_PORT); // control word 1 @@ -22,9 +19,9 @@ void pic_remap(uint8_t offset) { io_wait(); // control word 2 // interrupt offset - outb(PIC1_DATA_PORT, offset); + outb(PIC1_DATA_PORT, PIC_REMAP_OFFSET); io_wait(); - outb(PIC2_DATA_PORT, offset + 8); + outb(PIC2_DATA_PORT, PIC_REMAP_OFFSET + 8); io_wait(); // control word 3 // primary pic: set which pin secondary is connected to @@ -42,8 +39,6 @@ void pic_remap(uint8_t offset) { // clear data registers outb(PIC1_DATA_PORT, a1); outb(PIC2_DATA_PORT, a2); - - succek("PIC has been remapped to offset 0x%X", offset); } void pic_mask(int irq) { diff --git a/kernel/src/arch/i686/start.asm b/kernel/src/arch/i686/start.asm new file mode 100644 index 0000000..2151b51 --- /dev/null +++ b/kernel/src/arch/i686/start.asm @@ -0,0 +1,82 @@ +global start +bits 32 + + +; create the multiboot header +section .bootstrap.data +align 8 +mb_start: +dd 0xe85250d6 +dd 0 +dd mb_end - mb_start +dd -(0xe85250d6 + (mb_end - mb_start)) +dw 0 +dw 0 +dd 8 +mb_end: + + +; create the stack for bootstrapping +section .bootstrap.stack +align 16 +bootstrap_stack_start: +resb 1024 ; 1 KiB +bootstrap_stack_end: + + +; create the stack for the kernel +section .stack +align 16 +stack_start: +resb 16384 ; 16 KiB +stack_end: + + +; load the kernel into the higher half +section .bootstrap.text +align 8 +start: + ; init bootstrap stack + mov esp, bootstrap_stack_end + mov ebp, bootstrap_stack_end + + ; load kernel into higher half and init paging + extern paging_init + call paging_init + + jmp near load_kernel + +; initalize kernel after it has been loaded in higher half +section .text +align 8 +load_kernel: + ; init stack + mov esp, stack_end + mov ebp, stack_end + + ; load global descripter table + extern load_gdt + call load_gdt + + ; unmap kernel at page 0 + extern paging_finish + call paging_finish + + ; initalize the FPU + finit + + ; push multiboot header + extern KERNEL_MAPPING + add ebx, KERNEL_MAPPING + push ebx + + ; start kernel + sti + call kernel_main + extern kernel_main + + ; hlt forever if kernel quits (it should never) + cli +halt: + hlt + jmp halt diff --git a/kernel/src/arch/i686/sys.c b/kernel/src/arch/i686/sys.c new file mode 100644 index 0000000..209fea4 --- /dev/null +++ b/kernel/src/arch/i686/sys.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +void arch_init(void *boot_info) { + rtc_update(); + + idt_init(); + pic_remap(); + + load_boot_info(boot_info); + + /* havent refactored to work with paging yet */ + // acpi_init(); + // memory_init(); + + ps2ctrl_init(); +} + +extern void arch_update(void) { + rtc_update(); +} + +void arch_halt(void) { + halt(); +} + +void arch_wait_io(void) { + io_wait(); +} + +void arch_disable_int(void) { + int_disable(); +} + +void arch_enable_int(void) { + int_enable(); +} + +extern void arch_wait_int(void) { + int_wait(); +} + +void arch_poweroff(void) { + acpi_poweroff(); +} diff --git a/kernel/src/arch/i686/time.c b/kernel/src/arch/i686/time.c new file mode 100644 index 0000000..66fabc1 --- /dev/null +++ b/kernel/src/arch/i686/time.c @@ -0,0 +1,17 @@ +#include +#include + +static enum Timezone cur_tz = UTC; + +struct Time get_utctime(void) { + return rtc_utctime(); +} + +struct Time get_localtime(void) { + return rtc_localtime(cur_tz); +} + +void set_timezone(enum Timezone tz) { + cur_tz = tz; +} + diff --git a/kernel/src/cpu/cpu.c b/kernel/src/cpu/cpu.c deleted file mode 100644 index 416a1ad..0000000 --- a/kernel/src/cpu/cpu.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "cpu.h" - -#include "print.h" - -extern uint8_t sse_init (void); -extern uint8_t fpu_init (void); - -uint8_t init_registers (uint8_t reg) { - uint8_t res = 0; - - if (reg & SSE_REG) - res |= ~sse_init() & SSE_REG; - - if (reg & FPU_REG) - res |= ~fpu_init() & FPU_REG; - - return res; -} diff --git a/kernel/src/cpu/cpu.h b/kernel/src/cpu/cpu.h deleted file mode 100644 index b6221aa..0000000 --- a/kernel/src/cpu/cpu.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include - -#define SSE_REG 0x01 -#define FPU_REG 0x02 - -uint8_t init_registers (uint8_t reg); diff --git a/kernel/src/cpu/fpu.asm b/kernel/src/cpu/fpu.asm deleted file mode 100644 index d03feba..0000000 --- a/kernel/src/cpu/fpu.asm +++ /dev/null @@ -1,19 +0,0 @@ -global fpu_init - -fpu_init: - mov edx, cr0 - and edx, (-1) - ((1 << 3) + (1 << 4)) - mov cr0, edx - fninit - fnstsw [test] - cmp word [test], 0 - jne no_fpu - - mov eax, 0 - ret - -no_fpu: - mov eax, 1 - ret - -test: dw 0x55AA diff --git a/kernel/src/cpu/sse.asm b/kernel/src/cpu/sse.asm deleted file mode 100644 index e7b5a99..0000000 --- a/kernel/src/cpu/sse.asm +++ /dev/null @@ -1,22 +0,0 @@ -global sse_init - -sse_init: - mov eax, 0x1 - cpuid - test edx, 1<<25 - jmp no_sse - - mov eax, cr0 - and ax, 0xFFFB - or ax, 0x2 - mov cr0, eax - mov eax, cr4 - or ax, 3 << 9 - mov cr4, eax - - mov eax, 0 - ret - -no_sse: - mov eax, 1 - ret diff --git a/kernel/src/interrupt/idt.h b/kernel/src/interrupt/idt.h deleted file mode 100644 index 86a685f..0000000 --- a/kernel/src/interrupt/idt.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include - -#define IDT_SIZE 256 -#define IDT_INTERRUPTS 256 - -struct IdtEntry { - uint16_t isr_low; - uint16_t kernel_cs; - uint8_t _reserved; - uint8_t attributes; - uint16_t isr_high; -} __attribute__((packed)); - -struct Idtr { - uint16_t limit; - uint32_t base; -} __attribute__((packed)); - -enum IDTFlags { - IDT_FLAG_GATE_TASK = 0x5, - IDT_FLAG_GATE_16BIT_INT = 0x6, - IDT_FLAG_GATE_16BIT_TRAP = 0x7, - IDT_FLAG_GATE_32BIT_INT = 0xE, - IDT_FLAG_GATE_32BIT_TRAP = 0xF, - - IDT_FLAG_RING0 = (0 << 5), - IDT_FLAG_RING1 = (1 << 5), - IDT_FLAG_RING2 = (2 << 5), - IDT_FLAG_RING3 = (3 << 5), - - IDT_FLAG_PRESENT = 0x80, -}; - -void idt_init(void); diff --git a/kernel/src/main.c b/kernel/src/main.c index da5879a..33e4cea 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -1,52 +1,29 @@ -#include "acpi/acpi.h" -#include "boot/tag.h" -#include "cpu/cpu.h" -#include "drivers/ps2ctrl.h" -#include "drivers/ps2kb.h" -#include "drivers/ps2mouse.h" -#include "interrupt/idt.h" -#include "interrupt/pic.h" #include "time.h" -#include "tty/cursor.h" -#include "tty/term.h" - +#include +#include +#include #include +#include #include #include #include -#include +#include static double x = 0, y = 0; -void kernel_boot(void *boot_info) { - (void)boot_info; -} - - -void kernel_main(void) { +void kernel_main(void *boot_info) { term_init(); - cursor_enable(); - rtc_set_timezone(-4); - rtc_update(); - - idt_init(); - pic_remap(PIC_REMAP_OFFSET); - - // load_boot_info(boot_info); - // acpi_init(); - - // memory_init(); - - ps2ctrl_init(); + arch_init(boot_info); ps2kb_init(); ps2mouse_init(); - init_registers(FPU_REG | SSE_REG); + set_timezone(EST); while(1) { - int_wait(); + arch_wait_int(); + arch_update(); struct Keycode code = ps2kb_get(); if(code.key != KEY_NONE) { @@ -60,7 +37,7 @@ void kernel_main(void) { } if (code.key == KEY_ESCAPE) { - acpi_poweroff(); + arch_poweroff(); } struct MouseEvent event = ps2mouse_get(); @@ -76,6 +53,5 @@ void kernel_main(void) { } term_flush(); - rtc_update(); } } diff --git a/kernel/src/memory/allocator.c b/kernel/src/memory.c similarity index 98% rename from kernel/src/memory/allocator.c rename to kernel/src/memory.c index 6217ad4..e8d864b 100644 --- a/kernel/src/memory/allocator.c +++ b/kernel/src/memory.c @@ -1,6 +1,7 @@ #include #include #include +#include struct boundary_tag { unsigned int magic; @@ -15,11 +16,6 @@ struct boundary_tag { struct boundary_tag *prev; }; -extern int memory_lock(void); -extern int memory_unlock(void); -extern void *memory_alloc_page(int); -extern int memory_free_page(void* ,int); - #define ALLOC_MAGIC 0xc001c0de #define MAXCOMPLETE 5 #define MAXEXP 32 diff --git a/kernel/src/print/panic.c b/kernel/src/panic.c similarity index 86% rename from kernel/src/print/panic.c rename to kernel/src/panic.c index 58ffe40..96ad3b9 100644 --- a/kernel/src/print/panic.c +++ b/kernel/src/panic.c @@ -3,13 +3,11 @@ #include #include #include - -#include "tty/color.h" -#include "tty/term.h" +#include __attribute__((noreturn)) void _panic_impl(char* msg, int line, char* file, ...) { - int_disable(); + arch_disable_int(); va_list args; va_start(args, file); term_clear(); @@ -22,6 +20,6 @@ void _panic_impl(char* msg, int line, char* file, ...) { printk("\nin %s at line %d\n", file, line); term_flush(); while(1) { - halt(); - } + arch_halt(); + } } diff --git a/kernel/src/print/print.c b/kernel/src/print.c similarity index 66% rename from kernel/src/print/print.c rename to kernel/src/print.c index 46ec047..12f45de 100644 --- a/kernel/src/print/print.c +++ b/kernel/src/print.c @@ -1,10 +1,9 @@ -#include "tty/color.h" -#include "tty/term.h" #include #include #include #include #include +#include void printk(const char *restrict format, ...) { va_list args; @@ -82,47 +81,3 @@ void vprintk(const char *restrict format, va_list args) { void puts(const char *s) { for(; *s; s++) putchar(*s); } - -void printl(enum VGAColor color, const char* msg) { - term_setbg(VGA_BLACK); - term_setfg(VGA_WHITE); - putchar('['); - term_setfg(color); - printk("%s", msg); - term_setfg(VGA_WHITE); - putchar(']'); - putchar(' '); -} - -void _debugk_impl(char *format, ...) { - uint16_t color = term_save_col(); - printl(VGA_LIGHT_CYAN, "LOG"); - va_list args; - va_start(args, format); - vprintk(format, args); - va_end(args); - if (!term_newline()) putchar('\n'); - term_load_col(color); -} - -void _succek_impl(char *format, ...) { - uint16_t color = term_save_col(); - printl(VGA_LIGHT_GREEN, "OK"); - va_list args; - va_start(args, format); - vprintk(format, args); - va_end(args); - if (!term_newline()) putchar('\n'); - term_load_col(color); -} - -void _errork_impl(char *format, ...) { - uint16_t color = term_save_col(); - printl(VGA_LIGHT_RED, "ERR"); - va_list args; - va_start(args, format); - vprintk(format, args); - va_end(args); - if (!term_newline()) putchar('\n'); - term_load_col(color); -} diff --git a/kernel/src/start.asm b/kernel/src/start.asm deleted file mode 100644 index c01cbaa..0000000 --- a/kernel/src/start.asm +++ /dev/null @@ -1,135 +0,0 @@ -global start -extern kernel_boot -extern kernel_main -extern kernel_start -extern kernel_end -bits 32 - -; base, limit, access, flags -%macro gdt_entry 4 - db %2 & 0xff - db (%2 >> 8) & 0xff - db %1 & 0xff - db (%1 >> 8) & 0xff - db (%1 >> 16) & 0xff - db %3 - db ((%2 >> 16) & 0x0f) | (%4 << 4) - db (%1 >> 24) & 0xff -%endmacro - -MAGIC equ 0xe85250d6 -FLAGS equ 0 -LENGTH equ mb_end - mb_start -CHECKSUM equ -(MAGIC + LENGTH) - -VGABUF equ 0x000B8000 -KRNMAP equ 0xC0000000 - -section .multiboot.data -align 8 -mb_start: -dd MAGIC -dd FLAGS -dd LENGTH -dd CHECKSUM -dw 0 -dw 0 -dd 8 -mb_end: - -section .rodata -align 16 -gdt_start: -gdt_entry 0, 0, 0, 0 -gdt_entry 0, 0xFFFFF, 0x9A, 0xC -gdt_entry 0, 0xFFFFF, 0x92, 0xC -gdt_end: -gdt_descriptor: - dw gdt_end - gdt_start - 1 - dd gdt_start - -section .bootstrap_stack -align 16 -stack_start: -resb 16384 ; 16 KiB -stack_end: - -section .bss -align 4096 -page_directory: -resb 4096 -page_table1: -resb 4096 - -section .multiboot.text -align 8 -start: - - ; push ebx - ; call kernel_boot - ; pop eax - - mov edi, page_table1 - KRNMAP - mov esi, 0 - mov ecx, 1023 - -paging_cmp: - cmp esi, kernel_start - jl paging_add - cmp esi, kernel_end - KRNMAP - jge paging_map - - mov edx, esi - or edx, 0x003 - mov [edi], edx - -paging_add: - add esi, 4096 - add edi, 4 - loop paging_cmp - -paging_map: - mov dword [page_table1 - KRNMAP + 1023 * 4], VGABUF | 0x003 - mov dword [page_directory - KRNMAP + 0], page_table1 - KRNMAP + 0x003 - mov dword [page_directory - KRNMAP + 768 * 4], page_table1 - KRNMAP + 0x003 - - mov ecx, page_directory - KRNMAP - mov cr3, ecx - - mov ecx, cr0 - or ecx, 0x80010000 - mov cr0, ecx - - lea ecx, load_gdt - jmp near ecx - -section .text -align 8 -load_gdt: - cli - lgdt [gdt_descriptor] - mov eax, cr0 - or al, 1 - mov cr0, eax - jmp 0x08:load_kernel - -load_kernel: - - mov dword [page_directory], 0 - mov ecx, cr3 - mov cr3, ecx - - mov ax, 0x10 - mov ds, ax - mov ss, ax - mov es, ax - mov fs, ax - mov gs, ax - mov esp, stack_end - mov ebp, stack_end - sti - call kernel_main - cli -halt: - hlt - jmp halt diff --git a/kernel/src/tty/term.c b/kernel/src/term.c similarity index 85% rename from kernel/src/tty/term.c rename to kernel/src/term.c index a7451d2..4b42a6a 100644 --- a/kernel/src/tty/term.c +++ b/kernel/src/term.c @@ -5,12 +5,10 @@ #include #include +#include "drivers/vga.h" #include "term.h" -#include "color.h" -#include "cursor.h" uint16_t buffer[TERM_W * TERM_H * sizeof(uint16_t)]; -uint16_t *front; uint8_t x, y; uint8_t color; @@ -28,7 +26,6 @@ static void term_clear_line(int y) { void term_init (void) { x = 0; y = 0; - front = (uint16_t*) 0xC03FF000; term_setfg(VGA_WHITE); term_setbg(VGA_BLACK); term_clear(); @@ -37,11 +34,11 @@ void term_init (void) { void term_setpos(uint8_t xp, uint8_t yp) { x = xp; y = yp; - cursor_setpos(x, y); + vgatext_cur_mov(x, y); } void term_scroll (int lines) { - int_disable(); + arch_disable_int(); y -= lines; if (!lines) return; if(lines >= TERM_H || lines <= -TERM_H) { @@ -52,14 +49,14 @@ void term_scroll (int lines) { } else { memmove(buffer + lines * TERM_W, buffer + lines, (TERM_H + lines) * TERM_W); } - int_enable(); + arch_enable_int(); } -void term_setfg(enum VGAColor c) { +void term_setfg(enum vga_color c) { color = (color & 0xF0) | c; } -void term_setbg(enum VGAColor c) { +void term_setbg(enum vga_color c) { color = (color & 0x0F) | c << 4; } @@ -80,7 +77,7 @@ void term_load(uint32_t state) { x = (uint8_t) (state >> 16); y = (uint8_t) (state >> 8); color = (uint8_t) (state >> 0); - cursor_setpos(x, y); + vgatext_cur_mov(x, y); } uint16_t term_save_col(void) { @@ -124,7 +121,7 @@ void putchar(int c) { y = TERM_H - 1; } - cursor_setpos(x, y); + vgatext_cur_mov(x, y); } bool term_newline(void) { @@ -132,7 +129,7 @@ bool term_newline(void) { } void term_flush(void) { - int_disable(); - memcpy(front, buffer, TERM_W * TERM_H * sizeof(uint16_t)); - int_enable(); + arch_disable_int(); + vgatext_write_buf(buffer); + arch_enable_int(); } diff --git a/kernel/src/print/time.c b/kernel/src/time.c similarity index 99% rename from kernel/src/print/time.c rename to kernel/src/time.c index 7f52a98..e949882 100644 --- a/kernel/src/print/time.c +++ b/kernel/src/time.c @@ -1,7 +1,5 @@ -#include #include #include -#include static char* ABB_WEEKDAY[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" diff --git a/kernel/src/tty/color.c b/kernel/src/tty/color.c deleted file mode 100644 index c7258d9..0000000 --- a/kernel/src/tty/color.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "color.h" -#include "panic.h" - -bool itoac(int i, enum AnsiiColor *color) { - if (i < 0 || i > 15) return false; - *color = i; - return true; -} - -bool itovc(int i, enum VGAColor *color) { - if ( - (i >= 30 && i <= 37) || - (i >= 40 && i <= 47) || - (i >= 90 && i <= 97) || - (i >= 100 && i <= 107) - ) { - *color = i; - return true; - } - return false; -} - -enum VGAColor atovc(enum AnsiiColor color) { - switch(color) { - case ANSII_FRONT_BLACK: - case ANSII_FRONT_BLACK_EMPH: - case ANSII_BACK_BLACK: - case ANSII_BACK_BLACK_EMPH: - return VGA_BLACK; - case ANSII_FRONT_RED: - case ANSII_FRONT_RED_EMPH: - case ANSII_BACK_RED: - case ANSII_BACK_RED_EMPH: - return VGA_LIGHT_RED; - case ANSII_FRONT_GREEN: - case ANSII_FRONT_GREEN_EMPH: - case ANSII_BACK_GREEN: - case ANSII_BACK_GREEN_EMPH: - return VGA_LIGHT_GREEN; - case ANSII_FRONT_YELLOW: - case ANSII_FRONT_YELLOW_EMPH: - case ANSII_BACK_YELLOW: - case ANSII_BACK_YELLOW_EMPH: - return VGA_LIGHT_BROWN; - case ANSII_FRONT_BLUE: - case ANSII_FRONT_BLUE_EMPH: - case ANSII_BACK_BLUE: - case ANSII_BACK_BLUE_EMPH: - return VGA_LIGHT_BLUE; - case ANSII_FRONT_PURPLE: - case ANSII_FRONT_PURPLE_EMPH: - case ANSII_BACK_PURPLE: - case ANSII_BACK_PURPLE_EMPH: - return VGA_LIGHT_MAGENTA; - case ANSII_FRONT_CYAN: - case ANSII_FRONT_CYAN_EMPH: - case ANSII_BACK_CYAN: - case ANSII_BACK_CYAN_EMPH: - return VGA_LIGHT_CYAN; - case ANSII_FRONT_WHITE: - case ANSII_FRONT_WHITE_EMPH: - case ANSII_BACK_WHITE: - case ANSII_BACK_WHITE_EMPH: - return VGA_WHITE; - } - panic("this should not be reached (make gcc quiet)"); -} diff --git a/kernel/src/tty/color.h b/kernel/src/tty/color.h deleted file mode 100644 index 0751353..0000000 --- a/kernel/src/tty/color.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include -#include - -enum VGAColor { - VGA_BLACK = 0, - VGA_BLUE = 1, - VGA_GREEN = 2, - VGA_CYAN = 3, - VGA_RED = 4, - VGA_MAGENTA = 5, - VGA_BROWN = 6, - VGA_LIGHT_GREY = 7, - VGA_DARK_GREY = 8, - VGA_LIGHT_BLUE = 9, - VGA_LIGHT_GREEN = 10, - VGA_LIGHT_CYAN = 11, - VGA_LIGHT_RED = 12, - VGA_LIGHT_MAGENTA = 13, - VGA_LIGHT_BROWN = 14, - VGA_WHITE = 15, -}; - -enum AnsiiColor { - ANSII_FRONT_BLACK = 30, - ANSII_FRONT_RED = 31, - ANSII_FRONT_GREEN = 32, - ANSII_FRONT_YELLOW = 33, - ANSII_FRONT_BLUE = 34, - ANSII_FRONT_PURPLE = 35, - ANSII_FRONT_CYAN = 36, - ANSII_FRONT_WHITE = 37, - ANSII_FRONT_BLACK_EMPH = 90, - ANSII_FRONT_RED_EMPH = 91, - ANSII_FRONT_GREEN_EMPH = 92, - ANSII_FRONT_YELLOW_EMPH = 93, - ANSII_FRONT_BLUE_EMPH = 94, - ANSII_FRONT_PURPLE_EMPH = 95, - ANSII_FRONT_CYAN_EMPH = 96, - ANSII_FRONT_WHITE_EMPH = 97, - ANSII_BACK_BLACK = 40, - ANSII_BACK_RED = 41, - ANSII_BACK_GREEN = 42, - ANSII_BACK_YELLOW = 43, - ANSII_BACK_BLUE = 44, - ANSII_BACK_PURPLE = 45, - ANSII_BACK_CYAN = 46, - ANSII_BACK_WHITE = 47, - ANSII_BACK_BLACK_EMPH = 100, - ANSII_BACK_RED_EMPH = 101, - ANSII_BACK_GREEN_EMPH = 102, - ANSII_BACK_YELLOW_EMPH = 103, - ANSII_BACK_BLUE_EMPH = 104, - ANSII_BACK_PURPLE_EMPH = 105, - ANSII_BACK_CYAN_EMPH = 106, - ANSII_BACK_WHITE_EMPH = 107, -}; - -bool itoac(int i, enum AnsiiColor *color); -bool itovc(int i, enum VGAColor *color); -enum VGAColor atovc(enum AnsiiColor color); diff --git a/kernel/src/tty/cursor.c b/kernel/src/tty/cursor.c deleted file mode 100644 index 3a3888b..0000000 --- a/kernel/src/tty/cursor.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -#include "cursor.h" -#include "term.h" - -void cursor_enable(void) { - cursor_setsize(13, 16); -} - -void cursor_disable(void) { - outb(0x3D4, 0x0A); - outb(0x3D5, 0x20); -} - -void cursor_setsize(uint8_t start, uint8_t end) { - outb(0x3D4, 0x0A); - outb(0x3D5, (inb(0x3D5) & 0xC0) | start); - - outb(0x3D4, 0x0B); - outb(0x3D5, (inb(0x3D5) & 0xE0) | end); -} - -void cursor_setpos(uint8_t x, uint8_t y) { -; uint16_t pos = y * TERM_W + x; - - outb(0x3D4, 0x0F); - outb(0x3D5, (uint8_t) (pos & 0xFF)); - outb(0x3D4, 0x0E); - outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF)); -} diff --git a/kernel/src/tty/cursor.h b/kernel/src/tty/cursor.h deleted file mode 100644 index 602d9cd..0000000 --- a/kernel/src/tty/cursor.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -void cursor_enable(void); -void cursor_disable(void); -void cursor_setsize(uint8_t start, uint8_t end); -void cursor_setpos(uint8_t x, uint8_t y); -