Files
Astral/src/include/kernel/vmm.h
T
2022-10-24 15:37:37 -03:00

74 lines
1.8 KiB
C

#ifndef _VMM_H_INCLUDE
#define _VMM_H_INCLUDE
#include <kernel/vfs.h>
#include <arch/mmu.h>
#include <stdbool.h>
#include <stddef.h>
#define KERNEL_SPACE_START 0xFFFF800000000000
#define KERNEL_SPACE_END 0xFFFFFFFFFFFFFFFF
#define USER_SPACE_START 0x0
#define USER_SPACE_END (void*)0x00007FFFFFFFFFFF
#define USER_ALLOC_START (void*)0x1000
#define VMM_TYPE_FREE 0
#define VMM_TYPE_ANON 1
#define VMM_TYPE_FILE 2
struct vmm_cacheheader;
typedef struct{
int lock;
size_t firstfree;
struct vmm_cacheheader* next;
size_t freecount;
} vmm_cacheheader;
struct vmm_mapping;
typedef struct _vmm_mapping {
struct _vmm_mapping *next;
struct _vmm_mapping *prev;
vmm_cacheheader* cache;
void* start;
void* end;
size_t mmuflags;
size_t type;
void* data;
size_t offset;
} vmm_mapping;
#define VMM_CACHE_ENTRY_COUNT ((PAGE_SIZE - sizeof(vmm_cacheheader)) / sizeof(vmm_mapping))
typedef struct{
vmm_cacheheader header;
vmm_mapping mappings[VMM_CACHE_ENTRY_COUNT];
} vmm_cache;
typedef struct {
vmm_mapping* userstart;
arch_mmu_tableptr context;
int lock;
} vmm_context;
void vmm_init();
void vmm_destroy(vmm_context* ctx);
void* vmm_tophysical(void* addr);
bool vmm_dealwithrequest(void* addr, long error, bool user);
bool vmm_setused(void* addr, size_t pagec, size_t mmuflags);
bool vmm_unmap(void* addr, size_t pagec);
bool vmm_map(void* paddr, void* vaddr, size_t pagec, size_t mmuflags);
void* vmm_alloc(size_t pagec, size_t mmuflags);
bool vmm_setfree(void* addr, size_t pagec);
bool vmm_allocnowat(void* addr, size_t mmuflags, size_t size);
void* vmm_allocfrom(void* addr, size_t mmuflags, size_t size);
int vmm_mapfile(vnode_t* node, void* addr, size_t len, size_t offset, size_t mmuflags);
vmm_context* vmm_newcontext();
void vmm_switchcontext(vmm_context*);
int vmm_fork(vmm_context* oldctx, vmm_context* newctx);
#endif