trial implementation of private file mapping
for review only. will soon be reverted.
This commit is contained in:
22
kernel/include/memobj.h
Normal file
22
kernel/include/memobj.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef HEADER_MEMOBJ_H
|
||||
#define HEADER_MEMOBJ_H
|
||||
|
||||
#include <ihk/types.h>
|
||||
#include <ihk/atomic.h>
|
||||
#include <ihk/lock.h>
|
||||
#include <list.h>
|
||||
|
||||
struct memobj {
|
||||
struct list_head list;
|
||||
ihk_atomic_t ref;
|
||||
uintptr_t handle;
|
||||
struct list_head page_list;
|
||||
ihk_spinlock_t page_list_lock;
|
||||
};
|
||||
|
||||
int memobj_create(int fd, int flags, int prot, struct memobj **objp, int *maxprotp);
|
||||
void memobj_ref(struct memobj *obj);
|
||||
void memobj_release(struct memobj *obj);
|
||||
int memobj_get_page(struct memobj *obj, off_t off, size_t pgsize, uintptr_t *physp);
|
||||
|
||||
#endif /* HEADER_MEMOBJ_H */
|
||||
@ -2,16 +2,25 @@
|
||||
#define __HEADER_PAGE_H
|
||||
|
||||
struct page {
|
||||
struct list_head list;
|
||||
uint64_t flags;
|
||||
int64_t count;
|
||||
struct list_head list;
|
||||
uint8_t mode;
|
||||
uint8_t padding[3];
|
||||
int32_t count;
|
||||
off_t offset;
|
||||
};
|
||||
|
||||
/* flags */
|
||||
#define PAGE_IN_LIST 0x0001UL
|
||||
/* mode */
|
||||
enum page_mode {
|
||||
PM_NONE = 0x00,
|
||||
PM_PENDING_FREE = 0x01,
|
||||
PM_PAGEIO = 0x02,
|
||||
PM_MAPPED = 0x03,
|
||||
PM_ANON_COW = 0x04,
|
||||
};
|
||||
|
||||
struct page *phys_to_page(uintptr_t phys);
|
||||
uintptr_t page_to_phys(struct page *page);
|
||||
int page_unmap(struct page *page);
|
||||
|
||||
void *allocate_pages(int npages, enum ihk_mc_ap_flag flag);
|
||||
void free_pages(void *va, int npages);
|
||||
|
||||
26
kernel/include/pager.h
Normal file
26
kernel/include/pager.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef HEADER_PAGER_H
|
||||
#define HEADER_PAGER_H
|
||||
|
||||
#include <ihk/types.h>
|
||||
|
||||
enum pager_op {
|
||||
PAGER_REQ_CREATE = 0x0001,
|
||||
PAGER_REQ_RELEASE = 0x0002,
|
||||
PAGER_REQ_READ = 0x0003,
|
||||
};
|
||||
|
||||
/*
|
||||
* int pager_req_create(int fd, int flags, int prot, uintptr_t result_rpa);
|
||||
*/
|
||||
struct pager_create_result {
|
||||
uintptr_t handle;
|
||||
int maxprot;
|
||||
};
|
||||
|
||||
/*
|
||||
* int pager_req_release(uintptr_t handle);
|
||||
*/
|
||||
/*
|
||||
* int pager_req_read(uintptr_t handle, off_t off, size_t size, uintptr_t buf_rpa);
|
||||
*/
|
||||
#endif /* HEADER_PAGER_H */
|
||||
@ -7,6 +7,7 @@
|
||||
#include <ihk/atomic.h>
|
||||
#include <list.h>
|
||||
#include <signal.h>
|
||||
#include <memobj.h>
|
||||
|
||||
#define VR_NONE 0x0
|
||||
#define VR_STACK 0x1
|
||||
@ -14,13 +15,21 @@
|
||||
#define VR_IO_NOCACHE 0x100
|
||||
#define VR_REMOTE 0x200
|
||||
#define VR_DEMAND_PAGING 0x1000
|
||||
#define VR_PRIVATE 0x2000
|
||||
#define VR_PROT_NONE 0x00000000
|
||||
#define VR_PROT_READ 0x00010000
|
||||
#define VR_PROT_WRITE 0x00020000
|
||||
#define VR_PROT_EXEC 0x00040000
|
||||
#define VR_PROT_MASK 0x00070000
|
||||
#define VR_MAXPROT_NONE 0x00000000
|
||||
#define VR_MAXPROT_READ 0x00100000
|
||||
#define VR_MAXPROT_WRITE 0x00200000
|
||||
#define VR_MAXPROT_EXEC 0x00400000
|
||||
#define VR_MAXPROT_MASK 0x00700000
|
||||
|
||||
#define PROT_TO_VR_FLAG(prot) (((unsigned long)(prot) << 16) & VR_PROT_MASK)
|
||||
#define VRFLAG_PROT_TO_MAXPROT(vrflag) (((vrflag) & VR_PROT_MASK) << 4)
|
||||
#define VRFLAG_MAXPROT_TO_PROT(vrflag) (((vrflag) & VR_MAXPROT_MASK) >> 4)
|
||||
|
||||
#define PS_RUNNING 0x1
|
||||
#define PS_INTERRUPTIBLE 0x2
|
||||
@ -41,6 +50,8 @@ struct vm_range {
|
||||
struct list_head list;
|
||||
unsigned long start, end;
|
||||
unsigned long flag;
|
||||
struct memobj *memobj;
|
||||
off_t objoff;
|
||||
};
|
||||
|
||||
struct vm_regions {
|
||||
@ -106,7 +117,6 @@ struct process_vm {
|
||||
// is protected by its own lock (see ihk/manycore/generic/page_alloc.c)
|
||||
};
|
||||
|
||||
|
||||
struct process *create_process(unsigned long user_pc);
|
||||
struct process *clone_process(struct process *org,
|
||||
unsigned long pc, unsigned long sp);
|
||||
@ -114,10 +124,12 @@ void destroy_process(struct process *proc);
|
||||
void hold_process(struct process *proc);
|
||||
void free_process(struct process *proc);
|
||||
void free_process_memory(struct process *proc);
|
||||
void flush_process_memory(struct process *proc);
|
||||
|
||||
int add_process_memory_range(struct process *process,
|
||||
unsigned long start, unsigned long end,
|
||||
unsigned long phys, unsigned long flag);
|
||||
unsigned long phys, unsigned long flag,
|
||||
struct memobj *memobj, off_t objoff);
|
||||
int remove_process_memory_range(
|
||||
struct process *process, unsigned long start, unsigned long end);
|
||||
int split_process_memory_range(struct process *process,
|
||||
@ -133,6 +145,7 @@ struct vm_range *next_process_memory_range(
|
||||
struct process_vm *vm, struct vm_range *range);
|
||||
struct vm_range *previous_process_memory_range(
|
||||
struct process_vm *vm, struct vm_range *range);
|
||||
int page_fault_process_memory_range(struct process *proc, struct vm_range *range, uintptr_t fault_addr, uint64_t reason);
|
||||
int remove_process_region(struct process *proc,
|
||||
unsigned long start, unsigned long end);
|
||||
struct program_load_desc;
|
||||
|
||||
@ -126,6 +126,8 @@ struct syscall_request {
|
||||
struct syscall_response {
|
||||
unsigned long status;
|
||||
long ret;
|
||||
unsigned long fault_address;
|
||||
unsigned long fault_reason;
|
||||
};
|
||||
|
||||
struct syscall_post {
|
||||
@ -190,6 +192,7 @@ struct syscall_params {
|
||||
|
||||
extern int do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx);
|
||||
extern int obtain_clone_cpuid();
|
||||
extern long syscall_generic_forwarding(int n, ihk_mc_user_context_t *ctx);
|
||||
|
||||
#define DECLARATOR(number,name) __NR_##name = number,
|
||||
#define SYSCALL_HANDLED(number,name) DECLARATOR(number,name)
|
||||
|
||||
Reference in New Issue
Block a user