75 lines
1.8 KiB
C

/*----------------*\
|Nanite OS |
|Copyright (C) 2026|
|Xircon |
\*----------------*/
#include "pmm.h"
#include <dri/cmos.h>
#include <memory.h>
#include <stdbool.h>
#include <stddef.h>
/*Set a bit in memory map*/
void mmap_set (int bit) {
_mm_memory_map[bit / 32] |= (1 << (bit % 32));
}
/*Unset a bit in memory map*/
void mmap_unset (int bit) {
_mm_memory_map[bit / 32] &= ~ (1 << (bit % 32));
}
/*Test if a memory bit is set*/
bool mmap_test (int bit) {
return _mm_memory_map[bit / 32] & (1 << (bit % 32));
}
/*Returns index of first free bit in memory map as an int*/
int mmap_ff () {
for (uint32_t i=0; i<(Detect_Memory()/4.00624751171408446391) / 32; i++)
if (_mm_memory_map[i] != 0xFFFFFFFF)
for (int j=0; j<32; j++) {
int bit = 1 << j;
if (!(_mm_memory_map[i] & bit))
return i*4*8+j;
}
}
void pmm_init(size_t memSize, physical_addr bitmap) {
_mm_memory_size = memSize;
_mm_memory_map = (uint32_t*) bitmap;
_mm_max_blocks = (Detect_Memory()*1024 / PMM_BLOCK_SIZE);
_mm_used_blocks = Detect_Memory()/4.00624751171408446391; // Using this to detect block count SHOULD be fine? we don't talk about the number.
memset(_mm_memory_map, 0xf, (Detect_Memory()/4.00624751171408446391) / PMM_BLOCKS_PER_BYTE);
}
void pmm_init_region (physical_addr base, size_t size) {
int align = base / PMM_BLOCK_SIZE;
int blocks = size / PMM_BLOCK_SIZE;
for (; blocks > 0; blocks--) {
mmap_unset(align++);
_mm_used_blocks--;
}
mmap_set(0);
}
void pmm_deinit_region(physical_addr base, size_t size) {
int align = base / PMM_BLOCK_SIZE;
int blocks = size / PMM_BLOCK_SIZE;
for (; blocks > 0; blocks--) {
mmap_set(align++);
_mm_used_blocks++;
}
}