vm_extern.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*-
  2. * SPDX-License-Identifier: BSD-3-Clause
  3. *
  4. * Copyright (c) 1992, 1993
  5. * The Regents of the University of California. All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. Neither the name of the University nor the names of its contributors
  16. * may be used to endorse or promote products derived from this software
  17. * without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. * SUCH DAMAGE.
  30. */
  31. #ifndef _VM_EXTERN_H_
  32. #define _VM_EXTERN_H_
  33. struct pmap;
  34. struct proc;
  35. struct vmspace;
  36. struct vnode;
  37. struct vmem;
  38. #ifdef _KERNEL
  39. #include <sys/kassert.h>
  40. struct cdev;
  41. struct cdevsw;
  42. struct domainset;
  43. /* These operate on kernel virtual addresses only. */
  44. vm_offset_t kva_alloc(vm_size_t);
  45. vm_offset_t kva_alloc_aligned(vm_size_t, vm_size_t);
  46. void kva_free(vm_offset_t, vm_size_t);
  47. /* These operate on pageable virtual addresses. */
  48. vm_offset_t kmap_alloc_wait(vm_map_t, vm_size_t);
  49. void kmap_free_wakeup(vm_map_t, vm_offset_t, vm_size_t);
  50. /* These operate on virtual addresses backed by memory. */
  51. void *kmem_alloc_attr(vm_size_t size, int flags,
  52. vm_paddr_t low, vm_paddr_t high, vm_memattr_t memattr);
  53. void *kmem_alloc_attr_domainset(struct domainset *ds, vm_size_t size,
  54. int flags, vm_paddr_t low, vm_paddr_t high, vm_memattr_t memattr);
  55. void *kmem_alloc_contig(vm_size_t size, int flags,
  56. vm_paddr_t low, vm_paddr_t high, u_long alignment, vm_paddr_t boundary,
  57. vm_memattr_t memattr);
  58. void *kmem_alloc_contig_domainset(struct domainset *ds, vm_size_t size,
  59. int flags, vm_paddr_t low, vm_paddr_t high, u_long alignment,
  60. vm_paddr_t boundary, vm_memattr_t memattr);
  61. void *kmem_malloc(vm_size_t size, int flags);
  62. void *kmem_malloc_domainset(struct domainset *ds, vm_size_t size,
  63. int flags);
  64. void kmem_free(void *addr, vm_size_t size);
  65. /* This provides memory for previously allocated address space. */
  66. int kmem_back(vm_object_t, vm_offset_t, vm_size_t, int);
  67. int kmem_back_domain(int, vm_object_t, vm_offset_t, vm_size_t, int);
  68. void kmem_unback(vm_object_t, vm_offset_t, vm_size_t);
  69. /* Bootstrapping. */
  70. void kmem_bootstrap_free(vm_offset_t, vm_size_t);
  71. void kmem_subinit(vm_map_t, vm_map_t, vm_offset_t *, vm_offset_t *, vm_size_t,
  72. bool);
  73. void kmem_init(vm_offset_t, vm_offset_t);
  74. void kmem_init_zero_region(void);
  75. void kmeminit(void);
  76. bool kernacc(void *, int, int);
  77. bool useracc(void *, int, int);
  78. int vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
  79. int fault_flags, vm_page_t *m_hold);
  80. void vm_fault_copy_entry(vm_map_t, vm_map_t, vm_map_entry_t, vm_map_entry_t,
  81. vm_ooffset_t *);
  82. int vm_fault_disable_pagefaults(void);
  83. void vm_fault_enable_pagefaults(int save);
  84. int vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len,
  85. vm_prot_t prot, vm_page_t *ma, int max_count);
  86. int vm_fault_trap(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
  87. int fault_flags, int *signo, int *ucode);
  88. int vm_forkproc(struct thread *, struct proc *, struct thread *,
  89. struct vmspace *, int);
  90. void vm_waitproc(struct proc *);
  91. int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int,
  92. objtype_t, void *, vm_ooffset_t);
  93. int vm_mmap_object(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t,
  94. vm_prot_t, int, vm_object_t, vm_ooffset_t, boolean_t, struct thread *);
  95. int vm_mmap_to_errno(int rv);
  96. int vm_mmap_cdev(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *,
  97. int *, struct cdev *, struct cdevsw *, vm_ooffset_t *, vm_object_t *);
  98. int vm_mmap_vnode(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *, int *,
  99. struct vnode *, vm_ooffset_t *, vm_object_t *, boolean_t *);
  100. void vm_set_page_size(void);
  101. void vm_sync_icache(vm_map_t, vm_offset_t, vm_size_t);
  102. typedef int (*pmap_pinit_t)(struct pmap *pmap);
  103. struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t, pmap_pinit_t);
  104. struct vmspace *vmspace_fork(struct vmspace *, vm_ooffset_t *);
  105. int vmspace_exec(struct proc *, vm_offset_t, vm_offset_t);
  106. int vmspace_unshare(struct proc *);
  107. void vmspace_exit(struct thread *);
  108. struct vmspace *vmspace_acquire_ref(struct proc *);
  109. void vmspace_free(struct vmspace *);
  110. void vmspace_exitfree(struct proc *);
  111. void vmspace_switch_aio(struct vmspace *);
  112. void vnode_pager_setsize(struct vnode *, vm_ooffset_t);
  113. void vnode_pager_purge_range(struct vnode *, vm_ooffset_t, vm_ooffset_t);
  114. int vslock(void *, size_t);
  115. void vsunlock(void *, size_t);
  116. struct sf_buf *vm_imgact_map_page(vm_object_t object, vm_ooffset_t offset);
  117. void vm_imgact_unmap_page(struct sf_buf *sf);
  118. void vm_thread_dispose(struct thread *td);
  119. int vm_thread_new(struct thread *td, int pages);
  120. vm_pindex_t vm_kstack_pindex(vm_offset_t ks, int npages);
  121. vm_object_t vm_thread_kstack_size_to_obj(int npages);
  122. int vm_thread_stack_back(vm_offset_t kaddr, vm_page_t ma[], int npages,
  123. int req_class, int domain);
  124. u_int vm_active_count(void);
  125. u_int vm_inactive_count(void);
  126. u_int vm_laundry_count(void);
  127. u_int vm_wait_count(void);
  128. /*
  129. * Is pa a multiple of alignment, which is a power-of-two?
  130. */
  131. static inline bool
  132. vm_addr_align_ok(vm_paddr_t pa, u_long alignment)
  133. {
  134. KASSERT(powerof2(alignment), ("%s: alignment is not a power of 2: %#lx",
  135. __func__, alignment));
  136. return ((pa & (alignment - 1)) == 0);
  137. }
  138. /*
  139. * Do the first and last addresses of a range match in all bits except the ones
  140. * in -boundary (a power-of-two)? For boundary == 0, all addresses match.
  141. */
  142. static inline bool
  143. vm_addr_bound_ok(vm_paddr_t pa, vm_paddr_t size, vm_paddr_t boundary)
  144. {
  145. KASSERT(powerof2(boundary), ("%s: boundary is not a power of 2: %#jx",
  146. __func__, (uintmax_t)boundary));
  147. return (((pa ^ (pa + size - 1)) & -boundary) == 0);
  148. }
  149. static inline bool
  150. vm_addr_ok(vm_paddr_t pa, vm_paddr_t size, u_long alignment,
  151. vm_paddr_t boundary)
  152. {
  153. return (vm_addr_align_ok(pa, alignment) &&
  154. vm_addr_bound_ok(pa, size, boundary));
  155. }
  156. #endif /* _KERNEL */
  157. #endif /* !_VM_EXTERN_H_ */