2019-06-26 05:47:18 +00:00
|
|
|
#include <kern/cdef.h>
|
2018-12-16 23:52:33 +00:00
|
|
|
#include <arch/mem.h>
|
|
|
|
#include <arch/mlayout.h>
|
2018-01-26 08:43:22 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Page Table Definitions
|
|
|
|
**/
|
2015-09-01 17:37:58 +00:00
|
|
|
|
2015-02-04 08:43:01 +00:00
|
|
|
#define PML4_PRESENT (1ull << 0)
|
|
|
|
#define PML4_WRITE (1ull << 1)
|
|
|
|
#define PML4_USER (1ull << 2)
|
|
|
|
#define PML4_WRITE_THROUGH (1ull << 3)
|
|
|
|
#define PML4_CACHE_DISABLED (1ull << 4)
|
|
|
|
#define PML4_ACCESSED (1ull << 5)
|
|
|
|
#define PML4_EXECUTION_DISABLED (1ull << 63)
|
2015-02-04 07:55:38 +00:00
|
|
|
|
2015-02-04 08:43:01 +00:00
|
|
|
#define PDPT_PRESENT (1ull << 0)
|
|
|
|
#define PDPT_WRITE (1ull << 1)
|
|
|
|
#define PDPT_USER (1ull << 2)
|
|
|
|
#define PDPT_WRITE_THROUGH (1ull << 3)
|
|
|
|
#define PDPT_CACHE_DISABLED (1ull << 4)
|
|
|
|
#define PDPT_ACCESSED (1ull << 5)
|
|
|
|
#define PDPT_EXECUTION_DISABLED (1ull << 63)
|
2015-02-04 07:55:38 +00:00
|
|
|
|
2015-02-04 08:43:01 +00:00
|
|
|
#define PD_PRESENT (1ull << 0)
|
|
|
|
#define PD_WRITE (1ull << 1)
|
|
|
|
#define PD_USER (1ull << 2)
|
|
|
|
#define PD_WRITE_THROUGH (1ull << 3)
|
|
|
|
#define PD_CACHE_DISABLED (1ull << 4)
|
|
|
|
#define PD_ACCESSED (1ull << 5)
|
|
|
|
#define PD_EXECUTION_DISABLED (1ull << 63)
|
2015-02-04 07:55:38 +00:00
|
|
|
|
2015-02-04 08:43:01 +00:00
|
|
|
#define PT_PRESENT (1ull << 0)
|
|
|
|
#define PT_WRITE (1ull << 1)
|
|
|
|
#define PT_USER (1ull << 2)
|
|
|
|
#define PT_WRITE_THROUGH (1ull << 3)
|
|
|
|
#define PT_CACHE_DISABLED (1ull << 4)
|
|
|
|
#define PT_ACCESSED (1ull << 5)
|
|
|
|
#define PT_DIRTY (1ull << 6)
|
|
|
|
#define PT_ATTRIBUTE_TABLE (1ull << 7)
|
|
|
|
#define PT_GLOBAL (1ull << 8)
|
|
|
|
#define PT_EXECUTION_DISABLED (1ull << 63)
|
2015-02-04 07:55:38 +00:00
|
|
|
|
2018-02-12 03:26:03 +00:00
|
|
|
#define PML4_ENTRY_NUM(vaddr) (((vaddr) >> 39) & 0x1FF)
|
|
|
|
#define PDPT_ENTRY_NUM(vaddr) (((vaddr) >> 30) & 0x1FF)
|
|
|
|
#define PD_ENTRY_NUM(vaddr) (((vaddr) >> 21) & 0x1FF)
|
|
|
|
#define PT_ENTRY_NUM(vaddr) (((vaddr) >> 12) & 0x1FF)
|
2015-02-06 08:21:11 +00:00
|
|
|
|
2018-12-16 23:52:33 +00:00
|
|
|
void
|
2018-12-19 00:33:23 +00:00
|
|
|
write_page_tbl(void *base, uintptr pdpt_addr, uint64 attr)
|
2018-02-14 07:31:50 +00:00
|
|
|
{
|
2018-12-16 23:52:33 +00:00
|
|
|
if (base == NULL)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2019-11-28 18:02:52 +00:00
|
|
|
uint64 entry = (pdpt_addr & 0xFFFFFFFFFF000ul) | attr;
|
|
|
|
((uint8 *) base)[0] = (uint8) (entry & 0xFFul);
|
|
|
|
((uint8 *) base)[1] = (uint8) ((entry >> 8u) & 0xFFu);
|
|
|
|
((uint8 *) base)[2] = (uint8) ((entry >> 16u) & 0xFFu);
|
|
|
|
((uint8 *) base)[3] = (uint8) ((entry >> 24u) & 0xFFu);
|
|
|
|
((uint8 *) base)[4] = (uint8) ((entry >> 32u) & 0xFFu);
|
|
|
|
((uint8 *) base)[5] = (uint8) ((entry >> 40u) & 0xFFu);
|
|
|
|
((uint8 *) base)[6] = (uint8) ((entry >> 48u) & 0xFFu);
|
|
|
|
((uint8 *) base)[7] = (uint8) ((entry >> 56u) & 0xFFu);
|
2018-02-14 07:31:50 +00:00
|
|
|
}
|
|
|
|
|