xref: /openbsd/sys/uvm/uvm_addr.h (revision 1fece9ea)
1*1fece9eaSstefan /*	$OpenBSD: uvm_addr.h,v 1.7 2017/01/17 17:19:21 stefan Exp $	*/
2181c6205Sariane 
3181c6205Sariane /*
4181c6205Sariane  * Copyright (c) 2011 Ariane van der Steldt <ariane@stack.nl>
5181c6205Sariane  *
6181c6205Sariane  * Permission to use, copy, modify, and distribute this software for any
7181c6205Sariane  * purpose with or without fee is hereby granted, provided that the above
8181c6205Sariane  * copyright notice and this permission notice appear in all copies.
9181c6205Sariane  *
10181c6205Sariane  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11181c6205Sariane  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12181c6205Sariane  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13181c6205Sariane  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14181c6205Sariane  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15181c6205Sariane  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16181c6205Sariane  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17181c6205Sariane  */
18181c6205Sariane 
19181c6205Sariane #ifndef _UVM_UVM_ADDR_H_
20181c6205Sariane #define _UVM_UVM_ADDR_H_
21181c6205Sariane 
22181c6205Sariane /*
23181c6205Sariane  * Address selection logic.
24181c6205Sariane  *
25181c6205Sariane  * Address selection is just that: selection. These functions may make no
26181c6205Sariane  * changes to the map, except for their own state (which is passed as a
27181c6205Sariane  * uaddr_state pointer).
28181c6205Sariane  */
29181c6205Sariane 
30181c6205Sariane 
31181c6205Sariane /*
32181c6205Sariane  * UVM address selection base state.
33181c6205Sariane  *
34181c6205Sariane  * Each uvm address algorithm requires these parameters:
35181c6205Sariane  * - lower bound address (page aligned)
36181c6205Sariane  * - upper bound address (page aligned)
37181c6205Sariane  * - function address pointers
38181c6205Sariane  */
39181c6205Sariane struct uvm_addr_state {
40181c6205Sariane 	vaddr_t uaddr_minaddr;
41181c6205Sariane 	vaddr_t uaddr_maxaddr;
42181c6205Sariane 	const struct uvm_addr_functions *uaddr_functions;
43181c6205Sariane };
44181c6205Sariane 
45181c6205Sariane /*
46181c6205Sariane  * This structure describes one algorithm implementation.
47181c6205Sariane  *
48181c6205Sariane  * Each algorithm is described in terms of:
49181c6205Sariane  * - uaddr_select: an address selection algorithm
50181c6205Sariane  * - uaddr_free_insert: a freelist insertion function (optional)
51181c6205Sariane  * - uaddr_free_remove: a freelist deletion function (optional)
52181c6205Sariane  * - uaddr_destroy: a destructor for the algorithm state
53181c6205Sariane  */
54181c6205Sariane struct uvm_addr_functions {
55181c6205Sariane 	int (*uaddr_select)(struct vm_map *map,
56181c6205Sariane 	    struct uvm_addr_state *uaddr,
57181c6205Sariane 	    struct vm_map_entry **entry_out, vaddr_t *addr_out,
58181c6205Sariane 	    vsize_t sz, vaddr_t align, vaddr_t offset,
59181c6205Sariane 	    vm_prot_t prot, vaddr_t hint);
60181c6205Sariane 	void (*uaddr_free_insert)(struct vm_map *map,
61181c6205Sariane 	    struct uvm_addr_state *uaddr_state,
62181c6205Sariane 	    struct vm_map_entry *entry);
63181c6205Sariane 	void (*uaddr_free_remove)(struct vm_map *map,
64181c6205Sariane 	    struct uvm_addr_state *uaddr_state,
65181c6205Sariane 	    struct vm_map_entry *entry);
66181c6205Sariane 	void (*uaddr_destroy)(struct uvm_addr_state *uaddr_state);
67181c6205Sariane 	void (*uaddr_print)(struct uvm_addr_state *uaddr_state, boolean_t full,
68181c6205Sariane 	    int (*pr)(const char *, ...));
69181c6205Sariane 
70181c6205Sariane 	const char* uaddr_name;		/* Name of the allocator. */
71181c6205Sariane };
72181c6205Sariane 
73181c6205Sariane 
74181c6205Sariane #ifdef _KERNEL
75181c6205Sariane 
76181c6205Sariane void			 uvm_addr_init(void);
77181c6205Sariane void			 uvm_addr_destroy(struct uvm_addr_state *);
78181c6205Sariane vaddr_t			 uvm_addr_align(vaddr_t, vaddr_t, vaddr_t);
79181c6205Sariane vaddr_t			 uvm_addr_align_back(vaddr_t, vaddr_t, vaddr_t);
80181c6205Sariane int			 uvm_addr_linsearch(struct vm_map *,
81181c6205Sariane 			    struct uvm_addr_state *, struct vm_map_entry **,
82181c6205Sariane 			    vaddr_t *addr_out, vaddr_t, vsize_t,
83181c6205Sariane 			    vaddr_t, vaddr_t, int, vaddr_t, vaddr_t,
84181c6205Sariane 			    vsize_t, vsize_t);
85181c6205Sariane int			 uvm_addr_invoke(struct vm_map *,
86181c6205Sariane 			    struct uvm_addr_state *, struct vm_map_entry **,
87181c6205Sariane 			    struct vm_map_entry **, vaddr_t*,
88181c6205Sariane 			    vsize_t, vaddr_t, vaddr_t, vm_prot_t, vaddr_t);
89f09c1a3eSmiod #if 0
90181c6205Sariane struct uvm_addr_state	*uaddr_lin_create(vaddr_t, vaddr_t);
91f09c1a3eSmiod #endif
92181c6205Sariane struct uvm_addr_state	*uaddr_rnd_create(vaddr_t, vaddr_t);
9359399f65Sariane #ifndef SMALL_KERNEL
94181c6205Sariane struct uvm_addr_state	*uaddr_bestfit_create(vaddr_t, vaddr_t);
95181c6205Sariane struct uvm_addr_state	*uaddr_pivot_create(vaddr_t, vaddr_t);
96181c6205Sariane struct uvm_addr_state	*uaddr_stack_brk_create(vaddr_t, vaddr_t);
9759399f65Sariane #endif /* SMALL_KERNEL */
98181c6205Sariane int			 uvm_addr_fitspace(vaddr_t *, vaddr_t *,
99181c6205Sariane 			    vaddr_t, vaddr_t, vsize_t, vaddr_t, vaddr_t,
100181c6205Sariane 			    vsize_t, vsize_t);
101181c6205Sariane 
102181c6205Sariane #if defined(DEBUG) || defined(DDB)
103181c6205Sariane void			 uvm_addr_print(struct uvm_addr_state *, const char *,
104181c6205Sariane 			    boolean_t, int (*pr)(const char *, ...));
105181c6205Sariane #endif /* DEBUG || DDB */
106181c6205Sariane 
107181c6205Sariane /*
108181c6205Sariane  * Kernel bootstrap allocator.
109181c6205Sariane  */
11071b0131cSdlg RBT_HEAD(uaddr_free_rbtree, vm_map_entry);
11171b0131cSdlg RBT_PROTOTYPE(uaddr_free_rbtree, vm_map_entry, dfree.rbtree,
112181c6205Sariane     uvm_mapent_fspace_cmp);
113181c6205Sariane 
114181c6205Sariane extern struct uvm_addr_state uaddr_kbootstrap;
115181c6205Sariane 
116181c6205Sariane #endif /* _KERNEL */
117181c6205Sariane #endif /* _UVM_UVM_ADDR_H_ */
118