]>
git.saurik.com Git - apple/bootx.git/blob - bootx.tproj/sl.subproj/elf.c
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
23 * @APPLE_LICENSE_HEADER_END@
26 * elf.c - A function to decode a PPC Linux Kernel.
28 * Copyright (c) 2000 Apple Computer, Inc.
39 long ThinFatBinaryElf(void **binary
, unsigned long *length
)
44 long DecodeElf(void *binary
)
47 ProgramHeaderPtr phPtr
;
48 long cnt
, paddr
, offset
, memsz
, filesz
, entry
, *tmp
;
50 ehPtr
= (ElfHeaderPtr
)binary
;
51 if (ehPtr
->signature
!= kElfSignature
) return 0;
53 entry
= ehPtr
->entry
& kElfAddressMask
;
55 for (cnt
= 0; cnt
< ehPtr
->phnum
; cnt
++) {
56 phPtr
= (ProgramHeaderPtr
)((unsigned long)binary
+ ehPtr
->phoff
+ cnt
* ehPtr
->phentsize
);
58 if (phPtr
->type
== kElfProgramTypeLoad
) {
59 paddr
= phPtr
->paddr
& kElfAddressMask
;
60 offset
= phPtr
->offset
;
61 filesz
= phPtr
->filesz
;
64 // Get the actual entry if it is in this program.
65 if ((entry
>= paddr
) && (entry
< (paddr
+ filesz
))) {
66 tmp
= (long *)((unsigned long)binary
+ offset
+ entry
);
67 if (tmp
[2] == 0) entry
+= tmp
[0];
72 // Add the kernel to the memory-map.
73 AllocateMemoryRange("Kernel-PROGRAM", 0, memsz
);
75 // Set the last address used by the kernel program.
76 AllocateKernelMemory(paddr
+ memsz
);
78 if (paddr
< kImageAddr
) {
79 // Copy the Vectors out of the way.
80 bcopy((char *)((unsigned long)binary
+ offset
), gVectorSaveAddr
,
83 offset
+= kImageAddr
- paddr
;
84 filesz
-= kImageAddr
- paddr
;
89 bcopy((char *)((unsigned long)binary
+ offset
), (char *)paddr
, filesz
);