This commit is contained in:
secXsQuared 2016-08-29 13:06:57 -04:00
parent ba7672dd00
commit f412efdbfd
4 changed files with 17 additions and 31 deletions

View File

@ -3,13 +3,11 @@
* See COPYING under root for details
*/
#include "k_bit_ops.h"
#include "hal_arch.h"
#include "hal_intr.h"
#include "hal_print.h"
#include "hal_mem.h"
static uint8_t _idts[HAL_CORE_COUNT][IDT_ENTRY_NUM*IDT_ENTRY_SIZE];
hal_idt_ptr_t _idt_ptrs[HAL_CORE_COUNT];
static k_intr_handler_t _intr_handler_table[HAL_CORE_COUNT][IDT_ENTRY_NUM];

View File

@ -7,13 +7,6 @@
#include "s_pmm.h"
#include "k_atomic.h"
#define PMM_STATUS_SUCCESS 0
#define PMM_STATUS_CANNOT_ALLOC_NODE 1
#define PMM_STATUS_PAGE_NOT_FOUND 2
#define PMM_STATUS_INVALID_ARGUMENTS 3
#define PMM_STATUS_INIT_UNALIGNED 4
#define PMM_STATUS_NOT_ENOUGH_PAGE 5
//#define PMM_PAGE_ATTR_FREE_BIT 0
//#define PMM_PAGE_ATTR_PAGED_BIT 1
//
@ -22,11 +15,11 @@
// uint32_t attr;
//} k_physical_page_attr_t;
int32_t KAPI k_pmm_init(k_pmm_info_t *info);
k_status_t KAPI ke_pmm_init(k_pmm_info_t *info);
int32_t KAPI k_alloc_page(k_physical_addr_t *out);
k_status_t KAPI k_alloc_page(k_physical_addr_t *out);
int32_t KAPI k_free_page(k_physical_addr_t base);
k_status_t KAPI k_free_page(k_physical_addr_t base);
// TODO: implement these somehow, i might just reserve the first 16MB for these
int32_t KAPI k_alloc_contiguous_pages(uint64_t num_of_page,

View File

@ -1,3 +1,5 @@
#include <k_spin_lock.h>
#include <k_status.h>
#include "k_alloc.h"
#include "k_bug_check.h"
#include "k_pmm.h"
@ -10,15 +12,10 @@ typedef struct
//k_physical_page_attr_t attr;
} k_physical_page_descriptor_t;
typedef struct
{
k_avl_tree_t active_tree;
k_linked_list_t free_list;
k_spin_lock_t lock;
_Bool initialized;
} k_pmm_descriptor_t;
static k_pmm_descriptor_t _pmm_desc;
static k_avl_tree_t active_tree;
static k_linked_list_t free_list;
static k_spin_lock_t lock;
static _Bool initialized;
/*
* A comparison function between tree_node and your_node
@ -27,7 +24,7 @@ static k_pmm_descriptor_t _pmm_desc;
* = 0 if tree_node == your_node
* > 0 if tree_node > your_node
*/
static int32_t _avl_compare(k_avl_tree_node_t *tree_node, k_avl_tree_node_t *my_node)
static int32_t base_addr_compare(k_avl_tree_node_t *tree_node, k_avl_tree_node_t *my_node)
{
k_physical_addr_t tree_base = OBTAIN_STRUCT_ADDR(tree_node,
k_physical_page_descriptor_t,
@ -43,7 +40,7 @@ static int32_t _avl_compare(k_avl_tree_node_t *tree_node, k_avl_tree_node_t *my_
return 0;
}
int32_t KAPI k_pmm_init(k_pmm_info_t *info)
k_status_t KAPI ke_pmm_init(k_pmm_info_t *info)
{
if (info == NULL || desc == NULL || desc->initialized)
{
@ -51,7 +48,7 @@ int32_t KAPI k_pmm_init(k_pmm_info_t *info)
}
ke_linked_list_init(&desc->free_list);
ke_avl_tree_init(&desc->active_tree, _avl_compare);
ke_avl_tree_init(&desc->active_tree, base_addr_compare);
for (uint32_t i = 0; i < info->num_of_nodes; i++)
{
k_pmm_node_t *each_node = &info->nodes[i];
@ -88,7 +85,7 @@ int32_t KAPI k_pmm_init(k_pmm_info_t *info)
// potential callers of these, since timer/interrupts queue DPC, which might trigger
// page fault (kernel heap), therefore, it must set IRQL to DISABLED
int32_t KAPI k_alloc_page(k_pmm_descriptor_t *desc, k_physical_addr_t *out)
k_status_t KAPI ke_alloc_page(k_pmm_descriptor_t *desc, k_physical_addr_t *out)
{
if (desc == NULL || !desc->initialized)
return PMM_STATUS_INVALID_ARGUMENTS;
@ -105,8 +102,7 @@ int32_t KAPI k_alloc_page(k_pmm_descriptor_t *desc, k_physical_addr_t *out)
free_list_node);
ke_avl_tree_insert(&desc->active_tree, &page_info->avl_tree_node);
*out = page_info->base;
}
else
} else
{
result = PMM_STATUS_NOT_ENOUGH_PAGE;
}
@ -148,7 +144,7 @@ int32_t KAPI k_alloc_page(k_pmm_descriptor_t *desc, k_physical_addr_t *out)
// return result;
//}
int32_t KAPI k_free_page(k_pmm_descriptor_t* desc, k_physical_addr_t base)
k_status_t KAPI ke_free_page(k_pmm_descriptor_t *desc, k_physical_addr_t base)
{
if (desc == NULL || !desc->initialized)
return PMM_STATUS_INVALID_ARGUMENTS;
@ -166,8 +162,7 @@ int32_t KAPI k_free_page(k_pmm_descriptor_t* desc, k_physical_addr_t base)
{
page_info = OBTAIN_STRUCT_ADDR(node, k_physical_page_descriptor_t, avl_tree_node);
ke_linked_list_push_back(&desc->free_list, &page_info->free_list_node);
}
else
} else
{
result = PMM_STATUS_PAGE_NOT_FOUND;
}

View File

@ -40,7 +40,7 @@ int32_t KAPI k_vmm_init(k_vmm_descriptor_t *desc)
{
return VMM_STATUS_INVALID_ARGUMENTS;
}
ke_avl_tree_init(&desc->region_tree, _avl_compare);
ke_avl_tree_init(&desc->region_tree, base_addr_compare);
return VMM_STATUS_SUCCESS;
}