Author: fireball
Date: Mon Dec 10 23:28:31 2007
New Revision: 31131
URL:
http://svn.reactos.org/svn/reactos?rev=31131&view=rev
Log:
- Pass ARC Hardware Tree in SetupLDR too.
- Zero-initialize memory from the Hardware Heap, just to be sure.
- Don't set the Version/Key/Affinity when creating the system node, let the caller do
this.
- Fix the way components were added in the tree, it was busted.
- Enable setting of component information for the APM and ACPI component nodes. This was
#if'ed out because it crashed the kernel while PnP was getting bus information for
ATAPI/SCSIPORT, since the nodes had no component data. Add some component data to remove
the crash, and then enable component information.
- The Real Mode IRQ Routing Table is a Peripheral Class, not a System Class.
- Enable the code to create component nodes for each PCI Bus, it was #if'ed out ages
ago.
- Don't create any component data for the PCI BIOS, it doesn't have any.
- Create component data for the first PCI Bus component node based on the
PCI_REGISTRY_INFO strucutre.
- Fix the way the BIOS Hard disk Peripheral nodes are created.
- Always create the DiskController node with floppy disk information, but don't do
actual floppy detection if no floppies are there.
- Fix flags for Floppy Peripheral nodes.
- Fix vector for Floppy Peripheral node.
- Set component information for each BIOS hard disk peripheral node.
- Fix component information for Serial Peripherals, they were being created on the Serial
Controller node instead.
- Set empty component information for the system node.
- TODO: Setup ACPI and APM Bios descriptor information.
- TODO: Setup ROM BIOS Block descriptor information.
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/reactos/archwsup.c
trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.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 (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c Mon Dec 10 23:28:31 2007
@@ -508,119 +508,6 @@
FldrSetIdentifier(DiskKey, Identifier);
}
-
-static VOID
-DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
- PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
- PCM_INT13_DRIVE_PARAMETER Int13Drives;
- GEOMETRY Geometry;
- PCONFIGURATION_COMPONENT_DATA DiskKey;
- ULONG DiskCount;
- ULONG Size;
- ULONG i;
- BOOLEAN Changed;
-
- /* Count the number of visible drives */
- DiskReportError(FALSE);
- DiskCount = 0;
-
- /* There are some really broken BIOSes out there. There are even BIOSes
- * that happily report success when you ask them to read from non-existent
- * harddisks. So, we set the buffer to known contents first, then try to
- * read. If the BIOS reports success but the buffer contents haven't
- * changed then we fail anyway */
- memset((PVOID) DISKREADBUFFER, 0xcd, 512);
- while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
- {
- Changed = FALSE;
- for (i = 0; ! Changed && i < 512; i++)
- {
- Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd;
- }
- if (! Changed)
- {
- DbgPrint((DPRINT_HWDETECT, "BIOS reports success for disk %d but data
didn't change\n",
- (int)DiskCount));
- break;
- }
- DiskCount++;
- memset((PVOID) DISKREADBUFFER, 0xcd, 512);
- }
- DiskReportError(TRUE);
- DbgPrint((DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
- (int)DiskCount, (DiskCount == 1) ? "": "s"));
-
- /* Allocate resource descriptor */
- Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) +
- sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
- FullResourceDescriptor = MmAllocateMemory(Size);
- if (FullResourceDescriptor == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
-
- /* Initialize resource descriptor */
- memset(FullResourceDescriptor, 0, Size);
- FullResourceDescriptor->InterfaceType = InterfaceTypeUndefined;
- FullResourceDescriptor->BusNumber = -1;
- FullResourceDescriptor->PartialResourceList.Version = 1;
- FullResourceDescriptor->PartialResourceList.Revision = 1;
- FullResourceDescriptor->PartialResourceList.Count = 1;
- FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Type =
- CmResourceTypeDeviceSpecific;
-// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition
=
-// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Flags =
-
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.DeviceSpecificData.DataSize
=
- sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
-
- /* Get harddisk Int13 geometry data */
- Int13Drives = (PVOID)(((ULONG_PTR)FullResourceDescriptor) +
sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
- for (i = 0; i < DiskCount; i++)
- {
- if (MachDiskGetDriveGeometry(0x80 + i, &Geometry))
- {
- Int13Drives[i].DriveSelect = 0x80 + i;
- Int13Drives[i].MaxCylinders = Geometry.Cylinders - 1;
- Int13Drives[i].SectorsPerTrack = Geometry.Sectors;
- Int13Drives[i].MaxHeads = Geometry.Heads - 1;
- Int13Drives[i].NumberDrives = DiskCount;
-
- DbgPrint((DPRINT_HWDETECT,
- "Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
- 0x80 + i,
- Geometry.Cylinders - 1,
- Geometry.Heads -1,
- Geometry.Sectors,
- Geometry.BytesPerSector));
- }
- }
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(SystemKey, FullResourceDescriptor, Size);
- MmFreeMemory(FullResourceDescriptor);
-
- /* Create and fill subkey for each harddisk */
- for (i = 0; i < DiskCount; i++)
- {
- /* Create disk key */
- FldrCreateComponentKey(BusKey,
- L"DiskController\\0\\DiskPeripheral",
- i,
- PeripheralClass,
- DiskPeripheral,
- &DiskKey);
-
- /* Set disk values */
- SetHarddiskConfigurationData(DiskKey, 0x80 + i);
- SetHarddiskIdentifier(DiskKey, 0x80 + i);
- }
-}
-
-
static ULONG
GetFloppyCount(VOID)
{
@@ -694,7 +581,7 @@
/* Set 'ComponentInformation' value */
FldrSetComponentInformation(PeripheralKey,
- 0x0,
+ Input | Output,
FloppyNumber,
0xFFFFFFFF);
@@ -743,12 +630,11 @@
static VOID
-DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA SystemKey,
- PCONFIGURATION_COMPONENT_DATA BusKey)
+DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey,
+ PCONFIGURATION_COMPONENT_DATA ControllerKey)
{
PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
- PCONFIGURATION_COMPONENT_DATA ControllerKey;
ULONG Size;
ULONG FloppyCount;
@@ -756,24 +642,7 @@
DbgPrint((DPRINT_HWDETECT,
"Floppy count: %u\n",
FloppyCount));
-
- if (FloppyCount == 0)
- return;
- FldrCreateComponentKey(SystemKey,
- L"DiskController",
- 0,
- ControllerClass,
- DiskController,
- &ControllerKey);
- DbgPrint((DPRINT_HWDETECT, "Created key: DiskController\\0\n"));
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output | Input | Removable,
- 0,
- 0xFFFFFFFF);
-
Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) +
2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
FullResourceDescriptor = MmAllocateMemory(Size);
@@ -807,7 +676,7 @@
PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
PartialDescriptor->u.Interrupt.Level = 6;
- PartialDescriptor->u.Interrupt.Vector = 0;
+ PartialDescriptor->u.Interrupt.Vector = 6;
PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
/* Set DMA channel */
@@ -822,9 +691,140 @@
FldrSetConfigurationData(ControllerKey, FullResourceDescriptor, Size);
MmFreeMemory(FullResourceDescriptor);
- DetectBiosFloppyPeripheral(ControllerKey);
-}
-
+ if (FloppyCount) DetectBiosFloppyPeripheral(ControllerKey);
+}
+
+static VOID
+DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
+ PCONFIGURATION_COMPONENT_DATA BusKey)
+{
+ PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
+ PCM_INT13_DRIVE_PARAMETER Int13Drives;
+ GEOMETRY Geometry;
+ PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey;
+ ULONG DiskCount;
+ ULONG Size;
+ ULONG i;
+ BOOLEAN Changed;
+
+ /* Count the number of visible drives */
+ DiskReportError(FALSE);
+ DiskCount = 0;
+
+ /* There are some really broken BIOSes out there. There are even BIOSes
+ * that happily report success when you ask them to read from non-existent
+ * harddisks. So, we set the buffer to known contents first, then try to
+ * read. If the BIOS reports success but the buffer contents haven't
+ * changed then we fail anyway */
+ memset((PVOID) DISKREADBUFFER, 0xcd, 512);
+ while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
+ {
+ Changed = FALSE;
+ for (i = 0; ! Changed && i < 512; i++)
+ {
+ Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd;
+ }
+ if (! Changed)
+ {
+ DbgPrint((DPRINT_HWDETECT, "BIOS reports success for disk %d but data
didn't change\n",
+ (int)DiskCount));
+ break;
+ }
+ DiskCount++;
+ memset((PVOID) DISKREADBUFFER, 0xcd, 512);
+ }
+ DiskReportError(TRUE);
+ DbgPrint((DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
+ (int)DiskCount, (DiskCount == 1) ? "": "s"));
+
+ FldrCreateComponentKey(BusKey,
+ L"DiskController",
+ 0,
+ ControllerClass,
+ DiskController,
+ &ControllerKey);
+ DbgPrint((DPRINT_HWDETECT, "Created key: DiskController\\0\n"));
+
+ /* Set 'ComponentInformation' value */
+ FldrSetComponentInformation(ControllerKey,
+ Output | Input | Removable,
+ 0,
+ 0xFFFFFFFF);
+
+ DetectBiosFloppyController(BusKey, ControllerKey);
+
+ /* Allocate resource descriptor */
+ Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) +
+ sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
+ FullResourceDescriptor = MmAllocateMemory(Size);
+ if (FullResourceDescriptor == NULL)
+ {
+ DbgPrint((DPRINT_HWDETECT,
+ "Failed to allocate resource descriptor\n"));
+ return;
+ }
+
+ /* Initialize resource descriptor */
+ memset(FullResourceDescriptor, 0, Size);
+ FullResourceDescriptor->InterfaceType = InterfaceTypeUndefined;
+ FullResourceDescriptor->BusNumber = -1;
+ FullResourceDescriptor->PartialResourceList.Version = 1;
+ FullResourceDescriptor->PartialResourceList.Revision = 1;
+ FullResourceDescriptor->PartialResourceList.Count = 1;
+ FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Type =
CmResourceTypeDeviceSpecific;
+ FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition
= 0;
+ FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Flags = 0;
+
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.DeviceSpecificData.DataSize
=
+ sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
+
+ /* Get harddisk Int13 geometry data */
+ Int13Drives = (PVOID)(((ULONG_PTR)FullResourceDescriptor) +
sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
+ for (i = 0; i < DiskCount; i++)
+ {
+ if (MachDiskGetDriveGeometry(0x80 + i, &Geometry))
+ {
+ Int13Drives[i].DriveSelect = 0x80 + i;
+ Int13Drives[i].MaxCylinders = Geometry.Cylinders - 1;
+ Int13Drives[i].SectorsPerTrack = Geometry.Sectors;
+ Int13Drives[i].MaxHeads = Geometry.Heads - 1;
+ Int13Drives[i].NumberDrives = DiskCount;
+
+ DbgPrint((DPRINT_HWDETECT,
+ "Disk %x: %u Cylinders %u Heads %u Sectors %u
Bytes\n",
+ 0x80 + i,
+ Geometry.Cylinders - 1,
+ Geometry.Heads -1,
+ Geometry.Sectors,
+ Geometry.BytesPerSector));
+ }
+ }
+
+ /* Set 'Configuration Data' value */
+ FldrSetConfigurationData(SystemKey, FullResourceDescriptor, Size);
+ MmFreeMemory(FullResourceDescriptor);
+
+ /* Create and fill subkey for each harddisk */
+ for (i = 0; i < DiskCount; i++)
+ {
+ /* Create disk key */
+ FldrCreateComponentKey(ControllerKey,
+ L"DiskPeripheral",
+ i,
+ PeripheralClass,
+ DiskPeripheral,
+ &DiskKey);
+
+ /* Set 'ComponentInformation' value */
+ FldrSetComponentInformation(DiskKey,
+ Output | Input,
+ 0,
+ 0xFFFFFFFF);
+
+ /* Set disk values */
+ SetHarddiskConfigurationData(DiskKey, 0x80 + i);
+ SetHarddiskIdentifier(DiskKey, 0x80 + i);
+ }
+}
static VOID
InitializeSerialPort(ULONG Port,
@@ -1483,7 +1483,7 @@
DbgPrint((DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n"));
/* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
+ FldrSetComponentInformation(PeripheralKey,
Input | ConsoleIn,
0,
0xFFFFFFFF);
@@ -1911,8 +1911,6 @@
/* Detect ISA/BIOS devices */
DetectBiosDisks(SystemKey, BusKey);
- DetectBiosFloppyController(SystemKey, BusKey);
-
DetectSerialPorts(BusKey);
DetectParallelPorts(BusKey);
@@ -1937,6 +1935,12 @@
/* Create the 'System' key */
FldrCreateSystemKey(&SystemKey);
+
+ /* Set empty component information */
+ FldrSetComponentInformation(SystemKey,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF);
/* 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 (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c Mon Dec 10 23:28:31 2007
@@ -52,7 +52,8 @@
DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
{
PCONFIGURATION_COMPONENT_DATA BiosKey;
-
+ CM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
+
if (FindAcpiBios())
{
AcpiPresent = TRUE;
@@ -65,14 +66,24 @@
MultiFunctionAdapter,
&BiosKey);
-#if 0
/* Set 'Component Information' */
FldrSetComponentInformation(BiosKey,
0x0,
0x0,
0xFFFFFFFF);
-#endif
+ /* Set 'Configuration Data' value */
+ memset(&FullResourceDescriptor, 0, sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
+ FullResourceDescriptor.InterfaceType = Internal;
+ FullResourceDescriptor.BusNumber = *BusNumber;
+ FullResourceDescriptor.PartialResourceList.Version = 0;
+ FullResourceDescriptor.PartialResourceList.Revision = 0;
+ FullResourceDescriptor.PartialResourceList.Count = 0;
+ FldrSetConfigurationData(BiosKey,
+ &FullResourceDescriptor,
+ sizeof(CM_FULL_RESOURCE_DESCRIPTOR) -
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
+
/* 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 (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c Mon Dec 10 23:28:31 2007
@@ -57,7 +57,8 @@
DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
{
PCONFIGURATION_COMPONENT_DATA BiosKey;
-
+ CM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
+
if (FindApmBios())
{
/* Create new bus key */
@@ -67,14 +68,24 @@
AdapterClass,
MultiFunctionAdapter,
&BiosKey);
-
-#if 0
+
/* Set 'Component Information' */
FldrSetComponentInformation(BiosKey,
0x0,
0x0,
0xFFFFFFFF);
-#endif
+
+ /* Set 'Configuration Data' value */
+ memset(&FullResourceDescriptor, 0, sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
+ FullResourceDescriptor.InterfaceType = Internal;
+ FullResourceDescriptor.BusNumber = *BusNumber;
+ FullResourceDescriptor.PartialResourceList.Version = 0;
+ FullResourceDescriptor.PartialResourceList.Revision = 0;
+ FullResourceDescriptor.PartialResourceList.Count = 0;
+ FldrSetConfigurationData(BiosKey,
+ &FullResourceDescriptor,
+ sizeof(CM_FULL_RESOURCE_DESCRIPTOR) -
+ 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 (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c Mon Dec 10 23:28:31 2007
@@ -54,13 +54,13 @@
ROUTING_SLOT Slot[1];
} __attribute__((packed)) PCI_IRQ_ROUTING_TABLE, *PPCI_IRQ_ROUTING_TABLE;
-typedef struct _CM_PCI_BUS_DATA
-{
- UCHAR BusCount;
- USHORT PciVersion;
- UCHAR HardwareMechanism;
-} __attribute__((packed)) CM_PCI_BUS_DATA, *PCM_PCI_BUS_DATA;
-
+typedef struct _PCI_REGISTRY_INFO
+{
+ UCHAR MajorRevision;
+ UCHAR MinorRevision;
+ UCHAR NoBuses;
+ UCHAR HardwareMechanism;
+} PCI_REGISTRY_INFO, *PPCI_REGISTRY_INFO;
static PPCI_IRQ_ROUTING_TABLE
GetPciIrqRoutingTable(VOID)
@@ -106,7 +106,7 @@
static BOOLEAN
-FindPciBios(PCM_PCI_BUS_DATA BusData)
+FindPciBios(PPCI_REGISTRY_INFO BusData)
{
REGS RegsIn;
REGS RegsOut;
@@ -125,8 +125,9 @@
DbgPrint((DPRINT_HWDETECT, "BL: %x\n", RegsOut.b.bl));
DbgPrint((DPRINT_HWDETECT, "CL: %x\n", RegsOut.b.cl));
- BusData->BusCount = RegsOut.b.cl + 1;
- BusData->PciVersion = RegsOut.w.bx;
+ BusData->NoBuses = RegsOut.b.cl + 1;
+ BusData->MajorRevision = RegsOut.b.bh;
+ BusData->MinorRevision = RegsOut.b.bl;
BusData->HardwareMechanism = RegsOut.b.cl;
return TRUE;
@@ -156,7 +157,7 @@
FldrCreateComponentKey(BusKey,
L"RealModeIrqRoutingTable",
0,
- SystemClass,
+ PeripheralClass,
RealModeIrqRoutingTable,
&TableKey);
@@ -214,14 +215,13 @@
DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
{
PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
- CM_PCI_BUS_DATA BusData;
+ PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
+ PCI_REGISTRY_INFO BusData;
PCONFIGURATION_COMPONENT_DATA BiosKey;
ULONG Size;
-#if 0
PCONFIGURATION_COMPONENT_DATA BusKey;
ULONG i;
WCHAR szPci[] = L"PCI";
-#endif
/* Report the PCI BIOS */
if (FindPciBios(&BusData))
@@ -247,26 +247,23 @@
FldrSetIdentifier(BiosKey, L"PCI BIOS");
/* Set 'Configuration Data' value */
- Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR);
+ Size = FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR,
+ PartialResourceList.PartialDescriptors);
FullResourceDescriptor = MmAllocateMemory(Size);
if (FullResourceDescriptor == NULL)
- {
- DbgPrint((DPRINT_HWDETECT,
- "Failed to allocate resource descriptor\n"));
- return;
- }
+ {
+ DbgPrint((DPRINT_HWDETECT,
+ "Failed to allocate resource descriptor\n"));
+ return;
+ }
/* Initialize resource descriptor */
memset(FullResourceDescriptor, 0, Size);
FullResourceDescriptor->InterfaceType = PCIBus;
FullResourceDescriptor->BusNumber = 0;
- FullResourceDescriptor->PartialResourceList.Version = 1;
- FullResourceDescriptor->PartialResourceList.Revision = 1;
- FullResourceDescriptor->PartialResourceList.Count = 1;
- FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Type =
CmResourceTypeBusNumber;
-
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition =
CmResourceShareDeviceExclusive;
-
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.BusNumber.Start =
0;
-
FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].u.BusNumber.Length =
1;
+ FullResourceDescriptor->PartialResourceList.Version = 0;
+ FullResourceDescriptor->PartialResourceList.Revision = 0;
+ FullResourceDescriptor->PartialResourceList.Count = 0;
/* Set 'Configuration Data' value */
FldrSetConfigurationData(BiosKey, FullResourceDescriptor, Size);
@@ -274,36 +271,90 @@
DetectPciIrqRoutingTable(BiosKey);
-#if 0
- /*
- * FIXME:
- * Enabling this piece of code will corrupt the boot sequence!
- * This is probably caused by a bug in the registry code!
- */
-
/* Report PCI buses */
- for (i = 0; i < (ULONG)BusData.BusCount; i++)
+ for (i = 0; i < (ULONG)BusData.NoBuses; i++)
{
+ /* Create the bus key */
FldrCreateComponentKey(SystemKey,
L"MultifunctionAdapter",
*BusNumber,
AdapterClass,
MultiFunctionAdapter,
- &BiosKey);
-
+ &BusKey);
+
/* Set 'Component Information' */
FldrSetComponentInformation(BusKey,
0x0,
0x0,
0xFFFFFFFF);
-
+
+ /* Check if this is the first bus */
+ if (i == 0)
+ {
+ /* Set 'Configuration Data' value */
+ Size = FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR,
+ PartialResourceList.PartialDescriptors) +
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) +
+ sizeof(PCI_REGISTRY_INFO);
+ FullResourceDescriptor = MmAllocateMemory(Size);
+ if (!FullResourceDescriptor)
+ {
+ DbgPrint((DPRINT_HWDETECT,
+ "Failed to allocate resource descriptor\n"));
+ return;
+ }
+
+ /* Initialize resource descriptor */
+ memset(FullResourceDescriptor, 0, Size);
+ FullResourceDescriptor->InterfaceType = PCIBus;
+ FullResourceDescriptor->BusNumber = i;
+ FullResourceDescriptor->PartialResourceList.Version = 1;
+ FullResourceDescriptor->PartialResourceList.Revision = 1;
+ FullResourceDescriptor->PartialResourceList.Count = 1;
+ PartialDescriptor =
&FullResourceDescriptor->PartialResourceList.PartialDescriptors[0];
+ PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
+ PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
+ PartialDescriptor->u.DeviceSpecificData.DataSize =
sizeof(PCI_REGISTRY_INFO);
+
memcpy(&FullResourceDescriptor->PartialResourceList.PartialDescriptors[1],
+ &BusData,
+ sizeof(PCI_REGISTRY_INFO));
+
+ /* Set 'Configuration Data' value */
+ FldrSetConfigurationData(BusKey, FullResourceDescriptor, Size);
+ MmFreeMemory(FullResourceDescriptor);
+ }
+ else
+ {
+ /* Set 'Configuration Data' value */
+ Size = FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR,
+ PartialResourceList.PartialDescriptors);
+ FullResourceDescriptor = MmAllocateMemory(Size);
+ if (!FullResourceDescriptor)
+ {
+ DbgPrint((DPRINT_HWDETECT,
+ "Failed to allocate resource descriptor\n"));
+ return;
+ }
+
+ /* Initialize resource descriptor */
+ memset(FullResourceDescriptor, 0, Size);
+ FullResourceDescriptor->InterfaceType = PCIBus;
+ FullResourceDescriptor->BusNumber = i;
+ FullResourceDescriptor->PartialResourceList.Version = 0;
+ FullResourceDescriptor->PartialResourceList.Revision = 0;
+ FullResourceDescriptor->PartialResourceList.Count = 0;
+
+ /* Set 'Configuration Data' value */
+ FldrSetConfigurationData(BusKey, FullResourceDescriptor, Size);
+ MmFreeMemory(FullResourceDescriptor);
+ }
+
/* Increment bus number */
(*BusNumber)++;
-
+
/* Set 'Identifier' value */
- FldrSetIdentifier(BiosKey, szPci);
+ FldrSetIdentifier(BusKey, szPci);
}
-#endif
}
}
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 (original)
+++ trunk/reactos/boot/freeldr/freeldr/reactos/archwsup.c Mon Dec 10 23:28:31 2007
@@ -29,6 +29,9 @@
/* Return a block of memory from the ARC Hardware Heap */
Buffer = &reactos_arc_hardware_data[FldrpHwHeapLocation];
+ /* Clear it */
+ RtlZeroMemory(Buffer, Size);
+
/* Increment the heap location */
FldrpHwHeapLocation += Size;
if (FldrpHwHeapLocation > HW_MAX_ARC_HEAP_SIZE) Buffer = NULL;
@@ -118,9 +121,6 @@
Component = &FldrArcHwTreeRoot->ComponentEntry;
Component->Class = SystemClass;
Component->Type = MaximumType;
- Component->Version = 0;
- Component->Key = 0;
- Component->AffinityMask = 0;
Component->ConfigurationDataLength = 0;
Component->Identifier = 0;
Component->IdentifierLength = 0;
@@ -136,6 +136,36 @@
{
DbgPrint((DPRINT_HWDETECT, "RegCreateKey() failed (Error %u)\n",
Error));
return;
+ }
+}
+
+VOID
+NTAPI
+FldrLinkToParent(IN PCONFIGURATION_COMPONENT_DATA Parent,
+ IN PCONFIGURATION_COMPONENT_DATA Child)
+{
+ PCONFIGURATION_COMPONENT_DATA Sibling;
+
+ /* Get the first sibling */
+ Sibling = Parent->Child;
+
+ /* If no sibling exists, then we are the first child */
+ if (!Sibling)
+ {
+ /* Link us in */
+ Parent->Child = Child;
+ }
+ else
+ {
+ /* Loop each sibling */
+ do
+ {
+ /* This is now the parent */
+ Parent = Sibling;
+ } while ((Sibling = Sibling->Sibling));
+
+ /* Found the lowest sibling; mark us as its sibling too */
+ Parent->Sibling = Child;
}
}
@@ -160,17 +190,8 @@
/* Now save our parent */
ComponentData->Parent = SystemNode;
- /* Now we need to figure out if the parent already has a child entry */
- if (SystemNode->Child)
- {
- /* It does, so we'll be a sibling of the child instead */
- SystemNode->Child->Sibling = ComponentData;
- }
- else
- {
- /* It doesn't, so we will be the first child */
- SystemNode->Child = ComponentData;
- }
+ /* Link us to the parent */
+ FldrLinkToParent(SystemNode, ComponentData);
/* Set us up */
Component = &ComponentData->ComponentEntry;
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/react…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c Mon Dec 10 23:28:31 2007
@@ -30,6 +30,7 @@
LOADER_MODULE reactos_modules[64]; // Array to hold boot module info loaded for the
kernel
char reactos_module_strings[64][256]; // Array to hold module names
reactos_mem_data_t reactos_mem_data;
+extern char reactos_arc_hardware_data[HW_MAX_ARC_HEAP_SIZE];
char szBootPath[256];
char szHalName[256];
CHAR SystemRoot[255];
@@ -186,6 +187,7 @@
LoaderBlock.PageDirectoryEnd = (ULONG)&PageDirectoryEnd;
LoaderBlock.ModsCount = 0;
LoaderBlock.ModsAddr = reactos_modules;
+ LoaderBlock.ArchExtra = (ULONG)reactos_arc_hardware_data;
LoaderBlock.MmapLength = (unsigned
long)MachGetMemoryMap((PBIOS_MEMORY_MAP)reactos_memory_map, 32) * sizeof(memory_map_t);
if (LoaderBlock.MmapLength)
{