KernelVM: Make g_used_vm atomic and g_kernelvm_bitmap a LockedValue
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
132963070b
commit
df9a13cbfb
@ -1,10 +1,11 @@
|
|||||||
#include "memory/KernelVM.h"
|
#include "memory/KernelVM.h"
|
||||||
#include "arch/MMU.h"
|
#include "arch/MMU.h"
|
||||||
|
#include "thread/Spinlock.h"
|
||||||
#include <luna/Bitmap.h>
|
#include <luna/Bitmap.h>
|
||||||
|
|
||||||
static const u64 KERNEL_VM_RANGE_START = 0xfffffffff0000000;
|
static const u64 KERNEL_VM_RANGE_START = 0xfffffffff0000000;
|
||||||
|
|
||||||
static Bitmap g_kernelvm_bitmap;
|
static LockedValue<Bitmap> g_kernelvm_bitmap;
|
||||||
|
|
||||||
static u8 bitmap_memory[4096];
|
static u8 bitmap_memory[4096];
|
||||||
|
|
||||||
@ -14,22 +15,26 @@ static const u64 KERNEL_VM_RANGE_END = KERNEL_VM_RANGE_SIZE + KERNEL_VM_RANGE_ST
|
|||||||
|
|
||||||
static_assert(KERNEL_VM_RANGE_END == 0xfffffffff8000000);
|
static_assert(KERNEL_VM_RANGE_END == 0xfffffffff8000000);
|
||||||
|
|
||||||
static usize g_used_vm;
|
static Atomic<usize> g_used_vm;
|
||||||
|
|
||||||
namespace KernelVM
|
namespace KernelVM
|
||||||
{
|
{
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
g_kernelvm_bitmap.initialize(bitmap_memory, sizeof(bitmap_memory));
|
g_kernelvm_bitmap.init();
|
||||||
g_kernelvm_bitmap.clear(false);
|
|
||||||
|
auto kernelvm_bitmap = g_kernelvm_bitmap.lock();
|
||||||
|
kernelvm_bitmap->initialize(bitmap_memory, sizeof(bitmap_memory));
|
||||||
|
kernelvm_bitmap->clear(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<u64> alloc_one_page()
|
Result<u64> alloc_one_page()
|
||||||
{
|
{
|
||||||
for (u64 index = 0; index < g_kernelvm_bitmap.size(); index++)
|
auto kernelvm_bitmap = g_kernelvm_bitmap.lock();
|
||||||
|
for (u64 index = 0; index < kernelvm_bitmap->size(); index++)
|
||||||
{
|
{
|
||||||
if (g_kernelvm_bitmap.get(index)) continue;
|
if (kernelvm_bitmap->get(index)) continue;
|
||||||
g_kernelvm_bitmap.set(index, true);
|
kernelvm_bitmap->set(index, true);
|
||||||
g_used_vm += ARCH_PAGE_SIZE;
|
g_used_vm += ARCH_PAGE_SIZE;
|
||||||
return KERNEL_VM_RANGE_START + (index * ARCH_PAGE_SIZE);
|
return KERNEL_VM_RANGE_START + (index * ARCH_PAGE_SIZE);
|
||||||
}
|
}
|
||||||
@ -41,9 +46,10 @@ namespace KernelVM
|
|||||||
{
|
{
|
||||||
u64 first_free_index = 0;
|
u64 first_free_index = 0;
|
||||||
u64 free_contiguous_pages = 0;
|
u64 free_contiguous_pages = 0;
|
||||||
for (u64 index = 0; index < g_kernelvm_bitmap.size(); index++)
|
auto kernelvm_bitmap = g_kernelvm_bitmap.lock();
|
||||||
|
for (u64 index = 0; index < kernelvm_bitmap->size(); index++)
|
||||||
{
|
{
|
||||||
if (g_kernelvm_bitmap.get(index))
|
if (kernelvm_bitmap->get(index))
|
||||||
{
|
{
|
||||||
free_contiguous_pages = 0;
|
free_contiguous_pages = 0;
|
||||||
continue;
|
continue;
|
||||||
@ -70,7 +76,7 @@ namespace KernelVM
|
|||||||
u64 start_index;
|
u64 start_index;
|
||||||
if (find_several_pages_impl(count, start_index))
|
if (find_several_pages_impl(count, start_index))
|
||||||
{
|
{
|
||||||
g_kernelvm_bitmap.clear_region(start_index, count, true);
|
g_kernelvm_bitmap.lock()->clear_region(start_index, count, true);
|
||||||
g_used_vm += ARCH_PAGE_SIZE * count;
|
g_used_vm += ARCH_PAGE_SIZE * count;
|
||||||
return KERNEL_VM_RANGE_START + (start_index * ARCH_PAGE_SIZE);
|
return KERNEL_VM_RANGE_START + (start_index * ARCH_PAGE_SIZE);
|
||||||
}
|
}
|
||||||
@ -84,9 +90,11 @@ namespace KernelVM
|
|||||||
|
|
||||||
u64 index = (address - KERNEL_VM_RANGE_START) / ARCH_PAGE_SIZE;
|
u64 index = (address - KERNEL_VM_RANGE_START) / ARCH_PAGE_SIZE;
|
||||||
|
|
||||||
if (index >= g_kernelvm_bitmap.size()) return err(EFAULT);
|
auto kernelvm_bitmap = g_kernelvm_bitmap.lock();
|
||||||
|
|
||||||
g_kernelvm_bitmap.set(index, false);
|
if (index >= kernelvm_bitmap->size()) return err(EFAULT);
|
||||||
|
|
||||||
|
kernelvm_bitmap->set(index, false);
|
||||||
g_used_vm -= ARCH_PAGE_SIZE;
|
g_used_vm -= ARCH_PAGE_SIZE;
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
@ -99,7 +107,7 @@ namespace KernelVM
|
|||||||
|
|
||||||
u64 index = (address - KERNEL_VM_RANGE_START) / ARCH_PAGE_SIZE;
|
u64 index = (address - KERNEL_VM_RANGE_START) / ARCH_PAGE_SIZE;
|
||||||
|
|
||||||
g_kernelvm_bitmap.clear_region(index, count, false);
|
g_kernelvm_bitmap.lock()->clear_region(index, count, false);
|
||||||
g_used_vm -= ARCH_PAGE_SIZE * count;
|
g_used_vm -= ARCH_PAGE_SIZE * count;
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
Loading…
Reference in New Issue
Block a user