Author: hpoussin
Date: Sun Aug 23 10:25:52 2009
New Revision: 42873
URL:
http://svn.reactos.org/svn/reactos?rev=42873&view=rev
Log:
[freeldr] When creating a component, provide at the same time its configuration data
Modified:
trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
trunk/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
trunk/reactos/boot/freeldr/freeldr/reactos/archwsup.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c [iso-8859-1] Sun Aug 23
10:25:52 2009
@@ -236,6 +236,72 @@
DPRINTM(DPRINT_HWDETECT, "MaxNodeSize %u NodeCount %u\n", NodeSize,
NodeCount);
DPRINTM(DPRINT_HWDETECT, "Estimated buffer size %u\n", NodeSize *
NodeCount);
+ /* Set 'Configuration Data' value */
+ Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + (NodeSize * NodeCount);
+ PartialResourceList = MmHeapAlloc(Size);
+ if (PartialResourceList == NULL)
+ {
+ DPRINTM(DPRINT_HWDETECT,
+ "Failed to allocate resource descriptor\n");
+ return;
+ }
+ memset(PartialResourceList, 0, Size);
+
+ /* Initialize resource descriptor */
+ PartialResourceList->Version = 1;
+ PartialResourceList->Revision = 1;
+ PartialResourceList->Count = 1;
+ PartialResourceList->PartialDescriptors[0].Type =
+ CmResourceTypeDeviceSpecific;
+ PartialResourceList->PartialDescriptors[0].ShareDisposition =
+ CmResourceShareUndetermined;
+
+ Ptr = (char *)(((ULONG_PTR)&PartialResourceList->PartialDescriptors[0]) +
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
+
+ /* Set instalation check data */
+ memcpy (Ptr, InstData, sizeof(CM_PNP_BIOS_INSTALLATION_CHECK));
+ Ptr += sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
+
+ /* Copy device nodes */
+ FoundNodeCount = 0;
+ PnpBufferSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
+ for (i = 0; i < 0xFF; i++)
+ {
+ NodeNumber = (UCHAR)i;
+
+ x = PnpBiosGetDeviceNode(&NodeNumber, (PVOID)DISKREADBUFFER);
+ if (x == 0)
+ {
+ DeviceNode = (PCM_PNP_BIOS_DEVICE_NODE)DISKREADBUFFER;
+
+ DPRINTM(DPRINT_HWDETECT,
+ "Node: %u Size %u (0x%x)\n",
+ DeviceNode->Node,
+ DeviceNode->Size,
+ DeviceNode->Size);
+
+ memcpy (Ptr,
+ DeviceNode,
+ DeviceNode->Size);
+
+ Ptr += DeviceNode->Size;
+ PnpBufferSize += DeviceNode->Size;
+
+ FoundNodeCount++;
+ if (FoundNodeCount >= NodeCount)
+ break;
+ }
+ }
+
+ /* Set real data size */
+ PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize =
+ PnpBufferSize;
+ Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + PnpBufferSize;
+
+ DPRINTM(DPRINT_HWDETECT, "Real buffer size: %u\n", PnpBufferSize);
+ DPRINTM(DPRINT_HWDETECT, "Resource size: %u\n", Size);
+
/* Create component key */
FldrCreateComponentKey(SystemKey,
AdapterClass,
@@ -244,84 +310,19 @@
0x0,
0xFFFFFFFF,
"PNP BIOS",
+ PartialResourceList,
+ Size,
&BusKey);
+
(*BusNumber)++;
- /* Set 'Configuration Data' value */
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + (NodeSize * NodeCount);
- PartialResourceList = MmHeapAlloc(Size);
- if (PartialResourceList == NULL)
- {
- DPRINTM(DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n");
- return;
- }
- memset(PartialResourceList, 0, Size);
-
- /* Initialize resource descriptor */
- PartialResourceList->Version = 1;
- PartialResourceList->Revision = 1;
- PartialResourceList->Count = 1;
- PartialResourceList->PartialDescriptors[0].Type =
- CmResourceTypeDeviceSpecific;
- PartialResourceList->PartialDescriptors[0].ShareDisposition =
- CmResourceShareUndetermined;
-
- Ptr = (char *)(((ULONG_PTR)&PartialResourceList->PartialDescriptors[0]) +
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
-
- /* Set instalation check data */
- memcpy (Ptr, InstData, sizeof(CM_PNP_BIOS_INSTALLATION_CHECK));
- Ptr += sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
-
- /* Copy device nodes */
- FoundNodeCount = 0;
- PnpBufferSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
- for (i = 0; i < 0xFF; i++)
- {
- NodeNumber = (UCHAR)i;
-
- x = PnpBiosGetDeviceNode(&NodeNumber, (PVOID)DISKREADBUFFER);
- if (x == 0)
- {
- DeviceNode = (PCM_PNP_BIOS_DEVICE_NODE)DISKREADBUFFER;
-
- DPRINTM(DPRINT_HWDETECT,
- "Node: %u Size %u (0x%x)\n",
- DeviceNode->Node,
- DeviceNode->Size,
- DeviceNode->Size);
-
- memcpy (Ptr,
- DeviceNode,
- DeviceNode->Size);
-
- Ptr += DeviceNode->Size;
- PnpBufferSize += DeviceNode->Size;
-
- FoundNodeCount++;
- if (FoundNodeCount >= NodeCount)
- break;
- }
- }
-
- /* Set real data size */
- PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize =
- PnpBufferSize;
- Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + PnpBufferSize;
-
- DPRINTM(DPRINT_HWDETECT, "Real buffer size: %u\n", PnpBufferSize);
- DPRINTM(DPRINT_HWDETECT, "Resource size: %u\n", Size);
-
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
MmHeapFree(PartialResourceList);
}
-static VOID
-SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
- ULONG DriveNumber)
+static PCM_PARTIAL_RESOURCE_LIST
+GetHarddiskConfigurationData(ULONG DriveNumber, ULONG* pSize)
{
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
@@ -329,6 +330,11 @@
GEOMETRY Geometry;
ULONG Size;
+ //
+ // Initialize returned size
+ //
+ *pSize = 0;
+
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_DISK_GEOMETRY_DEVICE_DATA);
@@ -337,7 +343,7 @@
{
DPRINTM(DPRINT_HWDETECT,
"Failed to allocate a full resource descriptor\n");
- return;
+ return NULL;
}
memset(PartialResourceList, 0, Size);
@@ -374,7 +380,7 @@
{
DPRINTM(DPRINT_HWDETECT, "Reading disk geometry failed\n");
MmHeapFree(PartialResourceList);
- return;
+ return NULL;
}
DPRINTM(DPRINT_HWDETECT,
"Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
@@ -384,8 +390,11 @@
DiskGeometry->SectorsPerTrack,
DiskGeometry->BytesPerSector);
- FldrSetConfigurationData(DiskKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ //
+ // Return configuration data
+ //
+ *pSize = Size;
+ return PartialResourceList;
}
typedef struct tagDISKCONTEXT
@@ -640,15 +649,6 @@
/* Set 'Identifier' value */
sprintf(Identifier, "FLOPPY%ld", FloppyNumber + 1);
- FldrCreateComponentKey(ControllerKey,
- PeripheralClass,
- FloppyDiskPeripheral,
- Input | Output,
- FloppyNumber,
- 0xFFFFFFFF,
- Identifier,
- &PeripheralKey);
-
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_FLOPPY_DEVICE_DATA);
PartialResourceList = MmHeapAlloc(Size);
@@ -680,17 +680,26 @@
FloppyData->MaximumTrackValue = (FloppyType == 1) ? 39 : 79;
FloppyData->DataTransferRate = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size);
+ FldrCreateComponentKey(ControllerKey,
+ PeripheralClass,
+ FloppyDiskPeripheral,
+ Input | Output,
+ FloppyNumber,
+ 0xFFFFFFFF,
+ Identifier,
+ PartialResourceList,
+ Size,
+ &PeripheralKey);
+
MmHeapFree(PartialResourceList);
}
}
static VOID
-DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey,
- PCONFIGURATION_COMPONENT_DATA ControllerKey)
-{
+DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey)
+{
+ PCONFIGURATION_COMPONENT_DATA ControllerKey;
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
ULONG Size;
@@ -743,26 +752,35 @@
PartialDescriptor->u.Dma.Channel = 2;
PartialDescriptor->u.Dma.Port = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
+ /* Create floppy disk controller */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ DiskController,
+ Output | Input,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
+
MmHeapFree(PartialResourceList);
if (FloppyCount) DetectBiosFloppyPeripheral(ControllerKey);
}
-static VOID
-DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
- PCONFIGURATION_COMPONENT_DATA BusKey)
-{
+static PCONFIGURATION_COMPONENT_DATA
+DetectSystem(VOID)
+{
+ PCONFIGURATION_COMPONENT_DATA SystemKey;
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_INT13_DRIVE_PARAMETER Int13Drives;
GEOMETRY Geometry;
- PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey;
ULONG DiskCount;
ULONG Size;
ULONG i;
- BOOLEAN Changed, BootDriveReported = FALSE;
- CHAR BootPath[512];
+ BOOLEAN Changed;
/* Count the number of visible drives */
DiskReportError(FALSE);
@@ -794,18 +812,6 @@
DPRINTM(DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
(int)DiskCount, (DiskCount == 1) ? "": "s");
- FldrCreateComponentKey(BusKey,
- ControllerClass,
- DiskController,
- Output | Input | Removable,
- 0x0,
- 0xFFFFFFFF,
- NULL,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
-
- DetectBiosFloppyController(BusKey, ControllerKey);
-
/* Allocate resource descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
@@ -814,7 +820,7 @@
{
DPRINTM(DPRINT_HWDETECT,
"Failed to allocate resource descriptor\n");
- return;
+ return NULL;
}
/* Initialize resource descriptor */
@@ -832,9 +838,6 @@
Int13Drives = (PVOID)(((ULONG_PTR)PartialResourceList) +
sizeof(CM_PARTIAL_RESOURCE_LIST));
for (i = 0; i < DiskCount; i++)
{
- if (BootDrive == 0x80 + i)
- BootDriveReported = TRUE;
-
if (MachDiskGetDriveGeometry(0x80 + i, &Geometry))
{
Int13Drives[i].DriveSelect = 0x80 + i;
@@ -852,17 +855,91 @@
Geometry.BytesPerSector);
}
}
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(SystemKey, PartialResourceList, Size);
+
+ FldrCreateComponentKey(NULL,
+ SystemClass,
+ MaximumType,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &SystemKey);
+
MmHeapFree(PartialResourceList);
+
+ return SystemKey;
+}
+
+static ULONG
+GetDiskCount(PCONFIGURATION_COMPONENT_DATA BusKey)
+{
+ PCONFIGURATION_COMPONENT_DATA System;
+ ULONG ConfigurationDataLength;
+ ULONG DiskCount = 0;
+
+ //
+ // Get root component
+ //
+ System = BusKey;
+ while (System->Parent)
+ System = System->Parent;
+
+ //
+ // Get root configuration data length
+ //
+ ConfigurationDataLength = System->ComponentEntry.ConfigurationDataLength;
+
+ //
+ // We assume that nothing wrong happened, and that configuration
+ // only consists of one CM_PARTIAL_RESOURCE_LIST entry, followed
+ // by n entries of CM_INT13_DRIVE_PARAMETER
+ //
+ if (ConfigurationDataLength > 0)
+ DiskCount = (ConfigurationDataLength - sizeof(CM_PARTIAL_RESOURCE_LIST))
+ / sizeof(CM_INT13_DRIVE_PARAMETER);
+
+ //
+ // Return number of disks
+ //
+ DPRINTM(DPRINT_HWDETECT, "Retrieving %lu INT13 disks\\0\n");
+ return DiskCount;
+};
+
+static VOID
+DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA BusKey)
+{
+ PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey;
+ BOOLEAN BootDriveReported = FALSE;
+ ULONG i;
+ ULONG DiskCount = GetDiskCount(BusKey);
+ CHAR BootPath[512];
+
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ DiskController,
+ Output | Input,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ NULL,
+ 0,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
/* Create and fill subkey for each harddisk */
for (i = 0; i < DiskCount; i++)
{
+ PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
+ ULONG Size;
CHAR Identifier[20];
+ if (BootDrive == 0x80 + i)
+ BootDriveReported = TRUE;
+
/* Get disk values */
+ PartialResourceList = GetHarddiskConfigurationData(0x80 + i, &Size);
GetHarddiskIdentifier(Identifier, 0x80 + i);
/* Create disk key */
@@ -873,10 +950,9 @@
0x0,
0xFFFFFFFF,
Identifier,
+ PartialResourceList,
+ Size,
&DiskKey);
-
- /* Set disk values */
- SetHarddiskConfigurationData(DiskKey, 0x80 + i);
}
/* Get the drive we're booting from */
@@ -1202,6 +1278,12 @@
}
}
+ /* Set 'Configuration Data' value */
+ memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
+ PartialResourceList.Version = 1;
+ PartialResourceList.Revision = 1;
+ PartialResourceList.Count = 0;
+
/* Create 'PointerPeripheral' key */
FldrCreateComponentKey(ControllerKey,
PeripheralClass,
@@ -1210,20 +1292,13 @@
0x0,
0xFFFFFFFF,
Identifier,
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) -
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
&PeripheralKey);
+
DPRINTM(DPRINT_HWDETECT,
- "Created key: PointerPeripheral\\0\n");
-
- /* Set 'Configuration Data' value */
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
- PartialResourceList.Version = 1;
- PartialResourceList.Revision = 1;
- PartialResourceList.Count = 0;
-
- FldrSetConfigurationData(PeripheralKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
+ "Created key: PointerPeripheral\\0\n");
}
}
@@ -1260,16 +1335,6 @@
/* Set 'Identifier' value */
sprintf(Buffer, "COM%ld", i + 1);
-
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- ControllerClass,
- SerialController,
- Output | Input | ConsoleIn | ConsoleOut,
- ControllerNumber,
- 0xFFFFFFFF,
- Buffer,
- &ControllerKey);
/* Build full device descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
@@ -1318,8 +1383,18 @@
(PCM_SERIAL_DEVICE_DATA)&PartialResourceList->PartialDescriptors[3];
SerialDeviceData->BaudClock = 1843200; /* UART Clock frequency (Hertz) */
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
+ /* Create controller key */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ SerialController,
+ Output | Input | ConsoleIn | ConsoleOut,
+ ControllerNumber,
+ 0xFFFFFFFF,
+ Buffer,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+
MmHeapFree(PartialResourceList);
if (!Rs232PortInUse(Base))
@@ -1364,16 +1439,6 @@
/* Set 'Identifier' value */
sprintf(Buffer, "PARALLEL%ld", i + 1);
-
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- ControllerClass,
- ParallelController,
- Output,
- ControllerNumber,
- 0xFFFFFFFF,
- Buffer,
- &ControllerKey);
/* Build full device descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST);
@@ -1415,8 +1480,18 @@
PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
}
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
+ /* Create controller key */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ ParallelController,
+ Output,
+ ControllerNumber,
+ 0xFFFFFFFF,
+ Buffer,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+
MmHeapFree(PartialResourceList);
ControllerNumber++;
@@ -1509,17 +1584,6 @@
/* HACK: don't call DetectKeyboardDevice() as it fails in Qemu 0.8.2 */
if (TRUE || DetectKeyboardDevice())
{
- /* Create controller key */
- FldrCreateComponentKey(ControllerKey,
- PeripheralClass,
- KeyboardPeripheral,
- Input | ConsoleIn,
- 0x0,
- 0xFFFFFFFF,
- "PCAT_ENHANCED",
- &PeripheralKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n");
-
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_KEYBOARD_DEVICE_DATA);
@@ -1549,8 +1613,19 @@
KeyboardData->Subtype = 0;
KeyboardData->KeyboardFlags = 0x20;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size);
+ /* Create controller key */
+ FldrCreateComponentKey(ControllerKey,
+ PeripheralClass,
+ KeyboardPeripheral,
+ Input | ConsoleIn,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCAT_ENHANCED",
+ PartialResourceList,
+ Size,
+ &PeripheralKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n");
+
MmHeapFree(PartialResourceList);
}
}
@@ -1563,17 +1638,6 @@
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
PCONFIGURATION_COMPONENT_DATA ControllerKey;
ULONG Size;
-
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- ControllerClass,
- KeyboardController,
- Input | ConsoleIn,
- 0x0,
- 0xFFFFFFFF,
- NULL,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardController\\0\n");
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
@@ -1619,8 +1683,19 @@
PartialDescriptor->u.Port.Start.HighPart = 0x0;
PartialDescriptor->u.Port.Length = 1;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
+ /* Create controller key */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ KeyboardController,
+ Input | ConsoleIn,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardController\\0\n");
+
MmHeapFree(PartialResourceList);
DetectKeyboardPeripheral(ControllerKey);
@@ -1747,6 +1822,21 @@
{
DPRINTM(DPRINT_HWDETECT, "Detected PS2 port\n");
+ memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
+
+ /* Initialize resource descriptor */
+ PartialResourceList.Version = 1;
+ PartialResourceList.Revision = 1;
+ PartialResourceList.Count = 1;
+
+ /* Set Interrupt */
+ PartialResourceList.PartialDescriptors[0].Type = CmResourceTypeInterrupt;
+ PartialResourceList.PartialDescriptors[0].ShareDisposition =
CmResourceShareUndetermined;
+ PartialResourceList.PartialDescriptors[0].Flags = CM_RESOURCE_INTERRUPT_LATCHED;
+ PartialResourceList.PartialDescriptors[0].u.Interrupt.Level = 12;
+ PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 0;
+ PartialResourceList.PartialDescriptors[0].u.Interrupt.Affinity = 0xFFFFFFFF;
+
/* Create controller key */
FldrCreateComponentKey(BusKey,
ControllerClass,
@@ -1755,32 +1845,20 @@
0x0,
0xFFFFFFFF,
NULL,
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST),
&ControllerKey);
DPRINTM(DPRINT_HWDETECT, "Created key: PointerController\\0\n");
-
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
-
- /* Initialize resource descriptor */
- PartialResourceList.Version = 1;
- PartialResourceList.Revision = 1;
- PartialResourceList.Count = 1;
-
- /* Set Interrupt */
- PartialResourceList.PartialDescriptors[0].Type = CmResourceTypeInterrupt;
- PartialResourceList.PartialDescriptors[0].ShareDisposition =
CmResourceShareUndetermined;
- PartialResourceList.PartialDescriptors[0].Flags = CM_RESOURCE_INTERRUPT_LATCHED;
- PartialResourceList.PartialDescriptors[0].u.Interrupt.Level = 12;
- PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 0;
- PartialResourceList.PartialDescriptors[0].u.Interrupt.Affinity = 0xFFFFFFFF;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST));
if (DetectPS2AuxDevice())
{
DPRINTM(DPRINT_HWDETECT, "Detected PS2 mouse\n");
+
+ /* Initialize resource descriptor */
+ memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
+ PartialResourceList.Version = 1;
+ PartialResourceList.Revision = 1;
+ PartialResourceList.Count = 0;
/* Create peripheral key */
FldrCreateComponentKey(ControllerKey,
@@ -1790,20 +1868,11 @@
0x0,
0xFFFFFFFF,
"MICROSOFT PS2 MOUSE",
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) -
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
&PeripheralKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: PointerPeripheral\\0\n");
-
- /* Initialize resource descriptor */
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
- PartialResourceList.Version = 1;
- PartialResourceList.Revision = 1;
- PartialResourceList.Count = 0;
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
+ DPRINTM(DPRINT_HWDETECT, "Created key: PointerPeripheral\\0\n");
}
}
}
@@ -1850,6 +1919,8 @@
0x0,
0xFFFFFFFF,
Buffer,
+ NULL,
+ 0,
&ControllerKey);
DPRINTM(DPRINT_HWDETECT, "Created key: DisplayController\\0\n");
@@ -1863,16 +1934,6 @@
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCONFIGURATION_COMPONENT_DATA BusKey;
ULONG Size;
-
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- AdapterClass,
- MultiFunctionAdapter,
- 0x0,
- 0x0,
- 0xFFFFFFFF,
- "ISA",
- &BusKey);
/* Increment bus number */
(*BusNumber)++;
@@ -1894,12 +1955,24 @@
PartialResourceList->Revision = 1;
PartialResourceList->Count = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "ISA",
+ PartialResourceList,
+ Size,
+ &BusKey);
+
MmHeapFree(PartialResourceList);
/* Detect ISA/BIOS devices */
- DetectBiosDisks(SystemKey, BusKey);
+ DetectBiosDisks(BusKey);
+
+ DetectBiosFloppyController(BusKey);
DetectSerialPorts(BusKey);
@@ -1924,7 +1997,7 @@
DPRINTM(DPRINT_HWDETECT, "DetectHardware()\n");
/* Create the 'System' key */
- FldrCreateSystemKey(&SystemKey);
+ SystemKey = DetectSystem();
/* Detect buses */
DetectPciBios(SystemKey, &BusNumber);
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c [iso-8859-1] Sun Aug 23 10:25:52
2009
@@ -67,16 +67,6 @@
AcpiPresent = TRUE;
LoaderBlock.Flags |= MB_FLAGS_ACPI_TABLE;
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- AdapterClass,
- MultiFunctionAdapter,
- 0x0,
- 0x0,
- 0xFFFFFFFF,
- "ACPI BIOS",
- &BiosKey);
-
/* Get BIOS memory map */
RtlZeroMemory(BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32);
BiosMemoryMapEntryCount = PcMemGetMemoryMap(BiosMemoryMap,
@@ -109,10 +99,17 @@
DPRINTM(DPRINT_HWDETECT, "RSDT %p, data size %x\n",
Rsdp->rsdt_physical_address,
TableSize);
- FldrSetConfigurationData(BiosKey,
- PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) + TableSize
- );
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "ACPI BIOS",
+ PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) + TableSize,
+ &BiosKey);
/* Increment bus number */
(*BusNumber)++;
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c [iso-8859-1] Sun Aug 23 10:25:52
2009
@@ -61,6 +61,12 @@
if (FindApmBios())
{
+ /* Create 'Configuration Data' value */
+ memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
+ PartialResourceList.Version = 0;
+ PartialResourceList.Revision = 0;
+ PartialResourceList.Count = 0;
+
/* Create new bus key */
FldrCreateComponentKey(SystemKey,
AdapterClass,
@@ -69,17 +75,10 @@
0x0,
0xFFFFFFFF,
"APM",
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) -
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
&BiosKey);
-
- /* Set 'Configuration Data' value */
- memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
- PartialResourceList.Version = 0;
- PartialResourceList.Revision = 0;
- PartialResourceList.Count = 0;
- FldrSetConfigurationData(BiosKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
/* Increment bus number */
(*BusNumber)++;
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c [iso-8859-1] Sun Aug 23 10:25:52
2009
@@ -154,15 +154,6 @@
{
DPRINTM(DPRINT_HWDETECT, "Table size: %u\n", Table->Size);
- FldrCreateComponentKey(BusKey,
- PeripheralClass,
- RealModeIrqRoutingTable,
- 0x0,
- 0x0,
- 0xFFFFFFFF,
- "PCI Real-mode IRQ Routing Table",
- &TableKey);
-
/* Set 'Configuration Data' value */
Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors) +
2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) + Table->Size;
@@ -194,8 +185,17 @@
memcpy(&PartialResourceList->PartialDescriptors[2],
Table, Table->Size);
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(TableKey, PartialResourceList, Size);
+ FldrCreateComponentKey(BusKey,
+ PeripheralClass,
+ RealModeIrqRoutingTable,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCI Real-mode IRQ Routing Table",
+ PartialResourceList,
+ Size,
+ &TableKey);
+
MmHeapFree(PartialResourceList);
}
}
@@ -215,19 +215,6 @@
/* Report the PCI BIOS */
if (FindPciBios(&BusData))
{
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- AdapterClass,
- MultiFunctionAdapter,
- 0x0,
- 0x0,
- 0xFFFFFFFF,
- "PCI BIOS",
- &BiosKey);
-
- /* Increment bus number */
- (*BusNumber)++;
-
/* Set 'Configuration Data' value */
Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST,
PartialDescriptors);
@@ -242,8 +229,21 @@
/* Initialize resource descriptor */
memset(PartialResourceList, 0, Size);
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BiosKey, PartialResourceList, Size);
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCI BIOS",
+ PartialResourceList,
+ Size,
+ &BiosKey);
+
+ /* Increment bus number */
+ (*BusNumber)++;
+
MmHeapFree(PartialResourceList);
DetectPciIrqRoutingTable(BiosKey);
@@ -251,16 +251,6 @@
/* Report PCI buses */
for (i = 0; i < (ULONG)BusData.NoBuses; i++)
{
- /* Create the bus key */
- FldrCreateComponentKey(SystemKey,
- AdapterClass,
- MultiFunctionAdapter,
- 0x0,
- 0x0,
- 0xFFFFFFFF,
- "PCI",
- &BusKey);
-
/* Check if this is the first bus */
if (i == 0)
{
@@ -289,10 +279,6 @@
memcpy(&PartialResourceList->PartialDescriptors[1],
&BusData,
sizeof(PCI_REGISTRY_INFO));
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
}
else
{
@@ -309,11 +295,21 @@
/* Initialize resource descriptor */
memset(PartialResourceList, 0, Size);
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
}
+
+ /* Create the bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCI",
+ PartialResourceList,
+ Size,
+ &BusKey);
+
+ MmHeapFree(PartialResourceList);
/* Increment bus number */
(*BusNumber)++;
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c [iso-8859-1] Sun Aug 23 10:25:52
2009
@@ -29,9 +29,8 @@
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
extern char reactos_arc_strings[32][256];
-static VOID
-SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
- ULONG DriveNumber)
+static PCM_PARTIAL_RESOURCE_LIST
+GetHarddiskConfigurationData(ULONG DriveNumber, ULONG* pSize)
{
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
@@ -39,6 +38,11 @@
GEOMETRY Geometry;
ULONG Size;
+ //
+ // Initialize returned size
+ //
+ *pSize = 0;
+
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_DISK_GEOMETRY_DEVICE_DATA);
@@ -47,7 +51,7 @@
{
DPRINTM(DPRINT_HWDETECT,
"Failed to allocate a full resource descriptor\n");
- return;
+ return NULL;
}
memset(PartialResourceList, 0, Size);
@@ -78,7 +82,7 @@
{
DPRINTM(DPRINT_HWDETECT, "Reading disk geometry failed\n");
MmHeapFree(PartialResourceList);
- return;
+ return NULL;
}
DPRINTM(DPRINT_HWDETECT,
"Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
@@ -88,8 +92,11 @@
DiskGeometry->SectorsPerTrack,
DiskGeometry->BytesPerSector);
- FldrSetConfigurationData(DiskKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ //
+ // Return configuration data
+ //
+ *pSize = Size;
+ return PartialResourceList;
}
@@ -202,17 +209,7 @@
DPRINTM(DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
(int)DiskCount, (DiskCount == 1) ? "": "s");
- FldrCreateComponentKey(BusKey,
- ControllerClass,
- DiskController,
- Output | Input | Removable,
- 0,
- 0xFFFFFFFF,
- NULL,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
-
- //DetectBiosFloppyController(BusKey, ControllerKey);
+ //DetectBiosFloppyController(BusKey);
/* Allocate resource descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
@@ -258,16 +255,29 @@
}
}
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(SystemKey, PartialResourceList, Size);
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ DiskController,
+ Output | Input,
+ 0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
+
MmHeapFree(PartialResourceList);
/* Create and fill subkey for each harddisk */
for (i = 0; i < DiskCount; i++)
{
+ PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
+ ULONG Size;
CHAR Identifier[20];
/* Get disk values */
+ PartialResourceList = GetHarddiskConfigurationData(0x80 + i, &Size);
GetHarddiskIdentifier(Identifier, 0x80 + i);
/* Create disk key */
@@ -278,10 +288,12 @@
0,
0xFFFFFFFF,
Identifier,
+ PartialResourceList,
+ Size,
&DiskKey);
-
- /* Set disk values */
- SetHarddiskConfigurationData(DiskKey, 0x80 + i);
+
+ if (PartialResourceList)
+ MmHeapFree(PartialResourceList);
}
}
@@ -291,19 +303,6 @@
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCONFIGURATION_COMPONENT_DATA BusKey;
ULONG Size;
-
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- AdapterClass,
- MultiFunctionAdapter,
- 0x0,
- 0x0,
- 0xFFFFFFFF,
- "ISA",
- &BusKey);
-
- /* Increment bus number */
- (*BusNumber)++;
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) -
@@ -322,10 +321,22 @@
PartialResourceList->Revision = 1;
PartialResourceList->Count = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "ISA",
+ PartialResourceList,
+ Size,
+ &BusKey);
+
+ /* Increment bus number */
+ (*BusNumber)++;
+
MmHeapFree(PartialResourceList);
-
/* Detect ISA/BIOS devices */
DetectBiosDisks(SystemKey, BusKey);
Modified: trunk/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c [iso-8859-1] Sun Aug 23
10:25:52 2009
@@ -394,6 +394,8 @@
0,
(ULONG)-1,
NULL,
+ NULL,
+ 0,
&NewKey);
/* Add properties */
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/archwsup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/react…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/reactos/archwsup.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/reactos/archwsup.c [iso-8859-1] Sun Aug 23 10:25:52
2009
@@ -19,6 +19,12 @@
PCONFIGURATION_COMPONENT_DATA FldrArcHwTreeRoot;
BOOLEAN UseRealHeap = FALSE;
+
+VOID
+NTAPI
+FldrSetConfigurationData(IN PCONFIGURATION_COMPONENT_DATA ComponentData,
+ IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
+ IN ULONG Size);
/* FUNCTIONS ******************************************************************/
@@ -139,6 +145,8 @@
IN ULONG Key,
IN ULONG Affinity,
IN PCHAR IdentifierString,
+ IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
+ IN ULONG Size,
OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey)
{
PCONFIGURATION_COMPONENT_DATA ComponentData;
@@ -152,7 +160,8 @@
ComponentData->Parent = SystemNode;
/* Link us to the parent */
- FldrLinkToParent(SystemNode, ComponentData);
+ if (SystemNode)
+ FldrLinkToParent(SystemNode, ComponentData);
/* Set us up */
Component = &ComponentData->ComponentEntry;
@@ -166,6 +175,10 @@
if (IdentifierString)
FldrSetIdentifier(ComponentData, IdentifierString);
+ /* Set configuration data */
+ if (ResourceList)
+ FldrSetConfigurationData(ComponentData, ResourceList, Size);
+
/* Return the child */
*ComponentKey = ComponentData;
}