Added function to construct page stack from membory map

This commit is contained in:
2021-04-12 00:09:23 -05:00
parent 48e6f907a1
commit 41d21bd636
2 changed files with 33 additions and 1 deletions

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "memorymap.h"
#include "types/physaddr.h" #include "types/physaddr.h"
#include <stddef.h> #include <stddef.h>
@@ -64,3 +65,11 @@ int free_page(struct page_stack_t *stack, physaddr_t location);
* @return size_t * @return size_t
*/ */
size_t free_page_count(struct page_stack_t *stack); size_t free_page_count(struct page_stack_t *stack);
/**
* @brief Push all available pages in `map` onto the stack
*
* @param stack
* @param map
*/
int initialize_page_stack(struct page_stack_t *stack, struct memory_map_t *map, size_t page_size);

View File

@@ -1,4 +1,5 @@
#include "pageallocator.h" #include "pageallocator.h"
#include "types/memorytype.h"
#include "types/status.h" #include "types/status.h"
physaddr_t reserve_page(struct page_stack_t *stack) physaddr_t reserve_page(struct page_stack_t *stack)
@@ -27,4 +28,26 @@ int free_page(struct page_stack_t *stack, physaddr_t location)
size_t free_page_count(struct page_stack_t *stack) size_t free_page_count(struct page_stack_t *stack)
{ {
return stack->base_pointer - stack->stack_pointer; return stack->base_pointer - stack->stack_pointer;
} }
int initialize_page_stack(struct page_stack_t *stack, struct memory_map_t *map, size_t page_size)
{
stack->total_pages = 0;
for(int i = 0; i < map->size; i++)
{
if(map->array[i].type != M_AVAILABLE)
{
continue;
}
size_t location = (map->array[i].location + page_size - 1) & ~(page_size - 1);
while(location + page_size <= map->array[i].location + map->array[i].size)
{
if(free_page(stack, location) != S_OK)
{
return S_OUT_OF_MEMORY;
}
stack->total_pages++;
location += page_size;
}
}
}