mm: rename vmm api to mm

This commit is contained in:
Matheus
2026-07-01 14:57:05 -03:00
parent c650036cfe
commit 239c267ed3
47 changed files with 402 additions and 413 deletions
+97 -8
View File
@@ -1,9 +1,98 @@
#ifndef _MM_H
#define _MM_H
#include <arch/mmu.h>
#include <mutex.h>
#include <kernel/page.h>
#include <kernel/vfs.h>
#include <kernel/vmm.h>
#include <rbtree.h>
#define MM_RANGE_FLAGS_PAGESIZE 1
#define MM_RANGE_FLAGS_ALLOCATE 2
#define MM_RANGE_FLAGS_PHYSICAL 4
#define MM_RANGE_FLAGS_FILE 8
#define MM_RANGE_FLAGS_EXACT 16
#define MM_RANGE_FLAGS_SHARED 32
#define MM_RANGE_FLAGS_REPLACE 64
#define MM_RANGE_FLAGS_CREDCHECK 128
#define MM_PERMANENT_RANGE_FLAGS_MASK (MM_RANGE_FLAGS_FILE | MM_RANGE_FLAGS_SHARED | MM_RANGE_FLAGS_PHYSICAL)
#define MM_FAULT_ACTION_READ 1
#define MM_FAULT_ACTION_WRITE 2
#define MM_FAULT_ACTION_EXEC 4
typedef struct {
vnode_t *node;
uintmax_t offset;
} mm_map_file_desc_t;
typedef struct mm_range_t{
rbtree_t rbtree_node;
void *start;
size_t size;
int flags;
mmuflags_t mmuflags;
union {
struct {
vnode_t *vnode;
size_t offset;
};
};
} mm_range_t;
typedef struct {
mutex_t lock;
rbtree_t *ranges;
void *start;
void *end;
} mm_space_t;
typedef struct {
mm_space_t space;
pagetableptr_t pagetable;
} mm_context_t;
extern mm_context_t mm_kernel_ctx;
static inline mmuflags_t mm_vnode_flags_to_mmu_flags(int flags) {
mmuflags_t mmuflags = ARCH_MMU_FLAGS_USER;
if (flags & V_FFLAGS_READ)
mmuflags |= ARCH_MMU_FLAGS_READ;
if (flags & V_FFLAGS_WRITE)
mmuflags |= ARCH_MMU_FLAGS_WRITE;
if ((flags & V_FFLAGS_EXEC) == 0)
mmuflags |= ARCH_MMU_FLAGS_NOEXEC;
return mmuflags;
}
static inline int mm_mmu_flags_to_vnode_flags(mmuflags_t mmuflags) {
int flags = 0;
if (mmuflags & ARCH_MMU_FLAGS_READ)
flags |= V_FFLAGS_READ;
if (mmuflags & ARCH_MMU_FLAGS_WRITE)
flags |= V_FFLAGS_WRITE;
if ((mmuflags & ARCH_MMU_FLAGS_NOEXEC) == 0)
flags |= V_FFLAGS_EXEC;
return flags;
}
int mm_change_mmu_flags(void *base, size_t size, mmuflags_t mmuflags, int flags);
void mm_destroy_context(mm_context_t *context);
mm_context_t *mm_fork_context(mm_context_t *oldcontext);
void *mm_map(void *addr, size_t size, int flags, mmuflags_t mmuflags, void *private);
void mm_unmap(void *addr, size_t size, int flags);
bool mm_handle_page_fault(void *addr, bool user, int actions);
mm_context_t *mm_create_context();
void mm_switch_context(mm_context_t *ctx);
#define MM_GET_PHYSICAL_ADDRESS_FLAGS_HOLD 1
#define MM_GET_PHYSICAL_ADDRESS_FLAGS_LOCK 2
void *mm_get_physical_address(void *addr, int flags);
void mm_apinit();
void mm_init();
extern size_t mm_cache_cached_pages;
@@ -18,12 +107,12 @@ int mm_cache_sync(void);
int mm_cache_evict(page_t *page);
void mm_range_init(void);
vmmrange_t *mm_alloc_range(void);
void mm_free_range(vmmrange_t *range);
vmmrange_t *mm_get_range(vmmspace_t *space, void *addr);
void *mm_get_free_range(vmmspace_t *space, void *addr, size_t size);
void mm_insert_range(vmmspace_t *space, vmmrange_t *new_range);
void mm_destroy_range(vmmrange_t *range, uintmax_t offset, size_t size, int flags);
int mm_change_range(vmmspace_t *space, void *address, size_t size, bool free, int flags, mmuflags_t new_mmuflags);
mm_range_t *mm_alloc_range(void);
void mm_free_range(mm_range_t *range);
mm_range_t *mm_get_range(mm_space_t *space, void *addr);
void *mm_get_free_range(mm_space_t *space, void *addr, size_t size);
void mm_insert_range(mm_space_t *space, mm_range_t *new_range);
void mm_destroy_range(mm_range_t *range, uintmax_t offset, size_t size, int flags);
int mm_change_range(mm_space_t *space, void *address, size_t size, bool free, int flags, mmuflags_t new_mmuflags);
#endif
+1 -1
View File
@@ -2,7 +2,7 @@
#define _PROC_H
#include <arch/context.h>
#include <kernel/vmm.h>
#include <kernel/mm.h>
#include <kernel/abi.h>
#include <kernel/vfs.h>
#include <semaphore.h>
+2 -2
View File
@@ -2,7 +2,7 @@
#define _THREAD_H
#include <arch/context.h>
#include <kernel/vmm.h>
#include <kernel/mm.h>
#include <kernel/abi.h>
#include <kernel/signal.h>
#include <kernel/event.h>
@@ -35,7 +35,7 @@ typedef struct thread_t {
extracontext_t extracontext;
void *kernelstack;
size_t kernelstacksize;
vmmcontext_t *vmmctx;
mm_context_t *mmctx;
tid_t tid;
int flags;
bool sleepintstatus;
-96
View File
@@ -1,96 +0,0 @@
#ifndef _VMM_H
#define _VMM_H
#include <arch/mmu.h>
#include <mutex.h>
#include <kernel/vfs.h>
#include <rbtree.h>
#define VMM_FLAGS_PAGESIZE 1
#define VMM_FLAGS_ALLOCATE 2
#define VMM_FLAGS_PHYSICAL 4
#define VMM_FLAGS_FILE 8
#define VMM_FLAGS_EXACT 16
#define VMM_FLAGS_SHARED 32
#define VMM_FLAGS_REPLACE 64
#define VMM_FLAGS_CREDCHECK 128
#define VMM_PERMANENT_FLAGS_MASK (VMM_FLAGS_FILE | VMM_FLAGS_SHARED | VMM_FLAGS_PHYSICAL)
#define VMM_ACTION_READ 1
#define VMM_ACTION_WRITE 2
#define VMM_ACTION_EXEC 4
typedef struct {
vnode_t *node;
uintmax_t offset;
} vmmfiledesc_t;
typedef struct vmmrange_t{
rbtree_t rbtree_node;
void *start;
size_t size;
int flags;
mmuflags_t mmuflags;
union {
struct {
vnode_t *vnode;
size_t offset;
};
};
} vmmrange_t;
typedef struct {
mutex_t lock;
rbtree_t *ranges;
void *start;
void *end;
} vmmspace_t;
typedef struct {
vmmspace_t space;
pagetableptr_t pagetable;
} vmmcontext_t;
extern vmmcontext_t vmm_kernelctx;
static inline mmuflags_t vnodeflagstommuflags(int flags) {
mmuflags_t mmuflags = ARCH_MMU_FLAGS_USER;
if (flags & V_FFLAGS_READ)
mmuflags |= ARCH_MMU_FLAGS_READ;
if (flags & V_FFLAGS_WRITE)
mmuflags |= ARCH_MMU_FLAGS_WRITE;
if ((flags & V_FFLAGS_EXEC) == 0)
mmuflags |= ARCH_MMU_FLAGS_NOEXEC;
return mmuflags;
}
static inline int mmuflagstovnodeflags(mmuflags_t mmuflags) {
int flags = 0;
if (mmuflags & ARCH_MMU_FLAGS_READ)
flags |= V_FFLAGS_READ;
if (mmuflags & ARCH_MMU_FLAGS_WRITE)
flags |= V_FFLAGS_WRITE;
if ((mmuflags & ARCH_MMU_FLAGS_NOEXEC) == 0)
flags |= V_FFLAGS_EXEC;
return flags;
}
int vmm_changemmuflags(void *base, size_t size, mmuflags_t mmuflags, int flags);
void vmm_destroycontext(vmmcontext_t *context);
vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext);
void *vmm_map(void *addr, size_t size, int flags, mmuflags_t mmuflags, void *private);
void vmm_unmap(void *addr, size_t size, int flags);
bool vmm_pagefault(void *addr, bool user, int actions);
vmmcontext_t *vmm_newcontext();
void vmm_switchcontext(vmmcontext_t *ctx);
#define VMM_GET_PHYSICAL_FLAGS_HOLD 1
#define VMM_GET_PHYSICAL_FLAGS_LOCK 2
void *vmm_getphysical(void *addr, int flags);
void vmm_apinit();
void vmm_init();
#endif
+5 -5
View File
@@ -7,7 +7,7 @@
#include <arch/msr.h>
#include <arch/ist.h>
#include <kernel/interrupt.h>
#include <kernel/vmm.h>
#include <kernel/mm.h>
#include <kernel/timer.h>
#include <kernel/scheduler.h>
#include <kernel/dpc.h>
@@ -23,7 +23,7 @@ typedef struct cpu_t {
struct cpu_t *self; // expected to be here by other code
vmmcontext_t *vmmctx; // expected to be here by other code
mm_context_t *mmctx; // expected to be here by other code
long hardware_id; // expected to be here by other code
long internal_id; // expected to be here by other code
@@ -131,13 +131,13 @@ static inline cpu_t *current_cpu(void) {
return cpu;
}
static inline vmmcontext_t *current_vmm_context(void) {
vmmcontext_t *context;
static inline mm_context_t *current_mm_context(void) {
mm_context_t *context;
asm volatile ("mov %%gs:16, %%rax" : "=a"(context) : : "memory");
return context;
}
static inline void set_current_vmm_context(vmmcontext_t *context) {
static inline void set_current_mm_context(mm_context_t *context) {
asm volatile ("mov %%rax, %%gs:16" : : "a"(context) : "memory");
}
+1 -1
View File
@@ -96,7 +96,7 @@ static void pci_archinit() {
void *phys = (void *)mcfgentries[i].address;
uintmax_t pageoffset = (uintptr_t)phys % PAGE_SIZE;
size_t mappingsize = pageoffset + MCFG_MAPPING_SIZE(mcfgentries[i].end_bus - mcfgentries[i].start_bus + 1);
void *virt = vmm_map(NULL, mappingsize, VMM_FLAGS_PHYSICAL,
void *virt = mm_map(NULL, mappingsize, MM_RANGE_FLAGS_PHYSICAL,
ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC | ARCH_MMU_FLAGS_UC, phys);
__assert(virt);
mcfgentries[i].address = (uintptr_t)virt + pageoffset;