Skip to content

Commit 4f4371d

Browse files
[FREELDR:APPLETV] Simplify memory mapping code, fix Win2K
1 parent 406e4d1 commit 4f4371d

File tree

3 files changed

+139
-57
lines changed

3 files changed

+139
-57
lines changed

boot/freeldr/freeldr/arch/i386/appletv/appletvhw.c

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,115 @@ HalpCalibrateStallExecution(VOID)
188188
delay_count /= (MILLISEC / 2);
189189
}
190190

191+
static
192+
BOOLEAN
193+
AppleTVFindPciBios(PPCI_REGISTRY_INFO BusData)
194+
{
195+
/* We hardcode PCI BIOS here */
196+
197+
BusData->MajorRevision = 0x02;
198+
BusData->MinorRevision = 0x10;
199+
BusData->NoBuses = 7;
200+
BusData->HardwareMechanism = 1;
201+
return TRUE;
202+
}
203+
204+
VOID
205+
DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
206+
{
207+
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
208+
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
209+
PCI_REGISTRY_INFO BusData;
210+
ULONG Size;
211+
PCONFIGURATION_COMPONENT_DATA BusKey;
212+
ULONG i;
213+
214+
AppleTVFindPciBios(&BusData);
215+
216+
/* Set 'Configuration Data' value */
217+
Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors);
218+
PartialResourceList = FrLdrHeapAlloc(Size, TAG_HW_RESOURCE_LIST);
219+
if (PartialResourceList == NULL)
220+
{
221+
ERR("Failed to allocate resource descriptor\n");
222+
return;
223+
}
224+
225+
/* Initialize resource descriptor */
226+
RtlZeroMemory(PartialResourceList, Size);
227+
228+
/* Increment bus number */
229+
(*BusNumber)++;
230+
231+
// DetectPciIrqRoutingTable(BiosKey);
232+
233+
/* Report PCI buses */
234+
for (i = 0; i < (ULONG)BusData.NoBuses; i++)
235+
{
236+
/* Check if this is the first bus */
237+
if (i == 0)
238+
{
239+
/* Set 'Configuration Data' value */
240+
Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST,
241+
PartialDescriptors) +
242+
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) +
243+
sizeof(PCI_REGISTRY_INFO);
244+
PartialResourceList = FrLdrHeapAlloc(Size, TAG_HW_RESOURCE_LIST);
245+
if (!PartialResourceList)
246+
{
247+
ERR("Failed to allocate resource descriptor! Ignoring remaining PCI buses. (i = %lu, NoBuses = %lu)\n",
248+
i, (ULONG)BusData.NoBuses);
249+
return;
250+
}
251+
252+
/* Initialize resource descriptor */
253+
RtlZeroMemory(PartialResourceList, Size);
254+
PartialResourceList->Version = 1;
255+
PartialResourceList->Revision = 1;
256+
PartialResourceList->Count = 1;
257+
PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
258+
PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
259+
PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
260+
PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(PCI_REGISTRY_INFO);
261+
memcpy(&PartialResourceList->PartialDescriptors[1],
262+
&BusData,
263+
sizeof(PCI_REGISTRY_INFO));
264+
}
265+
else
266+
{
267+
/* Set 'Configuration Data' value */
268+
Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST,
269+
PartialDescriptors);
270+
PartialResourceList = FrLdrHeapAlloc(Size, TAG_HW_RESOURCE_LIST);
271+
if (!PartialResourceList)
272+
{
273+
ERR("Failed to allocate resource descriptor! Ignoring remaining PCI buses. (i = %lu, NoBuses = %lu)\n",
274+
i, (ULONG)BusData.NoBuses);
275+
return;
276+
}
277+
278+
/* Initialize resource descriptor */
279+
RtlZeroMemory(PartialResourceList, Size);
280+
}
281+
282+
/* Create the bus key */
283+
FldrCreateComponentKey(SystemKey,
284+
AdapterClass,
285+
MultiFunctionAdapter,
286+
0x0,
287+
0x0,
288+
0xFFFFFFFF,
289+
"PCI",
290+
PartialResourceList,
291+
Size,
292+
&BusKey);
293+
294+
/* Increment bus number */
295+
(*BusNumber)++;
296+
}
297+
298+
}
299+
191300
VOID
192301
DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
193302
{
@@ -475,6 +584,7 @@ AppleTVHwDetect(_In_opt_ PCSTR Options)
475584
/* Create the 'System' key */
476585
FldrCreateSystemKey(&SystemKey, "Apple TV (1st generation)");
477586

587+
DetectPciBios(SystemKey, &BusNumber);
478588
DetectAcpiBios(SystemKey, &BusNumber);
479589
DetectInternal(SystemKey, &BusNumber);
480590
DetectSmBios();

boot/freeldr/freeldr/arch/i386/appletv/appletvmem.c

Lines changed: 17 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -98,59 +98,6 @@ SetMemory(
9898
MemoryType);
9999
}
100100

101-
ULONG
102-
PcMemFinalizeMemoryMap(
103-
PFREELDR_MEMORY_DESCRIPTOR MemoryMap)
104-
{
105-
ULONG i;
106-
107-
/* Reserve some static ranges for freeldr */
108-
ReserveMemory(MemoryMap, 0x1000, STACKLOW - 0x1000, LoaderFirmwareTemporary, "BIOS area");
109-
ReserveMemory(MemoryMap, STACKLOW, STACKADDR - STACKLOW, LoaderOsloaderStack, "FreeLdr stack");
110-
ReserveMemory(MemoryMap, FREELDR_BASE, FrLdrImageSize, LoaderLoadedProgram, "FreeLdr image");
111-
112-
/* Default to 1 page above the firmware for the disk read buffer */
113-
DiskReadBuffer = (PUCHAR)ALIGN_UP_BY(BootArgs->KernelBaseAddress + BootArgs->KernelSize, PAGE_SIZE);
114-
DiskReadBufferSize = PAGE_SIZE;
115-
116-
/* Scan for free range above firmware */
117-
for (i = 0; i < FreeldrDescCount; i++)
118-
{
119-
if ((MemoryMap[i].BasePage > (BootArgs->KernelBaseAddress + BootArgs->KernelSize / PAGE_SIZE)) &&
120-
(MemoryMap[i].MemoryType == LoaderFree))
121-
{
122-
/* Use this range for the disk read buffer */
123-
DiskReadBuffer = (PVOID)(MemoryMap[i].BasePage * PAGE_SIZE);
124-
DiskReadBufferSize = min(MemoryMap[i].PageCount * PAGE_SIZE,
125-
MAX_DISKREADBUFFER_SIZE);
126-
break;
127-
}
128-
}
129-
130-
TRACE("DiskReadBuffer=0x%p, DiskReadBufferSize=0x%lx\n",
131-
DiskReadBuffer, DiskReadBufferSize);
132-
133-
ASSERT(DiskReadBufferSize > 0);
134-
135-
/* Now reserve the range for the disk read buffer */
136-
ReserveMemory(MemoryMap,
137-
(ULONG_PTR)DiskReadBuffer,
138-
DiskReadBufferSize,
139-
LoaderFirmwareTemporary,
140-
"Disk read buffer");
141-
142-
TRACE("Dumping resulting memory map:\n");
143-
for (i = 0; i < FreeldrDescCount; i++)
144-
{
145-
TRACE("BasePage=0x%lx, PageCount=0x%lx, Type=%s\n",
146-
MemoryMap[i].BasePage,
147-
MemoryMap[i].PageCount,
148-
MmGetSystemMemoryMapTypeString(MemoryMap[i].MemoryType));
149-
}
150-
return FreeldrDescCount;
151-
}
152-
153-
154101
static
155102
BIOS_MEMORY_TYPE
156103
UefiConvertToBiosType(EFI_MEMORY_TYPE MemoryType)
@@ -302,13 +249,26 @@ AppleTVMemGetMemoryMap(ULONG *MemoryMapSize)
302249
BiosConvertToFreeldrMap(BiosMapPtr,
303250
BiosMapNumberOfEntries);
304251

305-
// The first page should be reserved.
252+
// Reserve a few static ranges
253+
// Windows requires page #1 to be reserved
306254
SetMemory(FreeldrMemMap,
307-
0x000000,
308-
0x01000,
255+
0x0,
256+
PAGE_SIZE,
309257
LoaderSpecialMemory);
310258

311-
*MemoryMapSize = PcMemFinalizeMemoryMap(FreeldrMemMap);
259+
// FreeLoader stack
260+
SetMemory(FreeldrMemMap,
261+
STACKLOW,
262+
STACKADDR - STACKLOW,
263+
LoaderOsloaderStack);
264+
265+
// FreeLoader program
266+
SetMemory(FreeldrMemMap,
267+
FREELDR_BASE,
268+
FrLdrImageSize,
269+
LoaderLoadedProgram);
270+
271+
*MemoryMapSize = FreeldrDescCount;
312272

313273
return FreeldrMemMap;
314274
}

boot/freeldr/freeldr/arch/i386/hwdisk.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,18 @@ PcInitializeBootDevices(VOID)
460460
UCHAR DiskCount;
461461
BOOLEAN BootDriveReported = FALSE;
462462
CONFIGURATION_TYPE DriveType;
463+
464+
#ifdef SARCH_APPLETV
465+
// Set up disk read buffer.
466+
DiskReadBufferSize = PAGE_SIZE;
467+
DiskReadBuffer = MmAllocateMemoryWithType(DiskReadBufferSize, LoaderFirmwareTemporary);
468+
if (!DiskReadBuffer)
469+
{
470+
ERR("Cannot allocate disk read buffer!\n");
471+
ASSERT(FALSE);
472+
return FALSE;
473+
}
474+
#endif
463475

464476
DiskCount = EnumerateHarddisks(&BootDriveReported);
465477

0 commit comments

Comments
 (0)