OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
KxldState.c
Go to the documentation of this file.
1
15#include <Base.h>
16
18
19#include <Library/BaseLib.h>
20#include <Library/BaseMemoryLib.h>
21#include <Library/DebugLib.h>
22#include <Library/MemoryAllocationLib.h>
24#include <Library/OcMachoLib.h>
25#include <Library/OcStringLib.h>
26#include <Library/OcXmlLib.h>
27
28#include "PrelinkedInternal.h"
29
30STATIC
33 IN CONST VOID *KxldState,
34 IN UINT32 KxldStateSize,
35 IN MACH_CPU_TYPE CpuType
36 )
37{
39
40 if ( (KxldStateSize < sizeof (KXLD_LINK_STATE_HEADER))
41 || !BASE_TYPE_ALIGNED (KXLD_LINK_STATE_HEADER, KxldState))
42 {
43 return NULL;
44 }
45
46 Header = KxldState;
47
48 if ( (Header->Signature != KXLD_LINK_STATE_SIGNATURE)
49 || (Header->Version != KXLD_LINK_STATE_VERSION)
50 || (Header->CpuType != CpuType))
51 {
52 return NULL;
53 }
54
55 return Header;
56}
57
58STATIC
61 IN CONST VOID *KxldState,
62 IN UINT32 KxldStateSize,
63 IN MACH_CPU_TYPE CpuType,
64 OUT UINT32 *NumVtables
65 )
66{
68 CONST KXLD_VTABLE_HEADER *Vtables;
69 UINT32 SymbolSize;
70 UINT32 Index;
71 UINT32 End;
72
73 Header = InternalGetKxldHeader (KxldState, KxldStateSize, CpuType);
74 if (Header == NULL) {
75 return NULL;
76 }
77
78 if (Header->NumVtables == 0) {
79 return NULL;
80 }
81
82 if (CpuType == MachCpuTypeX86) {
83 SymbolSize = sizeof (KXLD_SYM_ENTRY_32);
84 if (!BASE_TYPE_ALIGNED (UINT32, Header->VtableOffset)) {
85 return NULL;
86 }
87 } else if (CpuType == MachCpuTypeX8664) {
88 SymbolSize = sizeof (KXLD_SYM_ENTRY_64);
89 if (!BASE_TYPE_ALIGNED (UINT64, Header->VtableOffset)) {
90 return NULL;
91 }
92 } else {
93 return NULL;
94 }
95
96 if ( BaseOverflowMulAddU32 (Header->NumVtables, sizeof (KXLD_VTABLE_HEADER), Header->VtableOffset, &End)
97 || (End > KxldStateSize))
98 {
99 return NULL;
100 }
101
102 Vtables = (KXLD_VTABLE_HEADER *)((UINT8 *)KxldState + Header->VtableOffset);
103
104 for (Index = 0; Index < Header->NumVtables; ++Index) {
105 if ( BaseOverflowMulAddU32 (Vtables[Index].NumEntries, SymbolSize, Vtables[Index].EntryOffset, &End)
106 || (End > KxldStateSize))
107 {
108 return NULL;
109 }
110 }
111
112 *NumVtables = Header->NumVtables;
113 return Vtables;
114}
115
116STATIC
117CONST VOID *
119 IN CONST VOID *KxldState,
120 IN UINT32 KxldStateSize,
121 IN MACH_CPU_TYPE CpuType,
122 OUT UINT32 *NumSymbols
123 )
124{
126 UINT32 SymbolSize;
127 UINT32 End;
128
129 Header = InternalGetKxldHeader (KxldState, KxldStateSize, CpuType);
130 if (Header == NULL) {
131 return NULL;
132 }
133
134 if (Header->NumSymbols == 0) {
135 return NULL;
136 }
137
138 if (CpuType == MachCpuTypeX86) {
139 SymbolSize = sizeof (KXLD_SYM_ENTRY_32);
140 if (!BASE_TYPE_ALIGNED (UINT32, Header->SymbolOffset)) {
141 return NULL;
142 }
143 } else if (CpuType == MachCpuTypeX8664) {
144 SymbolSize = sizeof (KXLD_SYM_ENTRY_64);
145 if (!BASE_TYPE_ALIGNED (UINT64, Header->SymbolOffset)) {
146 return NULL;
147 }
148 } else {
149 return NULL;
150 }
151
152 if ( BaseOverflowMulAddU32 (Header->NumSymbols, SymbolSize, Header->SymbolOffset, &End)
153 || (End > KxldStateSize))
154 {
155 return NULL;
156 }
157
158 *NumSymbols = Header->NumSymbols;
159 return ((UINT8 *)KxldState + Header->SymbolOffset);
160}
161
162STATIC
163CONST CHAR8 *
165 IN CONST VOID *KxldState,
166 IN UINT32 KxldStateSize,
167 IN UINT32 Offset
168 )
169{
170 CONST CHAR8 *SymbolWalker;
171 CONST CHAR8 *SymbolWalkerEnd;
172
173 if (Offset >= KxldStateSize) {
174 return NULL;
175 }
176
177 SymbolWalker = (CONST CHAR8 *)KxldState + Offset;
178 SymbolWalkerEnd = (CONST CHAR8 *)KxldState + KxldStateSize;
179
180 while (SymbolWalker < SymbolWalkerEnd) {
181 if (*SymbolWalker == '\0') {
182 return (CONST CHAR8 *)KxldState + Offset;
183 }
184
185 ++SymbolWalker;
186 }
187
188 return NULL;
189}
190
191EFI_STATUS
193 IN OUT PRELINKED_KEXT *Kext,
194 IN PRELINKED_CONTEXT *Context
195 )
196{
197 PRELINKED_KEXT_SYMBOL *SymbolTable;
198 PRELINKED_KEXT_SYMBOL *WalkerBottom;
199 PRELINKED_KEXT_SYMBOL *WalkerTop;
200 CONST CHAR8 *Name;
201 CONST KXLD_SYM_ENTRY_ANY *KxldSymbols;
202 UINT64 KxldAddress;
203 UINT32 Index;
204 UINT32 NumSymbols;
205 UINT32 NumCxxSymbols;
206 BOOLEAN Result;
207
208 ASSERT (Kext->Context.KxldState != NULL);
209 ASSERT (Kext->Context.KxldStateSize > 0);
210
211 if (Kext->LinkedSymbolTable != NULL) {
212 return EFI_SUCCESS;
213 }
214
215 KxldSymbols = InternalGetKxldSymbols (
216 Kext->Context.KxldState,
217 Kext->Context.KxldStateSize,
218 Context->Is32Bit ? MachCpuTypeI386 : MachCpuTypeX8664,
219 &NumSymbols
220 );
221
222 if (KxldSymbols == NULL) {
223 return EFI_UNSUPPORTED;
224 }
225
226 SymbolTable = AllocatePool (NumSymbols * sizeof (*SymbolTable));
227 if (SymbolTable == NULL) {
228 return EFI_OUT_OF_RESOURCES;
229 }
230
231 WalkerBottom = &SymbolTable[0];
232 WalkerTop = &SymbolTable[NumSymbols - 1];
233
234 NumCxxSymbols = 0;
235
236 DEBUG ((
237 DEBUG_VERBOSE,
238 "OCAK: Processing %a-bit %a KXLD state with %u symbols\n",
239 Context->Is32Bit ? "32" : "64",
240 Kext->Identifier,
241 NumSymbols
242 ));
243
244 for (Index = 0; Index < NumSymbols; ++Index) {
245 Name = InternalGetKxldString (
246 Kext->Context.KxldState,
247 Kext->Context.KxldStateSize,
248 Context->Is32Bit ? KxldSymbols->Kxld32.NameOffset : KxldSymbols->Kxld64.NameOffset
249 );
250 if (Name == NULL) {
251 return EFI_INVALID_PARAMETER;
252 }
253
254 Result = MachoSymbolNameIsCxx (Name);
255
256 KxldAddress = Context->Is32Bit ? KxldSymbols->Kxld32.Address : KxldSymbols->Kxld64.Address;
257
258 DEBUG ((
259 DEBUG_VERBOSE,
260 "OCAK: Adding %a-bit symbol %a with %Lx value (flags %u)\n",
261 Context->Is32Bit ? "32" : "64",
262 Name,
263 KxldAddress,
264 Context->Is32Bit ? KxldSymbols->Kxld32.Flags : KxldSymbols->Kxld64.Flags
265 ));
266
267 if (!Result) {
268 WalkerBottom->Value = KxldAddress;
269 WalkerBottom->Name = Name;
270 WalkerBottom->Length = (UINT32)AsciiStrLen (WalkerBottom->Name);
271 ++WalkerBottom;
272 } else {
273 WalkerTop->Value = KxldAddress;
274 WalkerTop->Name = Name;
275 WalkerTop->Length = (UINT32)AsciiStrLen (WalkerTop->Name);
276 --WalkerTop;
277
278 ++NumCxxSymbols;
279 }
280
281 KxldSymbols = KXLD_ANY_NEXT (Context->Is32Bit, KxldSymbols);
282 }
283
284 Kext->NumberOfSymbols = NumSymbols;
285 Kext->NumberOfCxxSymbols = NumCxxSymbols;
286 Kext->LinkedSymbolTable = SymbolTable;
287
288 return EFI_SUCCESS;
289}
290
291EFI_STATUS
293 IN OUT PRELINKED_KEXT *Kext,
294 IN PRELINKED_CONTEXT *Context
295 )
296{
297 PRELINKED_VTABLE *LinkedVtables;
298 PRELINKED_VTABLE *CurrentVtable;
299 CONST KXLD_SYM_ENTRY_ANY *KxldSymbols;
300 CONST KXLD_VTABLE_HEADER *KxldVtables;
301 UINT32 Index;
302 UINT32 Index2;
303 UINT32 NumVtables;
304 UINT32 NumEntries;
305 UINT32 ResultingSize;
306
307 ASSERT (Kext->Context.KxldState != NULL);
308 ASSERT (Kext->Context.KxldStateSize > 0);
309
310 if (Kext->LinkedVtables != NULL) {
311 return EFI_SUCCESS;
312 }
313
314 KxldVtables = InternalGetKxldVtables (
315 Kext->Context.KxldState,
316 Kext->Context.KxldStateSize,
317 Context->Is32Bit ? MachCpuTypeI386 : MachCpuTypeX8664,
318 &NumVtables
319 );
320
321 //
322 // Some KPIs may not have vtables (e.g. BSD).
323 //
324 if (KxldVtables == NULL) {
325 Kext->LinkedVtables = NULL;
326 Kext->NumberOfVtables = 0;
327 return EFI_SUCCESS;
328 }
329
330 NumEntries = 0;
331
332 for (Index = 0; Index < NumVtables; ++Index) {
333 if (BaseOverflowAddU32 (NumEntries, KxldVtables[Index].NumEntries, &NumEntries)) {
334 return EFI_OUT_OF_RESOURCES;
335 }
336 }
337
338 if ( BaseOverflowMulU32 (NumVtables, sizeof (*LinkedVtables), &ResultingSize)
339 || BaseOverflowMulAddU32 (NumEntries, sizeof (*LinkedVtables->Entries), ResultingSize, &ResultingSize))
340 {
341 return EFI_OUT_OF_RESOURCES;
342 }
343
344 LinkedVtables = AllocatePool (ResultingSize);
345 if (LinkedVtables == NULL) {
346 return EFI_OUT_OF_RESOURCES;
347 }
348
349 CurrentVtable = LinkedVtables;
350 for (Index = 0; Index < NumVtables; ++Index) {
351 CurrentVtable->Name = InternalGetKxldString (
352 Kext->Context.KxldState,
353 Kext->Context.KxldStateSize,
354 KxldVtables[Index].NameOffset
355 );
356 if (CurrentVtable->Name == NULL) {
357 FreePool (LinkedVtables);
358 return EFI_INVALID_PARAMETER;
359 }
360
361 KxldSymbols = (KXLD_SYM_ENTRY_ANY *)((UINT8 *)Kext->Context.KxldState + KxldVtables[Index].EntryOffset);
362 CurrentVtable->NumEntries = KxldVtables[Index].NumEntries;
363
364 DEBUG ((
365 DEBUG_VERBOSE,
366 "OCAK: Adding vtable %a (%u/%u) for %a of %u entries\n",
367 CurrentVtable->Name,
368 Index + 1,
369 NumVtables,
370 Kext->Identifier,
371 CurrentVtable->NumEntries
372 ));
373
374 for (Index2 = 0; Index2 < CurrentVtable->NumEntries; ++Index2) {
375 CurrentVtable->Entries[Index2].Address = Context->Is32Bit ? KxldSymbols->Kxld32.Address : KxldSymbols->Kxld64.Address;
376 CurrentVtable->Entries[Index2].Name = InternalGetKxldString (
377 Kext->Context.KxldState,
378 Kext->Context.KxldStateSize,
379 Context->Is32Bit ? KxldSymbols->Kxld32.NameOffset : KxldSymbols->Kxld64.NameOffset
380 );
381 if (CurrentVtable->Entries[Index2].Name == NULL) {
382 FreePool (LinkedVtables);
383 return EFI_INVALID_PARAMETER;
384 }
385
386 KxldSymbols = KXLD_ANY_NEXT (Context->Is32Bit, KxldSymbols);
387 }
388
389 CurrentVtable = GET_NEXT_PRELINKED_VTABLE (CurrentVtable);
390 }
391
392 Kext->LinkedVtables = LinkedVtables;
393 Kext->NumberOfVtables = NumVtables;
394
395 return EFI_SUCCESS;
396}
397
398STATIC
399EFI_STATUS
401 IN OUT PRELINKED_CONTEXT *Context,
402 IN INT64 Delta
403 )
404{
405 UINT32 Index;
406 UINT32 KextCount;
407 UINT32 FieldIndex;
408 UINT32 FieldCount;
409 XML_NODE *KextPlist;
410 CONST CHAR8 *KextPlistKey;
411 CHAR8 *ScratchWalker;
412 XML_NODE *KextPlistValue;
413 UINT64 KxldState;
414
415 KextCount = XmlNodeChildren (Context->KextList);
416
417 Context->KextScratchBuffer = ScratchWalker = AllocatePool (KextCount * KEXT_OFFSET_STR_LEN);
418 if (Context->KextScratchBuffer == NULL) {
419 return EFI_OUT_OF_RESOURCES;
420 }
421
422 for (Index = 0; Index < KextCount; ++Index) {
423 KextPlist = PlistNodeCast (XmlNodeChild (Context->KextList, Index), PLIST_NODE_TYPE_DICT);
424
425 if (KextPlist == NULL) {
426 continue;
427 }
428
429 FieldCount = PlistDictChildren (KextPlist);
430 for (FieldIndex = 0; FieldIndex < FieldCount; ++FieldIndex) {
431 KextPlistKey = PlistKeyValue (PlistDictChild (KextPlist, FieldIndex, &KextPlistValue));
432 if (KextPlistKey == NULL) {
433 continue;
434 }
435
436 if (AsciiStrCmp (KextPlistKey, PRELINK_INFO_LINK_STATE_ADDR_KEY) == 0) {
437 if (!PlistIntegerValue (KextPlistValue, &KxldState, sizeof (KxldState), TRUE)) {
438 return EFI_INVALID_PARAMETER;
439 }
440
441 DEBUG ((DEBUG_VERBOSE, "OCAK: Shifting 0x%Lx to 0x%Lx\n", KxldState, KxldState + Delta));
442
443 KxldState += Delta;
444
445 if (!AsciiUint64ToLowerHex (ScratchWalker, KEXT_OFFSET_STR_LEN, KxldState)) {
446 return EFI_INVALID_PARAMETER;
447 }
448
449 XmlNodeChangeContent (KextPlistValue, ScratchWalker);
450 ScratchWalker += AsciiStrSize (ScratchWalker);
451 }
452 }
453 }
454
455 return EFI_SUCCESS;
456}
457
458EFI_STATUS
460 IN OUT PRELINKED_CONTEXT *Context
461 )
462{
463 EFI_STATUS Status;
464 UINT32 AlignedSize;
465 UINT32 NewSize;
466
467 //
468 // This is a requirement from 10.6.8, should be guaranteed?
469 //
470 ASSERT (BASE_POT_ALIGNED (MACHO_PAGE_SIZE, Context->PrelinkedLastAddress));
471
472 //
473 // Append prelink state for 10.6.8
474 //
475 AlignedSize = MACHO_ALIGN (Context->PrelinkedStateKernelSize);
476 if ( BaseOverflowAddU32 (Context->PrelinkedSize, AlignedSize, &NewSize)
477 || (NewSize > Context->PrelinkedAllocSize))
478 {
479 return EFI_BUFFER_TOO_SMALL;
480 }
481
482 if (Context->Is32Bit) {
483 Context->PrelinkedStateSegment->Segment32.VirtualAddress = (UINT32)Context->PrelinkedLastAddress;
484 Context->PrelinkedStateSegment->Segment32.Size = AlignedSize;
485 Context->PrelinkedStateSegment->Segment32.FileOffset = Context->PrelinkedSize;
486 Context->PrelinkedStateSegment->Segment32.FileSize = AlignedSize;
487 Context->PrelinkedStateSectionKernel->Section32.Address = (UINT32)Context->PrelinkedLastAddress;
488 Context->PrelinkedStateSectionKernel->Section32.Offset = Context->PrelinkedSize;
489 Context->PrelinkedStateSectionKernel->Section32.Size = Context->PrelinkedStateKernelSize;
490 } else {
491 Context->PrelinkedStateSegment->Segment64.VirtualAddress = Context->PrelinkedLastAddress;
492 Context->PrelinkedStateSegment->Segment64.Size = AlignedSize;
493 Context->PrelinkedStateSegment->Segment64.FileOffset = Context->PrelinkedSize;
494 Context->PrelinkedStateSegment->Segment64.FileSize = AlignedSize;
495 Context->PrelinkedStateSectionKernel->Section64.Address = Context->PrelinkedLastAddress;
496 Context->PrelinkedStateSectionKernel->Section64.Offset = Context->PrelinkedSize;
497 Context->PrelinkedStateSectionKernel->Section64.Size = Context->PrelinkedStateKernelSize;
498 }
499
500 CopyMem (
501 &Context->Prelinked[Context->PrelinkedSize],
502 Context->PrelinkedStateKernel,
503 Context->PrelinkedStateKernelSize
504 );
505 ZeroMem (
506 &Context->Prelinked[Context->PrelinkedSize + Context->PrelinkedStateKernelSize],
507 AlignedSize - Context->PrelinkedStateKernelSize
508 );
509
510 Context->PrelinkedLastAddress += AlignedSize;
511 Context->PrelinkedSize += AlignedSize;
512
513 AlignedSize = MACHO_ALIGN (Context->PrelinkedStateKextsSize);
514 if ( BaseOverflowAddU32 (Context->PrelinkedSize, AlignedSize, &NewSize)
515 || (NewSize > Context->PrelinkedAllocSize))
516 {
517 return EFI_BUFFER_TOO_SMALL;
518 }
519
520 if (Context->Is32Bit) {
521 Context->PrelinkedStateSegment->Segment32.Size += AlignedSize;
522 Context->PrelinkedStateSegment->Segment32.FileSize += AlignedSize;
523 Context->PrelinkedStateSectionKexts->Section32.Address = (UINT32)Context->PrelinkedLastAddress;
524 Context->PrelinkedStateSectionKexts->Section32.Offset = Context->PrelinkedSize;
525 Context->PrelinkedStateSectionKexts->Section32.Size = Context->PrelinkedStateKextsSize;
526 } else {
527 Context->PrelinkedStateSegment->Segment64.Size += AlignedSize;
528 Context->PrelinkedStateSegment->Segment64.FileSize += AlignedSize;
529 Context->PrelinkedStateSectionKexts->Section64.Address = Context->PrelinkedLastAddress;
530 Context->PrelinkedStateSectionKexts->Section64.Offset = Context->PrelinkedSize;
531 Context->PrelinkedStateSectionKexts->Section64.Size = Context->PrelinkedStateKextsSize;
532 }
533
534 CopyMem (
535 &Context->Prelinked[Context->PrelinkedSize],
536 Context->PrelinkedStateKexts,
537 Context->PrelinkedStateKextsSize
538 );
539 ZeroMem (
540 &Context->Prelinked[Context->PrelinkedSize + Context->PrelinkedStateKextsSize],
541 AlignedSize - Context->PrelinkedStateKextsSize
542 );
543
544 Context->PrelinkedLastAddress += AlignedSize;
545 Context->PrelinkedSize += AlignedSize;
546
547 if ((Context->Is32Bit ?
548 Context->PrelinkedStateSectionKexts->Section32.Address : Context->PrelinkedStateSectionKexts->Section64.Address)
549 != Context->PrelinkedStateKextsAddress)
550 {
552 Context,
553 (INT64)((Context->Is32Bit ?
554 Context->PrelinkedStateSectionKexts->Section32.Address : Context->PrelinkedStateSectionKexts->Section64.Address)
555 - Context->PrelinkedStateKextsAddress)
556 );
557 if (!EFI_ERROR (Status)) {
558 Context->PrelinkedStateKextsAddress = Context->Is32Bit ?
559 Context->PrelinkedStateSectionKexts->Section32.Address : Context->PrelinkedStateSectionKexts->Section64.Address;
560 }
561
562 DEBUG ((
563 DEBUG_INFO,
564 "OCAK: Rebasing %a-bit KXLD state from %Lx to %Lx - %r\n",
565 Context->Is32Bit ? "32" : "64",
566 Context->PrelinkedStateKextsAddress,
567 Context->Is32Bit ?
568 Context->PrelinkedStateSectionKexts->Section32.Address : Context->PrelinkedStateSectionKexts->Section64.Address,
569 Status
570 ));
571 } else {
572 Status = EFI_SUCCESS;
573 }
574
575 return Status;
576}
577
578UINT64
580 IN BOOLEAN Is32Bit,
581 IN CONST VOID *KxldState,
582 IN UINT32 KxldStateSize,
583 IN CONST CHAR8 *Name
584 )
585{
586 CONST CHAR8 *LocalName;
587 CONST KXLD_SYM_ENTRY_ANY *KxldSymbols;
588 UINT64 KxldAddress;
589 UINT32 Index;
590 UINT32 NumSymbols;
591
592 ASSERT (KxldState != NULL);
593 ASSERT (KxldStateSize > 0);
594 ASSERT (Name != NULL);
595
596 KxldSymbols = InternalGetKxldSymbols (
597 KxldState,
598 KxldStateSize,
600 &NumSymbols
601 );
602
603 if (KxldSymbols == NULL) {
604 return 0;
605 }
606
607 DEBUG ((
608 DEBUG_VERBOSE,
609 "OCAK: Processing %a-bit KXLD state for %a with %u symbols\n",
610 Is32Bit ? "32" : "64",
611 Name,
612 NumSymbols
613 ));
614
615 for (Index = 0; Index < NumSymbols; ++Index) {
616 LocalName = InternalGetKxldString (
617 KxldState,
618 KxldStateSize,
619 Is32Bit ? KxldSymbols->Kxld32.NameOffset : KxldSymbols->Kxld64.NameOffset
620 );
621 if (LocalName == NULL) {
622 return 0;
623 }
624
625 KxldAddress = Is32Bit ? KxldSymbols->Kxld32.Address : KxldSymbols->Kxld64.Address;
626
627 DEBUG ((
628 DEBUG_VERBOSE,
629 "OCAK: Checking %a-bit symbol %a with %Lx value (flags %u)\n",
630 Is32Bit ? "32" : "64",
631 LocalName,
632 KxldAddress,
633 Is32Bit ? KxldSymbols->Kxld32.Flags : KxldSymbols->Kxld64.Flags
634 ));
635
636 if (AsciiStrCmp (LocalName, Name) == 0) {
637 return KxldAddress;
638 }
639
640 KxldSymbols = KXLD_ANY_NEXT (Is32Bit, KxldSymbols);
641 }
642
643 return 0;
644}
VENDOR_DEVICE_PATH Header
#define KXLD_LINK_STATE_SIGNATURE
#define KXLD_LINK_STATE_VERSION
@ MachCpuTypeI386
@ MachCpuTypeX8664
@ MachCpuTypeX86
INT32 MACH_CPU_TYPE
EFI_DEVICE_PATH_PROTOCOL End
STATIC CONST VOID * InternalGetKxldSymbols(IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN MACH_CPU_TYPE CpuType, OUT UINT32 *NumSymbols)
Definition KxldState.c:118
EFI_STATUS InternalKxldStateRebuild(IN OUT PRELINKED_CONTEXT *Context)
Definition KxldState.c:459
UINT64 InternalKxldSolveSymbol(IN BOOLEAN Is32Bit, IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN CONST CHAR8 *Name)
Definition KxldState.c:579
STATIC CONST CHAR8 * InternalGetKxldString(IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN UINT32 Offset)
Definition KxldState.c:164
EFI_STATUS InternalKxldStateBuildLinkedSymbolTable(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
Definition KxldState.c:192
STATIC CONST KXLD_LINK_STATE_HEADER * InternalGetKxldHeader(IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN MACH_CPU_TYPE CpuType)
Definition KxldState.c:32
EFI_STATUS InternalKxldStateBuildLinkedVtables(IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
Definition KxldState.c:292
STATIC CONST KXLD_VTABLE_HEADER * InternalGetKxldVtables(IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN MACH_CPU_TYPE CpuType, OUT UINT32 *NumVtables)
Definition KxldState.c:60
STATIC EFI_STATUS InternalKxldStateRebasePlist(IN OUT PRELINKED_CONTEXT *Context, IN INT64 Delta)
Definition KxldState.c:400
#define PRELINK_INFO_LINK_STATE_ADDR_KEY
BOOLEAN MachoSymbolNameIsCxx(IN CONST CHAR8 *Name)
Definition CxxSymbols.c:391
#define MACHO_ALIGN(x)
Definition OcMachoLib.h:28
#define MACHO_PAGE_SIZE
Definition OcMachoLib.h:23
BOOLEAN AsciiUint64ToLowerHex(OUT CHAR8 *Buffer, IN UINT32 BufferSize, IN UINT64 Value)
Definition OcAsciiLib.c:150
@ PLIST_NODE_TYPE_DICT
Definition OcXmlLib.h:91
CONST CHAR8 * PlistKeyValue(IN XML_NODE *Node OPTIONAL)
Definition OcXmlLib.c:1841
UINT32 XmlNodeChildren(IN CONST XML_NODE *Node)
Definition OcXmlLib.c:1493
UINT32 PlistDictChildren(IN CONST XML_NODE *Node)
Definition OcXmlLib.c:1813
BOOLEAN PlistIntegerValue(IN XML_NODE *Node OPTIONAL, OUT VOID *Value, IN UINT32 Size, IN BOOLEAN Hex)
Definition OcXmlLib.c:1943
XML_NODE * PlistNodeCast(IN XML_NODE *Node OPTIONAL, IN PLIST_NODE_TYPE Type)
Definition OcXmlLib.c:1760
XML_NODE * XmlNodeChild(IN CONST XML_NODE *Node, IN UINT32 Child)
Definition OcXmlLib.c:1503
VOID XmlNodeChangeContent(IN OUT XML_NODE *Node, IN CONST CHAR8 *Content)
Definition OcXmlLib.c:1477
XML_NODE * PlistDictChild(IN CONST XML_NODE *Node, IN UINT32 Child, OUT XML_NODE **Value OPTIONAL)
Definition OcXmlLib.c:1823
#define KEXT_OFFSET_STR_LEN
#define GET_NEXT_PRELINKED_VTABLE(This)
#define KXLD_ANY_NEXT(a, b)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
#define ASSERT(x)
Definition coder.h:55
CONST CHAR8 * Name
name of this symbol
UINT64 Value
value of this symbol (or stab offset)
UINT64 Address
The symbol's address.
CONST CHAR8 * Name
The symbol's name.
PRELINKED_VTABLE_ENTRY Entries[]
The VTable entries.
UINT32 NumEntries
The number of VTable entries.
CONST CHAR8 * Name
The VTable's name.