summaryrefslogtreecommitdiff
path: root/kernel/memory
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-24 12:38:28 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-24 12:38:28 -0400
commit8a81340b78def3895c119d5ada63cbe3a8452985 (patch)
tree48715bf57b6a76f97e5d60c5fd84afbf49d57d4f /kernel/memory
parentonly backtrace on valid kernel frames (diff)
downloadcomus-8a81340b78def3895c119d5ada63cbe3a8452985.tar.gz
comus-8a81340b78def3895c119d5ada63cbe3a8452985.tar.bz2
comus-8a81340b78def3895c119d5ada63cbe3a8452985.zip
const pointers on free & kmapuseraddr
Diffstat (limited to 'kernel/memory')
-rw-r--r--kernel/memory/memory.c4
-rw-r--r--kernel/memory/paging.c32
-rw-r--r--kernel/memory/virtalloc.c2
-rw-r--r--kernel/memory/virtalloc.h2
4 files changed, 28 insertions, 12 deletions
diff --git a/kernel/memory/memory.c b/kernel/memory/memory.c
index 2a9c15e..7ceb491 100644
--- a/kernel/memory/memory.c
+++ b/kernel/memory/memory.c
@@ -26,7 +26,7 @@ void *kmapaddr(void *phys, void *virt, size_t len, unsigned int flags)
return mem_mapaddr(kernel_mem_ctx, phys, virt, len, flags);
}
-void kunmapaddr(void *virt)
+void kunmapaddr(const void *virt)
{
mem_unmapaddr(kernel_mem_ctx, virt);
}
@@ -41,7 +41,7 @@ void *kalloc_pages(size_t count)
return mem_alloc_pages(kernel_mem_ctx, count, F_PRESENT | F_WRITEABLE);
}
-void kfree_pages(void *ptr)
+void kfree_pages(const void *ptr)
{
mem_free_pages(kernel_mem_ctx, ptr);
}
diff --git a/kernel/memory/paging.c b/kernel/memory/paging.c
index 4f1b788..f286027 100644
--- a/kernel/memory/paging.c
+++ b/kernel/memory/paging.c
@@ -5,6 +5,7 @@
#include "physalloc.h"
#include "paging.h"
#include "memory.h"
+#include <stdint.h>
// PAGE MAP LEVEL 4 ENTRY
struct pml4e {
@@ -214,7 +215,7 @@ static volatile struct pt *pt_map(volatile struct pt *pPT)
// locate a pdpt for a vitural address
// @returns PHYSICAL ADDRESS
static volatile struct pdpt *pdpt_locate(volatile struct pml4 *pPML4,
- void *vADDR)
+ const void *vADDR)
{
volatile struct pml4 *vPML4;
volatile struct pml4e *vPML4E;
@@ -235,7 +236,7 @@ static volatile struct pdpt *pdpt_locate(volatile struct pml4 *pPML4,
// locate a pd for a vitural address
// @returns PHYSICAL ADDRESS
-static volatile struct pd *pd_locate(volatile struct pdpt *pPDPT, void *vADDR)
+static volatile struct pd *pd_locate(volatile struct pdpt *pPDPT, const void *vADDR)
{
volatile struct pdpt *vPDPT;
volatile struct pdpte *vPDPTE;
@@ -256,7 +257,7 @@ static volatile struct pd *pd_locate(volatile struct pdpt *pPDPT, void *vADDR)
// locate a pt for a vitural address
// @returns PHYSICAL ADDRESS
-static volatile struct pt *pt_locate(volatile struct pd *pPD, void *vADDR)
+static volatile struct pt *pt_locate(volatile struct pd *pPD, const void *vADDR)
{
volatile struct pd *vPD;
volatile struct pde *vPDE;
@@ -506,7 +507,7 @@ free:
// locate a pte for a vitural address
// @returns VIRTUAL ADDRESS
static volatile struct pte *page_locate(volatile struct pml4 *pPML4,
- void *vADDR)
+ const void *vADDR)
{
volatile struct pdpt *pPDPT;
volatile struct pd *pPD;
@@ -573,7 +574,7 @@ static volatile struct pte *page_alloc(volatile struct pml4 *pPML4, void *vADDR,
}
// free a pte (page) for a vitural address
-static void page_free(volatile struct pml4 *pPML4, void *vADDR)
+static void page_free(volatile struct pml4 *pPML4, const void *vADDR)
{
volatile struct pte *vPTE;
void *pADDR;
@@ -591,7 +592,7 @@ static void page_free(volatile struct pml4 *pPML4, void *vADDR)
/* map & unmap pages */
-static void unmap_pages(volatile struct pml4 *pPML4, void *vADDR,
+static void unmap_pages(volatile struct pml4 *pPML4, const void *vADDR,
long page_count)
{
for (long i = 0; i < page_count; i++) {
@@ -717,7 +718,22 @@ void *mem_mapaddr(mem_ctx_t ctx, void *phys, void *virt, size_t len,
return (char *)virt + error;
}
-void mem_unmapaddr(mem_ctx_t ctx, void *virt)
+void *kmapuseraddr(mem_ctx_t ctx, const void *vADDR, size_t len)
+{
+ char *pADDR;
+ volatile struct pte *vPTE;
+
+ vPTE = page_locate((volatile struct pml4 *)ctx->pml4, vADDR);
+ if (vPTE == NULL)
+ return NULL;
+
+ pADDR = (void *)((uintptr_t)vPTE->address << 12);
+ pADDR += ((uint64_t)vADDR % PAGE_SIZE);
+
+ return kmapaddr(pADDR, NULL, len, F_PRESENT | F_WRITEABLE);
+}
+
+void mem_unmapaddr(mem_ctx_t ctx, const void *virt)
{
if (virt == NULL)
return;
@@ -768,7 +784,7 @@ void *mem_alloc_pages_at(mem_ctx_t ctx, size_t count, void *virt,
return virt;
}
-void mem_free_pages(mem_ctx_t ctx, void *virt)
+void mem_free_pages(mem_ctx_t ctx, const void *virt)
{
if (virt == NULL)
return;
diff --git a/kernel/memory/virtalloc.c b/kernel/memory/virtalloc.c
index 0f4de93..3690eae 100644
--- a/kernel/memory/virtalloc.c
+++ b/kernel/memory/virtalloc.c
@@ -165,7 +165,7 @@ void *virtaddr_alloc(struct virt_ctx *ctx, int n_pages)
return NULL;
}
-long virtaddr_free(struct virt_ctx *ctx, void *virtaddr)
+long virtaddr_free(struct virt_ctx *ctx, const void *virtaddr)
{
if (virtaddr == NULL)
return -1;
diff --git a/kernel/memory/virtalloc.h b/kernel/memory/virtalloc.h
index 7bf8b91..78adc46 100644
--- a/kernel/memory/virtalloc.h
+++ b/kernel/memory/virtalloc.h
@@ -64,7 +64,7 @@ void *virtaddr_alloc(struct virt_ctx *ctx, int pages);
* @param virtaddr - the addr to free
* @returns number of pages used for virtaddr
*/
-long virtaddr_free(struct virt_ctx *ctx, void *virtaddr);
+long virtaddr_free(struct virt_ctx *ctx, const void *virtaddr);
/**
* Cleans up heap allocations and frees the virtalloc context