genusOS/src/main.c

219 lines
4.3 KiB
C

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "../include/limine.h"
#include "acpi.h"
#include "common.h"
#include "print.h"
// credit owed to https://wiki.osdev.org/Limine_Bare_Bones for the limine setup code
__attribute__((used, section(".limine_requests")))
static volatile u64 limine_base_revision[] = LIMINE_BASE_REVISION(4);
__attribute__((used, section(".limine_requests")))
static volatile struct limine_framebuffer_request fb_req = {
.id = LIMINE_FRAMEBUFFER_REQUEST_ID,
.revision = 0
};
__attribute__((used, section(".limine_requests")))
static volatile struct limine_memmap_request mem_req = {
.id = LIMINE_MEMMAP_REQUEST_ID,
.revision = 0,
};
__attribute__((used, section(".limine_requests")))
static volatile struct limine_hhdm_request hhdm_req = {
.id = LIMINE_HHDM_REQUEST_ID,
.revision = 0
};
__attribute__((used, section(".limine_requests")))
static volatile struct limine_rsdp_request rsdp_req = {
.id = LIMINE_RSDP_REQUEST_ID,
.revision = 0
};
u64 hhdm_offset;
__attribute__((used, section(".limine_requests_start")))
static volatile u64 limine_requests_start_marker[] = LIMINE_REQUESTS_START_MARKER;
__attribute__((used, section(".limine_requests_end")))
static volatile u64 limine_requests_end_marker[] = LIMINE_REQUESTS_END_MARKER;
void* memcpy(void* restrict dst, const void* src, size_t n) {
u8* restrict pdst = (u8* restrict)dst;
const u8* restrict psrc = (const u8* restrict)src;
for(size_t i = 0; i < n; i++) {
pdst[i] = psrc[i];
}
return dst;
}
void* memset(void* s, int c, size_t n) {
u8* p = (u8*) s;
for(size_t i = 0; i < n; i++) {
p[i] = (u8)c;
}
return s;
}
void* memmove(void* dst, const void* src, size_t n) {
u8* restrict pdst = (u8* restrict)dst;
const u8* restrict psrc = (const u8* restrict)src;
if(src > dst) {
for(size_t i = 0; i < n; i++) {
pdst[i] = psrc[i];
}
} else if(src < dst) {
for(size_t i = n; i > 0; i--) {
pdst[i-1] = psrc[i-1];
}
}
return dst;
}
int memcmp(const void* s1, const void* s2, size_t n) {
const u8* p1 = (const u8* )s1;
const u8* p2 = (const u8* )s2;
for(size_t i = 0; i < n; i++) {
if(p1[i] != p2[i]) {
return p1[i] < p2[i] ? -1 : 1;
}
}
return 0;
}
static void hang() {
for(;;) {
asm ("hlt");
}
}
struct limine_framebuffer* fb;
void draw(u8 vect) {
for(size_t y = 0; y < fb->height; y++) {
for(size_t x = 0; x < fb->width; x++) {
volatile u32* fb_ptr = fb->address;
fb_ptr[y * fb->width + x] = (
(x + y) * 0x00010000 |
(x ^ y) * 0x00000100 |
(x - y) * 0x00000001
)*vect;
}
}
}
extern void init_idt(void);
extern u32 fg;
extern u32 bg;
void print_memmap_entry(struct limine_memmap_entry* entry) {
u32 savefg = fg;
u32 savebg = bg;
static const char* type_strs[] = {
"Usable",
"Reserved",
"ACPI Reclaimable",
"ACPI NVS",
"BAD!!!",
"Bootloader Reclaimable",
"Executable and Modules",
"Framebuffer",
"ACPI Tables",
};
static u32 type_colors[] = {
0x00AF00,
0xAF1F00,
0x7f7f00,
0x7f7f00,
0xFF0000,
0x007f7f,
0x408000,
0x0000FF,
0x00FF00
};
bg = type_colors[entry->type];
fg = ~bg;
u64 addr = entry->base;
u64 end = addr + entry->length;
print("[");
print(type_strs[entry->type]);
print("]");
print64(addr);
print(" - ");
print64(end);
print("\n");
fg = savefg;
bg = savebg;
}
void kmain() {
if(LIMINE_BASE_REVISION_SUPPORTED(limine_base_revision) == false) {
hang();
}
if(fb_req.response == NULL || fb_req.response->framebuffer_count < 1) {
hang();
}
fb = fb_req.response->framebuffers[0];
print_init(fb);
init_idt();
if(!mem_req.response) {
print("Failed to get memory map :(\n)");
hang();
}
if(!hhdm_req.response) {
print("Failed to get higher half direct mapping\n.");
hang();
}
hhdm_offset = hhdm_req.response->offset;
if(!rsdp_req.response) {
print ("Failed to find rsdp\n.");
hang();
}
rsdp = (struct acpi_rsdp_header*)(rsdp_req.response->address);
for(size_t i = 0; i < mem_req.response->entry_count; i++) {
print_memmap_entry(mem_req.response->entries[i]);
}
print("Found RSDP @ 0x");
print64((u64)rsdp);
put('\n');
print("With signature: ");
printn((char*)rsdp->signature, sizeof(rsdp->signature));
hang();
}