From 4aa74dbe2a35a45668b33d688f17b680c2232572 Mon Sep 17 00:00:00 2001 From: EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> Date: Sun, 5 May 2024 01:08:00 -0400 Subject: improved makefile somewhat --- .gitignore | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to '.gitignore') diff --git a/.gitignore b/.gitignore index cc56a26..be76e0b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # directories that have to exist but shouldn't be added to git -isodir/ sysroot/ build/ @@ -9,12 +8,15 @@ build/ *.o *.d *.a +*.sys +*.efi # i have no idea what this is for bx_enh_dbg.ini -# temporarily ignored cause i have no idea how to set up cmake with this and dont really have much else to use it for yet misc/ # not important make.png + +.vscode/ -- cgit v1.2.3-70-g09d2 From 982baec992d48343e455bf6e32ca96fbdcddda01 Mon Sep 17 00:00:00 2001 From: EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> Date: Sun, 5 May 2024 03:36:30 -0400 Subject: liminefied x86_64 boot --- .gitignore | 1 + kernel/arch/x86_64/crti.asm | 12 -------- kernel/arch/x86_64/crtn.asm | 9 ------ kernel/arch/x86_64/limine.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++ kernel/kernel.cpp | 12 ++++---- 5 files changed, 75 insertions(+), 27 deletions(-) delete mode 100644 kernel/arch/x86_64/crti.asm delete mode 100644 kernel/arch/x86_64/crtn.asm create mode 100644 kernel/arch/x86_64/limine.cpp (limited to '.gitignore') diff --git a/.gitignore b/.gitignore index be76e0b..ce75dcb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # directories that have to exist but shouldn't be added to git sysroot/ build/ +isodir/ # compiled files files *.bin diff --git a/kernel/arch/x86_64/crti.asm b/kernel/arch/x86_64/crti.asm deleted file mode 100644 index 73ac499..0000000 --- a/kernel/arch/x86_64/crti.asm +++ /dev/null @@ -1,12 +0,0 @@ -; x86 crti.asm -section .init -global _init:function -_init: - push rbp - mov rbp, rsp - -section .fini -global _fini:function -_fini: - push rbp - mov rbp, rsp \ No newline at end of file diff --git a/kernel/arch/x86_64/crtn.asm b/kernel/arch/x86_64/crtn.asm deleted file mode 100644 index 322b3a2..0000000 --- a/kernel/arch/x86_64/crtn.asm +++ /dev/null @@ -1,9 +0,0 @@ -; x86 crtn.asm - -section .init - pop rbp - ret - -section .fini - pop rbp - ret \ No newline at end of file diff --git a/kernel/arch/x86_64/limine.cpp b/kernel/arch/x86_64/limine.cpp new file mode 100644 index 0000000..84f8642 --- /dev/null +++ b/kernel/arch/x86_64/limine.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include "limine.h" + +namespace { +__attribute__((used, section(".requests"))) +volatile LIMINE_BASE_REVISION(2); +} + +namespace { +__attribute__((used, section(".requests"))) +volatile limine_framebuffer_request framebuffer_request = { + .id = LIMINE_FRAMEBUFFER_REQUEST, + .revision = 0, + .response = nullptr +}; +} + +namespace { +__attribute__((used, section(".requests_start_marker"))) +volatile LIMINE_REQUESTS_START_MARKER; + +__attribute__((used, section(".requests_end_marker"))) +volatile LIMINE_REQUESTS_END_MARKER; +} + +namespace { +void hcf() { + asm("cli"); + for (;;) { + asm("hlt"); + } +} +} + +extern void (*__init_array[])(); +extern void (*__init_array_end[])(); + + +extern "C" void _start() { + if (!LIMINE_BASE_REVISION_SUPPORTED) { + hcf(); + } + + // initialize global constructors + for (size_t i = 0; &__init_array[i] != __init_array_end; i++) { + __init_array[i](); + } + + // Ensure we got a framebuffer. + if (framebuffer_request.response == nullptr + || framebuffer_request.response->framebuffer_count < 1) { + hcf(); + } + + // Fetch the first framebuffer. + limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0]; + + // Note: we assume the framebuffer model is RGB with 32-bit pixels. + for (std::size_t i = 0; i < 100; i++) { + volatile uint32_t *fb_ptr = static_cast(framebuffer->address); + fb_ptr[i * (framebuffer->pitch / 4) + i] = 0xffffff; + } + + // We're done, just hang... + hcf(); +} \ No newline at end of file diff --git a/kernel/kernel.cpp b/kernel/kernel.cpp index a877be2..f8f36b5 100644 --- a/kernel/kernel.cpp +++ b/kernel/kernel.cpp @@ -3,9 +3,9 @@ #include #include -#include -#include -#include +//#include +//#include +//#include // linker symbols unsigned int _kernel_begin; @@ -19,7 +19,7 @@ extern "C" void kernel_main(void) { //initialize_ps2_controller(); //keyboard_init(); - printf("Hello world!\n"); - printf("a%db\n", 1); - printf("_begin: %x, _end: %x", &_kernel_begin, &_kernel_end); + //printf("Hello world!\n"); + //printf("a%db\n", 1); + //printf("_begin: %x, _end: %x", &_kernel_begin, &_kernel_end); } -- cgit v1.2.3-70-g09d2 From abaab98bd757cd0818cfcddc983eee25ab7672ed Mon Sep 17 00:00:00 2001 From: EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> Date: Tue, 7 May 2024 11:07:03 -0400 Subject: Made framebuffer class, serial write functions, and finally got makefile to build without having to make clean --- .gitignore | 1 + kernel/arch/x86_64/limine.cpp | 8 ++++++++ kernel/arch/x86_64/serial.cpp | 23 +++++++++++++++++++++++ kernel/framebuffer.cpp | 22 ++++++++++++++++++++++ kernel/include/arch/x86_64/serial.h | 19 +++++++++++++++++++ kernel/include/framebuffer.h | 18 ++++++++++++++++++ kernel/makefile | 19 +++++++++++-------- libc/makefile | 14 +++++++------- libc/putchar.c | 2 ++ makefile | 4 ++-- run-qemu.bat | 2 +- 11 files changed, 114 insertions(+), 18 deletions(-) create mode 100644 kernel/arch/x86_64/serial.cpp create mode 100644 kernel/framebuffer.cpp create mode 100644 kernel/include/arch/x86_64/serial.h create mode 100644 kernel/include/framebuffer.h (limited to '.gitignore') diff --git a/.gitignore b/.gitignore index ce75dcb..2d6918b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,6 @@ misc/ # not important make.png +.clangd .vscode/ diff --git a/kernel/arch/x86_64/limine.cpp b/kernel/arch/x86_64/limine.cpp index 8c67c52..9ea2bbc 100644 --- a/kernel/arch/x86_64/limine.cpp +++ b/kernel/arch/x86_64/limine.cpp @@ -1,6 +1,9 @@ #include #include +#include +#include #include "limine.h" +#include namespace { __attribute__((used, section(".requests"))) @@ -63,7 +66,12 @@ extern "C" void _start() { fb_ptr[i * (framebuffer->pitch / 4) + i] = 0xffffff; } + Framebuffer fb((uint32_t*)framebuffer->address, framebuffer->width, framebuffer->height); + fb.drawpixel(727, 727, 0x9528fd); + printf("video modes: %lx", framebuffer->mode_count); + + kernel_main(); // We're done, just hang... hcf(); diff --git a/kernel/arch/x86_64/serial.cpp b/kernel/arch/x86_64/serial.cpp new file mode 100644 index 0000000..e90bcde --- /dev/null +++ b/kernel/arch/x86_64/serial.cpp @@ -0,0 +1,23 @@ +#include +#include + +#define PORT 0x3f8 + +int is_transmit_empty() { + return inb(PORT + 5) & 0x20; +} + +extern "C" void serial_putchar(char c) { + while (is_transmit_empty() == 0); + outb(PORT, c); +} + +void serial_write(const char* data, size_t size) { + for (size_t i = 0; i < size; i++) { + serial_putchar(data[i]); + } +} + +void serial_writestring(const char* data) { + serial_write(data, strlen(data)); +} \ No newline at end of file diff --git a/kernel/framebuffer.cpp b/kernel/framebuffer.cpp new file mode 100644 index 0000000..a07d61a --- /dev/null +++ b/kernel/framebuffer.cpp @@ -0,0 +1,22 @@ +#include +#include +#include + +Framebuffer::Framebuffer(uint32_t* addr, const uint64_t width, const uint64_t height) + : addr {addr}, width {width}, height {height} { + clear(); +} + +void Framebuffer::clear() { + for (size_t y = 0; y < height; y++) { + for (size_t x = 0; x < width; x++) { + const size_t i = y * width + x; + addr[i] = 0x000000; + } + } +} + +void Framebuffer::drawpixel(const uint64_t x, const uint64_t y, const uint32_t color) { + const size_t pos = y * width + x; + addr[pos] = color; +} \ No newline at end of file diff --git a/kernel/include/arch/x86_64/serial.h b/kernel/include/arch/x86_64/serial.h new file mode 100644 index 0000000..2ee63c5 --- /dev/null +++ b/kernel/include/arch/x86_64/serial.h @@ -0,0 +1,19 @@ +#ifndef SERIAL_H +#define SERIAL_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +void serial_putchar(char c); +void serial_write(const char* data, size_t size); +void serial_writestring(const char* data); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/kernel/include/framebuffer.h b/kernel/include/framebuffer.h new file mode 100644 index 0000000..6080810 --- /dev/null +++ b/kernel/include/framebuffer.h @@ -0,0 +1,18 @@ +#ifndef FRAMEBUFFER_H +#define FRAMEBUFFER_H + +#include + +class Framebuffer { + private: + uint32_t* addr; + const uint64_t width; + const uint64_t height; + + public: + Framebuffer(uint32_t* addr, const uint64_t width, const uint64_t height); + void clear(); + void drawpixel(const uint64_t x, const uint64_t y, const uint32_t color); +}; + +#endif \ No newline at end of file diff --git a/kernel/makefile b/kernel/makefile index 8c2832d..33ab941 100644 --- a/kernel/makefile +++ b/kernel/makefile @@ -1,8 +1,11 @@ # Kernel makefile -CFLAGS := -ffreestanding -Wall -Wextra -g -std=gnu99 -O2 -Iinclude --sysroot=$(SYSROOT) -CXXFLAGS := -ffreestanding -Wall -Wextra -fno-exceptions -fno-rtti -g -O2 -Iinclude --sysroot=$(SYSROOT) -LDFLAGS := -T arch/$(ARCH)/linker.ld -ffreestanding -g -O2 -Iinclude --sysroot=$(SYSROOT) +CFLAGS := -ffreestanding -Wall -Wextra -g -std=gnu99 -O2 -Iinclude --sysroot=$(SYSROOT) \ + -isystem="/usr/include" +CXXFLAGS := -ffreestanding -Wall -Wextra -fno-exceptions -fno-rtti -g -O2 -Iinclude --sysroot=$(SYSROOT) \ + -isystem="/usr/include" +LDFLAGS := -T arch/$(ARCH)/linker.ld -ffreestanding -g -O2 -Iinclude --sysroot=$(SYSROOT) \ + -isystem="/usr/include" ASMFLAGS := ifeq ($(ARCH),x86_64) @@ -21,7 +24,7 @@ LIBS = -nostdlib -lc -lgcc #Find all the source files CPP_SRCS := $(shell find . -type f -name '*.cpp' -not -path './arch/*') \ $(shell find $(PWD)/kernel/arch/$(ARCH) -type f -name '*.cpp') -#HEADERS := $(shell find $(PWD) -type f -name '*.h') +HEADERS := $(shell find ./include -type f -name '*.h') #ASMFILES := $(shell find $(PWD) -type f -name '*.asm' -prune $(PWD)/arch) \ $(shell find $(PWD)/kernel/arch/$(ARCH) -type f -name '*.asm') @@ -50,11 +53,11 @@ kernel.bin: ${OBJS} $(CXX) ${LDFLAGS} -o $@ $(LINKLST) %.o: %.cpp - $(info [INFO] Compiling $<) +# $(info [INFO] Compiling $<) $(CXX) ${CXXFLAGS} -MMD -MP -c $< -o $@ %.o: %.c - $(info [INFO] Compiling $<) +# $(info [INFO] Compiling $<) $(CC) $(CFLAGS) -MMD -MP -c $< -o $@ %.o: %.asm @@ -67,9 +70,9 @@ kernel.bin: ${OBJS} # crtn.o: # $(NASM) arch/$(ARCH)/crtn.asm $(ASMFLAGS) -o $@ -install-headers: +install-headers: $(HEADERS) cp -r --preserve=timestamps include/. $(SYSROOT)/usr/include clean: $(info [INFO] Cleaning) - $(RM) ${OBJS} $(DEPFILES) \ No newline at end of file + $(RM) ${OBJS} $(DEPFILES) kernel.bin \ No newline at end of file diff --git a/libc/makefile b/libc/makefile index 560efb7..aec21ef 100644 --- a/libc/makefile +++ b/libc/makefile @@ -6,21 +6,21 @@ endif ifndef CFLAGS CFLAGS = -ffreestanding -Wall -Wextra -g -std=gnu11 -O2 -Iinclude - CFLAGS += --sysroot="$(SYSROOT)" - CFLAGS += -isystem="/usr/include" + CFLAGS += --sysroot=$(SYSROOT) + CFLAGS += -isystem $(SYSROOT)/usr/include endif ifndef CXXFLAGS CXXFLAGS = -ffreestanding -Wall -Wextra -fno-exceptions -fno-rtti -D__is_kernel -g -O2 -Iinclude CXXFLAGS += -Iinclude - CXXFLAGS += --sysroot="$(SYSROOT)" - CXXFLAGS += -isystem="/usr/include" + CXXFLAGS += --sysroot=$(SYSROOT) + CXXFLAGS += -isystem $(SYSROOT)/usr/include endif ifndef LDFLAGS LDFLAGS = -T arch/$(ARCH)/linker.ld -ffreestanding -g -O2 -Iinclude - LDFLAGS += --sysroot="$(SYSROOT)" - LDFLAGS += -isystem="/usr/include" + LDFLAGS += --sysroot=$(SYSROOT) + LDFLAGS += -isystem $(SYSROOT)/usr/include endif ifndef SYSROOT @@ -76,4 +76,4 @@ install-lib: libc.a clean: $(info [INFO] Cleaning) - $(RM) ${OBJECTS} $(DEPFILES) \ No newline at end of file + $(RM) ${OBJECTS} $(DEPFILES) libc.a \ No newline at end of file diff --git a/libc/putchar.c b/libc/putchar.c index 48147bf..f0f5783 100644 --- a/libc/putchar.c +++ b/libc/putchar.c @@ -1,9 +1,11 @@ #include //#include +#include int putchar(int ic) { char c = (char) ic; + serial_putchar(c); //terminal_write(&c, sizeof(c)); return ic; } \ No newline at end of file diff --git a/makefile b/makefile index 2581e21..d8535bc 100644 --- a/makefile +++ b/makefile @@ -22,11 +22,11 @@ build-all: kernel/kernel.bin libc/libc.a libc/libc.a: install-headers $(info [INFO] Building libc) - $(MAKE) -C ./libc/ ARCH=$(ARCH) PREFIX=$(PWD) + $(MAKE) -C ./libc/ all kernel/kernel.bin: libc/libc.a install-headers $(info [INFO] Building kernel) - $(MAKE) -C ./kernel/ ARCH=$(ARCH) PREFIX=$(PWD) + $(MAKE) -C ./kernel/ all limine: build-all cp kernel/kernel.bin isodir/boot diff --git a/run-qemu.bat b/run-qemu.bat index ddf7afa..b9c277b 100644 --- a/run-qemu.bat +++ b/run-qemu.bat @@ -1,2 +1,2 @@ @echo off -qemu-system-x86_64 -m 128 -drive format=raw,media=cdrom,file=emuos.iso \ No newline at end of file +qemu-system-x86_64 -m 128 -drive format=raw,media=cdrom,file=emuos.iso -serial stdio \ No newline at end of file -- cgit v1.2.3-70-g09d2