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