Add i386 support

This commit is contained in:
Quinten Kock 2020-11-30 16:31:01 +01:00
parent 08a80c7731
commit 20e7a7486a
9 changed files with 151 additions and 2 deletions

View File

@ -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

View File

@ -1,4 +1,5 @@
TIMEOUT=5
E9_OUTPUT=yes
:KornOS
PROTOCOL=stivale2

View File

@ -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

34
kernel/linker.ld.i386 Normal file
View File

@ -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;
}

View File

@ -0,0 +1,28 @@
#include <stivale2.h>
#include <stdint.h>
#include <stddef.h>
#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);
}

View File

@ -0,0 +1,4 @@
void halt_catch_fire() {
asm volatile ("cli");
while(1) asm volatile ("hlt");
}

View File

@ -0,0 +1,53 @@
#include <stdint.h>
#include <stddef.h>
#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;
}

View File

@ -0,0 +1,24 @@
#include <stddef.h>
#include <stdint.h>
#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);