Chameleon

Chameleon Svn Source Tree

Root/tags/2.0/i386/libsaio/bootstruct.c

Source at commit 1808 created 12 years 3 months ago.
By blackosx, Revise layout of package installer 'Welcome' file so it looks cleaner. Change the copyright notice to begin from 2009 as seen in the Chameleon 2.0 r431 installer. Should this date be set earlier?
1/*
2 * Copyright (c) 1999-2003 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 2.0 (the "License").You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License.
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24/*
25 * Copyright 1993 NeXT, Inc.
26 * All rights reserved.
27 */
28
29#include "libsaio.h"
30#include "bootstruct.h"
31
32/*==========================================================================
33 * Initialize the structure of parameters passed to
34 * the kernel by the booter.
35 */
36
37boot_args*bootArgs;
38boot_args_pre_lion*bootArgsPreLion;
39PrivateBootInfo_t*bootInfo;
40Node*gMemoryMapNode;
41
42static char platformName[64];
43
44void initKernBootStruct( void )
45{
46Node *node;
47int nameLen;
48static int init_done = 0;
49
50if ( !init_done )
51{
52bootArgs = (boot_args *)malloc(sizeof(boot_args));
53bootArgsPreLion = (boot_args_pre_lion *)malloc(sizeof(boot_args_pre_lion));
54bootInfo = (PrivateBootInfo_t *)malloc(sizeof(PrivateBootInfo_t));
55if (bootArgs == 0 || bootInfo == 0)
56stop("Couldn't allocate boot info\n");
57
58bzero(bootArgs, sizeof(boot_args));
59bzero(bootArgsPreLion, sizeof(boot_args_pre_lion));
60bzero(bootInfo, sizeof(PrivateBootInfo_t));
61
62// Get system memory map. Also update the size of the
63// conventional/extended memory for backwards compatibility.
64
65bootInfo->memoryMapCount =
66getMemoryMap( bootInfo->memoryMap, kMemoryMapCountMax,
67 (unsigned long *) &bootInfo->convmem,
68 (unsigned long *) &bootInfo->extmem );
69
70if ( bootInfo->memoryMapCount == 0 )
71{
72// BIOS did not provide a memory map, systems with
73// discontiguous memory or unusual memory hole locations
74// may have problems.
75
76bootInfo->convmem = getConventionalMemorySize();
77bootInfo->extmem = getExtendedMemorySize();
78}
79
80bootInfo->configEnd = bootInfo->config;
81bootArgs->Video.v_display = VGA_TEXT_MODE;
82
83DT__Initialize();
84
85node = DT__FindNode("/", true);
86if (node == 0) {
87stop("Couldn't create root node");
88}
89getPlatformName(platformName);
90nameLen = strlen(platformName) + 1;
91DT__AddProperty(node, "compatible", nameLen, platformName);
92DT__AddProperty(node, "model", nameLen, platformName);
93
94gMemoryMapNode = DT__FindNode("/chosen/memory-map", true);
95
96bootArgs->Version = kBootArgsVersion;
97bootArgs->Revision = kBootArgsRevision;
98
99bootArgsPreLion->Version = kBootArgsPreLionVersion;
100bootArgsPreLion->Revision = kBootArgsPreLionRevision;
101
102init_done = 1;
103}
104}
105
106
107/* Copy boot args after kernel and record address. */
108
109void
110reserveKernBootStruct(void)
111{
112if ((gMacOSVersion[0] == '1') && (gMacOSVersion[1] == '0')
113&& (gMacOSVersion[2] == '.') && (gMacOSVersion[3] == '7'))
114{
115void *oldAddr = bootArgs;
116bootArgs = (boot_args *)AllocateKernelMemory(sizeof(boot_args));
117bcopy(oldAddr, bootArgs, sizeof(boot_args));
118}
119else
120{
121void *oldAddr = bootArgsPreLion;
122bootArgsPreLion = (boot_args_pre_lion *)AllocateKernelMemory(sizeof(boot_args_pre_lion));
123bcopy(oldAddr, bootArgsPreLion, sizeof(boot_args_pre_lion));
124}
125}
126
127void
128finalizeBootStruct(void)
129{
130uint32_t size;
131void *addr;
132int i;
133EfiMemoryRange *memoryMap;
134MemoryRange *range;
135int memoryMapCount = bootInfo->memoryMapCount;
136
137if (memoryMapCount == 0) {
138// XXX could make a two-part map here
139stop("Unable to convert memory map into proper format\n");
140}
141
142// convert memory map to boot_args memory map
143memoryMap = (EfiMemoryRange *)AllocateKernelMemory(sizeof(EfiMemoryRange) * memoryMapCount);
144bootArgs->MemoryMap = (uint32_t)memoryMap;
145bootArgs->MemoryMapSize = sizeof(EfiMemoryRange) * memoryMapCount;
146bootArgs->MemoryMapDescriptorSize = sizeof(EfiMemoryRange);
147bootArgs->MemoryMapDescriptorVersion = 0;
148
149for (i=0; i<memoryMapCount; i++, memoryMap++) {
150range = &bootInfo->memoryMap[i];
151switch(range->type) {
152case kMemoryRangeACPI:
153memoryMap->Type = kEfiACPIReclaimMemory;
154break;
155case kMemoryRangeNVS:
156memoryMap->Type = kEfiACPIMemoryNVS;
157break;
158case kMemoryRangeUsable:
159memoryMap->Type = kEfiConventionalMemory;
160break;
161case kMemoryRangeReserved:
162default:
163memoryMap->Type = kEfiReservedMemoryType;
164break;
165}
166memoryMap->PhysicalStart = range->base;
167memoryMap->VirtualStart = range->base;
168memoryMap->NumberOfPages = range->length >> I386_PGSHIFT;
169memoryMap->Attribute = 0;
170}
171
172// copy bootFile into device tree
173// XXX
174
175// add PCI info somehow into device tree
176// XXX
177
178// Flatten device tree
179DT__FlattenDeviceTree(0, &size);
180addr = (void *)AllocateKernelMemory(size);
181if (addr == 0) {
182stop("Couldn't allocate device tree\n");
183}
184
185DT__FlattenDeviceTree((void **)&addr, &size);
186bootArgs->deviceTreeP = (uint32_t)addr;
187bootArgs->deviceTreeLength = size;
188
189// Copy BootArgs values to older structure
190
191memcpy(&bootArgsPreLion->CommandLine, &bootArgs->CommandLine, BOOT_LINE_LENGTH);
192memcpy(&bootArgsPreLion->Video, &bootArgs->Video, sizeof(Boot_Video));
193
194bootArgsPreLion->MemoryMap = bootArgs->MemoryMap;
195bootArgsPreLion->MemoryMapSize = bootArgs->MemoryMapSize;
196bootArgsPreLion->MemoryMapDescriptorSize = bootArgs->MemoryMapDescriptorSize;
197bootArgsPreLion->MemoryMapDescriptorVersion = bootArgs->MemoryMapDescriptorVersion;
198
199bootArgsPreLion->deviceTreeP = bootArgs->deviceTreeP;
200bootArgsPreLion->deviceTreeLength = bootArgs->deviceTreeLength;
201
202bootArgsPreLion->kaddr = bootArgs->kaddr;
203bootArgsPreLion->ksize = bootArgs->ksize;
204
205bootArgsPreLion->efiRuntimeServicesPageStart = bootArgs->efiRuntimeServicesPageStart;
206bootArgsPreLion->efiRuntimeServicesPageCount = bootArgs->efiRuntimeServicesPageCount;
207bootArgsPreLion->efiSystemTable = bootArgs->efiSystemTable;
208
209bootArgsPreLion->efiMode = bootArgs->efiMode;
210
211bootArgsPreLion->performanceDataStart = bootArgs->performanceDataStart;
212bootArgsPreLion->performanceDataSize = bootArgs->performanceDataSize;
213bootArgsPreLion->efiRuntimeServicesVirtualPageStart = bootArgs->efiRuntimeServicesVirtualPageStart;
214}
215

Archive Download this file

Revision: 1808