Added function to construct page stack from membory map
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user