mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
- Fixed some compiler warnings.
- Detect and report PCI-BIOS. svn path=/trunk/; revision=10742
This commit is contained in:
parent
3dd13e9ba0
commit
6277a93862
11 changed files with 592 additions and 230 deletions
|
@ -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
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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, "Failed to create controller key\n"));
|
||||
continue;
|
||||
}
|
||||
DbgPrint((DPRINT_HWDETECT, "Created key: %s\n", Buffer));
|
||||
|
||||
/* 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,
|
||||
"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));
|
||||
|
||||
/* 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);
|
||||
|
||||
/* 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;
|
||||
|
||||
/* 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 '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;
|
||||
}
|
||||
DbgPrint((DPRINT_HWDETECT,
|
||||
"Created value: Identifier %s\n",
|
||||
Buffer));
|
||||
|
||||
/* Detect serial mouse */
|
||||
DetectSerialPointerPeripheral(ControllerKey, Base[i]);
|
||||
|
||||
ControllerNumber++;
|
||||
"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;
|
||||
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;
|
||||
|
||||
/* 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 '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;
|
||||
}
|
||||
DbgPrint((DPRINT_HWDETECT,
|
||||
"Created value: Identifier %s\n",
|
||||
Buffer));
|
||||
|
||||
/* Detect serial mouse */
|
||||
DetectSerialPointerPeripheral(ControllerKey, Base);
|
||||
|
||||
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);
|
||||
|
|
|
@ -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,
|
||||
|
|
366
freeldr/freeldr/arch/i386/hwpci.c
Normal file
366
freeldr/freeldr/arch/i386/hwpci.c
Normal file
|
@ -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 */
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 scsiport.sys */
|
||||
if (!LoadDriver(SourcePath, "scsiport.sys"))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Load atapi.sys (depends on hardware detection)
|
||||
*/
|
||||
if (!LoadDriver(SourcePath, "atapi.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 class2.sys */
|
||||
if (!LoadDriver(SourcePath, "class2.sys"))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Load cdrom.sys
|
||||
*/
|
||||
if (!LoadDriver(SourcePath, "cdrom.sys"))
|
||||
return;
|
||||
/* Load cdrom.sys */
|
||||
if (!LoadDriver(SourcePath, "cdrom.sys"))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Load cdfs.sys
|
||||
*/
|
||||
if (!LoadDriver(SourcePath, "cdfs.sys"))
|
||||
return;
|
||||
/* Load cdfs.sys */
|
||||
if (!LoadDriver(SourcePath, "cdfs.sys"))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Load disk.sys
|
||||
*/
|
||||
if (!LoadDriver(SourcePath, "disk.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 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
|
||||
*/
|
||||
/* 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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue