Handle pending signals even when resuming current_uthread
[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 /* Basic structure defining a region of a process's virtual memory.  Note we
21  * don't refcnt these.  Either they are in the TAILQ/tree, or they should be
22  * freed.  There should be no other references floating around.  We still need
23  * to sort out how we share memory and how we'll do private memory with these
24  * VMRs. */
25 struct vm_region {
26         TAILQ_ENTRY(vm_region)          vm_link;
27         TAILQ_ENTRY(vm_region)          vm_pm_link;
28         struct proc                                     *vm_proc;       /* owning process, for now */
29         uintptr_t                                       vm_base;
30         uintptr_t                                       vm_end;
31         int                                                     vm_prot;        
32         int                                                     vm_flags;       
33         struct file                                     *vm_file;
34         size_t                                          vm_foff;
35 };
36 TAILQ_HEAD(vmr_tailq, vm_region);                       /* Declares 'struct vmr_tailq' */
37
38 /* VM Region Management Functions.  For now, these just maintain themselves -
39  * anything related to mapping needs to be done by the caller. */
40 void vmr_init(void);
41 struct vm_region *create_vmr(struct proc *p, uintptr_t va, size_t len);
42 struct vm_region *split_vmr(struct vm_region *vmr, uintptr_t va);
43 int merge_vmr(struct vm_region *first, struct vm_region *second);
44 struct vm_region *merge_me(struct vm_region *vmr);
45 int grow_vmr(struct vm_region *vmr, uintptr_t va);
46 int shrink_vmr(struct vm_region *vmr, uintptr_t va);
47 void destroy_vmr(struct vm_region *vmr);
48 struct vm_region *find_vmr(struct proc *p, uintptr_t va);
49 struct vm_region *find_first_vmr(struct proc *p, uintptr_t va);
50 void isolate_vmrs(struct proc *p, uintptr_t va, size_t len);
51 void unmap_and_destroy_vmrs(struct proc *p);
52 int duplicate_vmrs(struct proc *p, struct proc *new_p);
53 void print_vmrs(struct proc *p);
54
55 /* mmap() related functions.  These manipulate VMRs and change the hardware page
56  * tables.  Any requests below the LOWEST_VA will silently be upped.  This may
57  * be a dynamic proc-specific variable later. */
58 #define MMAP_LOWEST_VA PGSIZE
59 void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
60            int fd, size_t offset);
61 void *do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
62               struct file *f, size_t offset);
63 int mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
64 int munmap(struct proc *p, uintptr_t addr, size_t len);
65 int handle_page_fault(struct proc *p, uintptr_t va, int prot);
66 unsigned long populate_va(struct proc *p, uintptr_t va, unsigned long nr_pgs);
67
68 /* These assume the mm_lock is held already */
69 int __do_mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
70 int __do_munmap(struct proc *p, uintptr_t addr, size_t len);
71
72 /* Kernel Dynamic Memory Mappings */
73 /* These two are just about reserving VA space */
74 uintptr_t get_vmap_segment(unsigned long num_pages);
75 uintptr_t put_vmap_segment(uintptr_t vaddr, unsigned long num_pages);
76 /* These two are about actually mapping stuff in some reserved space */
77 int map_vmap_segment(uintptr_t vaddr, uintptr_t paddr, unsigned long num_pages,
78                      int perm);
79 int unmap_vmap_segment(uintptr_t vaddr, unsigned long num_pages);
80 /* Helper wrappers, since no one will probably call the *_segment funcs */
81 uintptr_t vmap_pmem(uintptr_t paddr, size_t nr_bytes);
82 uintptr_t vmap_pmem_nocache(uintptr_t paddr, size_t nr_bytes);
83 int vunmap_vmem(uintptr_t vaddr, size_t nr_bytes);
84
85 #endif /* !ROS_KERN_MM_H */