mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 20:58:22 +00:00
mm: rename vmm api to mm
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,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;
|
||||
|
||||
@@ -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
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user