Renamed vm_prot from vm_perm to be more consistent
[akaros.git] / kern / include / mm.h
1 /* Copyright (c) 2009, 2010 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Memory management for processes: syscall related functions, virtual memory
6  * regions, etc. */
7
8 #ifndef ROS_KERN_MM_H
9 #define ROS_KERN_MM_H
10
11 #include <ros/common.h>
12 #include <atomic.h>
13 #include <sys/queue.h>
14 #include <slab.h>
15
16 struct file;
17 struct proc;                                                            /* preprocessor games */
18
19 /* This might turn into a per-process mem management structure.  For now, we're
20  * using the proc struct.  This would have things like the vmr list/tree, cr3,
21  * mem usage stats, something with private memory, etc.  Not sure if we'll ever
22  * need this. */
23 struct mm {
24         spinlock_t mm_lock;
25 };
26
27 /* Basic structure defining a region of a process's virtual memory.  Note we
28  * don't refcnt these.  Either they are in the TAILQ/tree, or they should be
29  * freed.  There should be no other references floating around.  We still need
30  * to sort out how we share memory and how we'll do private memory with these
31  * VMRs. */
32 struct vm_region {
33         TAILQ_ENTRY(vm_region)          vm_link;
34         struct proc                                     *vm_proc;       /* owning process, for now */
35         //struct mm                                     *vm_mm;         /* owning address space */
36         uintptr_t                                       vm_base;
37         uintptr_t                                       vm_end;
38         int                                                     vm_prot;        
39         int                                                     vm_flags;       
40         struct file                                     *vm_file;
41         size_t                                          vm_foff;
42 };
43 TAILQ_HEAD(vmr_tailq, vm_region);                       /* Declares 'struct vmr_tailq' */
44
45 #include <process.h>                                            /* preprocessor games */
46
47 /* VM Region Management Functions.  For now, these just maintain themselves -
48  * anything related to mapping needs to be done by the caller. */
49 void vmr_init(void);
50 struct vm_region *create_vmr(struct proc *p, uintptr_t va, size_t len);
51 struct vm_region *split_vmr(struct vm_region *vmr, uintptr_t va);
52 int merge_vmr(struct vm_region *first, struct vm_region *second);
53 int grow_vmr(struct vm_region *vmr, uintptr_t va);
54 int shrink_vmr(struct vm_region *vmr, uintptr_t va);
55 void destroy_vmr(struct vm_region *vmr);
56 struct vm_region *find_vmr(struct proc *p, uintptr_t va);
57 struct vm_region *find_first_vmr(struct proc *p, uintptr_t va);
58 void isolate_vmrs(struct proc *p, uintptr_t va, size_t len);
59 void duplicate_vmrs(struct proc *p, struct proc *new_p);
60 void print_vmrs(struct proc *p);
61
62 /* mmap() related functions.  These manipulate VMRs and change the hardware page
63  * tables. */
64 void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
65            int fd, size_t offset);
66 void *do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
67              struct file *f, size_t offset);
68 int mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
69 int munmap(struct proc *p, uintptr_t addr, size_t len);
70 int handle_page_fault(struct proc *p, uintptr_t va, int prot);
71
72 /* These assume the memory/proc_lock is held already */
73 void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
74                struct file *f, size_t offset);
75 int __do_mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
76 int __do_munmap(struct proc *p, uintptr_t addr, size_t len);
77 int __handle_page_fault(struct proc* p, uintptr_t va, int prot);
78
79 #endif /* !ROS_KERN_MM_H */