diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index ff88d727559..2f800beb1d9 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -236,17 +236,6 @@ DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) DPRINTM(DPRINT_HWDETECT, "MaxNodeSize %u NodeCount %u\n", NodeSize, NodeCount); DPRINTM(DPRINT_HWDETECT, "Estimated buffer size %u\n", NodeSize * NodeCount); - /* Create component key */ - FldrCreateComponentKey(SystemKey, - AdapterClass, - MultiFunctionAdapter, - 0x0, - 0x0, - 0xFFFFFFFF, - "PNP BIOS", - &BusKey); - (*BusNumber)++; - /* Set 'Configuration Data' value */ Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + (NodeSize * NodeCount); PartialResourceList = MmHeapAlloc(Size); @@ -312,16 +301,28 @@ DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) DPRINTM(DPRINT_HWDETECT, "Real buffer size: %u\n", PnpBufferSize); DPRINTM(DPRINT_HWDETECT, "Resource size: %u\n", Size); - - FldrSetConfigurationData(BusKey, PartialResourceList, Size); + + /* Create component key */ + FldrCreateComponentKey(SystemKey, + AdapterClass, + MultiFunctionAdapter, + 0x0, + 0x0, + 0xFFFFFFFF, + "PNP BIOS", + PartialResourceList, + Size, + &BusKey); + + (*BusNumber)++; + 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 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, 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 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, { DPRINTM(DPRINT_HWDETECT, "Failed to allocate a full resource descriptor\n"); - return; + return NULL; } memset(PartialResourceList, 0, Size); @@ -374,7 +380,7 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, { 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 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, DiskGeometry->SectorsPerTrack, DiskGeometry->BytesPerSector); - FldrSetConfigurationData(DiskKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); + // + // Return configuration data + // + *pSize = Size; + return PartialResourceList; } typedef struct tagDISKCONTEXT @@ -640,15 +649,6 @@ DetectBiosFloppyPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey) /* 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 @@ DetectBiosFloppyPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey) 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 @@ DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey, 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 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, 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 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, { DPRINTM(DPRINT_HWDETECT, "Failed to allocate resource descriptor\n"); - return; + return NULL; } /* Initialize resource descriptor */ @@ -832,9 +838,6 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, 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 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, 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 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, 0x0, 0xFFFFFFFF, Identifier, + PartialResourceList, + Size, &DiskKey); - - /* Set disk values */ - SetHarddiskConfigurationData(DiskKey, 0x80 + i); } /* Get the drive we're booting from */ @@ -1202,6 +1278,12 @@ DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey, } } + /* 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 @@ DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey, 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"); } } @@ -1261,16 +1336,6 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey) /* 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) + 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) + @@ -1318,8 +1383,18 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey) (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)) @@ -1365,16 +1440,6 @@ DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey) /* 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); if (Irq[i] != (ULONG)-1) @@ -1415,8 +1480,18 @@ DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey) 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 @@ DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey) /* 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 @@ DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey) 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); } } @@ -1564,17 +1639,6 @@ DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey) 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) + 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); @@ -1619,8 +1683,19 @@ DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey) 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,17 +1822,6 @@ DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey) { DPRINTM(DPRINT_HWDETECT, "Detected PS2 port\n"); - /* Create controller key */ - FldrCreateComponentKey(BusKey, - ControllerClass, - PointerController, - Input, - 0x0, - 0xFFFFFFFF, - NULL, - &ControllerKey); - DPRINTM(DPRINT_HWDETECT, "Created key: PointerController\\0\n"); - memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST)); /* Initialize resource descriptor */ @@ -1773,15 +1837,29 @@ DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey) 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)); + /* Create controller key */ + FldrCreateComponentKey(BusKey, + ControllerClass, + PointerController, + Input, + 0x0, + 0xFFFFFFFF, + NULL, + &PartialResourceList, + sizeof(CM_PARTIAL_RESOURCE_LIST), + &ControllerKey); + DPRINTM(DPRINT_HWDETECT, "Created key: PointerController\\0\n"); 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, ControllerClass, @@ -1790,20 +1868,11 @@ DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey) 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 @@ DetectDisplayController(PCONFIGURATION_COMPONENT_DATA BusKey) 0x0, 0xFFFFFFFF, Buffer, + NULL, + 0, &ControllerKey); DPRINTM(DPRINT_HWDETECT, "Created key: DisplayController\\0\n"); @@ -1864,16 +1935,6 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 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 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 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 @@ PcHwDetect(VOID) DPRINTM(DPRINT_HWDETECT, "DetectHardware()\n"); /* Create the 'System' key */ - FldrCreateSystemKey(&SystemKey); + SystemKey = DetectSystem(); /* Detect buses */ DetectPciBios(SystemKey, &BusNumber); diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c b/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c index ddcca2d72a2..a15e31abed0 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c @@ -67,16 +67,6 @@ DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 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 @@ DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 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)++; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c b/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c index c087ef923dd..fa3e39fd81f 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c @@ -61,6 +61,12 @@ DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 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,18 +75,11 @@ DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 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)++; } diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c b/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c index ebe3e5024cf..6f962cfa0de 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c @@ -154,15 +154,6 @@ DetectPciIrqRoutingTable(PCONFIGURATION_COMPONENT_DATA BusKey) { 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 @@ DetectPciIrqRoutingTable(PCONFIGURATION_COMPONENT_DATA BusKey) 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 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) /* 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 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) /* 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 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) /* 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 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) memcpy(&PartialResourceList->PartialDescriptors[1], &BusData, sizeof(PCI_REGISTRY_INFO)); - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(BusKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); } else { @@ -309,12 +295,22 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) /* 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)++; } diff --git a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c index 1bdf287448d..4b080ec4cf0 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c @@ -29,9 +29,8 @@ extern ULONG reactos_disk_count; 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 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, 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 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, { DPRINTM(DPRINT_HWDETECT, "Failed to allocate a full resource descriptor\n"); - return; + return NULL; } memset(PartialResourceList, 0, Size); @@ -78,7 +82,7 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, { 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 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, DiskGeometry->SectorsPerTrack, DiskGeometry->BytesPerSector); - FldrSetConfigurationData(DiskKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); + // + // Return configuration data + // + *pSize = Size; + return PartialResourceList; } @@ -202,17 +209,7 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, 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 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, } } - /* 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 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, 0, 0xFFFFFFFF, Identifier, + PartialResourceList, + Size, &DiskKey); - - /* Set disk values */ - SetHarddiskConfigurationData(DiskKey, 0x80 + i); + + if (PartialResourceList) + MmHeapFree(PartialResourceList); } } @@ -292,19 +304,6 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 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) - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); @@ -322,10 +321,22 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) PartialResourceList->Revision = 1; PartialResourceList->Count = 0; - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(BusKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); + /* 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); diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c index 5e3d687bc20..e6840f07358 100644 --- a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c +++ b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c @@ -394,6 +394,8 @@ VOID OfwCopyDeviceTree 0, (ULONG)-1, NULL, + NULL, + 0, &NewKey); /* Add properties */ diff --git a/reactos/boot/freeldr/freeldr/reactos/archwsup.c b/reactos/boot/freeldr/freeldr/reactos/archwsup.c index f7d4e093509..5abf4d02f7c 100644 --- a/reactos/boot/freeldr/freeldr/reactos/archwsup.c +++ b/reactos/boot/freeldr/freeldr/reactos/archwsup.c @@ -20,6 +20,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 ******************************************************************/ PVOID @@ -139,6 +145,8 @@ FldrCreateComponentKey(IN PCONFIGURATION_COMPONENT_DATA SystemNode, 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 @@ FldrCreateComponentKey(IN PCONFIGURATION_COMPONENT_DATA SystemNode, 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 @@ FldrCreateComponentKey(IN PCONFIGURATION_COMPONENT_DATA SystemNode, if (IdentifierString) FldrSetIdentifier(ComponentData, IdentifierString); + /* Set configuration data */ + if (ResourceList) + FldrSetConfigurationData(ComponentData, ResourceList, Size); + /* Return the child */ *ComponentKey = ComponentData; }