diff --git a/.gitignore b/.gitignore index 854240b5..3b152e1e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ pkgs sources astral.iso kernel-src/include/limine.h +kernel-src/include/printf.h +kernel-src/io/printf.c diff --git a/Makefile b/Makefile index bb4e871b..5729a9c5 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ kernel: ./jinx build astral clean-kernel: - find kernel-src -name *.o -delete + find builds/astral/ -name *.o -delete clean: make clean-kernel diff --git a/kernel-src/Makefile b/kernel-src/Makefile index cf85020b..e5bbe95a 100644 --- a/kernel-src/Makefile +++ b/kernel-src/Makefile @@ -5,7 +5,9 @@ TARGET=x86-64 INCDIR=$(shell pwd)/include ARCHDIR=$(shell pwd)/arch/$(TARGET)/ LDFLAGS=-ffreestanding -nostdlib -lgcc -Wl,-T,"$(ARCHDIR)/kernel.ld" -debug -CFLAGS=-ffreestanding -mcmodel=kernel -O2 -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -nostdlib -I "${INCDIR}" +# required for mpaland printf so it doesn't compile with floating point support, which results in build failures +PRINTFOPTS=-DPRINTF_DISABLE_SUPPORT_FLOAT +CFLAGS=-ffreestanding -mcmodel=kernel -O2 -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -nostdlib -Wall -I "${INCDIR}" $(PRINTFOPTS) ASFLAGS=-felf64 astral: $(OBJS) diff --git a/kernel-src/arch/x86-64/e9.c b/kernel-src/arch/x86-64/e9.c index a292a3a0..cf277e71 100644 --- a/kernel-src/arch/x86-64/e9.c +++ b/kernel-src/arch/x86-64/e9.c @@ -1,5 +1,3 @@ - - #include // TODO compile time options for disabling output to port e9h diff --git a/kernel-src/arch/x86-64/main.c b/kernel-src/arch/x86-64/main.c index 8f164df7..388d83bd 100644 --- a/kernel-src/arch/x86-64/main.c +++ b/kernel-src/arch/x86-64/main.c @@ -1,7 +1,7 @@ #include +#include void kernel_entry() { - arch_e9_puts("Hello, world!\n"); - asm("cli"); - asm("hlt"); + logging_sethook(arch_e9_putc); + __assert(!"kernel entry end"); } diff --git a/kernel-src/include/logging.h b/kernel-src/include/logging.h new file mode 100644 index 00000000..8dd069d8 --- /dev/null +++ b/kernel-src/include/logging.h @@ -0,0 +1,18 @@ +#ifndef _LOGGING_H +#define _LOGGING_H + +#include + +void _putchar(char c); +void logging_sethook(void (*fun)(char)); + +// TODO panic + +#define __assert(x) \ + if (!(x)){ \ + printf("%s:%s:%d: %s failed\n", __FILE__, __func__, __LINE__, #x); \ + for(;;); \ + }; + + +#endif diff --git a/kernel-src/io/logging.c b/kernel-src/io/logging.c new file mode 100644 index 00000000..3c868f94 --- /dev/null +++ b/kernel-src/io/logging.c @@ -0,0 +1,14 @@ +static void nohook(char c) { + +} + +static void (*hook)(char) = nohook; + +// hook used by mpaland printf +void _putchar(char c) { + hook(c); +} + +void logging_sethook(void (*fun)(char)) { + hook = fun; +} diff --git a/source-recipes/astral b/source-recipes/astral index 1abf6092..83f49fff 100644 --- a/source-recipes/astral +++ b/source-recipes/astral @@ -2,7 +2,14 @@ name=astral version=0 source_dir="kernel-src" allow_network="yes" +imagedeps="wget" regenerate() { curl https://raw.githubusercontent.com/limine-bootloader/limine/trunk/limine.h > include/limine.h + pushd /tmp/ + wget https://github.com/mpaland/printf/archive/refs/tags/v4.0.0.tar.gz + tar -xf v4.0.0.tar.gz + popd + cp /tmp/printf-4.0.0/printf.c io/printf.c + cp /tmp/printf-4.0.0/printf.h include/printf.h }