MMAP_LOWEST_VA must be page-aligned
[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 <ros/mman.h>
13 #include <atomic.h>
14 #include <sys/queue.h>
15 #include <slab.h>
16
17 struct file;
18 struct proc;                                                            /* preprocessor games */
19
20 /* This might turn into a per-process mem management structure.  For now, we're
21  * using the proc struct.  This would have things like the vmr list/tree, cr3,
22  * mem usage stats, something with private memory, etc.  Not sure if we'll ever
23  * need this. */
24 struct mm {
25         spinlock_t mm_lock;
26 };
27
28 /* Basic structure defining a region of a process's virtual memory.  Note we
29  * don't refcnt these.  Either they are in the TAILQ/tree, or they should be
30  * freed.  There should be no other references floating around.  We still need
31  * to sort out how we share memory and how we'll do private memory with these
32  * VMRs. */
33 struct vm_region {
34         TAILQ_ENTRY(vm_region)          vm_link;
35         struct proc                                     *vm_proc;       /* owning process, for now */
36         //struct mm                                     *vm_mm;         /* owning address space */
37         uintptr_t                                       vm_base;
38         uintptr_t                                       vm_end;
39         int                                                     vm_prot;        
40         int                                                     vm_flags;       
41         struct file                                     *vm_file;
42         size_t                                          vm_foff;
43 };
44 TAILQ_HEAD(vmr_tailq, vm_region);                       /* Declares 'struct vmr_tailq' */
45
46 #include <process.h>                                            /* preprocessor games */
47
48 /* VM Region Management Functions.  For now, these just maintain themselves -
49  * anything related to mapping needs to be done by the caller. */
50 void vmr_init(void);
51 struct vm_region *create_vmr(struct proc *p, uintptr_t va, size_t len);
52 struct vm_region *split_vmr(struct vm_region *vmr, uintptr_t va);
53 int merge_vmr(struct vm_region *first, struct vm_region *second);
54 struct vm_region *merge_me(struct vm_region *vmr);
55 int grow_vmr(struct vm_region *vmr, uintptr_t va);
56 int shrink_vmr(struct vm_region *vmr, uintptr_t va);
57 void destroy_vmr(struct vm_region *vmr);
58 struct vm_region *find_vmr(struct proc *p, uintptr_t va);
59 struct vm_region *find_first_vmr(struct proc *p, uintptr_t va);
60 void isolate_vmrs(struct proc *p, uintptr_t va, size_t len);
61 void destroy_vmrs(struct proc *p);
62 void duplicate_vmrs(struct proc *p, struct proc *new_p);
63 void print_vmrs(struct proc *p);
64
65 /* mmap() related functions.  These manipulate VMRs and change the hardware page
66  * tables.  Any requests below the LOWEST_VA will silently be upped.  This may
67  * be a dynamic proc-specific variable later. */
68 #define MMAP_LOWEST_VA PGSIZE
69 void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
70            int fd, size_t offset);
71 void *do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
72               struct file *f, size_t offset);
73 int mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
74 int munmap(struct proc *p, uintptr_t addr, size_t len);
75 int handle_page_fault(struct proc *p, uintptr_t va, int prot);
76
77 /* These assume the mm_lock is held already */
78 void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
79                 struct file *f, size_t offset);
80 int __do_mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
81 int __do_munmap(struct proc *p, uintptr_t addr, size_t len);
82 int __handle_page_fault(struct proc* p, uintptr_t va, int prot);
83
84 /* Kernel Dynamic Memory Mappings */
85 /* These two are just about reserving VA space */
86 uintptr_t get_vmap_segment(unsigned long num_pages);
87 uintptr_t put_vmap_segment(uintptr_t vaddr, unsigned long num_pages);
88 /* These two are about actually mapping stuff in some reserved space */
89 int map_vmap_segment(uintptr_t vaddr, uintptr_t paddr, unsigned long num_pages,
90                      int perm);
91 int unmap_vmap_segment(uintptr_t vaddr, unsigned long num_pages);
92
93 #endif /* !ROS_KERN_MM_H */