2015-02-01 22:14:44 +00:00
|
|
|
#include "kdef.h"
|
2015-02-22 02:38:23 +00:00
|
|
|
#include "mm.h"
|
2015-02-04 07:55:38 +00:00
|
|
|
|
2015-02-08 08:18:22 +00:00
|
|
|
#define kernel_heap_size 4096
|
|
|
|
char* _cur_heap = NULL;
|
|
|
|
extern char kernel_heap[kernel_heap_size];
|
2015-02-06 08:21:11 +00:00
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 write_pt_entry(void *const base, uint64_t const p_addr, uint64_t const attr)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
2015-02-04 07:55:38 +00:00
|
|
|
if(base == NULL)
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
2015-02-04 07:55:38 +00:00
|
|
|
uint64_t entry = (p_addr & 0xFFFFFFFFFF000) | attr;
|
|
|
|
((uint8_t*)base)[0] = (uint8_t)(entry & 0xFF);
|
|
|
|
((uint8_t*)base)[1] = (uint8_t)((entry >> 8) & 0xFF);
|
|
|
|
((uint8_t*)base)[2] = (uint8_t)((entry >> 16) & 0xFF);
|
|
|
|
((uint8_t*)base)[3] = (uint8_t)((entry >> 24) & 0xFF);
|
|
|
|
((uint8_t*)base)[4] = (uint8_t)((entry >> 32) & 0xFF);
|
|
|
|
((uint8_t*)base)[5] = (uint8_t)((entry >> 40) & 0xFF);
|
|
|
|
((uint8_t*)base)[6] = (uint8_t)((entry >> 48) & 0xFF);
|
|
|
|
((uint8_t*)base)[7] = (uint8_t)((entry >> 56) & 0xFF);
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 write_pd_entry(void *const base, uint64_t const pt_addr, uint64_t const attr)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
2015-02-04 07:55:38 +00:00
|
|
|
if(base == NULL)
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
2015-02-04 07:55:38 +00:00
|
|
|
uint64_t entry = (pt_addr & 0xFFFFFFFFFF000) | attr;
|
|
|
|
((uint8_t*)base)[0] = (uint8_t)(entry & 0xFF);
|
|
|
|
((uint8_t*)base)[1] = (uint8_t)((entry >> 8) & 0xFF);
|
|
|
|
((uint8_t*)base)[2] = (uint8_t)((entry >> 16) & 0xFF);
|
|
|
|
((uint8_t*)base)[3] = (uint8_t)((entry >> 24) & 0xFF);
|
|
|
|
((uint8_t*)base)[4] = (uint8_t)((entry >> 32) & 0xFF);
|
|
|
|
((uint8_t*)base)[5] = (uint8_t)((entry >> 40) & 0xFF);
|
|
|
|
((uint8_t*)base)[6] = (uint8_t)((entry >> 48) & 0xFF);
|
|
|
|
((uint8_t*)base)[7] = (uint8_t)((entry >> 56) & 0xFF);
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 write_pdpt_entry(void *const base, uint64_t const pd_addr, uint64_t const attr)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
2015-02-04 07:55:38 +00:00
|
|
|
if(base == NULL)
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
2015-02-04 07:55:38 +00:00
|
|
|
uint64_t entry = (pd_addr & 0xFFFFFFFFFF000) | attr;
|
|
|
|
((uint8_t*)base)[0] = (uint8_t)(entry & 0xFF);
|
|
|
|
((uint8_t*)base)[1] = (uint8_t)((entry >> 8) & 0xFF);
|
|
|
|
((uint8_t*)base)[2] = (uint8_t)((entry >> 16) & 0xFF);
|
|
|
|
((uint8_t*)base)[3] = (uint8_t)((entry >> 24) & 0xFF);
|
|
|
|
((uint8_t*)base)[4] = (uint8_t)((entry >> 32) & 0xFF);
|
|
|
|
((uint8_t*)base)[5] = (uint8_t)((entry >> 40) & 0xFF);
|
|
|
|
((uint8_t*)base)[6] = (uint8_t)((entry >> 48) & 0xFF);
|
|
|
|
((uint8_t*)base)[7] = (uint8_t)((entry >> 56) & 0xFF);
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 write_pml4_entry(void *const base, uint64_t const pdpt_addr, uint64_t const attr)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
2015-02-04 07:55:38 +00:00
|
|
|
if(base == NULL)
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
2015-02-04 07:55:38 +00:00
|
|
|
uint64_t const entry = (pdpt_addr & 0xFFFFFFFFFF000) | attr;
|
|
|
|
((uint8_t*)base)[0] = (uint8_t)(entry & 0xFF);
|
|
|
|
((uint8_t*)base)[1] = (uint8_t)((entry >> 8) & 0xFF);
|
|
|
|
((uint8_t*)base)[2] = (uint8_t)((entry >> 16) & 0xFF);
|
|
|
|
((uint8_t*)base)[3] = (uint8_t)((entry >> 24) & 0xFF);
|
|
|
|
((uint8_t*)base)[4] = (uint8_t)((entry >> 32) & 0xFF);
|
|
|
|
((uint8_t*)base)[5] = (uint8_t)((entry >> 40) & 0xFF);
|
|
|
|
((uint8_t*)base)[6] = (uint8_t)((entry >> 48) & 0xFF);
|
|
|
|
((uint8_t*)base)[7] = (uint8_t)((entry >> 56) & 0xFF);
|
2015-02-01 22:14:44 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 write_segment_descriptor(void *const gdt, uint32_t const base, uint32_t const limit, uint64_t const attr)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
2015-02-04 07:55:38 +00:00
|
|
|
if (gdt == NULL)
|
|
|
|
return;
|
|
|
|
uint64_t const seg_desc = (((uint64_t)base & 0xFFFF) << 16) | ((((uint64_t)base >> 16) & 0xFF) << 32) | ((((uint64_t)base >> 24) & 0xFF) << 56) | ((uint64_t)limit & 0xFFFF) | ((((uint64_t)limit >> 16) & 0xF) << 48) | attr;
|
|
|
|
((uint8_t*)gdt)[0] = (uint8_t)(seg_desc & 0xFF);
|
|
|
|
((uint8_t*)gdt)[1] = (uint8_t)((seg_desc >> 8) & 0xFF);
|
|
|
|
((uint8_t*)gdt)[2] = (uint8_t)((seg_desc >> 16) & 0xFF);
|
|
|
|
((uint8_t*)gdt)[3] = (uint8_t)((seg_desc >> 24) & 0xFF);
|
|
|
|
((uint8_t*)gdt)[4] = (uint8_t)((seg_desc >> 32) & 0xFF);
|
|
|
|
((uint8_t*)gdt)[5] = (uint8_t)((seg_desc >> 40) & 0xFF);
|
|
|
|
((uint8_t*)gdt)[6] = (uint8_t)((seg_desc >> 48) & 0xFF);
|
|
|
|
((uint8_t*)gdt)[7] = (uint8_t)((seg_desc >> 56) & 0xFF);
|
|
|
|
return;
|
|
|
|
}
|
2015-02-01 22:14:44 +00:00
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
uint64_t NATIVE64 map_page(void *const base, uint64_t const p_addr, uint64_t const v_addr, uint64_t const attr, uint64_t const availableRam)
|
2015-02-04 07:55:38 +00:00
|
|
|
{
|
|
|
|
//wait a sec, we actually need maximum memory information here for effectively map crap
|
2015-02-06 08:21:11 +00:00
|
|
|
if(base == NULL || p_addr << 52 || v_addr << 52)
|
2015-02-22 02:38:23 +00:00
|
|
|
return 0;
|
2015-02-04 07:55:38 +00:00
|
|
|
//ASSUME: little endian
|
2015-02-06 08:21:11 +00:00
|
|
|
//All of the following should be 4K-aliened
|
|
|
|
|
2015-02-04 07:55:38 +00:00
|
|
|
uint64_t const pml4_index = (v_addr >> 39) & 0x1FF;
|
2015-02-06 08:21:11 +00:00
|
|
|
uint64_t const pdpt_index = (v_addr >> 30) & 0x1FF;
|
|
|
|
uint64_t const pd_index = (v_addr >> 21) & 0x1FF;
|
|
|
|
uint64_t const pt_index = (v_addr >> 12) & 0x1FF;
|
2015-02-07 12:10:50 +00:00
|
|
|
//
|
|
|
|
// void * const pml4_entry_addr = (void*)((uint64_t*) base + pml4_index);
|
|
|
|
// if(!(*(uint64_t*)pml4_entry_addr & PML4_PRESENT))
|
|
|
|
// {
|
|
|
|
// //PML4 does not exist
|
2015-02-22 02:38:23 +00:00
|
|
|
// write_pml4_entry(pml4_entry_addr, (uint64_t)((uint64_t*)pdpt_base + pml4_index * 512), PML4_PRESENT | PML4_WRITE);
|
2015-02-07 12:10:50 +00:00
|
|
|
// }
|
|
|
|
// uint64_t const pml4_entry = *(uint64_t*)pml4_entry_addr;
|
|
|
|
//
|
|
|
|
// void * const pdpt_entry_addr = (void*)((uint64_t*) PAGE_ENTRY_BASE(pml4_entry) + pdpt_index);
|
|
|
|
// if(!(*(uint64_t*) pdpt_entry_addr & PDPT_PRESENT))
|
|
|
|
// {
|
2015-02-22 02:38:23 +00:00
|
|
|
// write_pdpt_entry(pdpt_entry_addr, (uint64_t)((uint64_t*)pd_base + pml4_index * 512 * 512 + pdpt_index * 512), PDPT_PRESENT | PDPT_WRITE);
|
2015-02-07 12:10:50 +00:00
|
|
|
// }
|
|
|
|
// uint64_t const pdpt_entry = *(uint64_t*)pdpt_entry_addr;
|
|
|
|
//
|
|
|
|
// void * const pd_entry_addr = (void*)((uint64_t*) PAGE_ENTRY_BASE(pdpt_entry) + pd_index);
|
|
|
|
// if(!(*(uint64_t*) pd_entry_addr & PD_PRESENT))
|
|
|
|
// {
|
2015-02-22 02:38:23 +00:00
|
|
|
// write_pd_entry(pd_entry_addr, (uint64_t)((uint64_t*)pt_base + pml4_index * 512 * 512 * 512 + pdpt_index * 512 * 512 + pd_index*512), PD_PRESENT | PD_WRITE);
|
2015-02-07 12:10:50 +00:00
|
|
|
// }
|
|
|
|
// uint64_t const pd_entry = *(uint64_t*)pd_entry_addr;
|
|
|
|
//
|
|
|
|
// void * const pt_entry_addr = (void*)((uint64_t*) PAGE_ENTRY_BASE(pd_entry) + pt_index);
|
2015-02-22 02:38:23 +00:00
|
|
|
// write_pt_entry(pt_entry_addr, p_addr, attr);
|
2015-02-07 12:10:50 +00:00
|
|
|
return 0;
|
2015-02-01 22:14:44 +00:00
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 mem_cpy(void *src, void *dst, uint64_t size)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
|
|
|
if (src == NULL || dst == NULL)
|
|
|
|
return;
|
|
|
|
char* cSrc = (char*)src;
|
|
|
|
char* cDst = (char*)dst;
|
|
|
|
while (size--)
|
|
|
|
*(cDst++) = *(cSrc++);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 mem_set(void *src, int8_t const val, uint64_t size)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
|
|
|
if (src == NULL)
|
|
|
|
return;
|
|
|
|
while (size--)
|
|
|
|
*((int8_t*)src++) = val;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void NATIVE64 mem_move(void *src, void *dst, uint64_t size)
|
2015-02-01 22:14:44 +00:00
|
|
|
{
|
|
|
|
if (src == NULL || dst == NULL)
|
|
|
|
return;
|
|
|
|
if (src >= dst)
|
|
|
|
{
|
2015-02-22 02:38:23 +00:00
|
|
|
return mem_cpy(src, dst, size);
|
2015-02-01 22:14:44 +00:00
|
|
|
}
|
|
|
|
src += size;
|
|
|
|
dst += size;
|
|
|
|
while (size--)
|
|
|
|
*((char*)--dst) = *((char*)--src);
|
|
|
|
return;
|
2015-02-08 08:18:22 +00:00
|
|
|
}
|
|
|
|
|
2015-02-22 02:38:23 +00:00
|
|
|
void*NATIVE64 dum_heap_alloc(uint64_t const size)
|
2015-02-08 08:18:22 +00:00
|
|
|
{
|
|
|
|
if(_cur_heap == NULL)
|
|
|
|
_cur_heap = kernel_heap;
|
|
|
|
if(_cur_heap + size < kernel_heap + kernel_heap_size)
|
|
|
|
{
|
|
|
|
void * temp_heap = (void*)_cur_heap;
|
|
|
|
_cur_heap = _cur_heap + size;
|
|
|
|
return temp_heap;
|
|
|
|
}
|
|
|
|
return NULL;
|
2015-02-01 22:14:44 +00:00
|
|
|
}
|