summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAda Christine <adachristine18@gmail.com>2021-03-30 19:03:59 +0000
committerAda Christine <adachristine18@gmail.com>2021-03-30 19:03:59 +0000
commitc838637132f93fb8b9d436633b3a82d55912946c (patch)
tree48456a2a0917fd3238d162cc0d56b921598a47b2
parent42c6af83ec7e26983f1ecdefc81ea481a2354cb4 (diff)
better page table entry masks
-rw-r--r--api/kernel/memory/paging.h9
-rw-r--r--loader/loader_efi.c10
2 files changed, 11 insertions, 8 deletions
diff --git a/api/kernel/memory/paging.h b/api/kernel/memory/paging.h
index 25e5eea..3d13eda 100644
--- a/api/kernel/memory/paging.h
+++ b/api/kernel/memory/paging.h
@@ -1,14 +1,17 @@
#pragma once
-#define PAGE_PR 1
-#define PAGE_WR 2
+#define PAGE_PR (1ULL << 0)
+#define PAGE_WR (1ULL << 1)
+#define PAGE_NX (1ULL << 63)
#define PAGE_MAP_LEVELS 4
#define PAGE_MAP_BITS 9
#define PAGE_OFFSET_BITS 12
+#define PAGE_ADDRESS_MASK 0x0007fffffffff000
+#define PAGE_ATTRIBUTE_MASK 0xf800000000000fff
+
#define PAGE_TABLE_INDEX_MASK ((1 << PAGE_MAP_BITS) - 1)
-#define PAGE_TABLE_ADDRESS_MASK ~((1 << PAGE_OFFSET_BITS) - 1)
#define page_table_index_bits(l) (PAGE_OFFSET_BITS + PAGE_MAP_BITS * (l - 1))
#define page_table_index(v, l) ((v >> page_table_index_bits(l)) & PAGE_TABLE_INDEX_MASK)
diff --git a/loader/loader_efi.c b/loader/loader_efi.c
index 63bbaba..6823563 100644
--- a/loader/loader_efi.c
+++ b/loader/loader_efi.c
@@ -34,9 +34,9 @@ static void *get_acpi_rsdp(void);
enum page_type
{
INVALID_PAGE_TYPE = 0x0,
- CODE_PAGE_TYPE = 0x1,
- RODATA_PAGE_TYPE = 0x1,
- DATA_PAGE_TYPE = 0x3
+ CODE_PAGE_TYPE = PAGE_PR,
+ RODATA_PAGE_TYPE = PAGE_PR|PAGE_NX,
+ DATA_PAGE_TYPE = PAGE_PR|PAGE_WR|PAGE_NX
};
static uint64_t *new_page_table(void)
@@ -64,7 +64,7 @@ static uint64_t *get_page_map(void)
{
uint64_t map;
__asm__("mov %%cr3, %0" : "=r"(map));
- return (uint64_t *)(map & PAGE_TABLE_ADDRESS_MASK);
+ return (uint64_t *)(map & PAGE_ADDRESS_MASK);
}
void set_page_map(uint64_t *map)
@@ -92,7 +92,7 @@ static uint64_t *get_page_table(uint64_t *map, uint64_t virt, int level)
else
{
uint64_t next_map_entry = map[page_table_index(virt, i)];
- next_map_entry &= PAGE_TABLE_ADDRESS_MASK;
+ next_map_entry &= PAGE_ADDRESS_MASK;
map = (uint64_t *)next_map_entry;
}
}