1/* $OpenBSD: uvm_addr.h,v 1.8 2024/07/04 04:52:10 jsg 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/*
23 * Address selection logic.
24 *
25 * Address selection is just that: selection. These functions may make no
26 * changes to the map, except for their own state (which is passed as a
27 * uaddr_state pointer).
28 */
29
30
31/*
32 * UVM address selection base state.
33 *
34 * Each uvm address algorithm requires these parameters:
35 * - lower bound address (page aligned)
36 * - upper bound address (page aligned)
37 * - function address pointers
38 */
39struct uvm_addr_state {
40 vaddr_t uaddr_minaddr;
41 vaddr_t uaddr_maxaddr;
42 const struct uvm_addr_functions *uaddr_functions;
43};
44
45/*
46 * This structure describes one algorithm implementation.
47 *
48 * Each algorithm is described in terms of:
49 * - uaddr_select: an address selection algorithm
50 * - uaddr_free_insert: a freelist insertion function (optional)
51 * - uaddr_free_remove: a freelist deletion function (optional)
52 * - uaddr_destroy: a destructor for the algorithm state
53 */
54struct uvm_addr_functions {
55 int (*uaddr_select)(struct vm_map *map,
56 struct uvm_addr_state *uaddr,
57 struct vm_map_entry **entry_out, vaddr_t *addr_out,
58 vsize_t sz, vaddr_t align, vaddr_t offset,
59 vm_prot_t prot, vaddr_t hint);
60 void (*uaddr_free_insert)(struct vm_map *map,
61 struct uvm_addr_state *uaddr_state,
62 struct vm_map_entry *entry);
63 void (*uaddr_free_remove)(struct vm_map *map,
64 struct uvm_addr_state *uaddr_state,
65 struct vm_map_entry *entry);
66 void (*uaddr_destroy)(struct uvm_addr_state *uaddr_state);
67 void (*uaddr_print)(struct uvm_addr_state *uaddr_state, boolean_t full,
68 int (*pr)(const char *, ...));
69
70 const char* uaddr_name; /* Name of the allocator. */
71};
72
73
74#ifdef _KERNEL
75
76void uvm_addr_init(void);
77void uvm_addr_destroy(struct uvm_addr_state *);
78int uvm_addr_linsearch(struct vm_map *,
79 struct uvm_addr_state *, struct vm_map_entry **,
80 vaddr_t *addr_out, vaddr_t, vsize_t,
81 vaddr_t, vaddr_t, int, vaddr_t, vaddr_t,
82 vsize_t, vsize_t);
83int uvm_addr_invoke(struct vm_map *,
84 struct uvm_addr_state *, struct vm_map_entry **,
85 struct vm_map_entry **, vaddr_t*,
86 vsize_t, vaddr_t, vaddr_t, vm_prot_t, vaddr_t);
87#if 0
88struct uvm_addr_state *uaddr_lin_create(vaddr_t, vaddr_t);
89#endif
90struct uvm_addr_state *uaddr_rnd_create(vaddr_t, vaddr_t);
91#ifndef SMALL_KERNEL
92struct uvm_addr_state *uaddr_bestfit_create(vaddr_t, vaddr_t);
93struct uvm_addr_state *uaddr_pivot_create(vaddr_t, vaddr_t);
94struct uvm_addr_state *uaddr_stack_brk_create(vaddr_t, vaddr_t);
95#endif /* SMALL_KERNEL */
96int uvm_addr_fitspace(vaddr_t *, vaddr_t *,
97 vaddr_t, vaddr_t, vsize_t, vaddr_t, vaddr_t,
98 vsize_t, vsize_t);
99
100#if defined(DEBUG) || defined(DDB)
101void uvm_addr_print(struct uvm_addr_state *, const char *,
102 boolean_t, int (*pr)(const char *, ...));
103#endif /* DEBUG || DDB */
104
105/*
106 * Kernel bootstrap allocator.
107 */
108RBT_HEAD(uaddr_free_rbtree, vm_map_entry);
109RBT_PROTOTYPE(uaddr_free_rbtree, vm_map_entry, dfree.rbtree,
110 uvm_mapent_fspace_cmp);
111
112extern struct uvm_addr_state uaddr_kbootstrap;
113
114#endif /* _KERNEL */
115#endif /* _UVM_UVM_ADDR_H_ */