]> git.saurik.com Git - apple/bootx.git/blame - bootx.tproj/sl.subproj/elf.c
BootX-46.tar.gz
[apple/bootx.git] / bootx.tproj / sl.subproj / elf.c
CommitLineData
04fee52e
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
db839b1d 6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
04fee52e 7 *
db839b1d
A
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
13 * file.
14 *
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
04fee52e
A
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
db839b1d
A
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.
04fee52e
A
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25/*
26 * elf.c - A function to decode a PPC Linux Kernel.
27 *
28 * Copyright (c) 2000 Apple Computer, Inc.
29 *
30 * DRI: Josh de Cesare
31 */
32
33#include <sl.h>
34
35#include "elf.h"
36
37// Public Functions
38
39long DecodeElf(void)
40{
41 ElfHeaderPtr ehPtr;
42 ProgramHeaderPtr phPtr;
43 long cnt, paddr, offset, memsz, filesz, entry, *tmp;
44
45 ehPtr = (ElfHeaderPtr)kLoadAddr;
46 if (ehPtr->signature != kElfSignature) return 0;
47
48 entry = ehPtr->entry & kElfAddressMask;
49
50 for (cnt = 0; cnt < ehPtr->phnum; cnt++) {
51 phPtr = (ProgramHeaderPtr)(kLoadAddr+ehPtr->phoff+cnt*ehPtr->phentsize);
52
53 if (phPtr->type == kElfProgramTypeLoad) {
54 paddr = phPtr->paddr & kElfAddressMask;
55 offset = phPtr->offset;
56 filesz = phPtr->filesz;
57 memsz = phPtr->memsz;
58
59 // Get the actual entry if it is in this program.
60 if ((entry >= paddr) && (entry < (paddr + filesz))) {
61 tmp = (long *)(kLoadAddr + offset + entry);
62 if (tmp[2] == 0) entry += tmp[0];
63
64 }
65 entry += paddr;
66
67 // Add the kernel to the memory-map.
68 AllocateMemoryRange("Kernel-PROGRAM", 0, memsz);
69
70 // Set the last address used by the kernel program.
71 AllocateKernelMemory(paddr + memsz);
72
73 if (paddr < kImageAddr) {
74 // Copy the Vectors out of the way.
75 bcopy((char *)(kLoadAddr + offset), gVectorSaveAddr,
76 kVectorSize - paddr);
77
78 offset += kImageAddr - paddr;
79 filesz -= kImageAddr - paddr;
80 paddr = kImageAddr;
81 }
82
83 // Move the program.
84 bcopy((char *)(kLoadAddr + offset), (char *)paddr, filesz);
85 }
86 }
87
88 return 0;
89}