]> git.saurik.com Git - apple/xnu.git/blame - pexpert/gen/pe_gen.c
xnu-6153.121.1.tar.gz
[apple/xnu.git] / pexpert / gen / pe_gen.c
CommitLineData
1c79356b 1/*
2d21ac55 2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
1c79356b 3 *
2d21ac55 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
0a7de745 5 *
2d21ac55
A
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.
0a7de745 14 *
2d21ac55
A
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
0a7de745 17 *
2d21ac55
A
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
8f6c56a5
A
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
2d21ac55
A
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.
0a7de745 25 *
2d21ac55 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
1c79356b
A
27 */
28/*
29 * @OSF_FREE_COPYRIGHT@
30 */
31
32#include <pexpert/pexpert.h>
2d21ac55 33#include <pexpert/protos.h>
fe8ab488 34#include <pexpert/device_tree.h>
1c79356b
A
35#include <kern/debug.h>
36
5ba3f43e
A
37#if CONFIG_EMBEDDED
38#include <libkern/section_keywords.h>
39#endif
39037602 40
1c79356b 41static int DEBUGFlag;
39037602 42
5ba3f43e
A
43#if CONFIG_EMBEDDED
44SECURITY_READ_ONLY_LATE(static uint32_t) gPEKernelConfigurationBitmask;
45#else
3e170ce0 46static uint32_t gPEKernelConfigurationBitmask;
5ba3f43e 47#endif
1c79356b 48
91447636
A
49int32_t gPESerialBaud = -1;
50
d9a64523
A
51int debug_cpu_performance_degradation_factor = 1;
52
0a7de745
A
53void
54pe_init_debug(void)
1c79356b 55{
3e170ce0
A
56 boolean_t boot_arg_value;
57
0a7de745 58 if (!PE_parse_boot_argn("debug", &DEBUGFlag, sizeof(DEBUGFlag))) {
3e170ce0 59 DEBUGFlag = 0;
0a7de745 60 }
3e170ce0
A
61
62 gPEKernelConfigurationBitmask = 0;
63
64 if (!PE_parse_boot_argn("assertions", &boot_arg_value, sizeof(boot_arg_value))) {
65#if MACH_ASSERT
66 boot_arg_value = TRUE;
67#else
68 boot_arg_value = FALSE;
69#endif
70 }
71 gPEKernelConfigurationBitmask |= (boot_arg_value ? kPEICanHasAssertions : 0);
72
73 if (!PE_parse_boot_argn("statistics", &boot_arg_value, sizeof(boot_arg_value))) {
74#if DEVELOPMENT || DEBUG
75 boot_arg_value = TRUE;
76#else
77 boot_arg_value = FALSE;
78#endif
79 }
80 gPEKernelConfigurationBitmask |= (boot_arg_value ? kPEICanHasStatistics : 0);
81
82#if SECURE_KERNEL
83 boot_arg_value = FALSE;
84#else
85 if (!PE_i_can_has_debugger(NULL)) {
86 boot_arg_value = FALSE;
0a7de745 87 } else if (!PE_parse_boot_argn("diagnostic_api", &boot_arg_value, sizeof(boot_arg_value))) {
3e170ce0
A
88 boot_arg_value = TRUE;
89 }
90#endif
91 gPEKernelConfigurationBitmask |= (boot_arg_value ? kPEICanHasDiagnosticAPI : 0);
92
d9a64523
A
93
94 int factor = 1;
0a7de745 95 boolean_t have_bootarg = PE_parse_boot_argn("cpu-factor", &factor, sizeof(factor));
d9a64523
A
96 if (have_bootarg) {
97 debug_cpu_performance_degradation_factor = factor;
98 } else {
0a7de745 99 DTEntry root;
d9a64523
A
100 if (DTLookupEntry(NULL, "/", &root) == kSuccess) {
101 void *prop = NULL;
102 uint32_t size = 0;
103 if (DTGetProperty(root, "target-is-fpga", &prop, &size) == kSuccess) {
104 debug_cpu_performance_degradation_factor = 10;
105 }
106 }
107 }
1c79356b
A
108}
109
0a7de745
A
110void
111PE_enter_debugger(const char *cause)
1c79356b 112{
0a7de745
A
113 if (DEBUGFlag & DB_NMI) {
114 Debugger(cause);
115 }
1c79356b
A
116}
117
3e170ce0
A
118uint32_t
119PE_i_can_has_kernel_configuration(void)
120{
121 return gPEKernelConfigurationBitmask;
122}
123
1c79356b 124/* extern references */
1c79356b
A
125extern void vcattach(void);
126
127/* Globals */
2d21ac55 128void (*PE_putc)(char c);
1c79356b 129
0a7de745
A
130void
131PE_init_printf(boolean_t vm_initialized)
1c79356b 132{
0a7de745
A
133 if (!vm_initialized) {
134 PE_putc = cnputc;
135 } else {
136 vcattach();
137 }
1c79356b 138}
0b4e3aa0 139
fe8ab488
A
140uint32_t
141PE_get_random_seed(unsigned char *dst_random_seed, uint32_t request_size)
142{
0a7de745
A
143 DTEntry entryP;
144 uint32_t size = 0;
145 void *dt_random_seed;
fe8ab488 146
0a7de745 147 if ((DTLookupEntry(NULL, "/chosen", &entryP) == kSuccess)
fe8ab488 148 && (DTGetProperty(entryP, "random-seed",
0a7de745 149 (void **)&dt_random_seed, &size) == kSuccess)) {
fe8ab488
A
150 unsigned char *src_random_seed;
151 unsigned int i;
152 unsigned int null_count = 0;
153
154 src_random_seed = (unsigned char *)dt_random_seed;
155
0a7de745
A
156 if (size > request_size) {
157 size = request_size;
158 }
fe8ab488
A
159
160 /*
161 * Copy from the device tree into the destination buffer,
162 * count the number of null bytes and null out the device tree.
163 */
0a7de745 164 for (i = 0; i < size; i++, src_random_seed++, dst_random_seed++) {
fe8ab488
A
165 *dst_random_seed = *src_random_seed;
166 null_count += *src_random_seed == (unsigned char)0;
167 *src_random_seed = (unsigned char)0;
168 }
0a7de745 169 if (null_count == size) {
fe8ab488
A
170 /* All nulls is no seed - return 0 */
171 size = 0;
0a7de745 172 }
fe8ab488
A
173 }
174
0a7de745 175 return size;
fe8ab488
A
176}
177
0a7de745 178unsigned char appleClut8[256 * 3] = {
0b4e3aa0 179// 00
0a7de745
A
180 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0x99, 0xFF, 0xFF, 0x66,
181 0xFF, 0xFF, 0x33, 0xFF, 0xFF, 0x00, 0xFF, 0xCC, 0xFF, 0xFF, 0xCC, 0xCC,
182 0xFF, 0xCC, 0x99, 0xFF, 0xCC, 0x66, 0xFF, 0xCC, 0x33, 0xFF, 0xCC, 0x00,
183 0xFF, 0x99, 0xFF, 0xFF, 0x99, 0xCC, 0xFF, 0x99, 0x99, 0xFF, 0x99, 0x66,
0b4e3aa0 184// 10
0a7de745
A
185 0xFF, 0x99, 0x33, 0xFF, 0x99, 0x00, 0xFF, 0x66, 0xFF, 0xFF, 0x66, 0xCC,
186 0xFF, 0x66, 0x99, 0xFF, 0x66, 0x66, 0xFF, 0x66, 0x33, 0xFF, 0x66, 0x00,
187 0xFF, 0x33, 0xFF, 0xFF, 0x33, 0xCC, 0xFF, 0x33, 0x99, 0xFF, 0x33, 0x66,
188 0xFF, 0x33, 0x33, 0xFF, 0x33, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xCC,
0b4e3aa0 189// 20
0a7de745
A
190 0xFF, 0x00, 0x99, 0xFF, 0x00, 0x66, 0xFF, 0x00, 0x33, 0xFF, 0x00, 0x00,
191 0xCC, 0xFF, 0xFF, 0xCC, 0xFF, 0xCC, 0xCC, 0xFF, 0x99, 0xCC, 0xFF, 0x66,
192 0xCC, 0xFF, 0x33, 0xCC, 0xFF, 0x00, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xCC,
193 0xCC, 0xCC, 0x99, 0xCC, 0xCC, 0x66, 0xCC, 0xCC, 0x33, 0xCC, 0xCC, 0x00,
0b4e3aa0 194// 30
0a7de745
A
195 0xCC, 0x99, 0xFF, 0xCC, 0x99, 0xCC, 0xCC, 0x99, 0x99, 0xCC, 0x99, 0x66,
196 0xCC, 0x99, 0x33, 0xCC, 0x99, 0x00, 0xCC, 0x66, 0xFF, 0xCC, 0x66, 0xCC,
197 0xCC, 0x66, 0x99, 0xCC, 0x66, 0x66, 0xCC, 0x66, 0x33, 0xCC, 0x66, 0x00,
198 0xCC, 0x33, 0xFF, 0xCC, 0x33, 0xCC, 0xCC, 0x33, 0x99, 0xCC, 0x33, 0x66,
0b4e3aa0 199// 40
0a7de745
A
200 0xCC, 0x33, 0x33, 0xCC, 0x33, 0x00, 0xCC, 0x00, 0xFF, 0xCC, 0x00, 0xCC,
201 0xCC, 0x00, 0x99, 0xCC, 0x00, 0x66, 0xCC, 0x00, 0x33, 0xCC, 0x00, 0x00,
202 0x99, 0xFF, 0xFF, 0x99, 0xFF, 0xCC, 0x99, 0xFF, 0x99, 0x99, 0xFF, 0x66,
203 0x99, 0xFF, 0x33, 0x99, 0xFF, 0x00, 0x99, 0xCC, 0xFF, 0x99, 0xCC, 0xCC,
0b4e3aa0 204// 50
0a7de745
A
205 0x99, 0xCC, 0x99, 0x99, 0xCC, 0x66, 0x99, 0xCC, 0x33, 0x99, 0xCC, 0x00,
206 0x99, 0x99, 0xFF, 0x99, 0x99, 0xCC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x66,
207 0x99, 0x99, 0x33, 0x99, 0x99, 0x00, 0x99, 0x66, 0xFF, 0x99, 0x66, 0xCC,
208 0x99, 0x66, 0x99, 0x99, 0x66, 0x66, 0x99, 0x66, 0x33, 0x99, 0x66, 0x00,
0b4e3aa0 209// 60
0a7de745
A
210 0x99, 0x33, 0xFF, 0x99, 0x33, 0xCC, 0x99, 0x33, 0x99, 0x99, 0x33, 0x66,
211 0x99, 0x33, 0x33, 0x99, 0x33, 0x00, 0x99, 0x00, 0xFF, 0x99, 0x00, 0xCC,
212 0x99, 0x00, 0x99, 0x99, 0x00, 0x66, 0x99, 0x00, 0x33, 0x99, 0x00, 0x00,
213 0x66, 0xFF, 0xFF, 0x66, 0xFF, 0xCC, 0x66, 0xFF, 0x99, 0x66, 0xFF, 0x66,
0b4e3aa0 214// 70
0a7de745
A
215 0x66, 0xFF, 0x33, 0x66, 0xFF, 0x00, 0x66, 0xCC, 0xFF, 0x66, 0xCC, 0xCC,
216 0x66, 0xCC, 0x99, 0x66, 0xCC, 0x66, 0x66, 0xCC, 0x33, 0x66, 0xCC, 0x00,
217 0x66, 0x99, 0xFF, 0x66, 0x99, 0xCC, 0x66, 0x99, 0x99, 0x66, 0x99, 0x66,
218 0x66, 0x99, 0x33, 0x66, 0x99, 0x00, 0x66, 0x66, 0xFF, 0x66, 0x66, 0xCC,
0b4e3aa0 219// 80
0a7de745
A
220 0x66, 0x66, 0x99, 0x66, 0x66, 0x66, 0x66, 0x66, 0x33, 0x66, 0x66, 0x00,
221 0x66, 0x33, 0xFF, 0x66, 0x33, 0xCC, 0x66, 0x33, 0x99, 0x66, 0x33, 0x66,
222 0x66, 0x33, 0x33, 0x66, 0x33, 0x00, 0x66, 0x00, 0xFF, 0x66, 0x00, 0xCC,
223 0x66, 0x00, 0x99, 0x66, 0x00, 0x66, 0x66, 0x00, 0x33, 0x66, 0x00, 0x00,
0b4e3aa0 224// 90
0a7de745
A
225 0x33, 0xFF, 0xFF, 0x33, 0xFF, 0xCC, 0x33, 0xFF, 0x99, 0x33, 0xFF, 0x66,
226 0x33, 0xFF, 0x33, 0x33, 0xFF, 0x00, 0x33, 0xCC, 0xFF, 0x33, 0xCC, 0xCC,
227 0x33, 0xCC, 0x99, 0x33, 0xCC, 0x66, 0x33, 0xCC, 0x33, 0x33, 0xCC, 0x00,
228 0x33, 0x99, 0xFF, 0x33, 0x99, 0xCC, 0x33, 0x99, 0x99, 0x33, 0x99, 0x66,
0b4e3aa0 229// a0
0a7de745
A
230 0x33, 0x99, 0x33, 0x33, 0x99, 0x00, 0x33, 0x66, 0xFF, 0x33, 0x66, 0xCC,
231 0x33, 0x66, 0x99, 0x33, 0x66, 0x66, 0x33, 0x66, 0x33, 0x33, 0x66, 0x00,
232 0x33, 0x33, 0xFF, 0x33, 0x33, 0xCC, 0x33, 0x33, 0x99, 0x33, 0x33, 0x66,
233 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x33, 0x00, 0xFF, 0x33, 0x00, 0xCC,
0b4e3aa0 234// b0
0a7de745
A
235 0x33, 0x00, 0x99, 0x33, 0x00, 0x66, 0x33, 0x00, 0x33, 0x33, 0x00, 0x00,
236 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xCC, 0x00, 0xFF, 0x99, 0x00, 0xFF, 0x66,
237 0x00, 0xFF, 0x33, 0x00, 0xFF, 0x00, 0x00, 0xCC, 0xFF, 0x00, 0xCC, 0xCC,
238 0x00, 0xCC, 0x99, 0x00, 0xCC, 0x66, 0x00, 0xCC, 0x33, 0x00, 0xCC, 0x00,
0b4e3aa0 239// c0
0a7de745
A
240 0x00, 0x99, 0xFF, 0x00, 0x99, 0xCC, 0x00, 0x99, 0x99, 0x00, 0x99, 0x66,
241 0x00, 0x99, 0x33, 0x00, 0x99, 0x00, 0x00, 0x66, 0xFF, 0x00, 0x66, 0xCC,
242 0x00, 0x66, 0x99, 0x00, 0x66, 0x66, 0x00, 0x66, 0x33, 0x00, 0x66, 0x00,
243 0x00, 0x33, 0xFF, 0x00, 0x33, 0xCC, 0x00, 0x33, 0x99, 0x00, 0x33, 0x66,
0b4e3aa0 244// d0
0a7de745
A
245 0x00, 0x33, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xCC,
246 0x00, 0x00, 0x99, 0x00, 0x00, 0x66, 0x00, 0x00, 0x33, 0xEE, 0x00, 0x00,
247 0xDD, 0x00, 0x00, 0xBB, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x88, 0x00, 0x00,
248 0x77, 0x00, 0x00, 0x55, 0x00, 0x00, 0x44, 0x00, 0x00, 0x22, 0x00, 0x00,
0b4e3aa0 249// e0
0a7de745
A
250 0x11, 0x00, 0x00, 0x00, 0xEE, 0x00, 0x00, 0xDD, 0x00, 0x00, 0xBB, 0x00,
251 0x00, 0xAA, 0x00, 0x00, 0x88, 0x00, 0x00, 0x77, 0x00, 0x00, 0x55, 0x00,
252 0x00, 0x44, 0x00, 0x00, 0x22, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xEE,
253 0x00, 0x00, 0xDD, 0x00, 0x00, 0xBB, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x88,
0b4e3aa0 254// f0
0a7de745
A
255 0x00, 0x00, 0x77, 0x00, 0x00, 0x55, 0x00, 0x00, 0x44, 0x00, 0x00, 0x22,
256 0x00, 0x00, 0x11, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xBB, 0xBB, 0xBB,
257 0xAA, 0xAA, 0xAA, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x55, 0x55, 0x55,
258 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00
0b4e3aa0 259};