1 /* 2 * Copyright (c) 2023 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29 #ifndef _VM_VM_PROTOS_INTERNAL_H_ 30 #define _VM_VM_PROTOS_INTERNAL_H_ 31 32 #include <sys/cdefs.h> 33 #include <vm/vm_protos.h> 34 35 __BEGIN_DECLS 36 37 #ifdef XNU_KERNEL_PRIVATE 38 39 extern kern_return_t 40 vnode_pager_get_object_vnode( 41 memory_object_t mem_obj, 42 uintptr_t * vnodeaddr, 43 uint32_t * vid); 44 45 #if CONFIG_CODE_DECRYPTION 46 extern memory_object_t apple_protect_pager_setup( 47 vm_object_t backing_object, 48 vm_object_offset_t backing_offset, 49 vm_object_offset_t crypto_backing_offset, 50 struct pager_crypt_info *crypt_info, 51 vm_object_offset_t crypto_start, 52 vm_object_offset_t crypto_end, 53 boolean_t cache_pager); 54 #endif /* CONFIG_CODE_DECRYPTION */ 55 56 extern memory_object_t shared_region_pager_setup( 57 vm_object_t backing_object, 58 vm_object_offset_t backing_offset, 59 struct vm_shared_region_slide_info *slide_info, 60 uint64_t jop_key); 61 62 extern uint64_t apple_protect_pager_purge_all(void); 63 extern uint64_t shared_region_pager_purge_all(void); 64 extern uint64_t dyld_pager_purge_all(void); 65 66 #if __has_feature(ptrauth_calls) 67 extern memory_object_t shared_region_pager_match( 68 vm_object_t backing_object, 69 vm_object_offset_t backing_offset, 70 struct vm_shared_region_slide_info *slide_info, 71 uint64_t jop_key); 72 73 extern void shared_region_pager_match_task_key(memory_object_t memobj, task_t task); 74 #endif /* __has_feature(ptrauth_calls) */ 75 76 extern void vnode_pager_was_dirtied( 77 struct vnode *, 78 vm_object_offset_t, 79 vm_object_offset_t); 80 81 extern uint32_t vnode_trim(struct vnode *, int64_t offset, unsigned long len); 82 83 extern vm_object_offset_t vnode_pager_get_filesize( 84 struct vnode *); 85 extern uint32_t vnode_pager_isinuse( 86 struct vnode *); 87 extern boolean_t vnode_pager_isSSD( 88 struct vnode *); 89 #if FBDP_DEBUG_OBJECT_NO_PAGER 90 extern bool vnode_pager_forced_unmount( 91 struct vnode *); 92 #endif /* FBDP_DEBUG_OBJECT_NO_PAGER */ 93 extern void vnode_pager_throttle( 94 void); 95 extern uint32_t vnode_pager_return_throttle_io_limit( 96 struct vnode *, 97 uint32_t *); 98 extern kern_return_t vnode_pager_get_name( 99 struct vnode *vp, 100 char *pathname, 101 vm_size_t pathname_len, 102 char *filename, 103 vm_size_t filename_len, 104 boolean_t *truncated_path_p); 105 struct timespec; 106 extern kern_return_t vnode_pager_get_mtime( 107 struct vnode *vp, 108 struct timespec *mtime, 109 struct timespec *cs_mtime); 110 extern kern_return_t vnode_pager_get_cs_blobs( 111 struct vnode *vp, 112 void **blobs); 113 114 #if CONFIG_IOSCHED 115 void vnode_pager_issue_reprioritize_io( 116 struct vnode *devvp, 117 uint64_t blkno, 118 uint32_t len, 119 int priority); 120 #endif 121 122 extern kern_return_t vnode_pager_get_object_size( 123 memory_object_t, 124 memory_object_offset_t *); 125 126 extern void vnode_pager_dirtied( 127 memory_object_t, 128 vm_object_offset_t, 129 vm_object_offset_t); 130 extern kern_return_t vnode_pager_get_isinuse( 131 memory_object_t, 132 uint32_t *); 133 extern kern_return_t vnode_pager_get_isSSD( 134 memory_object_t, 135 boolean_t *); 136 #if FBDP_DEBUG_OBJECT_NO_PAGER 137 extern kern_return_t vnode_pager_get_forced_unmount( 138 memory_object_t, 139 bool *); 140 #endif /* FBDP_DEBUG_OBJECT_NO_PAGER */ 141 extern kern_return_t vnode_pager_get_throttle_io_limit( 142 memory_object_t, 143 uint32_t *); 144 extern kern_return_t vnode_pager_get_object_name( 145 memory_object_t mem_obj, 146 char *pathname, 147 vm_size_t pathname_len, 148 char *filename, 149 vm_size_t filename_len, 150 boolean_t *truncated_path_p); 151 struct timespec; 152 extern kern_return_t vnode_pager_get_object_mtime( 153 memory_object_t mem_obj, 154 struct timespec *mtime, 155 struct timespec *cs_mtime); 156 157 #if CHECK_CS_VALIDATION_BITMAP 158 extern kern_return_t vnode_pager_cs_check_validation_bitmap( 159 memory_object_t mem_obj, 160 memory_object_offset_t offset, 161 int optype); 162 #endif /* CHECK_CS_VALIDATION_BITMAP */ 163 164 extern kern_return_t vnode_pager_data_request( 165 memory_object_t, 166 memory_object_offset_t, 167 memory_object_cluster_size_t, 168 vm_prot_t, 169 memory_object_fault_info_t); 170 extern kern_return_t vnode_pager_data_return( 171 memory_object_t, 172 memory_object_offset_t, 173 memory_object_cluster_size_t, 174 memory_object_offset_t *, 175 int *, 176 boolean_t, 177 boolean_t, 178 int); 179 extern kern_return_t vnode_pager_data_initialize( 180 memory_object_t, 181 memory_object_offset_t, 182 memory_object_cluster_size_t); 183 extern void vnode_pager_reference( 184 memory_object_t mem_obj); 185 extern kern_return_t vnode_pager_map( 186 memory_object_t mem_obj, 187 vm_prot_t prot); 188 extern kern_return_t vnode_pager_last_unmap( 189 memory_object_t mem_obj); 190 191 extern kern_return_t vnode_pager_terminate( 192 memory_object_t); 193 extern struct vnode *vnode_pager_lookup_vnode( 194 memory_object_t); 195 196 extern bool memory_object_is_vnode_pager(memory_object_t mem_obj); 197 198 struct vm_map_entry; 199 extern struct vm_object *find_vnode_object(struct vm_map_entry *entry); 200 201 extern boolean_t is_device_pager_ops(const struct memory_object_pager_ops *pager_ops); 202 203 extern void log_stack_execution_failure(addr64_t vaddr, vm_prot_t prot); 204 extern void log_unnest_badness( 205 vm_map_t map, 206 vm_map_offset_t start_unnest, 207 vm_map_offset_t end_unnest, 208 boolean_t is_nested_map, 209 vm_map_offset_t lowest_unnestable_addr); 210 211 extern vm_object_t vm_named_entry_to_vm_object( 212 vm_named_entry_t named_entry); 213 extern void vm_named_entry_associate_vm_object( 214 vm_named_entry_t named_entry, 215 vm_object_t object, 216 vm_object_offset_t offset, 217 vm_object_size_t size, 218 vm_prot_t prot); 219 220 extern int macx_backing_store_compaction(int flags); 221 extern unsigned int mach_vm_ctl_page_free_wanted(void); 222 223 extern kern_return_t compressor_memory_object_create( 224 memory_object_size_t, 225 memory_object_t *); 226 227 u_int32_t vnode_trim_list(struct vnode *vp, struct trim_list *tl, boolean_t route_only); 228 229 extern void vm_start_ecc_thread(void); 230 extern void vm_ecc_lock(void); 231 extern void vm_ecc_unlock(void); 232 233 void vm_purgeable_nonvolatile_owner_update(task_t owner, 234 int delta); 235 void vm_purgeable_volatile_owner_update(task_t owner, 236 int delta); 237 238 #endif /* XNU_KERNEL_PRIVATE */ 239 240 __END_DECLS 241 242 #endif /* _VM_VM_PROTOS_INTERNAL_H_ */ 243