Files
my-kern/kernel/mem/mem.c
Rick Rongen 20ab9e1d6e feat: gdt, attributes move, reorder
Added late gdt setup with initial tss
Moved attributes to include root
Reordered some imports
2021-03-21 17:34:38 +01:00

105 lines
2.9 KiB
C

//
// Created by rick on 22-04-20.
//
#include <attributes.h>
#include <stdio.h>
#include <sys/types.h>
#include <myke/libk/libk.h>
#include <myke/mem/mem.h>
#include <myke/mem/pmm.h>
#define MEMMAP_ENTRIES 16
#define MMAP_TYPE_UNDEFINED 0
#define MMAP_TYPE_AVAILABLE 1
#define MMAP_TYPE_RESERVED 2
#define MMAP_TYPE_ACPI_RECLAIMABLE 3
#define MMAP_TYPE_NVS 4
#define MMAP_TYPE_BADRAM 5
#define MMAP_TYPE_KERNEL 6
#define MMAP_TYPE_PAGING 7
typedef struct {
uint32_t address;
uint32_t length;
uint32_t type;
} att_packed mmap_entry;
int last_memmap_entry = 0;
mmap_entry memmap[MEMMAP_ENTRIES] = {
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
};
void use_mmap_entry(struct multiboot_mmap_entry *entry) {
mmap_entry *mm_entry = &memmap[last_memmap_entry++];
mm_entry->address = (void *) entry->addr;
mm_entry->length = entry->len;
mm_entry->type = entry->type;
// check if the entry overlaps with the kernel address space
if (kernel_start >= mm_entry->address && kernel_start <= mm_entry->address + mm_entry->length) {
uint32_t page_after_kernel = kernel_end + PAGE_SIZE & ~(PAGE_SIZE - 1);
uint32_t kernel_size_full_pages = page_after_kernel - mm_entry->address;
// todo make this something proper
struct multiboot_mmap_entry extra_entry;
extra_entry.size = entry->size;
extra_entry.type = entry->type;
extra_entry.addr = page_after_kernel;
extra_entry.len = entry->size - kernel_size_full_pages;
use_mmap_entry(&extra_entry);
mm_entry->length = kernel_size_full_pages;
mm_entry->type = MMAP_TYPE_KERNEL;
}
}
void mmap_init_multiboot(struct multiboot_mmap_entry *entries, uint32_t count) {
for (uint32_t i = 0; i < count; ++i) {
use_mmap_entry(&entries[i]);
}
// init page manager
for (int i = 0; i < last_memmap_entry; ++i) {
mmap_entry *entry = &memmap[i];
if (entry->type != MMAP_TYPE_AVAILABLE) {
continue;
}
if (entry->address < kernel_start) {
continue; // skip for now
}
pmm_init((void *) entry->address, entry->length);
entry->type = MMAP_TYPE_PAGING;
}
}
void print_mmap_info() {
printf("Kernel start: %8x\n"
"Kernel end: %8x\n", kernel_start, kernel_end);
for (int i = 0; i < 16; ++i) {
if (memmap[i].type == 0) {
break;
}
printf("Idx: %d\n"
"Address: %8x\n"
"Length: %8x\n"
"Type: %d\n\n", i, memmap[i].address, memmap[i].length, memmap[i].type);
}
}