xref: /openbsd-src/sys/uvm/uvm_addr.h (revision 4c1e55dc91edd6e69ccc60ce855900fbc12cf34f)
1 /*	$OpenBSD: uvm_addr.h,v 1.2 2012/03/15 17:52:28 ariane Exp $	*/
2 
3 /*
4  * Copyright (c) 2011 Ariane van der Steldt <ariane@stack.nl>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef _UVM_UVM_ADDR_H_
20 #define _UVM_UVM_ADDR_H_
21 
22 #include <uvm/uvm_extern.h>
23 
24 /*
25  * Address selection logic.
26  *
27  * Address selection is just that: selection. These functions may make no
28  * changes to the map, except for their own state (which is passed as a
29  * uaddr_state pointer).
30  */
31 
32 
33 /*
34  * UVM address selection base state.
35  *
36  * Each uvm address algorithm requires these parameters:
37  * - lower bound address (page aligned)
38  * - upper bound address (page aligned)
39  * - function address pointers
40  */
41 struct uvm_addr_state {
42 	vaddr_t uaddr_minaddr;
43 	vaddr_t uaddr_maxaddr;
44 	const struct uvm_addr_functions *uaddr_functions;
45 };
46 
47 /*
48  * This structure describes one algorithm implementation.
49  *
50  * Each algorithm is described in terms of:
51  * - uaddr_select: an address selection algorithm
52  * - uaddr_free_insert: a freelist insertion function (optional)
53  * - uaddr_free_remove: a freelist deletion function (optional)
54  * - uaddr_destroy: a destructor for the algorithm state
55  */
56 struct uvm_addr_functions {
57 	int (*uaddr_select)(struct vm_map *map,
58 	    struct uvm_addr_state *uaddr,
59 	    struct vm_map_entry**entry_out, vaddr_t *addr_out,
60 	    vsize_t sz, vaddr_t align, vaddr_t offset,
61 	    vm_prot_t prot, vaddr_t hint);
62 	void (*uaddr_free_insert)(struct vm_map *map,
63 	    struct uvm_addr_state *uaddr_state,
64 	    struct vm_map_entry *entry);
65 	void (*uaddr_free_remove)(struct vm_map *map,
66 	    struct uvm_addr_state *uaddr_state,
67 	    struct vm_map_entry *entry);
68 	void (*uaddr_destroy)(struct uvm_addr_state *uaddr_state);
69 	void (*uaddr_print)(struct uvm_addr_state *uaddr_state, boolean_t full,
70 	    int (*pr)(const char*, ...));
71 
72 	const char* uaddr_name;		/* Name of the allocator. */
73 };
74 
75 
76 #ifdef _KERNEL
77 
78 void			 uvm_addr_init(void);
79 void			 uvm_addr_destroy(struct uvm_addr_state*);
80 vaddr_t			 uvm_addr_align(vaddr_t, vaddr_t, vaddr_t);
81 vaddr_t			 uvm_addr_align_back(vaddr_t, vaddr_t, vaddr_t);
82 int			 uvm_addr_linsearch(struct vm_map*,
83 			    struct uvm_addr_state*, struct vm_map_entry**,
84 			    vaddr_t *addr_out, vaddr_t, vsize_t,
85 			    vaddr_t, vaddr_t, int, vaddr_t, vaddr_t,
86 			    vsize_t, vsize_t);
87 int			 uvm_addr_invoke(struct vm_map*,
88 			    struct uvm_addr_state*, struct vm_map_entry**,
89 			    struct vm_map_entry**, vaddr_t*,
90 			    vsize_t, vaddr_t, vaddr_t, vm_prot_t, vaddr_t);
91 struct uvm_addr_state	*uaddr_lin_create(vaddr_t, vaddr_t);
92 struct uvm_addr_state	*uaddr_rnd_create(vaddr_t, vaddr_t);
93 struct uvm_addr_state	*uaddr_hint_create(vaddr_t, vaddr_t, vsize_t);
94 #ifndef SMALL_KERNEL
95 struct uvm_addr_state	*uaddr_bestfit_create(vaddr_t, vaddr_t);
96 struct uvm_addr_state	*uaddr_pivot_create(vaddr_t, vaddr_t);
97 struct uvm_addr_state	*uaddr_stack_brk_create(vaddr_t, vaddr_t);
98 #endif /* SMALL_KERNEL */
99 int			 uvm_addr_fitspace(vaddr_t*, vaddr_t*,
100 			    vaddr_t, vaddr_t, vsize_t, vaddr_t, vaddr_t,
101 			    vsize_t, vsize_t);
102 
103 #if defined(DEBUG) || defined(DDB)
104 void			 uvm_addr_print(struct uvm_addr_state*, const char*,
105 			    boolean_t, int (*pr)(const char*, ...));
106 #endif /* DEBUG || DDB */
107 
108 /*
109  * Kernel bootstrap allocator.
110  */
111 RB_HEAD(uaddr_free_rbtree, vm_map_entry);
112 RB_PROTOTYPE(uaddr_free_rbtree, vm_map_entry, dfree.rbtree,
113     uvm_mapent_fspace_cmp);
114 
115 extern struct uvm_addr_state uaddr_kbootstrap;
116 
117 #endif /* _KERNEL */
118 #endif /* _UVM_UVM_ADDR_H_ */
119