diff options
| author | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2024-05-31 21:08:22 -0400 |
|---|---|---|
| committer | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2024-05-31 21:08:22 -0400 |
| commit | 1bd17dce9a8297f86f3bb34b3f440490b601eca6 (patch) | |
| tree | 9741c7c99e9f5675dc08b26b005eb1f6047623f2 | |
| parent | 4956918086a85031bb47b28e868c0ff8e6cc8f95 (diff) | |
started working on pmm and fixed printf doing weird things to the
numbers
| -rw-r--r-- | .bochsrc | 8 | ||||
| -rw-r--r-- | kernel/arch/x86_64/limine.cpp | 45 | ||||
| -rw-r--r-- | kernel/include/limine.h (renamed from kernel/arch/x86_64/limine.h) | 0 | ||||
| -rw-r--r-- | kernel/include/mm/pmm.h | 27 | ||||
| -rw-r--r-- | kernel/kernel.cpp | 2 | ||||
| -rw-r--r-- | kernel/makefile | 11 | ||||
| -rw-r--r-- | kernel/mm/pmm.cpp | 55 | ||||
| -rw-r--r-- | libc/printf.c | 26 | ||||
| -rw-r--r-- | makefile | 5 |
9 files changed, 153 insertions, 26 deletions
@@ -3,13 +3,15 @@ boot: cdrom megs: 256 -display_library: sdl2 -#display_library: sdl2, options="gui_debug" +#display_library: sdl2 +display_library: sdl2, options="gui_debug" vga: extension=vbe magic_break: enabled=1 -clock: sync=none, time0=local +clock: sync=realtime, time0=local cpu: reset_on_triple_fault=0 + +com1: enabled=1, mode=file, dev=misc/bochs.txt
\ No newline at end of file diff --git a/kernel/arch/x86_64/limine.cpp b/kernel/arch/x86_64/limine.cpp index 6d7984e..b592592 100644 --- a/kernel/arch/x86_64/limine.cpp +++ b/kernel/arch/x86_64/limine.cpp @@ -2,10 +2,11 @@ #include <stddef.h>
#include <stdio.h>
#include <arch/x86_64/serial.h>
-#include "limine.h"
+#include <limine.h>
#include "gdt.h"
#include "idt.h"
#include <framebuffer.h>
+#include <mm/pmm.h>
namespace {
__attribute__((used, section(".requests")))
@@ -22,6 +23,24 @@ volatile limine_framebuffer_request framebuffer_request = { }
namespace {
+__attribute__((used, section(".requests")))
+volatile limine_memmap_request memmap_request = {
+ .id = LIMINE_MEMMAP_REQUEST,
+ .revision = 0,
+ .response = nullptr
+};
+}
+
+namespace {
+__attribute__((used, section(".requests")))
+volatile limine_hhdm_request hhdm_request = {
+ .id = LIMINE_HHDM_REQUEST,
+ .revision = 0,
+ .response = nullptr
+};
+}
+
+namespace {
__attribute__((used, section(".requests_start_marker")))
volatile LIMINE_REQUESTS_START_MARKER;
@@ -30,7 +49,7 @@ volatile LIMINE_REQUESTS_END_MARKER; }
namespace {
-void hcf() {
+[[noreturn]] void hcf() {
asm("cli");
for (;;) {
asm("hlt");
@@ -41,7 +60,7 @@ void hcf() { extern void (*__init_array[])();
extern void (*__init_array_end[])();
-extern "C" void kernel_main();
+void kernel_main();
extern "C" void _start() {
asm("cli");
@@ -75,8 +94,12 @@ extern "C" void _start() { hcf();
}
+ if (memmap_request.response == nullptr) {
+ hcf();
+ }
+
// Fetch the first framebuffer.
- limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0];
+ limine_framebuffer* framebuffer = framebuffer_request.response->framebuffers[0];
// Note: we assume the framebuffer model is RGB with 32-bit pixels.
// for (size_t i = 0; i < 100; i++) {
@@ -84,11 +107,10 @@ extern "C" void _start() { // fb_ptr[i * (framebuffer->pitch / 4) + i] = 0xffffff;
// }
- asm("xchgw %bx, %bx");
fb_init((uint32_t*)framebuffer->address, framebuffer->width, framebuffer->height);
draw_pixel(727, 727, 0x9528fd);
draw_pixel(0, 0, 0xff0000);
- draw_pixel(1919, 1079, 0x00ff00);
+ draw_pixel(framebuffer->width - 1, framebuffer->height - 1, 0x00ff00);
// for (size_t i = 0; i < framebuffer->mode_count; i++) {
// printf("Mode %d\n", i);
// printf("Pitch %d\nWidth %d\nHeight %d\nbpp %d\nmem_model %d\n",
@@ -100,6 +122,17 @@ extern "C" void _start() { printf("Pitch %d\nWidth %d\nHeight %d\nbpp %d\nmem_model %d\n",
framebuffer->pitch, framebuffer->width, framebuffer->height,
framebuffer->bpp, framebuffer->memory_model);
+
+ limine_memmap_response* memmap = memmap_request.response;
+ for (int i = 0; i < memmap->entry_count; i++) {
+ printf("base: %lx\nlength: %lx\ntype: %d\n\n",
+ memmap->entries[i]->base, memmap->entries[i]->length, memmap->entries[i]->type);
+ }
+
+ // broken printf mirroring 64 bit values for some reason
+ //uint64_t tester = 0xFFFE0000000000AE + 1;
+ //printf("aaaa: %lx\n", tester);
+ pmm_init(memmap_request.response, hhdm_request.response->offset);
kernel_main();
diff --git a/kernel/arch/x86_64/limine.h b/kernel/include/limine.h index b4afb43..b4afb43 100644 --- a/kernel/arch/x86_64/limine.h +++ b/kernel/include/limine.h diff --git a/kernel/include/mm/pmm.h b/kernel/include/mm/pmm.h new file mode 100644 index 0000000..bfe21c5 --- /dev/null +++ b/kernel/include/mm/pmm.h @@ -0,0 +1,27 @@ +#ifndef PMM_H +#define PMM_H + +#include <stdint.h> +#include <stddef.h> +#include <limine.h> + +enum mm_type { + MEM_USABLE, + MEM_RESERVED +}; + +struct MMEntry { + uint64_t base; + uint64_t length; + mm_type type; +}; + +struct PBitmap { + uint64_t* addr; + size_t size; + MMEntry entry; +}; + +void pmm_init(limine_memmap_response* memmap, uint64_t hhdm_offset); + +#endif
\ No newline at end of file diff --git a/kernel/kernel.cpp b/kernel/kernel.cpp index a0394ea..e72500e 100644 --- a/kernel/kernel.cpp +++ b/kernel/kernel.cpp @@ -12,7 +12,7 @@ unsigned int _kernel_begin; unsigned int _kernel_end;
-extern "C" void kernel_main(void) {
+void kernel_main(void) {
// Initialize terminal
//terminal_initialize();
diff --git a/kernel/makefile b/kernel/makefile index dfced86..030caaa 100644 --- a/kernel/makefile +++ b/kernel/makefile @@ -3,15 +3,16 @@ 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"
+ -isystem="/usr/include" -std=gnu++20
LDFLAGS := -T arch/$(ARCH)/linker.ld -ffreestanding -g -O2 -Iinclude --sysroot=$(SYSROOT) \
-isystem="/usr/include"
ASMFLAGS :=
ifeq ($(ARCH),x86_64)
-CFLAGS += -mno-red-zone -mcmodel=kernel -mno-sse -mno-sse2 -mno-mmx
-CXXFLAGS += -mno-red-zone -mcmodel=kernel -mno-sse -mno-sse2 -mno-mmx
-LDFLAGS += -mno-red-zone -mcmodel=kernel -mno-sse -mno-sse2 -mno-mmx
+CFLAGS += -mno-red-zone -mcmodel=kernel -mno-80387 -mno-sse -mno-sse2 -mno-mmx
+CXXFLAGS += -mno-red-zone -mcmodel=kernel -mno-80387 -mno-sse -mno-sse2 -mno-mmx
+LDFLAGS += -mno-red-zone -mcmodel=kernel -mno-80387 -mno-sse -mno-sse2 -mno-mmx \
+ -z max-page-size=0x1000
ASMFLAGS += -felf64
endif
@@ -75,4 +76,4 @@ install-headers: $(HEADERS) clean:
$(info [INFO] Cleaning)
- $(RM) ${OBJS} $(DEPFILES) kernel.bin
\ No newline at end of file + $(RM) ${OBJS} $(DEPFILES) kernel.bin
diff --git a/kernel/mm/pmm.cpp b/kernel/mm/pmm.cpp new file mode 100644 index 0000000..bd8f12c --- /dev/null +++ b/kernel/mm/pmm.cpp @@ -0,0 +1,55 @@ +#include <mm/pmm.h> +#include <stdio.h> + +PBitmap bitmap; + +// Finds the biggest chunk of memory +static MMEntry find_mem_chunk(limine_memmap_response* memmap) { + uint64_t highestmem = 0; + size_t highestindex = 0; + limine_memmap_entry* entries = memmap->entries[0]; + for (size_t i = 0; i < memmap->entry_count; i++) { + if (entries[i].type == LIMINE_MEMMAP_USABLE && entries[i].length > highestmem) { + highestmem = entries[i].length; + highestindex = i; + } + } + + return MMEntry{ + entries[highestindex].base, + entries[highestindex].length, + MEM_USABLE + }; +} + +void pmm_init(limine_memmap_response* memmap, uint64_t hhdm_offset) { + MMEntry mem_entry = find_mem_chunk(memmap); + + // Round any numbers needed to 4K boudaries + //mem_entry.base += 4096 - (mem_entry.base % 4096); + mem_entry.length -= mem_entry.length % 4096; + + // setup bitmap at the beginning of the chunk + bitmap.entry = mem_entry; + bitmap.addr = (uint64_t*)(bitmap.entry.base + hhdm_offset); + // divided by byte size since size is for iterating over the bitmap + bitmap.size = mem_entry.length / 4096 / sizeof(uint64_t); + + printf("addr: %lx\nsize: %lx\n", (uint64_t)bitmap.addr, bitmap.size); + printf("hhdm offset: %lx\n", hhdm_offset); + + // write test + for (size_t i = 0; i < 100; i++) { + bitmap.addr[i] = i; + //printf("value %d: %lx\n", i, bitmap.addr[i]); + } + + // read test + for (size_t i = 0; i < bitmap.size; i++) { + //printf("value %d: %lx\n"); + } +} + +uint64_t get_phys_page() { + +}
\ No newline at end of file diff --git a/libc/printf.c b/libc/printf.c index 72a4749..0bb5506 100644 --- a/libc/printf.c +++ b/libc/printf.c @@ -37,10 +37,14 @@ static const char* itoa(unsigned int num, char* str, unsigned int base) { }
// reverse the string
- for (int i = 0; i < cou; i++) {
- char temp = str[i];
- str[i] = str[cou - i - 1];
- str[cou - 1] = temp;
+ size_t start = 0;
+ size_t end = cou - 1;
+ while (start < end) {
+ char temp = str[start];
+ str[start] = str[end];
+ str[end] = temp;
+ ++start;
+ --end;
}
str[cou] = '\0';
@@ -49,7 +53,7 @@ static const char* itoa(unsigned int num, char* str, unsigned int base) { // have no idea if there's a better way to do this. for %lx
static const char* itoa_u64(unsigned long long num, char* str, int base) {
- int cou = 0; // nt
+ size_t cou = 0; // nt
if (num == 0) { // 0
str[cou] = '0';
@@ -71,10 +75,14 @@ static const char* itoa_u64(unsigned long long num, char* str, int base) { }
// reverse the string
- for (int i = 0; i < cou; i++) {
- char temp = str[i];
- str[i] = str[cou - i - 1];
- str[cou - 1] = temp;
+ size_t start = 0;
+ size_t end = cou - 1;
+ while (start < end) {
+ char temp = str[start];
+ str[start] = str[end];
+ str[end] = temp;
+ ++start;
+ --end;
}
str[cou] = '\0';
@@ -34,10 +34,11 @@ limine: build-all -no-emul-boot -boot-load-size 4 -boot-info-table \
--efi-boot boot/limine/limine-uefi-cd.bin \
-efi-boot-part --efi-boot-image --protective-msdos-label \
- isodir -o emuos.iso
+ isodir -o $(OS_NAME).iso
+ limine bios-install $(OS_NAME).iso
qemu: limine
- $(QEMU) -no-shutdown -no-reboot --serial stdio -s -m 512 -hda $(OS_NAME).iso
+ $(QEMU) -no-shutdown -no-reboot --serial stdio -s -m 1024 -hda $(OS_NAME).iso
install: install-headers install-libraries
|
