75 lines
1.8 KiB
C
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++;
|
|
}
|
|
}
|
|
|
|
|