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