summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/include/comus/memory.h18
-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
5 files changed, 42 insertions, 16 deletions
diff --git a/kernel/include/comus/memory.h b/kernel/include/comus/memory.h
index 942e7a8..255eca2 100644
--- a/kernel/include/comus/memory.h
+++ b/kernel/include/comus/memory.h
@@ -121,7 +121,7 @@ void *mem_mapaddr(mem_ctx_t ctx, void *phys, void *virt, size_t len,
* Unmaps mapped address from the kmapaddr function
* @param virt - the vitural address returned from kmapaddr
*/
-void mem_unmapaddr(mem_ctx_t ctx, void *virt);
+void mem_unmapaddr(mem_ctx_t ctx, const void *virt);
/**
* Allocate a single page of memory with the given paging structure
@@ -169,7 +169,7 @@ void *mem_alloc_pages_at(mem_ctx_t ctx, size_t count, void *virt,
*
* @param ptr - the pointer provided by alloc_page or alloc_pages
*/
-void mem_free_pages(mem_ctx_t ctx, void *ptr);
+void mem_free_pages(mem_ctx_t ctx, const void *ptr);
/**
* Allocates at least len bytes of memory starting at
@@ -185,10 +185,20 @@ void mem_free_pages(mem_ctx_t ctx, void *ptr);
void *kmapaddr(void *phys, void *virt, size_t len, unsigned int flags);
/**
+ * Map a vitural address in a userspace context to kernel space
+ *
+ * @param ctx - the userspace memory context to map from
+ * @param virt - the vitural address given by userspace
+ * @param len - the length of the buffer to map
+ * @returns vitural address mapped in kernel context
+ */
+void *kmapuseraddr(mem_ctx_t ctx, const void *virt, size_t len);
+
+/**
* Unmaps mapped address from the kmapaddr function
* @param virt - the vitural address returned from kmapaddr
*/
-void kunmapaddr(void *virt);
+void kunmapaddr(const void *virt);
/**
* Allocate a single page of memory
@@ -210,6 +220,6 @@ void *kalloc_pages(size_t count);
*
* @param ptr - the pointer provided by alloc_page or alloc_pages
*/
-void kfree_pages(void *ptr);
+void kfree_pages(const void *ptr);
#endif /* memory.h */
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