From 1fc1c0150cad87e55628e578943db1f2c72feac6 Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Mon, 30 Nov 2020 02:56:55 +0100 Subject: [PATCH] Reorganize kernel code --- kernel/Makefile | 2 +- kernel/src/entry-stivale2.c | 28 ++++++++++++++++++++ kernel/src/main-stivale2.c | 51 ------------------------------------- kernel/src/main.c | 7 +++++ kernel/src/main.h | 1 + kernel/src/vga.c | 20 +++++++++++++++ kernel/src/vga.h | 19 ++++++++++++++ 7 files changed, 76 insertions(+), 52 deletions(-) create mode 100644 kernel/src/entry-stivale2.c delete mode 100644 kernel/src/main-stivale2.c create mode 100644 kernel/src/main.c create mode 100644 kernel/src/main.h create mode 100644 kernel/src/vga.c create mode 100644 kernel/src/vga.h diff --git a/kernel/Makefile b/kernel/Makefile index 2273354..4a3eab5 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -6,7 +6,7 @@ LD = ld -m elf_x86_64 QEMU = qemu-system-x86_64 QEMUFLAGS = -m 1G -enable-kvm -cpu host LDINTERNALFLAGS := -Tlinker.ld -INTERNALCFLAGS := -I../ext/limine/stivale \ +INTERNALCFLAGS := -I../ext/limine/stivale -mcmodel=kernel CFILES := $(shell find src -type f -name '*.c') HFILES := $(shell find src -type f -name '*.h') diff --git a/kernel/src/entry-stivale2.c b/kernel/src/entry-stivale2.c new file mode 100644 index 0000000..f1eeb1c --- /dev/null +++ b/kernel/src/entry-stivale2.c @@ -0,0 +1,28 @@ +#include +#include +#include + +#include "main.h" + +static uint8_t stack[4096] = {0}; +void stivale2_main(struct stivale2_struct *info); + +struct stivale2_header_tag_smp smp_request = { + .tag = { + .identifier = STIVALE2_HEADER_TAG_SMP_ID, + .next = 0 + }, + .flags = 0 +}; + +__attribute__((section(".stivale2hdr"), used)) +struct stivale2_header header2 = { + .entry_point = (uint64_t)stivale2_main, + .stack = (uintptr_t)stack + sizeof(stack), + .flags = 0, + .tags = (uint64_t)&smp_request +}; + +void stivale2_main(struct stivale2_struct *info) { + kmain(); +} diff --git a/kernel/src/main-stivale2.c b/kernel/src/main-stivale2.c deleted file mode 100644 index de225f0..0000000 --- a/kernel/src/main-stivale2.c +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include -#include - -#define VGA_ADDRESS 0xb8000 -#define VGA_COLOR(character, color) ((uint16_t) (character) | (uint16_t) (color) << 8) -#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 - -static uint8_t stack[4096] = {0}; -void stivale2_main(struct stivale2_struct *info); - -struct stivale2_header_tag_smp smp_request = { - .tag = { - .identifier = STIVALE2_HEADER_TAG_SMP_ID, - .next = 0 - }, - .flags = 0 -}; - -__attribute__((section(".stivale2hdr"), used)) -struct stivale2_header header2 = { - .entry_point = (uint64_t)stivale2_main, - .stack = (uintptr_t)stack + sizeof(stack), - .flags = 0, - .tags = (uint64_t)&smp_request -}; - -void stivale2_main(struct stivale2_struct *info) { - volatile uint16_t *vga_buffer = (uint16_t*)VGA_ADDRESS; - vga_buffer[0] = VGA_COLOR('h', VGA_GREEN); - vga_buffer[1] = VGA_COLOR('e', VGA_GREEN); - vga_buffer[2] = VGA_COLOR('l', VGA_GREEN); - vga_buffer[3] = VGA_COLOR('l', VGA_GREEN); - vga_buffer[4] = VGA_COLOR('o', VGA_GREEN); - asm volatile ("hlt"); -} diff --git a/kernel/src/main.c b/kernel/src/main.c new file mode 100644 index 0000000..e4c02ff --- /dev/null +++ b/kernel/src/main.c @@ -0,0 +1,7 @@ +#include "vga.h" + +void kmain() { + vga_puts("hello!"); + vga_putc('h'); + asm volatile ("hlt"); +} diff --git a/kernel/src/main.h b/kernel/src/main.h new file mode 100644 index 0000000..a79acd1 --- /dev/null +++ b/kernel/src/main.h @@ -0,0 +1 @@ +void kmain(); diff --git a/kernel/src/vga.c b/kernel/src/vga.c new file mode 100644 index 0000000..9ad8d48 --- /dev/null +++ b/kernel/src/vga.c @@ -0,0 +1,20 @@ +#include + +#include "vga.h" + +#define VGA_ADDRESS 0xb8000 + +static uint8_t current_color = VGA_WHITE; +uint16_t *vga_buffer = (uint16_t*)VGA_ADDRESS; + +void vga_putc(char c) { + *(vga_buffer++) = (uint16_t)c | (uint16_t)(current_color) << 8; +} + +void vga_puts(char *c) { + char cur = *(c++); + while(cur != '\0') { + vga_putc(cur); + cur = *(c++); + } +} diff --git a/kernel/src/vga.h b/kernel/src/vga.h new file mode 100644 index 0000000..213de43 --- /dev/null +++ b/kernel/src/vga.h @@ -0,0 +1,19 @@ +#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);