/*----------------*\ |Nanite OS | |Copyright (C) 2026| |Xircon | \*----------------*/ #include "pmm.h" #include #include #include #include /*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++; } }