1 | /* |
2 | * Copyright (c) 2000 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 | #ifndef _PEXPERT_I386_BOOT_H |
29 | #define _PEXPERT_I386_BOOT_H |
30 | |
31 | #include <stdint.h> |
32 | |
33 | /* |
34 | * What the booter leaves behind for the kernel. |
35 | */ |
36 | |
37 | /* |
38 | * Types of boot driver that may be loaded by the booter. |
39 | */ |
40 | enum { |
41 | kBootDriverTypeInvalid = 0, |
42 | kBootDriverTypeKEXT = 1, |
43 | kBootDriverTypeMKEXT = 2 |
44 | }; |
45 | |
46 | enum { |
47 | kEfiReservedMemoryType = 0, |
48 | kEfiLoaderCode = 1, |
49 | kEfiLoaderData = 2, |
50 | kEfiBootServicesCode = 3, |
51 | kEfiBootServicesData = 4, |
52 | kEfiRuntimeServicesCode = 5, |
53 | kEfiRuntimeServicesData = 6, |
54 | kEfiConventionalMemory = 7, |
55 | kEfiUnusableMemory = 8, |
56 | kEfiACPIReclaimMemory = 9, |
57 | kEfiACPIMemoryNVS = 10, |
58 | kEfiMemoryMappedIO = 11, |
59 | kEfiMemoryMappedIOPortSpace = 12, |
60 | kEfiPalCode = 13, |
61 | kEfiMaxMemoryType = 14 |
62 | }; |
63 | |
64 | /* |
65 | * Memory range descriptor. |
66 | */ |
67 | typedef struct EfiMemoryRange { |
68 | uint32_t Type; |
69 | uint32_t Pad; |
70 | uint64_t PhysicalStart; |
71 | uint64_t VirtualStart; |
72 | uint64_t NumberOfPages; |
73 | uint64_t Attribute; |
74 | } EfiMemoryRange; |
75 | |
76 | #define BOOT_LINE_LENGTH 1024 |
77 | #define BOOT_STRING_LEN BOOT_LINE_LENGTH |
78 | |
79 | /* |
80 | * Video information.. |
81 | */ |
82 | |
83 | struct Boot_VideoV1 { |
84 | uint32_t v_baseAddr; /* Base address of video memory */ |
85 | uint32_t v_display; /* Display Code (if Applicable */ |
86 | uint32_t v_rowBytes; /* Number of bytes per pixel row */ |
87 | uint32_t v_width; /* Width */ |
88 | uint32_t v_height; /* Height */ |
89 | uint32_t v_depth; /* Pixel Depth */ |
90 | }; |
91 | typedef struct Boot_VideoV1 Boot_VideoV1; |
92 | |
93 | struct Boot_Video { |
94 | uint32_t v_display; /* Display Code (if Applicable */ |
95 | uint32_t v_rowBytes; /* Number of bytes per pixel row */ |
96 | uint32_t v_width; /* Width */ |
97 | uint32_t v_height; /* Height */ |
98 | uint32_t v_depth; /* Pixel Depth */ |
99 | uint32_t v_resv[7]; /* Reserved */ |
100 | uint64_t v_baseAddr; /* Base address of video memory */ |
101 | }; |
102 | typedef struct Boot_Video Boot_Video; |
103 | |
104 | /* Values for v_display */ |
105 | |
106 | #define GRAPHICS_MODE 1 |
107 | #define FB_TEXT_MODE 2 |
108 | |
109 | /* Struct describing an image passed in by the booter */ |
110 | struct boot_icon_element { |
111 | unsigned int width; |
112 | unsigned int height; |
113 | int y_offset_from_center; |
114 | unsigned int data_size; |
115 | unsigned int __reserved1[4]; |
116 | unsigned char data[0]; |
117 | }; |
118 | typedef struct boot_icon_element boot_icon_element; |
119 | |
120 | /* Boot argument structure - passed into Mach kernel at boot time. |
121 | * "Revision" can be incremented for compatible changes |
122 | */ |
123 | #define kBootArgsRevision 0 |
124 | #define kBootArgsVersion 2 |
125 | |
126 | /* Snapshot constants of previous revisions that are supported */ |
127 | #define kBootArgsVersion1 1 |
128 | #define kBootArgsVersion2 2 |
129 | #define kBootArgsRevision2_0 0 |
130 | |
131 | #define kBootArgsEfiMode32 32 |
132 | #define kBootArgsEfiMode64 64 |
133 | |
134 | /* Bitfields for boot_args->flags */ |
135 | #define kBootArgsFlagRebootOnPanic (1 << 0) |
136 | #define kBootArgsFlagHiDPI (1 << 1) |
137 | #define kBootArgsFlagBlack (1 << 2) |
138 | #define kBootArgsFlagCSRActiveConfig (1 << 3) |
139 | #define kBootArgsFlagCSRConfigMode (1 << 4) |
140 | #define kBootArgsFlagCSRBoot (1 << 5) |
141 | #define kBootArgsFlagBlackBg (1 << 6) |
142 | #define kBootArgsFlagLoginUI (1 << 7) |
143 | #define kBootArgsFlagInstallUI (1 << 8) |
144 | |
145 | typedef struct boot_args { |
146 | uint16_t Revision; /* Revision of boot_args structure */ |
147 | uint16_t Version; /* Version of boot_args structure */ |
148 | |
149 | uint8_t efiMode; /* 32 = 32-bit, 64 = 64-bit */ |
150 | uint8_t debugMode; /* Bit field with behavior changes */ |
151 | uint16_t flags; |
152 | |
153 | char CommandLine[BOOT_LINE_LENGTH]; /* Passed in command line */ |
154 | |
155 | uint32_t MemoryMap; /* Physical address of memory map */ |
156 | uint32_t MemoryMapSize; |
157 | uint32_t MemoryMapDescriptorSize; |
158 | uint32_t MemoryMapDescriptorVersion; |
159 | |
160 | Boot_VideoV1 VideoV1; /* Video Information */ |
161 | |
162 | uint32_t deviceTreeP; /* Physical address of flattened device tree */ |
163 | uint32_t deviceTreeLength; /* Length of flattened tree */ |
164 | |
165 | uint32_t kaddr; /* Physical address of beginning of kernel text */ |
166 | uint32_t ksize; /* Size of combined kernel text+data+efi */ |
167 | |
168 | uint32_t efiRuntimeServicesPageStart; /* physical address of defragmented runtime pages */ |
169 | uint32_t efiRuntimeServicesPageCount; |
170 | uint64_t efiRuntimeServicesVirtualPageStart; /* virtual address of defragmented runtime pages */ |
171 | |
172 | uint32_t efiSystemTable; /* physical address of system table in runtime area */ |
173 | uint32_t kslide; |
174 | |
175 | uint32_t performanceDataStart; /* physical address of log */ |
176 | uint32_t performanceDataSize; |
177 | |
178 | uint32_t keyStoreDataStart; /* physical address of key store data */ |
179 | uint32_t keyStoreDataSize; |
180 | uint64_t bootMemStart; |
181 | uint64_t bootMemSize; |
182 | uint64_t PhysicalMemorySize; |
183 | uint64_t FSBFrequency; |
184 | uint64_t pciConfigSpaceBaseAddress; |
185 | uint32_t pciConfigSpaceStartBusNumber; |
186 | uint32_t pciConfigSpaceEndBusNumber; |
187 | uint32_t csrActiveConfig; |
188 | uint32_t csrCapabilities; |
189 | uint32_t boot_SMC_plimit; |
190 | uint16_t bootProgressMeterStart; |
191 | uint16_t bootProgressMeterEnd; |
192 | Boot_Video Video; /* Video Information */ |
193 | |
194 | uint32_t apfsDataStart; /* Physical address of apfs volume key structure */ |
195 | uint32_t apfsDataSize; |
196 | |
197 | uint32_t __reserved4[710]; |
198 | |
199 | } boot_args; |
200 | |
201 | extern char assert_boot_args_size_is_4096[sizeof(boot_args) == 4096 ? 1 : -1]; |
202 | |
203 | #endif /* _PEXPERT_I386_BOOT_H */ |
204 | |
205 | |