- Fixed some compiler warnings.
authorEric Kohl <eric.kohl@reactos.org>
Mon, 30 Aug 2004 10:53:38 +0000 (10:53 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 30 Aug 2004 10:53:38 +0000 (10:53 +0000)
- Detect and report PCI-BIOS.

svn path=/trunk/; revision=10742

freeldr/freeldr/CHANGELOG
freeldr/freeldr/Makefile
freeldr/freeldr/arch/i386/hardware.c
freeldr/freeldr/arch/i386/hardware.h
freeldr/freeldr/arch/i386/hwpci.c [new file with mode: 0644]
freeldr/freeldr/arch/i386/i386cpu.S
freeldr/freeldr/include/version.h
freeldr/freeldr/reactos/binhive.c
freeldr/freeldr/reactos/reactos.c
freeldr/freeldr/reactos/setupldr.c
freeldr/freeldr/rtl/print.c

index 0dc77fb..301b011 100644 (file)
@@ -1,3 +1,8 @@
+Changes in v1.8.23 (30/08/2004) (ekohl)
+
+- Fixed some compiler warnings.
+- Detect and report PCI-BIOS.
+
 Changes in v1.8.22 (21/05/2004) (navaraf)
 
 - Fixed lots of bugs in NTFS code and added correct update sequence
index 492ca14..c6aac39 100644 (file)
@@ -188,24 +188,25 @@ endif
 # fathelp.o must come first in the link line because it contains bootsector helper code
 # arch.o must come second in the link line because it contains the startup code
 ARCH_OBJS      =       fathelp.o       \
-                               arch.o          \
-                               i386idt.o       \
-                               i386trap.o      \
-                               i386cpu.o       \
-                               i386pnp.o       \
-                               boot.o          \
-                               linux.o         \
-                               mb.o            \
-                               i386mem.o       \
-                               i386rtl.o       \
-                               i386vid.o       \
-                               drvmap.o        \
-                               int386.o        \
-                               i386disk.o      \
-                               portio.o        \
-                               hardware.o      \
-                               hwcpu.o         \
-                               _alloca.o               # For Mingw32 builds
+                       arch.o          \
+                       i386idt.o       \
+                       i386trap.o      \
+                       i386cpu.o       \
+                       i386pnp.o       \
+                       boot.o          \
+                       linux.o         \
+                       mb.o            \
+                       i386mem.o       \
+                       i386rtl.o       \
+                       i386vid.o       \
+                       drvmap.o        \
+                       int386.o        \
+                       i386disk.o      \
+                       portio.o        \
+                       hardware.o      \
+                       hwcpu.o         \
+                       hwpci.o         \
+                       _alloca.o               # For Mingw32 builds
 
 
 RTL_OBJS       =       print.o         \
index 46da856..5d63374 100644 (file)
@@ -374,6 +374,12 @@ DetectPnpBios(HKEY SystemKey, U32 *BusNumber)
   /* Increment bus number */
   (*BusNumber)++;
 
+  /* Set 'Component Information' value similar to my NT4 box */
+  SetComponentInformation(BusKey,
+                          0x0,
+                          0x0,
+                          0xFFFFFFFF);
+
   /* Set 'Identifier' value */
   Error = RegSetValue(BusKey,
                      "Identifier",
@@ -1334,9 +1340,10 @@ DetectSerialPorts(HKEY BusKey)
   PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
   PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
   PCM_SERIAL_DEVICE_DATA SerialDeviceData;
-  U32 Base[4] = {0x3F8, 0x2F8, 0x3E8, 0x2E8};
   U32 Irq[4] = {4, 3, 4, 3};
+  U32 Base;
   char Buffer[80];
+  PU16 BasePtr;
   U32 ControllerNumber = 0;
   HKEY ControllerKey;
   U32 i;
@@ -1345,122 +1352,124 @@ DetectSerialPorts(HKEY BusKey)
 
   DbgPrint((DPRINT_HWDETECT, "DetectSerialPorts()\n"));
 
-  for (i = 0; i < 4; i++)
+  ControllerNumber = 0;
+  BasePtr = (PU16)0x400;
+  for (i = 0; i < 4; i++, BasePtr++)
     {
-      WRITE_PORT_UCHAR ((PUCHAR)(Base[i] + 4), 0x10);
-      if (!(READ_PORT_UCHAR((PUCHAR)Base[i] + 6) & 0xf0))
+      Base = (U32)*BasePtr;
+      if (Base == 0)
+        continue;
+
+      DbgPrint((DPRINT_HWDETECT,
+               "Found COM%u port at 0x%x\n",
+               i + 1,
+               Base));
+
+      /* Create controller key */
+      sprintf(Buffer,
+             "SerialController\\%u",
+             ControllerNumber);
+
+      Error = RegCreateKey(BusKey,
+                          Buffer,
+                          &ControllerKey);
+      if (Error != ERROR_SUCCESS)
        {
-         DbgPrint((DPRINT_HWDETECT,
-                   "Found COM%u port at 0x%x\n",
-                   i + 1,
-                   Base[i]));
-
-         /* Create controller key */
-         sprintf(Buffer,
-                 "SerialController\\%u",
-                 ControllerNumber);
-
-         Error = RegCreateKey(BusKey,
-                              Buffer,
-                              &ControllerKey);
-         if (Error != ERROR_SUCCESS)
-           {
-             DbgPrint((DPRINT_HWDETECT, "Failed to create controller key\n"));
-             continue;
-           }
-         DbgPrint((DPRINT_HWDETECT, "Created key: %s\n", Buffer));
+         DbgPrint((DPRINT_HWDETECT, "Failed to create controller key\n"));
+         continue;
+       }
+      DbgPrint((DPRINT_HWDETECT, "Created key: %s\n", Buffer));
 
-         /* Set 'ComponentInformation' value */
-         SetComponentInformation(ControllerKey,
-                                 0x78,
-                                 ControllerNumber,
-                                 0xFFFFFFFF);
+      /* Set 'ComponentInformation' value */
+      SetComponentInformation(ControllerKey,
+                             0x78,
+                             ControllerNumber,
+                             0xFFFFFFFF);
 
-         /* Build full device descriptor */
-         Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) +
-                2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) +
-                sizeof(CM_SERIAL_DEVICE_DATA);
-         FullResourceDescriptor = MmAllocateMemory(Size);
-         if (FullResourceDescriptor == NULL)
-           {
-             DbgPrint((DPRINT_HWDETECT,
-                       "Failed to allocate resource descriptor\n"));
-             continue;
-           }
-         memset(FullResourceDescriptor, 0, Size);
+      /* Build full device descriptor */
+      Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) +
+            2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) +
+            sizeof(CM_SERIAL_DEVICE_DATA);
+      FullResourceDescriptor = MmAllocateMemory(Size);
+      if (FullResourceDescriptor == NULL)
+       {
+         DbgPrint((DPRINT_HWDETECT,
+                   "Failed to allocate resource descriptor\n"));
+         continue;
+       }
+      memset(FullResourceDescriptor, 0, Size);
 
-         /* Initialize resource descriptor */
-         FullResourceDescriptor->InterfaceType = Isa;
-         FullResourceDescriptor->BusNumber = 0;
-         FullResourceDescriptor->PartialResourceList.Count = 3;
-
-         /* Set IO Port */
-         PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0];
-         PartialDescriptor->Type = CmResourceTypePort;
-         PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
-         PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
-         PartialDescriptor->u.Port.Start = (U64)Base[i];
-         PartialDescriptor->u.Port.Length = 7;
-
-         /* Set Interrupt */
-         PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[1];
-         PartialDescriptor->Type = CmResourceTypeInterrupt;
-         PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
-         PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
-         PartialDescriptor->u.Interrupt.Level = Irq[i];
-         PartialDescriptor->u.Interrupt.Vector = Irq[i];
-         PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
+      /* Initialize resource descriptor */
+      FullResourceDescriptor->InterfaceType = Isa;
+      FullResourceDescriptor->BusNumber = 0;
+      FullResourceDescriptor->PartialResourceList.Count = 3;
 
-         /* Set serial data (device specific) */
-         PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[2];
-         PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
-         PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
-         PartialDescriptor->Flags = 0;
-         PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_SERIAL_DEVICE_DATA);
+      /* Set IO Port */
+      PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0];
+      PartialDescriptor->Type = CmResourceTypePort;
+      PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+      PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
+      PartialDescriptor->u.Port.Start = (U64)Base;
+      PartialDescriptor->u.Port.Length = 7;
 
-         SerialDeviceData =
-          (PCM_SERIAL_DEVICE_DATA)&FullResourceDescriptor->PartialResourceList.PartialDescriptors[3];
-         SerialDeviceData->BaudClock = 1843200; /* UART Clock frequency (Hertz) */
+      /* Set Interrupt */
+      PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[1];
+      PartialDescriptor->Type = CmResourceTypeInterrupt;
+      PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
+      PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
+      PartialDescriptor->u.Interrupt.Level = Irq[i];
+      PartialDescriptor->u.Interrupt.Vector = Irq[i];
+      PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
+
+      /* Set serial data (device specific) */
+      PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[2];
+      PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
+      PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
+      PartialDescriptor->Flags = 0;
+      PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_SERIAL_DEVICE_DATA);
+
+      SerialDeviceData =
+       (PCM_SERIAL_DEVICE_DATA)&FullResourceDescriptor->PartialResourceList.PartialDescriptors[3];
+      SerialDeviceData->BaudClock = 1843200; /* UART Clock frequency (Hertz) */
 
-         /* Set 'Configuration Data' value */
-         Error = RegSetValue(ControllerKey,
-                             "Configuration Data",
-                             REG_FULL_RESOURCE_DESCRIPTOR,
-                             (PU8) FullResourceDescriptor,
-                             Size);
-         MmFreeMemory(FullResourceDescriptor);
-         if (Error != ERROR_SUCCESS)
-           {
-             DbgPrint((DPRINT_HWDETECT,
-                       "RegSetValue(Configuration Data) failed (Error %u)\n",
-                       (int)Error));
-           }
+      /* Set 'Configuration Data' value */
+      Error = RegSetValue(ControllerKey,
+                         "Configuration Data",
+                         REG_FULL_RESOURCE_DESCRIPTOR,
+                         (PU8) FullResourceDescriptor,
+                         Size);
+      MmFreeMemory(FullResourceDescriptor);
+      if (Error != ERROR_SUCCESS)
+       {
+         DbgPrint((DPRINT_HWDETECT,
+                   "RegSetValue(Configuration Data) failed (Error %u)\n",
+                   (int)Error));
+       }
 
-         /* Set 'Identifier' value */
-         sprintf(Buffer,
-                 "COM%u",
-                 i + 1);
-         Error = RegSetValue(ControllerKey,
-                             "Identifier",
-                             REG_SZ,
-                             (PU8)Buffer,
-                             strlen(Buffer) + 1);
-         if (Error != ERROR_SUCCESS)
-           {
-             DbgPrint((DPRINT_HWDETECT,
-                       "RegSetValue() failed (Error %u)\n",
-                       (int)Error));
-             continue;
-           }
+      /* Set 'Identifier' value */
+      sprintf(Buffer,
+             "COM%u",
+             i + 1);
+      Error = RegSetValue(ControllerKey,
+                         "Identifier",
+                         REG_SZ,
+                         (PU8)Buffer,
+                         strlen(Buffer) + 1);
+      if (Error != ERROR_SUCCESS)
+       {
          DbgPrint((DPRINT_HWDETECT,
-                   "Created value: Identifier %s\n",
-                   Buffer));
+                   "RegSetValue() failed (Error %u)\n",
+                   (int)Error));
+         continue;
+       }
+      DbgPrint((DPRINT_HWDETECT,
+               "Created value: Identifier %s\n",
+               Buffer));
 
-         /* Detect serial mouse */
-         DetectSerialPointerPeripheral(ControllerKey, Base[i]);
+      /* Detect serial mouse */
+      DetectSerialPointerPeripheral(ControllerKey, Base);
 
-         ControllerNumber++;
-       }
+      ControllerNumber++;
     }
 }
 
@@ -1474,6 +1483,7 @@ DetectParallelPorts(HKEY BusKey)
   char Buffer[80];
   HKEY ControllerKey;
   PU16 BasePtr;
+  U32 Base;
   U32 ControllerNumber;
   U32 i;
   S32 Error;
@@ -1485,13 +1495,14 @@ DetectParallelPorts(HKEY BusKey)
   BasePtr = (PU16)0x408;
   for (i = 0; i < 3; i++, BasePtr++)
     {
-      if (*BasePtr == 0)
+      Base = (U32)*BasePtr;
+      if (Base == 0)
         continue;
 
       DbgPrint((DPRINT_HWDETECT,
                "Parallel port %u: %x\n",
                ControllerNumber,
-               *BasePtr));
+               Base));
 
       /* Create controller key */
       sprintf(Buffer,
@@ -1510,7 +1521,7 @@ DetectParallelPorts(HKEY BusKey)
 
       /* Set 'ComponentInformation' value */
       SetComponentInformation(ControllerKey,
-                             0x78, /* FIXME */
+                             0x40,
                              ControllerNumber,
                              0xFFFFFFFF);
 
@@ -1538,7 +1549,7 @@ DetectParallelPorts(HKEY BusKey)
       PartialDescriptor->Type = CmResourceTypePort;
       PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
       PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
-      PartialDescriptor->u.Port.Start = (U64)*BasePtr;
+      PartialDescriptor->u.Port.Start = (U64)Base;
       PartialDescriptor->u.Port.Length = 3;
 
       /* Set Interrupt */
@@ -2245,8 +2256,8 @@ DetectHardware(VOID)
   DetectCPUs(SystemKey);
 
   /* Detect buses */
+  DetectPciBios(SystemKey, &BusNumber);
 #if 0
-  DetectPciBios(&BusNumber);
   DetectApmBios(&BusNumber);
 #endif
   DetectPnpBios(SystemKey, &BusNumber);
index bde9c37..0f59379 100644 (file)
@@ -163,6 +163,9 @@ VOID SetComponentInformation(HKEY ComponentKey,
 /* hwcpu.c */
 VOID DetectCPUs(HKEY SystemKey);
 
+/* hwpci.c */
+VOID DetectPciBios(HKEY SystemKey, U32 *BusNumber);
+
 /* i386cpu.S */
 U32 CpuidSupported(VOID);
 VOID GetCpuid(U32 Level,
diff --git a/freeldr/freeldr/arch/i386/hwpci.c b/freeldr/freeldr/arch/i386/hwpci.c
new file mode 100644 (file)
index 0000000..05f360f
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ *  FreeLoader
+ *
+ *  Copyright (C) 2004  Eric Kohl
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <freeldr.h>
+#include <arch.h>
+#include <rtl.h>
+#include <debug.h>
+#include <mm.h>
+#include <portio.h>
+
+#include "../../reactos/registry.h"
+#include "hardware.h"
+
+typedef struct _ROUTING_SLOT
+{
+  U8  BusNumber;
+  U8  DeviceNumber;
+  U8  LinkA;
+  U16 BitmapA;
+  U8  LinkB;
+  U16 BitmapB;
+  U8  LinkC;
+  U16 BitmapC;
+  U8  LinkD;
+  U16 BitmapD;
+  U8  SlotNumber;
+  U8  Reserved;
+} __attribute__((packed)) ROUTING_SLOT, *PROUTING_SLOT;
+
+typedef struct _PCI_IRQ_ROUTING_TABLE
+{
+  U32 Signature;
+  U16 Version;
+  U16 Size;
+  U8  RouterBus;
+  U8  RouterSlot;
+  U16 ExclusiveIRQs;
+  U32 CompatibleRouter;
+  U32 MiniportData;
+  U8  Reserved[11];
+  U8  Checksum;
+  ROUTING_SLOT Slot[1];
+} __attribute__((packed)) PCI_IRQ_ROUTING_TABLE, *PPCI_IRQ_ROUTING_TABLE;
+
+typedef struct _CM_PCI_BUS_DATA
+{
+  U8  BusCount;
+  U16 PciVersion;
+  U8  HardwareMechanism;
+} __attribute__((packed)) CM_PCI_BUS_DATA, *PCM_PCI_BUS_DATA;
+
+
+static PPCI_IRQ_ROUTING_TABLE
+GetPciIrqRoutingTable(VOID)
+{
+  PPCI_IRQ_ROUTING_TABLE Table;
+  PU8 Ptr;
+  U32 Sum;
+  U32 i;
+
+  Table = (PPCI_IRQ_ROUTING_TABLE)0xF0000;
+  while ((U32)Table < 0x100000)
+    {
+      if (Table->Signature == 0x52495024)
+       {
+         DbgPrint((DPRINT_HWDETECT,
+                   "Found signature\n"));
+
+         Ptr = (PU8)Table;
+         Sum = 0;
+         for (i = 0; i < Table->Size; i++)
+           {
+             Sum += Ptr[i];
+           }
+
+         if ((Sum & 0xFF) != 0)
+           {
+             DbgPrint((DPRINT_HWDETECT,
+                       "Invalid routing table\n"));
+             return NULL;
+           }
+
+         DbgPrint((DPRINT_HWDETECT,
+                  "Valid checksum\n"));
+
+         return Table;
+       }
+
+      Table = (PPCI_IRQ_ROUTING_TABLE)((U32)Table + 0x10);
+    }
+
+  return NULL;
+}
+
+
+static BOOL
+FindPciBios(PCM_PCI_BUS_DATA BusData)
+{
+  REGS  RegsIn;
+  REGS  RegsOut;
+
+  RegsIn.b.ah = 0xB1; /* Subfunction B1h */
+  RegsIn.b.al = 0x01; /* PCI BIOS present */
+
+  Int386(0x1A, &RegsIn, &RegsOut);
+
+  if (INT386_SUCCESS(RegsOut) && RegsOut.d.edx == 0x20494350 && RegsOut.b.ah == 0)
+    {
+//      printf("Found PCI bios\n");
+
+//      printf("AL: %x\n", RegsOut.b.al);
+//      printf("BH: %x\n", RegsOut.b.bh);
+//      printf("BL: %x\n", RegsOut.b.bl);
+//      printf("CL: %x\n", RegsOut.b.cl);
+
+      BusData->BusCount = RegsOut.b.cl + 1;
+      BusData->PciVersion = RegsOut.w.bx;
+      BusData->HardwareMechanism = RegsOut.b.cl;
+
+      return TRUE;
+    }
+
+
+//  printf("No PCI bios found\n");
+
+  return FALSE;
+}
+
+
+static VOID
+DetectPciIrqRoutingTable(HKEY BusKey)
+{
+  PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
+  PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
+  PPCI_IRQ_ROUTING_TABLE Table;
+  HKEY TableKey;
+  U32 Size;
+  S32 Error;
+
+  Table = GetPciIrqRoutingTable();
+  if (Table != NULL)
+    {
+      DbgPrint((DPRINT_HWDETECT, "Table size: %u\n", Table->Size));
+
+      Error = RegCreateKey(BusKey,
+                          "RealModeIrqRoutingTable\\0",
+                          &TableKey);
+      if (Error != ERROR_SUCCESS)
+       {
+         DbgPrint((DPRINT_HWDETECT, "RegCreateKey() failed (Error %u)\n", (int)Error));
+         return;
+       }
+
+      /* Set 'Component Information' */
+      SetComponentInformation(TableKey,
+                              0x0,
+                              0x0,
+                              0xFFFFFFFF);
+
+      /* Set 'Identifier' value */
+      Error = RegSetValue(TableKey,
+                         "Identifier",
+                         REG_SZ,
+                         (PU8)"PCI Real-mode IRQ Routing Table",
+                         32);
+      if (Error != ERROR_SUCCESS)
+       {
+         DbgPrint((DPRINT_HWDETECT, "RegSetValue() failed (Error %u)\n", (int)Error));
+         return;
+       }
+
+      /* Set 'Configuration Data' value */
+      Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) +
+            Table->Size;
+      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 = Isa;
+      FullResourceDescriptor->BusNumber = 0;
+      FullResourceDescriptor->PartialResourceList.Count = 1;
+
+      PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0];
+      PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
+      PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
+      PartialDescriptor->u.DeviceSpecificData.DataSize = Table->Size;
+
+      memcpy(((PVOID)FullResourceDescriptor) + sizeof(CM_FULL_RESOURCE_DESCRIPTOR),
+            Table,
+            Table->Size);
+
+      /* Set 'Configuration Data' value */
+      Error = RegSetValue(TableKey,
+                         "Configuration Data",
+                         REG_FULL_RESOURCE_DESCRIPTOR,
+                         (PU8) FullResourceDescriptor,
+                         Size);
+      MmFreeMemory(FullResourceDescriptor);
+      if (Error != ERROR_SUCCESS)
+       {
+         DbgPrint((DPRINT_HWDETECT,
+                   "RegSetValue(Configuration Data) failed (Error %u)\n",
+                   (int)Error));
+         return;
+       }
+    }
+}
+
+
+VOID
+DetectPciBios(HKEY SystemKey, U32 *BusNumber)
+{
+  PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor;
+  CM_PCI_BUS_DATA BusData;
+  char Buffer[80];
+  HKEY BiosKey;
+  U32 Size;
+  S32 Error;
+#if 0
+  HKEY BusKey;
+  U32 i;
+#endif
+
+  /* Report the PCI BIOS */
+  if (FindPciBios(&BusData))
+    {
+      /* Create new bus key */
+      sprintf(Buffer,
+             "MultifunctionAdapter\\%u", *BusNumber);
+      Error = RegCreateKey(SystemKey,
+                          Buffer,
+                          &BiosKey);
+      if (Error != ERROR_SUCCESS)
+       {
+         DbgPrint((DPRINT_HWDETECT, "RegCreateKey() failed (Error %u)\n", (int)Error));
+         return;
+       }
+
+      /* Set 'Component Information' */
+      SetComponentInformation(BiosKey,
+                              0x0,
+                              0x0,
+                              0xFFFFFFFF);
+
+      /* Increment bus number */
+      (*BusNumber)++;
+
+      /* Set 'Identifier' value */
+      Error = RegSetValue(BiosKey,
+                         "Identifier",
+                         REG_SZ,
+                         (PU8)"PCI BIOS",
+                         9);
+      if (Error != ERROR_SUCCESS)
+       {
+         DbgPrint((DPRINT_HWDETECT, "RegSetValue() failed (Error %u)\n", (int)Error));
+         return;
+       }
+
+      /* Set 'Configuration Data' value */
+      Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) -
+            sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
+      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 = Internal;
+      FullResourceDescriptor->BusNumber = 0;
+      FullResourceDescriptor->PartialResourceList.Count = 0;
+
+      /* Set 'Configuration Data' value */
+      Error = RegSetValue(BiosKey,
+                         "Configuration Data",
+                         REG_FULL_RESOURCE_DESCRIPTOR,
+                         (PU8) FullResourceDescriptor,
+                         Size);
+      MmFreeMemory(FullResourceDescriptor);
+      if (Error != ERROR_SUCCESS)
+       {
+         DbgPrint((DPRINT_HWDETECT,
+                   "RegSetValue(Configuration Data) failed (Error %u)\n",
+                   (int)Error));
+         return;
+       }
+
+      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 < (U32)BusData.BusCount; i++)
+       {
+         sprintf(Buffer,
+                 "MultifunctionAdapter\\%u", *BusNumber);
+         Error = RegCreateKey(SystemKey,
+                              Buffer,
+                              &BusKey);
+         if (Error != ERROR_SUCCESS)
+           {
+             DbgPrint((DPRINT_HWDETECT, "RegCreateKey() failed (Error %u)\n", (int)Error));
+             printf("RegCreateKey() failed (Error %u)\n", (int)Error);
+             return;
+           }
+
+         /* Set 'Component Information' */
+         SetComponentInformation(BusKey,
+                                 0x0,
+                                 0x0,
+                                 0xFFFFFFFF);
+
+         /* Increment bus number */
+         (*BusNumber)++;
+
+
+         /* Set 'Identifier' value */
+         Error = RegSetValue(BusKey,
+                             "Identifier",
+                             REG_SZ,
+                             (PU8)"PCI",
+                             4);
+         if (Error != ERROR_SUCCESS)
+           {
+             DbgPrint((DPRINT_HWDETECT, "RegSetValue() failed (Error %u)\n", (int)Error));
+             return;
+           }
+       }
+#endif
+
+    }
+}
+
+/* EOF */
index 7206c5b..38ae197 100644 (file)
@@ -38,39 +38,39 @@ EXTERN(_CpuidSupported)
 
        pushl   %ecx                    /* save ECX */
 
-       pushfl                                  /* push original EFLAGS */
+       pushfl                          /* push original EFLAGS */
        popl    %eax                    /* get original EFLAGS */
        movl    %eax,%ecx               /* save original EFLAGS */
-       xorl    $0x40000,%eax   /* flip AC bit in EFLAGS */
+       xorl    $0x40000,%eax           /* flip AC bit in EFLAGS */
        pushl   %eax                    /* save new EFLAGS value on stack */
-       popfl                                   /* replace current EFLAGS value */
+       popfl                           /* replace current EFLAGS value */
 
-       pushfl                                  /* get new EFLAGS */
+       pushfl                          /* get new EFLAGS */
        popl    %eax                    /* store new EFLAGS in EAX */
        xorl    %ecx, %eax              /* can't toggle AC bit, processor=80386 */
 
        movl    $0x300,%eax             /* return processor id */
-    jz         NoCpuid                 /* jump if 80386 processor */
+       jz      NoCpuid                 /* jump if 80386 processor */
 
        pushl   %ecx
-       popfl                                   /* restore AC bit in EFLAGS first */
+       popfl                           /* restore AC bit in EFLAGS first */
 
        movl    %ecx,%eax               /* get original EFLAGS */
-       xorl    $0x200000,%eax  /* flip ID bit in EFLAGS */
+       xorl    $0x200000,%eax          /* flip ID bit in EFLAGS */
        pushl   %eax                    /* save new EFLAGS value on stack */
-       popfl                                   /* replace current EFLAGS value */
-       pushfl                                  /* get new EFLAGS */
+       popfl                           /* replace current EFLAGS value */
+       pushfl                          /* get new EFLAGS */
        popl    %eax                    /* store new EFLAGS in EAX */
        xorl    %ecx,%eax               /* can't toggle ID bit, */
 
        movl    $0x400,%eax             /* return processor id */
-       je              NoCpuid                 /* processor=80486 */
+       je      NoCpuid                 /* processor=80486 */
 
        movl    $1,%eax                 /* CPUID supported */
 
 NoCpuid:
        pushl   %ecx
-       popfl                                   /* restore EFLAGS */
+       popfl                           /* restore EFLAGS */
        popl    %ecx                    /* retore ECX */
 
        ret
@@ -97,16 +97,16 @@ EXTERN(_GetCpuid)
        cpuid
 
        movl    0x0C(%ebp),%esi
-       movl    %eax, (%esi)
+       movl    %eax,(%esi)
 
        movl    0x10(%ebp),%esi
-       movl    %ebx, (%esi)
+       movl    %ebx,(%esi)
 
        movl    0x14(%ebp),%esi
-       movl    %ecx, (%esi)
+       movl    %ecx,(%esi)
 
        movl    0x18(%ebp),%esi
-       movl    %edx, (%esi)
+       movl    %edx,(%esi)
 
        popl    %esi
        popl    %edx
index 2229902..0b4cf37 100644 (file)
@@ -22,7 +22,7 @@
 
 
 /* just some stuff */
-#define VERSION                        "FreeLoader v1.8.22"
+#define VERSION                        "FreeLoader v1.8.23"
 #define COPYRIGHT              "Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>"
 #define AUTHOR_EMAIL   "<brianp@sginet.com>"
 #define BY_AUTHOR              "by Brian Palmer"
@@ -36,7 +36,7 @@
 //
 #define FREELOADER_MAJOR_VERSION       1
 #define FREELOADER_MINOR_VERSION       8
-#define FREELOADER_PATCH_VERSION       22
+#define FREELOADER_PATCH_VERSION       23
 
 
 #ifndef ASM
index 20171d3..60f7329 100644 (file)
@@ -780,7 +780,7 @@ CmiAllocateCell (PREGISTRY_HIVE RegistryHive,
       /* Add a new block */
       if (!CmiAddBin(RegistryHive,
                     ((sizeof(HBIN) + CellSize - 1) / REG_BLOCK_SIZE) + 1,
-                    (PVOID *)&NewBlock,
+                    (PVOID *)(PVOID)&NewBlock,
                     pBlockOffset))
        return FALSE;
     }
@@ -844,7 +844,7 @@ CmiAllocateHashTableCell (PREGISTRY_HIVE Hive,
                (SubKeyCount * sizeof(HASH_RECORD));
   Status = CmiAllocateCell (Hive,
                            NewHashSize,
-                           (PVOID*) &HashCell,
+                           (PVOID*)(PVOID)&HashCell,
                            HBOffset);
   if ((HashCell == NULL) || (Status == FALSE))
     {
@@ -937,7 +937,7 @@ CmiAllocateValueCell(PREGISTRY_HIVE Hive,
   NameSize = (ValueName == NULL) ? 0 : strlen (ValueName);
   Status = CmiAllocateCell (Hive,
                            sizeof(VALUE_CELL) + NameSize,
-                           (PVOID*)&NewValueCell,
+                           (PVOID*)(PVOID)&NewValueCell,
                            ValueCellOffset);
   if ((NewValueCell == NULL) || (Status == FALSE))
     {
@@ -1081,7 +1081,7 @@ CmiExportValue (PREGISTRY_HIVE Hive,
       /* Allocate data cell */
       if (!CmiAllocateCell (Hive,
                            sizeof(CELL_HEADER) + DstDataSize,
-                           (PVOID *)&DataCell,
+                           (PVOID *)(PVOID)&DataCell,
                            &DataCellOffset))
        {
          return FALSE;
index 6dd9a33..dd628fe 100644 (file)
@@ -468,16 +468,14 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
        char  szFileName[1024];
        char  szBootPath[256];
        int             i;
-//     int             nNumDriverFiles=0;
-//     int             nNumFilesLoaded=0;
        char  MsgBuffer[256];
        U32 SectionId;
 
        char* Base;
        U32 Size;
 
-        PARTITION_TABLE_ENTRY PartitionTableEntry;
-        U32 rosPartition;
+       PARTITION_TABLE_ENTRY PartitionTableEntry;
+       U32 rosPartition;
 
        //
        // Open the operating system section
@@ -500,7 +498,7 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
        mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline;
        mb_info.mods_count = 0;
        mb_info.mods_addr = (unsigned long)multiboot_modules;
-       mb_info.mmap_length = (unsigned long)GetBiosMemoryMap((PBIOS_MEMORY_MAP)&multiboot_memory_map, 32) * sizeof(memory_map_t);
+       mb_info.mmap_length = (unsigned long)GetBiosMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&multiboot_memory_map, 32) * sizeof(memory_map_t);
        if (mb_info.mmap_length)
        {
                mb_info.mmap_addr = (unsigned long)&multiboot_memory_map;
@@ -556,7 +554,7 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
                        UiMessageBox(MsgBuffer);
                        return;
                }
-               
+
                /* recalculate the boot partition for freeldr */
                i = 0;
                rosPartition = 0;
@@ -576,17 +574,18 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
                      }
                   }
                }
+
                if (BootPartition == 0)
                {
                        sprintf(MsgBuffer,"Invalid system path: '%s'", value);
                        UiMessageBox(MsgBuffer);
                        return;
                }
-               
+
                /* copy ARC path into kernel command line */
                strcpy(multiboot_kernel_cmdline, value);
        }
-               
+
        /* Set boot drive and partition */
        ((char *)(&mb_info.boot_device))[0] = (char)BootDrive;
        ((char *)(&mb_info.boot_device))[1] = (char)BootPartition;
index 6534e07..27a900f 100644 (file)
@@ -251,7 +251,7 @@ VOID RunLoader(VOID)
   mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline;
   mb_info.mods_count = 0;
   mb_info.mods_addr = (unsigned long)multiboot_modules;
-  mb_info.mmap_length = (unsigned long)GetBiosMemoryMap((PBIOS_MEMORY_MAP)&multiboot_memory_map, 32) * sizeof(memory_map_t);
+  mb_info.mmap_length = (unsigned long)GetBiosMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&multiboot_memory_map, 32) * sizeof(memory_map_t);
   if (mb_info.mmap_length)
     {
       mb_info.mmap_addr = (unsigned long)&multiboot_memory_map;
@@ -497,77 +497,56 @@ for(;;);
       return;
     }
 
+#if 0
+  /* Load isapnp.sys */
+  if (!LoadDriver(SourcePath, "isapnp.sys"))
+    return;
+#endif
 
-  /* Load drivers */
-  if (BootDrive < 0x80)
-    {
-      /*
-       * Load floppy.sys
-       */
-      if (!LoadDriver(SourcePath, "floppy.sys"))
-       return;
+#if 0
+  /* Load pci.sys */
+  if (!LoadDriver(SourcePath, "pci.sys"))
+    return;
+#endif
 
-      /*
-       * Load vfatfs.sys (could be loaded by the setup prog!)
-       */
-      if (!LoadDriver(SourcePath, "vfatfs.sys"))
-       return;
-    }
-  else
-    {
-       /*
-        * Load scsiport.sys
-        */
-       if (!LoadDriver(SourcePath, "scsiport.sys"))
-               return;
-
-       /*
-        * Load atapi.sys (depends on hardware detection)
-        */
-       if (!LoadDriver(SourcePath, "atapi.sys"))
-               return;
-
-       /*
-        * Load class2.sys
-        */
-       if (!LoadDriver(SourcePath, "class2.sys"))
-               return;
-
-       /*
-        * Load cdrom.sys
-        */
-       if (!LoadDriver(SourcePath, "cdrom.sys"))
-               return;
-
-       /*
-        * Load cdfs.sys
-        */
-       if (!LoadDriver(SourcePath, "cdfs.sys"))
-               return;
-
-       /*
-        * Load disk.sys
-        */
-       if (!LoadDriver(SourcePath, "disk.sys"))
-               return;
-
-       /*
-        * Load vfatfs.sys (could be loaded by the setup prog!)
-        */
-       if (!LoadDriver(SourcePath, "vfatfs.sys"))
-               return;
-    }
+  /* Load scsiport.sys */
+  if (!LoadDriver(SourcePath, "scsiport.sys"))
+    return;
 
+  /* Load atapi.sys (depends on hardware detection) */
+  if (!LoadDriver(SourcePath, "atapi.sys"))
+    return;
 
-  /*
-   * Load keyboard driver
-   */
+  /* Load class2.sys */
+  if (!LoadDriver(SourcePath, "class2.sys"))
+    return;
+
+  /* Load cdrom.sys */
+  if (!LoadDriver(SourcePath, "cdrom.sys"))
+    return;
+
+  /* Load cdfs.sys */
+  if (!LoadDriver(SourcePath, "cdfs.sys"))
+    return;
+
+  /* Load disk.sys */
+  if (!LoadDriver(SourcePath, "disk.sys"))
+    return;
+
+  /* Load floppy.sys */
+  if (!LoadDriver(SourcePath, "floppy.sys"))
+    return;
+
+  /* Load vfatfs.sys (could be loaded by the setup prog!) */
+  if (!LoadDriver(SourcePath, "vfatfs.sys"))
+    return;
+
+
+  /* Load keyboard driver */
   if (!LoadDriver(SourcePath, "keyboard.sys"))
     return;
 
-  /*
-   * Load screen driver
-   */
+  /* Load screen driver */
   if (!LoadDriver(SourcePath, "blue.sys"))
     return;
 
@@ -575,9 +554,7 @@ for(;;);
   UiUnInitialize("Booting ReactOS...");
 #endif
 
-  /*
-   * Now boot the kernel
-   */
+  /* Now boot the kernel */
   DiskStopFloppyMotor();
   boot_reactos();
 }
index 62c6fcb..95b4d8d 100644 (file)
@@ -26,7 +26,7 @@ void print(char *str)
 {
        int     i;
 
-       for(i=0; i<strlen(str); i++)
+       for (i = 0; i < strlen(str); i++)
                putchar(str[i]);
 }
 
@@ -36,7 +36,7 @@ void print(char *str)
  */
 void printf(char *format, ... )
 {
-       int *dataptr = (int *) &format;
+       int *dataptr = (int *)(void *)&format;
        char c, *ptr, str[16];
        int ll;
 
@@ -102,7 +102,7 @@ void printf(char *format, ... )
 
 void sprintf(char *buffer, char *format, ... )
 {
-       int *dataptr = (int *) &format;
+       int *dataptr = (int *)(void *)&format;
        char c, *ptr, str[16];
        char *p = buffer;
        int ll;