| 1 | /* |
| 2 | * Copyright (c) 2021 Apple Inc. All rights reserved. |
| 3 | * |
| 4 | * @APPLE_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. Please obtain a copy of the License at |
| 10 | * http://www.opensource.apple.com/apsl/ and read it before using this |
| 11 | * file. |
| 12 | * |
| 13 | * The Original Code and all software distributed under the License are |
| 14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
| 15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
| 16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, |
| 17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
| 18 | * Please see the License for the specific language governing rights and |
| 19 | * limitations under the License. |
| 20 | * |
| 21 | * @APPLE_LICENSE_HEADER_END@ |
| 22 | */ |
| 23 | /* |
| 24 | * |
| 25 | * File: mach/dyld_pager.h |
| 26 | * |
| 27 | * protos and struct definitions for the pager that applies dyld fixups. |
| 28 | */ |
| 29 | |
| 30 | #ifndef _MACH_DYLD_PAGER_H_ |
| 31 | #define |
| 32 | |
| 33 | #ifdef __cplusplus |
| 34 | extern "C" { |
| 35 | #endif |
| 36 | |
| 37 | #include <mach/vm_prot.h> |
| 38 | #include <mach/mach_types.h> |
| 39 | |
| 40 | /* |
| 41 | * These describe the address regions (mwlr_address, mwlr_size) to be mapped |
| 42 | * from the given file (mwlr_fd, mwlr_file_offset) with mwlr_protections. |
| 43 | */ |
| 44 | struct mwl_region { |
| 45 | int mwlr_fd; /* fd of file file to over map */ |
| 46 | vm_prot_t mwlr_protections;/* protections for new overmapping */ |
| 47 | uint64_t mwlr_file_offset;/* offset in file of start of mapping */ |
| 48 | mach_vm_address_t mwlr_address __kernel_data_semantics; /* start address of existing region */ |
| 49 | mach_vm_size_t mwlr_size; /* size of existing region */ |
| 50 | }; |
| 51 | |
| 52 | #define MWL_INFO_VERS 7 |
| 53 | struct mwl_info_hdr { |
| 54 | uint32_t mwli_version; /* version of info blob, currently 7 */ |
| 55 | uint16_t mwli_page_size; /* 0x1000 or 0x4000 (for sanity checking) */ |
| 56 | uint16_t mwli_pointer_format; /* DYLD_CHAINED_PTR_* value */ |
| 57 | uint32_t mwli_binds_offset; /* offset within this blob of bind pointers table */ |
| 58 | uint32_t mwli_binds_count; /* number of pointers in bind pointers table (for range checks) */ |
| 59 | uint32_t mwli_chains_offset; /* offset within this blob of dyld_chained_starts_in_image */ |
| 60 | uint32_t mwli_chains_size; /* size of dyld_chained_starts_in_image */ |
| 61 | uint64_t mwli_slide; /* slide to add to rebased pointers */ |
| 62 | uint64_t mwli_image_address; /* add this to rebase offsets includes any slide */ |
| 63 | /* followed by the binds pointers and dyld_chained_starts_in_image */ |
| 64 | }; |
| 65 | |
| 66 | #define MWL_MAX_REGION_COUNT 5 /* data, const, data auth, auth const, objc const */ |
| 67 | |
| 68 | #ifndef KERNEL_PRIVATE |
| 69 | |
| 70 | extern int __map_with_linking_np(const struct mwl_region regions[], uint32_t regionCount, const struct mwl_info_hdr* blob, uint32_t blobSize); |
| 71 | |
| 72 | #endif /* KERNEL_PRIVATE */ |
| 73 | |
| 74 | /* |
| 75 | * Special value for dyld to use with shared_region_check_np() to prevent anymore use of map_with_linking_np() in a process |
| 76 | */ |
| 77 | #define DYLD_VM_END_MWL (-1ull) |
| 78 | |
| 79 | #ifdef __cplusplus |
| 80 | } |
| 81 | #endif |
| 82 | |
| 83 | #endif /* _MACH_DYLD_PAGER_H_ */ |
| 84 | |