diff options
-rw-r--r-- | kernel/include/comus/memory.h | 18 | ||||
-rw-r--r-- | kernel/memory/memory.c | 4 | ||||
-rw-r--r-- | kernel/memory/paging.c | 32 | ||||
-rw-r--r-- | kernel/memory/virtalloc.c | 2 | ||||
-rw-r--r-- | kernel/memory/virtalloc.h | 2 |
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 |