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 | |