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/i... ============================================================================== --- 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/i... ============================================================================== --- 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/i... ============================================================================== --- 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/i... ============================================================================== --- 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/i... ============================================================================== --- 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/p... ============================================================================== --- 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/reacto... ============================================================================== --- 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; }