1 /* 2 * Copyright (c) 2000-2016 Apple Computer, 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 * @OSF_COPYRIGHT@ 30 */ 31 /* 32 * Mach Operating System 33 * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University 34 * All Rights Reserved. 35 * 36 * Permission to use, copy, modify and distribute this software and its 37 * documentation is hereby granted, provided that both the copyright 38 * notice and this permission notice appear in all copies of the 39 * software, derivative works or modified versions, and any portions 40 * thereof, and that both notices appear in supporting documentation. 41 * 42 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 43 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 44 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 45 * 46 * Carnegie Mellon requests users of this software to return to 47 * 48 * Software Distribution Coordinator or [email protected] 49 * School of Computer Science 50 * Carnegie Mellon University 51 * Pittsburgh PA 15213-3890 52 * 53 * any improvements or extensions that they make and grant Carnegie Mellon 54 * the rights to redistribute these changes. 55 */ 56 /* 57 */ 58 /* 59 * File: memory_object.h 60 * Author: Michael Wayne Young 61 * 62 * External memory management interface definition. 63 */ 64 65 #ifndef _MACH_MEMORY_OBJECT_TYPES_H_ 66 #define _MACH_MEMORY_OBJECT_TYPES_H_ 67 68 /* 69 * User-visible types used in the external memory 70 * management interface: 71 */ 72 73 #include <mach/port.h> 74 #include <mach/message.h> 75 #include <mach/vm_prot.h> 76 #include <mach/vm_sync.h> 77 #include <mach/vm_types.h> 78 #include <mach/machine/vm_types.h> 79 80 #include <sys/cdefs.h> 81 82 #if XNU_KERNEL_PRIVATE 83 #include <os/refcnt.h> 84 #if __LP64__ 85 #define MEMORY_OBJECT_HAS_REFCOUNT 1 86 #else 87 #define MEMORY_OBJECT_HAS_REFCOUNT 0 88 #endif 89 #endif /* XNU_KERNEL_PRIVATE */ 90 91 #define VM_64_BIT_DATA_OBJECTS 92 93 typedef unsigned long long memory_object_offset_t; 94 typedef unsigned long long memory_object_size_t; 95 typedef natural_t memory_object_cluster_size_t; 96 typedef natural_t * memory_object_fault_info_t; 97 98 typedef unsigned long long vm_object_id_t; 99 100 101 /* 102 * Temporary until real EMMI version gets re-implemented 103 */ 104 105 #ifdef KERNEL_PRIVATE 106 107 /* IMPORTANT: this type must match "ipc_object_bits_t" from ipc/ipc_port.h */ 108 typedef natural_t mo_ipc_object_bits_t; 109 110 struct memory_object_pager_ops; /* forward declaration */ 111 112 typedef struct vm_object *memory_object_control_t; 113 /* 114 * "memory_object" used to be a Mach port in user space and could be passed 115 * as such to some kernel APIs. 116 * 117 * Its first field must match the "io_bits" field of a 118 * "struct ipc_object" to identify them as a "IKOT_MEMORY_OBJECT". 119 */ 120 typedef struct memory_object { 121 mo_ipc_object_bits_t mo_ikot; /* DO NOT CHANGE */ 122 #if __LP64__ 123 #if XNU_KERNEL_PRIVATE 124 /* 125 * On LP64 there's a 4 byte hole that is perfect for a refcount. 126 * Expose it so that all pagers can take advantage of it. 127 */ 128 os_ref_atomic_t mo_ref; 129 #else 130 unsigned int __mo_padding; 131 #endif /* XNU_KERNEL_PRIVATE */ 132 #endif /* __LP64__ */ 133 const struct memory_object_pager_ops *mo_pager_ops; 134 memory_object_control_t mo_control; 135 } *memory_object_t; 136 137 typedef const struct memory_object_pager_ops { 138 void (*memory_object_reference)( 139 memory_object_t mem_obj); 140 void (*memory_object_deallocate)( 141 memory_object_t mem_obj); 142 kern_return_t (*memory_object_init)( 143 memory_object_t mem_obj, 144 memory_object_control_t mem_control, 145 memory_object_cluster_size_t size); 146 kern_return_t (*memory_object_terminate)( 147 memory_object_t mem_obj); 148 kern_return_t (*memory_object_data_request)( 149 memory_object_t mem_obj, 150 memory_object_offset_t offset, 151 memory_object_cluster_size_t length, 152 vm_prot_t desired_access, 153 memory_object_fault_info_t fault_info); 154 kern_return_t (*memory_object_data_return)( 155 memory_object_t mem_obj, 156 memory_object_offset_t offset, 157 memory_object_cluster_size_t size, 158 memory_object_offset_t *resid_offset, 159 int *io_error, 160 boolean_t dirty, 161 boolean_t kernel_copy, 162 int upl_flags); 163 kern_return_t (*memory_object_data_initialize)( 164 memory_object_t mem_obj, 165 memory_object_offset_t offset, 166 memory_object_cluster_size_t size); 167 #if XNU_KERNEL_PRIVATE 168 void *__obsolete_memory_object_data_unlock; 169 void *__obsolete_memory_object_synchronize; 170 #else 171 kern_return_t (*memory_object_data_unlock)( 172 memory_object_t mem_obj, 173 memory_object_offset_t offset, 174 memory_object_size_t size, 175 vm_prot_t desired_access); /* obsolete */ 176 kern_return_t (*memory_object_synchronize)( 177 memory_object_t mem_obj, 178 memory_object_offset_t offset, 179 memory_object_size_t size, 180 vm_sync_t sync_flags); /* obsolete */ 181 #endif /* !XNU_KERNEL_PRIVATE */ 182 kern_return_t (*memory_object_map)( 183 memory_object_t mem_obj, 184 vm_prot_t prot); 185 kern_return_t (*memory_object_last_unmap)( 186 memory_object_t mem_obj); 187 #if XNU_KERNEL_PRIVATE 188 void *__obsolete_memory_object_data_reclaim; 189 #else 190 kern_return_t (*memory_object_data_reclaim)( 191 memory_object_t mem_obj, 192 boolean_t reclaim_backing_store); /* obsolete */ 193 #endif /* !XNU_KERNEL_PRIVATE */ 194 boolean_t (*memory_object_backing_object)( 195 memory_object_t mem_obj, 196 memory_object_offset_t mem_obj_offset, 197 vm_object_t *backing_object, 198 vm_object_offset_t *backing_offset); 199 const char *memory_object_pager_name; 200 } * memory_object_pager_ops_t; 201 202 #else /* KERNEL_PRIVATE */ 203 204 typedef mach_port_t memory_object_t; 205 /* 206 * vestigial, maintained for source compatibility, 207 * no MIG interface will accept or return non NULL 208 * objects for those. 209 */ 210 typedef mach_port_t memory_object_control_t; 211 212 #endif /* KERNEL_PRIVATE */ 213 214 typedef memory_object_t *memory_object_array_t; 215 /* A memory object ... */ 216 /* Used by the kernel to retrieve */ 217 /* or store data */ 218 219 typedef mach_port_t memory_object_name_t; 220 /* Used to describe the memory ... */ 221 /* object in vm_regions() calls */ 222 223 typedef mach_port_t memory_object_default_t; 224 /* Registered with the host ... */ 225 /* for creating new internal objects */ 226 227 #define MEMORY_OBJECT_NULL ((memory_object_t) 0) 228 #define MEMORY_OBJECT_CONTROL_NULL ((memory_object_control_t) 0) 229 #define MEMORY_OBJECT_NAME_NULL ((memory_object_name_t) 0) 230 #define MEMORY_OBJECT_DEFAULT_NULL ((memory_object_default_t) 0) 231 232 233 typedef int memory_object_copy_strategy_t; 234 /* How memory manager handles copy: */ 235 #define MEMORY_OBJECT_COPY_NONE 0 236 /* ... No special support */ 237 #define MEMORY_OBJECT_COPY_CALL 1 238 /* ... Make call on memory manager */ 239 #define MEMORY_OBJECT_COPY_DELAY 2 240 /* ... Memory manager doesn't 241 * change data externally. 242 */ 243 #define MEMORY_OBJECT_COPY_TEMPORARY 3 244 /* ... Memory manager doesn't 245 * change data externally, and 246 * doesn't need to see changes. 247 */ 248 #define MEMORY_OBJECT_COPY_SYMMETRIC 4 249 /* ... Memory manager doesn't 250 * change data externally, 251 * doesn't need to see changes, 252 * and object will not be 253 * multiply mapped. 254 * 255 * XXX 256 * Not yet safe for non-kernel use. 257 */ 258 259 #define MEMORY_OBJECT_COPY_INVALID 5 260 /* ... An invalid copy strategy, 261 * for external objects which 262 * have not been initialized. 263 * Allows copy_strategy to be 264 * examined without also 265 * examining pager_ready and 266 * internal. 267 */ 268 269 typedef int memory_object_return_t; 270 /* Which pages to return to manager 271 * this time (lock_request) */ 272 #define MEMORY_OBJECT_RETURN_NONE 0 273 /* ... don't return any. */ 274 #define MEMORY_OBJECT_RETURN_DIRTY 1 275 /* ... only dirty pages. */ 276 #define MEMORY_OBJECT_RETURN_ALL 2 277 /* ... dirty and precious pages. */ 278 #define MEMORY_OBJECT_RETURN_ANYTHING 3 279 /* ... any resident page. */ 280 281 /* 282 * Data lock request flags 283 */ 284 285 #define MEMORY_OBJECT_DATA_FLUSH 0x1 286 #define MEMORY_OBJECT_DATA_NO_CHANGE 0x2 287 #define MEMORY_OBJECT_DATA_PURGE 0x4 288 #define MEMORY_OBJECT_COPY_SYNC 0x8 289 #define MEMORY_OBJECT_DATA_SYNC 0x10 290 #define MEMORY_OBJECT_IO_SYNC 0x20 291 #define MEMORY_OBJECT_DATA_FLUSH_ALL 0x40 292 293 /* 294 * Types for the memory object flavor interfaces 295 */ 296 297 #define MEMORY_OBJECT_INFO_MAX (1024) 298 typedef int *memory_object_info_t; 299 typedef int memory_object_flavor_t; 300 typedef int memory_object_info_data_t[MEMORY_OBJECT_INFO_MAX]; 301 302 303 #define MEMORY_OBJECT_PERFORMANCE_INFO 11 304 #define MEMORY_OBJECT_ATTRIBUTE_INFO 14 305 #define MEMORY_OBJECT_BEHAVIOR_INFO 15 306 307 #ifdef PRIVATE 308 309 #define OLD_MEMORY_OBJECT_BEHAVIOR_INFO 10 310 #define OLD_MEMORY_OBJECT_ATTRIBUTE_INFO 12 311 312 struct old_memory_object_behave_info { 313 memory_object_copy_strategy_t copy_strategy; 314 boolean_t temporary; 315 boolean_t invalidate; 316 }; 317 318 struct old_memory_object_attr_info { /* old attr list */ 319 boolean_t object_ready; 320 boolean_t may_cache; 321 memory_object_copy_strategy_t copy_strategy; 322 }; 323 324 typedef struct old_memory_object_behave_info *old_memory_object_behave_info_t; 325 typedef struct old_memory_object_behave_info old_memory_object_behave_info_data_t; 326 typedef struct old_memory_object_attr_info *old_memory_object_attr_info_t; 327 typedef struct old_memory_object_attr_info old_memory_object_attr_info_data_t; 328 329 #define OLD_MEMORY_OBJECT_BEHAVE_INFO_COUNT ((mach_msg_type_number_t) \ 330 (sizeof(old_memory_object_behave_info_data_t)/sizeof(int))) 331 #define OLD_MEMORY_OBJECT_ATTR_INFO_COUNT ((mach_msg_type_number_t) \ 332 (sizeof(old_memory_object_attr_info_data_t)/sizeof(int))) 333 334 #ifdef KERNEL 335 336 __BEGIN_DECLS 337 extern void memory_object_reference(memory_object_t object); 338 extern void memory_object_deallocate(memory_object_t object); 339 extern boolean_t memory_object_backing_object( 340 memory_object_t mem_obj, 341 memory_object_offset_t offset, 342 vm_object_t *backing_object, 343 vm_object_offset_t *backing_offset); 344 345 extern void memory_object_control_reference(memory_object_control_t control); 346 extern void memory_object_control_deallocate(memory_object_control_t control); 347 extern int memory_object_control_uiomove(memory_object_control_t, memory_object_offset_t, void *, int, int, int, int); 348 __END_DECLS 349 350 #endif /* KERNEL */ 351 352 #endif /* PRIVATE */ 353 354 struct memory_object_perf_info { 355 memory_object_cluster_size_t cluster_size; 356 boolean_t may_cache; 357 }; 358 359 struct memory_object_attr_info { 360 memory_object_copy_strategy_t copy_strategy; 361 memory_object_cluster_size_t cluster_size; 362 boolean_t may_cache_object; 363 boolean_t temporary; 364 }; 365 366 struct memory_object_behave_info { 367 memory_object_copy_strategy_t copy_strategy; 368 boolean_t temporary; 369 boolean_t invalidate; 370 boolean_t silent_overwrite; 371 boolean_t advisory_pageout; 372 }; 373 374 375 typedef struct memory_object_behave_info *memory_object_behave_info_t; 376 typedef struct memory_object_behave_info memory_object_behave_info_data_t; 377 378 typedef struct memory_object_perf_info *memory_object_perf_info_t; 379 typedef struct memory_object_perf_info memory_object_perf_info_data_t; 380 381 typedef struct memory_object_attr_info *memory_object_attr_info_t; 382 typedef struct memory_object_attr_info memory_object_attr_info_data_t; 383 384 #define MEMORY_OBJECT_BEHAVE_INFO_COUNT ((mach_msg_type_number_t) \ 385 (sizeof(memory_object_behave_info_data_t)/sizeof(int))) 386 #define MEMORY_OBJECT_PERF_INFO_COUNT ((mach_msg_type_number_t) \ 387 (sizeof(memory_object_perf_info_data_t)/sizeof(int))) 388 #define MEMORY_OBJECT_ATTR_INFO_COUNT ((mach_msg_type_number_t) \ 389 (sizeof(memory_object_attr_info_data_t)/sizeof(int))) 390 391 #define invalid_memory_object_flavor(f) \ 392 (f != MEMORY_OBJECT_ATTRIBUTE_INFO && \ 393 f != MEMORY_OBJECT_PERFORMANCE_INFO && \ 394 f != OLD_MEMORY_OBJECT_BEHAVIOR_INFO && \ 395 f != MEMORY_OBJECT_BEHAVIOR_INFO && \ 396 f != OLD_MEMORY_OBJECT_ATTRIBUTE_INFO) 397 398 399 /* 400 * Used to support options on memory_object_release_name call 401 */ 402 #define MEMORY_OBJECT_TERMINATE_IDLE 0x1 403 #define MEMORY_OBJECT_RESPECT_CACHE 0x2 404 #define MEMORY_OBJECT_RELEASE_NO_OP 0x4 405 406 407 /* named entry processor mapping options */ 408 /* enumerated */ 409 #define MAP_MEM_NOOP 0 410 #define MAP_MEM_COPYBACK 1 411 #define MAP_MEM_IO 2 412 #define MAP_MEM_WTHRU 3 413 #define MAP_MEM_WCOMB 4 /* Write combining mode */ 414 /* aka store gather */ 415 #define MAP_MEM_INNERWBACK 5 416 #define MAP_MEM_POSTED 6 417 #define MAP_MEM_RT 7 418 #define MAP_MEM_POSTED_REORDERED 8 419 #define MAP_MEM_POSTED_COMBINED_REORDERED 9 420 421 #define GET_MAP_MEM(flags) \ 422 ((((unsigned int)(flags)) >> 24) & 0xFF) 423 424 #define SET_MAP_MEM(caching, flags) \ 425 ((flags) = ((((unsigned int)(caching)) << 24) \ 426 & 0xFF000000) | ((flags) & 0xFFFFFF)); 427 428 /* leave room for vm_prot bits (0xFF ?) */ 429 #define MAP_MEM_LEDGER_TAGGED 0x002000 /* object owned by a specific task and ledger */ 430 #define MAP_MEM_PURGABLE_KERNEL_ONLY 0x004000 /* volatility controlled by kernel */ 431 #define MAP_MEM_GRAB_SECLUDED 0x008000 /* can grab secluded pages */ 432 #define MAP_MEM_ONLY 0x010000 /* change processor caching */ 433 #define MAP_MEM_NAMED_CREATE 0x020000 /* create extant object */ 434 #define MAP_MEM_PURGABLE 0x040000 /* create a purgable VM object */ 435 #define MAP_MEM_NAMED_REUSE 0x080000 /* reuse provided entry if identical */ 436 #define MAP_MEM_USE_DATA_ADDR 0x100000 /* preserve address of data, rather than base of page */ 437 #define MAP_MEM_VM_COPY 0x200000 /* make a copy of a VM range */ 438 #define MAP_MEM_VM_SHARE 0x400000 /* extract a VM range for remap */ 439 #define MAP_MEM_4K_DATA_ADDR 0x800000 /* preserve 4K aligned address of data */ 440 441 #define MAP_MEM_FLAGS_MASK 0x00FFFF00 442 #define MAP_MEM_FLAGS_USER ( \ 443 MAP_MEM_PURGABLE_KERNEL_ONLY | \ 444 MAP_MEM_GRAB_SECLUDED | \ 445 MAP_MEM_ONLY | \ 446 MAP_MEM_NAMED_CREATE | \ 447 MAP_MEM_PURGABLE | \ 448 MAP_MEM_NAMED_REUSE | \ 449 MAP_MEM_USE_DATA_ADDR | \ 450 MAP_MEM_VM_COPY | \ 451 MAP_MEM_VM_SHARE | \ 452 MAP_MEM_LEDGER_TAGGED | \ 453 MAP_MEM_4K_DATA_ADDR) 454 #define MAP_MEM_FLAGS_ALL ( \ 455 MAP_MEM_FLAGS_USER) 456 457 #ifdef KERNEL 458 459 /* 460 * Universal Page List data structures 461 * 462 * A UPL describes a bounded set of physical pages 463 * associated with some range of an object or map 464 * and a snapshot of the attributes associated with 465 * each of those pages. 466 */ 467 #ifdef PRIVATE 468 #define MAX_UPL_TRANSFER_BYTES (1024 * 1024) 469 #define MAX_UPL_SIZE_BYTES (1024 * 1024 * 64) 470 471 #define MAX_UPL_SIZE (MAX_UPL_SIZE_BYTES / PAGE_SIZE) 472 #define MAX_UPL_TRANSFER (MAX_UPL_TRANSFER_BYTES / PAGE_SIZE) 473 474 struct upl_page_info { 475 ppnum_t phys_addr; /* physical page index number */ 476 unsigned int 477 #ifdef XNU_KERNEL_PRIVATE 478 free_when_done:1, /* page is to be freed on commit */ 479 absent:1, /* No valid data in this page */ 480 dirty:1, /* Page must be cleaned (O) */ 481 precious:1, /* must be cleaned, we have only copy */ 482 device:1, /* no page data, mapped dev memory */ 483 speculative:1, /* page is valid, but not yet accessed */ 484 #define VMP_CS_BITS 4 485 #define VMP_CS_ALL_FALSE 0x0 486 #define VMP_CS_ALL_TRUE 0xF 487 cs_validated:VMP_CS_BITS, /* CODE SIGNING: page was validated */ 488 cs_tainted:VMP_CS_BITS, /* CODE SIGNING: page is tainted */ 489 cs_nx:VMP_CS_BITS, /* CODE SIGNING: page is NX */ 490 491 needed:1, /* page should be left in cache on abort */ 492 mark:1, /* a mark flag for the creator to use as they wish */ 493 :0; /* force to long boundary */ 494 #else 495 opaque; /* use upl_page_xxx() accessor funcs */ 496 #endif /* XNU_KERNEL_PRIVATE */ 497 }; 498 499 #else 500 501 struct upl_page_info { 502 unsigned int opaque[2]; /* use upl_page_xxx() accessor funcs */ 503 }; 504 505 #endif /* PRIVATE */ 506 507 typedef struct upl_page_info upl_page_info_t; 508 typedef upl_page_info_t *upl_page_info_array_t; 509 typedef upl_page_info_array_t upl_page_list_ptr_t; 510 511 typedef uint32_t upl_offset_t; /* page-aligned byte offset */ 512 typedef uint32_t upl_size_t; /* page-aligned byte size */ 513 514 /* upl invocation flags */ 515 /* top nibble is used by super upl */ 516 517 typedef uint64_t upl_control_flags_t; 518 519 #define UPL_FLAGS_NONE 0x00000000ULL 520 #define UPL_COPYOUT_FROM 0x00000001ULL 521 #define UPL_PRECIOUS 0x00000002ULL 522 #define UPL_NO_SYNC 0x00000004ULL 523 #define UPL_CLEAN_IN_PLACE 0x00000008ULL 524 #define UPL_NOBLOCK 0x00000010ULL 525 #define UPL_RET_ONLY_DIRTY 0x00000020ULL 526 #define UPL_SET_INTERNAL 0x00000040ULL 527 #define UPL_QUERY_OBJECT_TYPE 0x00000080ULL 528 #define UPL_RET_ONLY_ABSENT 0x00000100ULL /* used only for COPY_FROM = FALSE */ 529 #define UPL_FILE_IO 0x00000200ULL 530 #define UPL_SET_LITE 0x00000400ULL 531 #define UPL_SET_INTERRUPTIBLE 0x00000800ULL 532 #define UPL_SET_IO_WIRE 0x00001000ULL 533 #define UPL_FOR_PAGEOUT 0x00002000ULL 534 #define UPL_WILL_BE_DUMPED 0x00004000ULL 535 #define UPL_FORCE_DATA_SYNC 0x00008000ULL 536 /* continued after the ticket bits... */ 537 538 #define UPL_PAGE_TICKET_MASK 0x000F0000ULL 539 #define UPL_PAGE_TICKET_SHIFT 16 540 541 /* ... flags resume here */ 542 #define UPL_BLOCK_ACCESS 0x00100000ULL 543 #define UPL_ENCRYPT 0x00200000ULL 544 #define UPL_NOZEROFILL 0x00400000ULL 545 #define UPL_WILL_MODIFY 0x00800000ULL /* caller will modify the pages */ 546 547 #define UPL_NEED_32BIT_ADDR 0x01000000ULL 548 #define UPL_UBC_MSYNC 0x02000000ULL 549 #define UPL_UBC_PAGEOUT 0x04000000ULL 550 #define UPL_UBC_PAGEIN 0x08000000ULL 551 #define UPL_REQUEST_SET_DIRTY 0x10000000ULL 552 #define UPL_REQUEST_NO_FAULT 0x20000000ULL /* fail if pages not all resident */ 553 #define UPL_NOZEROFILLIO 0x40000000ULL /* allow non zerofill pages present */ 554 #define UPL_REQUEST_FORCE_COHERENCY 0x80000000ULL 555 556 /* UPL flags known by this kernel */ 557 #define UPL_VALID_FLAGS 0xFFFFFFFFFFULL 558 559 560 /* upl abort error flags */ 561 #define UPL_ABORT_RESTART 0x1 562 #define UPL_ABORT_UNAVAILABLE 0x2 563 #define UPL_ABORT_ERROR 0x4 564 #define UPL_ABORT_FREE_ON_EMPTY 0x8 /* only implemented in wrappers */ 565 #define UPL_ABORT_DUMP_PAGES 0x10 566 #define UPL_ABORT_NOTIFY_EMPTY 0x20 567 /* deprecated: #define UPL_ABORT_ALLOW_ACCESS 0x40 */ 568 #define UPL_ABORT_REFERENCE 0x80 569 570 /* upl pages check flags */ 571 #define UPL_CHECK_DIRTY 0x1 572 573 574 /* 575 * upl pagein/pageout flags 576 * 577 * 578 * when I/O is issued from this UPL it should be done synchronously 579 */ 580 #define UPL_IOSYNC 0x1 581 582 /* 583 * the passed in UPL should not have either a commit or abort 584 * applied to it by the underlying layers... the site that 585 * created the UPL is responsible for cleaning it up. 586 */ 587 #define UPL_NOCOMMIT 0x2 588 589 /* 590 * turn off any speculative read-ahead applied at the I/O layer 591 */ 592 #define UPL_NORDAHEAD 0x4 593 594 /* 595 * pageout request is targeting a real file 596 * as opposed to a swap file. 597 */ 598 599 #define UPL_VNODE_PAGER 0x8 600 /* 601 * this pageout is being originated as part of an explicit 602 * memory synchronization operation... no speculative clustering 603 * should be applied, only the range specified should be pushed. 604 */ 605 #define UPL_MSYNC 0x10 606 607 /* 608 * 609 */ 610 #define UPL_PAGING_ENCRYPTED 0x20 611 612 /* 613 * this pageout is being originated as part of an explicit 614 * memory synchronization operation that is checking for I/O 615 * errors and taking it's own action... if an error occurs, 616 * just abort the pages back into the cache unchanged 617 */ 618 #define UPL_KEEPCACHED 0x40 619 620 /* 621 * this pageout originated from within cluster_io to deal 622 * with a dirty page that hasn't yet been seen by the FS 623 * that backs it... tag it so that the FS can take the 624 * appropriate action w/r to its locking model since the 625 * pageout will reenter the FS for the same file currently 626 * being handled in this context. 627 */ 628 #define UPL_NESTED_PAGEOUT 0x80 629 630 /* 631 * we've detected a sequential access pattern and 632 * we are speculatively and aggressively pulling 633 * pages in... do not count these as real PAGEINs 634 * w/r to our hard throttle maintenance 635 */ 636 #define UPL_IOSTREAMING 0x100 637 638 /* 639 * Currently, it's only used for the swap pagein path. 640 * Since the swap + compressed pager layer manage their 641 * pages, these pages are not marked "absent" i.e. these 642 * are "valid" pages. The pagein path will _not_ issue an 643 * I/O (correctly) for valid pages. So, this flag is used 644 * to override that logic in the vnode I/O path. 645 */ 646 #define UPL_IGNORE_VALID_PAGE_CHECK 0x200 647 648 649 650 /* upl commit flags */ 651 #define UPL_COMMIT_FREE_ON_EMPTY 0x1 /* only implemented in wrappers */ 652 #define UPL_COMMIT_CLEAR_DIRTY 0x2 653 #define UPL_COMMIT_SET_DIRTY 0x4 654 #define UPL_COMMIT_INACTIVATE 0x8 655 #define UPL_COMMIT_NOTIFY_EMPTY 0x10 656 /* deprecated: #define UPL_COMMIT_ALLOW_ACCESS 0x20 */ 657 #define UPL_COMMIT_CS_VALIDATED 0x40 658 #define UPL_COMMIT_CLEAR_PRECIOUS 0x80 659 #define UPL_COMMIT_SPECULATE 0x100 660 #define UPL_COMMIT_FREE_ABSENT 0x200 661 #define UPL_COMMIT_WRITTEN_BY_KERNEL 0x400 662 663 #define UPL_COMMIT_KERNEL_ONLY_FLAGS (UPL_COMMIT_CS_VALIDATED | UPL_COMMIT_FREE_ABSENT) 664 665 /* flags for return of state from vm_map_get_upl, vm_upl address space */ 666 /* based call */ 667 #define UPL_DEV_MEMORY 0x1 668 #define UPL_PHYS_CONTIG 0x2 669 670 671 /* 672 * Flags for the UPL page ops routine. This routine is not exported 673 * out of the kernel at the moment and so the defs live here. 674 */ 675 #define UPL_POP_DIRTY 0x1 676 #define UPL_POP_PAGEOUT 0x2 677 #define UPL_POP_PRECIOUS 0x4 678 #define UPL_POP_ABSENT 0x8 679 #define UPL_POP_BUSY 0x10 680 681 #define UPL_POP_PHYSICAL 0x10000000 682 #define UPL_POP_DUMP 0x20000000 683 #define UPL_POP_SET 0x40000000 684 #define UPL_POP_CLR 0x80000000 685 686 /* 687 * Flags for the UPL range op routine. This routine is not exported 688 * out of the kernel at the moemet and so the defs live here. 689 */ 690 /* 691 * UPL_ROP_ABSENT: Returns the extent of the range presented which 692 * is absent, starting with the start address presented 693 */ 694 #define UPL_ROP_ABSENT 0x01 695 /* 696 * UPL_ROP_PRESENT: Returns the extent of the range presented which 697 * is present (i.e. resident), starting with the start address presented 698 */ 699 #define UPL_ROP_PRESENT 0x02 700 /* 701 * UPL_ROP_DUMP: Dump the pages which are found in the target object 702 * for the target range. 703 */ 704 #define UPL_ROP_DUMP 0x04 705 706 #ifdef PRIVATE 707 708 #define UPL_REPRIO_INFO_MASK (0xFFFFFFFF) 709 #define UPL_REPRIO_INFO_SHIFT 32 710 711 /* access macros for upl_t */ 712 713 #define UPL_DEVICE_PAGE(upl) \ 714 (((upl)[0].phys_addr != 0) ? ((upl)[0].device) : FALSE) 715 716 #define UPL_PAGE_PRESENT(upl, index) \ 717 ((upl)[(index)].phys_addr != 0) 718 719 #define UPL_PHYS_PAGE(upl, index) \ 720 ((upl)[(index)].phys_addr) 721 722 #define UPL_SPECULATIVE_PAGE(upl, index) \ 723 (((upl)[(index)].phys_addr != 0) ? ((upl)[(index)].speculative) : FALSE) 724 725 #define UPL_DIRTY_PAGE(upl, index) \ 726 (((upl)[(index)].phys_addr != 0) ? ((upl)[(index)].dirty) : FALSE) 727 728 #define UPL_PRECIOUS_PAGE(upl, index) \ 729 (((upl)[(index)].phys_addr != 0) ? ((upl)[(index)].precious) : FALSE) 730 731 #define UPL_VALID_PAGE(upl, index) \ 732 (((upl)[(index)].phys_addr != 0) ? (!((upl)[(index)].absent)) : FALSE) 733 734 #define UPL_PAGEOUT_PAGE(upl, index) \ 735 (((upl)[(index)].phys_addr != 0) ? ((upl)[(index)].free_when_done) : FALSE) 736 737 #define UPL_SET_PAGE_FREE_ON_COMMIT(upl, index) \ 738 (((upl)[(index)].phys_addr != 0) ? \ 739 ((upl)[(index)].free_when_done = TRUE) : FALSE) 740 741 #define UPL_CLR_PAGE_FREE_ON_COMMIT(upl, index) \ 742 (((upl)[(index)].phys_addr != 0) ? \ 743 ((upl)[(index)].free_when_done = FALSE) : FALSE) 744 745 #define UPL_REPRIO_INFO_BLKNO(upl, index) \ 746 (((upl)->upl_reprio_info[(index)]) & UPL_REPRIO_INFO_MASK) 747 748 #define UPL_REPRIO_INFO_LEN(upl, index) \ 749 ((((upl)->upl_reprio_info[(index)]) >> UPL_REPRIO_INFO_SHIFT) & UPL_REPRIO_INFO_MASK) 750 751 /* modifier macros for upl_t */ 752 753 #define UPL_SET_CS_VALIDATED(upl, index, value) \ 754 ((upl)[(index)].cs_validated = (value)) 755 756 #define UPL_SET_CS_TAINTED(upl, index, value) \ 757 ((upl)[(index)].cs_tainted = (value)) 758 759 #define UPL_SET_CS_NX(upl, index, value) \ 760 ((upl)[(index)].cs_nx = (value)) 761 762 #define UPL_SET_REPRIO_INFO(upl, index, blkno, len) \ 763 ((upl)->upl_reprio_info[(index)]) = (((uint64_t)(blkno) & UPL_REPRIO_INFO_MASK) | \ 764 (((uint64_t)(len) & UPL_REPRIO_INFO_MASK) << UPL_REPRIO_INFO_SHIFT)) 765 766 /* The call prototyped below is used strictly by UPL_GET_INTERNAL_PAGE_LIST */ 767 768 __BEGIN_DECLS 769 770 extern vm_size_t upl_offset_to_pagelist; 771 extern vm_size_t upl_get_internal_pagelist_offset(void); 772 extern void* upl_get_internal_vectorupl(upl_t); 773 extern upl_page_info_t* upl_get_internal_vectorupl_pagelist(upl_t); 774 775 __END_DECLS 776 777 /*Use this variant to get the UPL's page list iff:*/ 778 /*- the upl being passed in is already part of a vector UPL*/ 779 /*- the page list you want is that of this "sub-upl" and not that of the entire vector-upl*/ 780 781 #define UPL_GET_INTERNAL_PAGE_LIST_SIMPLE(upl) \ 782 ((upl_page_info_t *)((upl_offset_to_pagelist == 0) ? \ 783 (uintptr_t)upl + (unsigned int)(upl_offset_to_pagelist = upl_get_internal_pagelist_offset()): \ 784 (uintptr_t)upl + (unsigned int)upl_offset_to_pagelist)) 785 786 /* UPL_GET_INTERNAL_PAGE_LIST is only valid on internal objects where the */ 787 /* list request was made with the UPL_INTERNAL flag */ 788 789 790 #define UPL_GET_INTERNAL_PAGE_LIST(upl) \ 791 ((upl_get_internal_vectorupl(upl) != NULL ) ? (upl_get_internal_vectorupl_pagelist(upl)) : \ 792 ((upl_page_info_t *)((upl_offset_to_pagelist == 0) ? \ 793 (uintptr_t)upl + (unsigned int)(upl_offset_to_pagelist = upl_get_internal_pagelist_offset()): \ 794 (uintptr_t)upl + (unsigned int)upl_offset_to_pagelist))) 795 796 __BEGIN_DECLS 797 798 extern ppnum_t upl_phys_page(upl_page_info_t *upl, int index); 799 extern boolean_t upl_device_page(upl_page_info_t *upl); 800 extern boolean_t upl_speculative_page(upl_page_info_t *upl, int index); 801 extern void upl_clear_dirty(upl_t upl, boolean_t value); 802 extern void upl_set_referenced(upl_t upl, boolean_t value); 803 extern void upl_range_needed(upl_t upl, int index, int count); 804 #if CONFIG_IOSCHED 805 extern int64_t upl_blkno(upl_page_info_t *upl, int index); 806 extern void upl_set_blkno(upl_t upl, vm_offset_t upl_offset, int size, int64_t blkno); 807 #endif 808 809 __END_DECLS 810 811 #endif /* PRIVATE */ 812 813 __BEGIN_DECLS 814 815 extern boolean_t upl_page_present(upl_page_info_t *upl, int index); 816 extern boolean_t upl_dirty_page(upl_page_info_t *upl, int index); 817 extern boolean_t upl_valid_page(upl_page_info_t *upl, int index); 818 extern void upl_deallocate(upl_t upl); 819 extern void upl_mark_decmp(upl_t upl); 820 extern void upl_unmark_decmp(upl_t upl); 821 822 #ifdef KERNEL_PRIVATE 823 824 void upl_page_set_mark(upl_page_info_t *upl, int index, boolean_t v); 825 boolean_t upl_page_get_mark(upl_page_info_t *upl, int index); 826 827 #endif // KERNEL_PRIVATE 828 829 __END_DECLS 830 831 #endif /* KERNEL */ 832 833 #endif /* _MACH_MEMORY_OBJECT_TYPES_H_ */ 834