#ifndef _UVM_UVM_ADDR_H_
#define _UVM_UVM_ADDR_H_
struct uvm_addr_state {
vaddr_t uaddr_minaddr;
vaddr_t uaddr_maxaddr;
const struct uvm_addr_functions *uaddr_functions;
};
struct uvm_addr_functions {
int (*uaddr_select)(struct vm_map *map,
struct uvm_addr_state *uaddr,
struct vm_map_entry **entry_out, vaddr_t *addr_out,
vsize_t sz, vaddr_t align, vaddr_t offset,
vm_prot_t prot, vaddr_t hint);
void (*uaddr_free_insert)(struct vm_map *map,
struct uvm_addr_state *uaddr_state,
struct vm_map_entry *entry);
void (*uaddr_free_remove)(struct vm_map *map,
struct uvm_addr_state *uaddr_state,
struct vm_map_entry *entry);
void (*uaddr_destroy)(struct uvm_addr_state *uaddr_state);
void (*uaddr_print)(struct uvm_addr_state *uaddr_state, boolean_t full,
int (*pr)(const char *, ...));
const char* uaddr_name;
};
#ifdef _KERNEL
void uvm_addr_init(void);
void uvm_addr_destroy(struct uvm_addr_state *);
int uvm_addr_linsearch(struct vm_map *,
struct uvm_addr_state *, struct vm_map_entry **,
vaddr_t *addr_out, vaddr_t, vsize_t,
vaddr_t, vaddr_t, int, vaddr_t, vaddr_t,
vsize_t, vsize_t);
int uvm_addr_invoke(struct vm_map *,
struct uvm_addr_state *, struct vm_map_entry **,
struct vm_map_entry **, vaddr_t*,
vsize_t, vaddr_t, vaddr_t, vm_prot_t, vaddr_t);
#if 0
struct uvm_addr_state *uaddr_lin_create(vaddr_t, vaddr_t);
#endif
struct uvm_addr_state *uaddr_rnd_create(vaddr_t, vaddr_t);
#ifndef SMALL_KERNEL
struct uvm_addr_state *uaddr_bestfit_create(vaddr_t, vaddr_t);
struct uvm_addr_state *uaddr_pivot_create(vaddr_t, vaddr_t);
struct uvm_addr_state *uaddr_stack_brk_create(vaddr_t, vaddr_t);
#endif
int uvm_addr_fitspace(vaddr_t *, vaddr_t *,
vaddr_t, vaddr_t, vsize_t, vaddr_t, vaddr_t,
vsize_t, vsize_t);
#if defined(DEBUG) || defined(DDB)
void uvm_addr_print(struct uvm_addr_state *, const char *,
boolean_t, int (*pr)(const char *, ...));
#endif
RBT_HEAD(uaddr_free_rbtree, vm_map_entry);
RBT_PROTOTYPE(uaddr_free_rbtree, vm_map_entry, dfree.rbtree,
uvm_mapent_fspace_cmp);
extern struct uvm_addr_state uaddr_kbootstrap;
#endif
#endif