misc: changes from a long time ago

This commit is contained in:
2026-02-03 21:28:15 +00:00
parent c7d4463f7e
commit af0d97d6f5
10 changed files with 266 additions and 74 deletions

View File

@@ -1,20 +1,20 @@
#include <mango/types.h>
#include <mango/compiler.h>
#include <mango/memblock.h>
#include <mango/vm.h>
#include <mango/pmap.h>
#include <mango/printk.h>
#include <mango/status.h>
#include <mango/compiler.h>
#include <mango/pmap.h>
#include <mango/types.h>
#include <mango/vm.h>
/* some helpful datasize constants */
#define C_1GiB 0x40000000ULL
#define C_2GiB (2 * C_1GiB)
#define C_1GiB 0x40000000ULL
#define C_2GiB (2 * C_1GiB)
#define BAD_INDEX ((unsigned int)-1)
#define BAD_INDEX ((unsigned int)-1)
#define PTR_TO_ENTRY(x) (((x) & ~VM_PAGE_MASK) | PTE_PRESENT | PTE_RW)
#define ENTRY_TO_PTR(x) ((x) & ~VM_PAGE_MASK)
#define PFN(x) ((x) >> VM_PAGE_SHIFT)
#define PFN(x) ((x) >> VM_PAGE_SHIFT)
static int can_use_gbpages = 0;
static pmap_t kernel_pmap;
@@ -33,7 +33,7 @@ static size_t ps_size(enum page_size ps)
}
}
static pmap_t alloc_pmap()
static pmap_t alloc_pmap(void)
{
struct pml4t *p = kzalloc(sizeof *p, 0);
return vm_virt_to_phys(p);
@@ -45,12 +45,14 @@ static pte_t make_pte(pfn_t pfn, enum vm_prot prot, enum page_size size)
switch (size) {
case PS_1G:
/* pfn_t is in terms of 4KiB pages, convert to 1GiB page frame number */
/* pfn_t is in terms of 4KiB pages, convert to 1GiB page frame
* number */
pfn >>= 18;
v = (pfn & 0x3FFFFF) << 30;
break;
case PS_2M:
/* pfn_t is in terms of 4KiB pages, convert to 2MiB page frame number */
/* pfn_t is in terms of 4KiB pages, convert to 2MiB page frame
* number */
pfn >>= 9;
v = (pfn & 0x7FFFFFFF) << 21;
break;
@@ -129,14 +131,16 @@ static void delete_pdir(phys_addr_t pd)
kfree(pdir);
}
static kern_status_t do_pmap_add(pmap_t pmap, void *p, pfn_t pfn, enum vm_prot prot, enum page_size size)
static kern_status_t do_pmap_add(
pmap_t pmap,
void *p,
pfn_t pfn,
enum vm_prot prot,
enum page_size size)
{
uintptr_t pv = (uintptr_t)p;
unsigned int
pml4t_index = BAD_INDEX,
pdpt_index = BAD_INDEX,
pd_index = BAD_INDEX,
pt_index = BAD_INDEX;
unsigned int pml4t_index = BAD_INDEX, pdpt_index = BAD_INDEX,
pd_index = BAD_INDEX, pt_index = BAD_INDEX;
switch (size) {
case PS_4K:
@@ -171,16 +175,19 @@ static kern_status_t do_pmap_add(pmap_t pmap, void *p, pfn_t pfn, enum vm_prot p
struct pdpt *pdpt = NULL;
if (!pml4t->p_entries[pml4t_index]) {
pdpt = kzalloc(sizeof *pdpt, 0);
pml4t->p_entries[pml4t_index] = PTR_TO_ENTRY(vm_virt_to_phys(pdpt));
pml4t->p_entries[pml4t_index]
= PTR_TO_ENTRY(vm_virt_to_phys(pdpt));
} else {
pdpt = vm_phys_to_virt(ENTRY_TO_PTR(pml4t->p_entries[pml4t_index]));
pdpt = vm_phys_to_virt(
ENTRY_TO_PTR(pml4t->p_entries[pml4t_index]));
}
/* if we're mapping a 1GiB page, we stop here */
if (size == PS_1G) {
if (pdpt->p_entries[pdpt_index] != 0) {
/* this slot points to a pdir, delete it.
if this slot points to a hugepage, this does nothing */
if this slot points to a hugepage, this does nothing
*/
delete_pdir(pdpt->p_entries[pdpt_index]);
}
@@ -189,22 +196,25 @@ static kern_status_t do_pmap_add(pmap_t pmap, void *p, pfn_t pfn, enum vm_prot p
return KERN_OK;
}
/* 3. traverse PDPT, get PDIR (optional, 4K and 2M only) */
struct pdir *pdir = NULL;
if (!pdpt->p_entries[pdpt_index] || pdpt->p_pages[pdpt_index] & PTE_PAGESIZE) {
if (!pdpt->p_entries[pdpt_index]
|| pdpt->p_pages[pdpt_index] & PTE_PAGESIZE) {
/* entry is null, or points to a hugepage */
pdir = kzalloc(sizeof *pdir, 0);
pdpt->p_entries[pdpt_index] = PTR_TO_ENTRY(vm_virt_to_phys(pdir));
pdpt->p_entries[pdpt_index]
= PTR_TO_ENTRY(vm_virt_to_phys(pdir));
} else {
pdir = vm_phys_to_virt(ENTRY_TO_PTR(pdpt->p_entries[pdpt_index]));
pdir = vm_phys_to_virt(
ENTRY_TO_PTR(pdpt->p_entries[pdpt_index]));
}
/* if we're mapping a 2MiB page, we stop here */
if (size == PS_2M) {
if (pdir->p_entries[pd_index] != 0) {
/* this slot points to a ptab, delete it.
if this slot points to a hugepage, this does nothing */
if this slot points to a hugepage, this does nothing
*/
delete_ptab(pdir->p_entries[pd_index]);
}
@@ -214,7 +224,8 @@ static kern_status_t do_pmap_add(pmap_t pmap, void *p, pfn_t pfn, enum vm_prot p
/* 4. traverse PDIR, get PTAB (optional, 4K only) */
struct ptab *ptab = NULL;
if (!pdir->p_entries[pd_index] || pdir->p_pages[pd_index] & PTE_PAGESIZE) {
if (!pdir->p_entries[pd_index]
|| pdir->p_pages[pd_index] & PTE_PAGESIZE) {
/* entry is null, or points to a hugepage */
ptab = kzalloc(sizeof *ptab, 0);
pdir->p_entries[pd_index] = PTR_TO_ENTRY(vm_virt_to_phys(ptab));
@@ -234,7 +245,8 @@ pmap_t get_kernel_pmap(void)
void pmap_bootstrap(void)
{
can_use_gbpages = gigabyte_pages();
printk("pmap: gigabyte pages %sabled", can_use_gbpages == 1 ? "en" : "dis");
printk("pmap: gigabyte pages %sabled",
can_use_gbpages == 1 ? "en" : "dis");
enable_nx();
printk("pmap: NX protection enabled");
@@ -251,16 +263,19 @@ void pmap_bootstrap(void)
the kernel and memblock-allocated data. */
uintptr_t vbase = VM_KERNEL_VOFFSET;
for (size_t i = 0; i < C_2GiB; i += hugepage_sz) {
do_pmap_add(kernel_pmap,
(void *)(vbase + i),
PFN(i),
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_SVR,
hugepage);
do_pmap_add(
kernel_pmap,
(void *)(vbase + i),
PFN(i),
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC
| VM_PROT_SVR,
hugepage);
}
phys_addr_t pmem_limit = 0x0;
struct memblock_iter it;
for_each_mem_range(&it, 0x00, UINTPTR_MAX) {
for_each_mem_range(&it, 0x00, UINTPTR_MAX)
{
if (it.it_limit > pmem_limit) {
pmem_limit = it.it_limit;
}
@@ -268,10 +283,13 @@ void pmap_bootstrap(void)
vbase = VM_PAGEMAP_BASE;
for (size_t i = 0; i < pmem_limit; i += hugepage_sz) {
do_pmap_add(kernel_pmap,
(void *)(vbase + i),
PFN(i),
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_SVR | VM_PROT_NOCACHE, hugepage);
do_pmap_add(
kernel_pmap,
(void *)(vbase + i),
PFN(i),
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_SVR
| VM_PROT_NOCACHE,
hugepage);
}
pmap_switch(kernel_pmap);
@@ -284,10 +302,14 @@ pmap_t pmap_create(void)
void pmap_destroy(pmap_t pmap)
{
}
kern_status_t pmap_add(pmap_t pmap, void *p, pfn_t pfn, enum vm_prot prot, enum pmap_flags flags)
kern_status_t pmap_add(
pmap_t pmap,
void *p,
pfn_t pfn,
enum vm_prot prot,
enum pmap_flags flags)
{
enum page_size ps = PS_4K;
if (flags & PMAP_HUGEPAGE) {
@@ -297,7 +319,13 @@ kern_status_t pmap_add(pmap_t pmap, void *p, pfn_t pfn, enum vm_prot prot, enum
return do_pmap_add(pmap, p, pfn, prot, ps);
}
kern_status_t pmap_add_block(pmap_t pmap, void *p, pfn_t pfn, size_t len, enum vm_prot prot, enum pmap_flags flags)
kern_status_t pmap_add_block(
pmap_t pmap,
void *p,
pfn_t pfn,
size_t len,
enum vm_prot prot,
enum pmap_flags flags)
{
return KERN_OK;
}