diff --git a/Makefile b/Makefile index 6bb8bd2..69fea3d 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,12 @@ $(COMPONENTS): disk: $(KERNEL_HDD) run: $(KERNEL_HDD) - qemu-system-x86_64 -m 2G -drive file=$(KERNEL_HDD),format=raw + qemu-system-$(ARCH) \ + -m 16M \ + -drive file=$(KERNEL_HDD),format=raw \ + -smp 2 \ + -enable-kvm \ + -debugcon stdio ext/limine/limine-install: $(MAKE) -C ext/limine/ limine-install diff --git a/ext/limine.cfg b/ext/limine.cfg index 8430812..3cee4ca 100644 --- a/ext/limine.cfg +++ b/ext/limine.cfg @@ -1,4 +1,5 @@ TIMEOUT=5 +E9_OUTPUT=yes :KornOS PROTOCOL=stivale2 diff --git a/kernel/Makefile b/kernel/Makefile index 1bd968a..34d83a1 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -8,7 +8,7 @@ LD = ld -m elf_$(ARCH) CFLAGS ?= -O2 CFLAGS := $(CFLAGS) $(ARCH_CFLAGS) \ -Wall -Wextra -pedantic -Wno-language-extension-token -std=gnu11 -I../ext/limine/stivale -fPIE -LDFLAGS := $(LDFLAGS) -T linker.ld +LDFLAGS := $(LDFLAGS) -T linker.ld.$(ARCH) TARGET := kernel diff --git a/kernel/linker.ld.i386 b/kernel/linker.ld.i386 new file mode 100644 index 0000000..282142a --- /dev/null +++ b/kernel/linker.ld.i386 @@ -0,0 +1,34 @@ +ENTRY(stivale2_main) + +SECTIONS +{ + . = 1M + 512K; + + .stivale2hdr ALIGN(4K) : + { + KEEP(*(.stivalehdr)) + } + + .text ALIGN(4K) : + { + KEEP(*(.text*)) + } + + .rodata ALIGN(4K) : + { + KEEP(*(.rodata*)) + } + + .data ALIGN(4K) : + { + KEEP(*(.data*)) + } + + .bss ALIGN(4K) : + { + KEEP(*(COMMON)) + KEEP(*(.bss*)) + } + + _stack = 1M; +} diff --git a/kernel/linker.ld b/kernel/linker.ld.x86_64 similarity index 100% rename from kernel/linker.ld rename to kernel/linker.ld.x86_64 diff --git a/kernel/src/arch/i386/entry-stivale2.c b/kernel/src/arch/i386/entry-stivale2.c new file mode 100644 index 0000000..e3a42ea --- /dev/null +++ b/kernel/src/arch/i386/entry-stivale2.c @@ -0,0 +1,28 @@ +#include +#include +#include + +#include "../../main.h" + +void stivale2_main(struct stivale2_struct *info); + +struct stivale2_header_tag_smp smp_request = { + .tag = { + .identifier = STIVALE2_HEADER_TAG_SMP_ID, + .next = 0 + }, + .flags = 02 +}; + +__attribute__((section(".stivale2hdr"), used)) +struct stivale2_header header2 = { + .entry_point = 0, + .stack = 1024*1024, + .flags = 0, + .tags = 0 +}; + +void stivale2_main(struct stivale2_struct *info) { + char *argv[3] = {"stivale2", info->bootloader_brand, info->bootloader_version}; + kmain(3, argv); +} diff --git a/kernel/src/arch/i386/ops.c b/kernel/src/arch/i386/ops.c new file mode 100644 index 0000000..4ebe70f --- /dev/null +++ b/kernel/src/arch/i386/ops.c @@ -0,0 +1,4 @@ +void halt_catch_fire() { + asm volatile ("cli"); + while(1) asm volatile ("hlt"); +} \ No newline at end of file diff --git a/kernel/src/arch/i386/vga.c b/kernel/src/arch/i386/vga.c new file mode 100644 index 0000000..018cc19 --- /dev/null +++ b/kernel/src/arch/i386/vga.c @@ -0,0 +1,53 @@ +#include +#include + +#include "vga.h" + +static const size_t VGA_WIDTH = 80; +static const size_t VGA_HEIGHT = 25; + +static volatile size_t terminal_row; +static volatile size_t terminal_column; +static volatile uint8_t current_color = VGA_WHITE; +static uint16_t *terminal_buffer = (uint16_t*)0xb8000; + +void vga_putc(char c) { + size_t index = terminal_row*VGA_WIDTH + terminal_column; + if(c == '\t') { + vga_putc(' '); + while(terminal_column % 8 != 0) { + vga_putc(' '); + } + return; + } + if(c != '\n' && c != '\t') + terminal_buffer[index] = (uint16_t)c | (uint16_t)(current_color) << 8; + + if (c == '\n' || ++terminal_column == VGA_WIDTH) { + terminal_column = 0; + if (++terminal_row == VGA_HEIGHT) + terminal_row = 0; + } +} + +void vga_puts(char *c) { + char cur = *(c++); + while(cur != '\0') { + vga_putc(cur); + cur = *(c++); + } +} + +void vga_setcolor(uint8_t new_color) { + current_color = new_color; +} + +void vga_write_elsewhere(char *c, size_t y, size_t x) { + size_t old_row = terminal_row; + size_t old_column = terminal_column; + terminal_row = y; + terminal_column = x; + vga_puts(c); + terminal_row=old_row; + terminal_column=old_column; +} diff --git a/kernel/src/arch/i386/vga.h b/kernel/src/arch/i386/vga.h new file mode 100644 index 0000000..30db3e0 --- /dev/null +++ b/kernel/src/arch/i386/vga.h @@ -0,0 +1,24 @@ +#include +#include + +#define VGA_BLACK 0 +#define VGA_BLUE 1 +#define VGA_GREEN 2 +#define VGA_CYAN 3 +#define VGA_RED 4 +#define VGA_PURPLE 5 +#define VGA_BROWN 6 +#define VGA_GRAY 7 +#define VGA_DARK_GRAY 8 +#define VGA_LIGHT_BLUE 9 +#define VGA_LIGH_GREEN 10 +#define VGA_LIGHT_CYAN 11 +#define VGA_LIGHT_RED 12 +#define VGA_LIGHT_PURPLE 13 +#define VGA_YELLOW 14 +#define VGA_WHITE 15 + +void vga_putc(char c); +void vga_puts(char *c); +void vga_setcolor(uint8_t color); +void vga_write_elsewhere(char *c, size_t y, size_t x);