- Fixed some compiler warnings.

- Detect and report PCI-BIOS.

svn path=/trunk/; revision=10742
This commit is contained in:
Eric Kohl 2004-08-30 10:53:38 +00:00
parent 3dd13e9ba0
commit 6277a93862
11 changed files with 592 additions and 230 deletions

View 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

View file

@ -205,6 +205,7 @@ ARCH_OBJS = fathelp.o \
portio.o \
hardware.o \
hwcpu.o \
hwpci.o \
_alloca.o # For Mingw32 builds

View 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,15 +1352,18 @@ DetectSerialPorts(HKEY BusKey)
DbgPrint((DPRINT_HWDETECT, "DetectSerialPorts()\n"));
for (i = 0; i < 4; i++)
{
WRITE_PORT_UCHAR ((PUCHAR)(Base[i] + 4), 0x10);
if (!(READ_PORT_UCHAR((PUCHAR)Base[i] + 6) & 0xf0))
ControllerNumber = 0;
BasePtr = (PU16)0x400;
for (i = 0; i < 4; i++, BasePtr++)
{
Base = (U32)*BasePtr;
if (Base == 0)
continue;
DbgPrint((DPRINT_HWDETECT,
"Found COM%u port at 0x%x\n",
i + 1,
Base[i]));
Base));
/* Create controller key */
sprintf(Buffer,
@ -1399,7 +1409,7 @@ DetectSerialPorts(HKEY BusKey)
PartialDescriptor->Type = CmResourceTypePort;
PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
PartialDescriptor->Flags = CM_RESOURCE_PORT_IO;
PartialDescriptor->u.Port.Start = (U64)Base[i];
PartialDescriptor->u.Port.Start = (U64)Base;
PartialDescriptor->u.Port.Length = 7;
/* Set Interrupt */
@ -1457,11 +1467,10 @@ DetectSerialPorts(HKEY BusKey)
Buffer));
/* Detect serial mouse */
DetectSerialPointerPeripheral(ControllerKey, Base[i]);
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);

View 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,

View 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 */

View file

@ -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

View 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

View 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;

View file

@ -468,8 +468,6 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
char szFileName[1024];
char szBootPath[256];
int i;
// int nNumDriverFiles=0;
// int nNumFilesLoaded=0;
char MsgBuffer[256];
U32 SectionId;
@ -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;
@ -576,6 +574,7 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName)
}
}
}
if (BootPartition == 0)
{
sprintf(MsgBuffer,"Invalid system path: '%s'", value);

View 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;
}
/* Load drivers */
if (BootDrive < 0x80)
{
/*
* Load floppy.sys
*/
if (!LoadDriver(SourcePath, "floppy.sys"))
#if 0
/* Load isapnp.sys */
if (!LoadDriver(SourcePath, "isapnp.sys"))
return;
#endif
/*
* Load vfatfs.sys (could be loaded by the setup prog!)
*/
if (!LoadDriver(SourcePath, "vfatfs.sys"))
#if 0
/* Load pci.sys */
if (!LoadDriver(SourcePath, "pci.sys"))
return;
}
else
{
/*
* Load scsiport.sys
*/
#endif
/* Load scsiport.sys */
if (!LoadDriver(SourcePath, "scsiport.sys"))
return;
/*
* Load atapi.sys (depends on hardware detection)
*/
/* Load atapi.sys (depends on hardware detection) */
if (!LoadDriver(SourcePath, "atapi.sys"))
return;
/*
* Load class2.sys
*/
/* Load class2.sys */
if (!LoadDriver(SourcePath, "class2.sys"))
return;
/*
* Load cdrom.sys
*/
/* Load cdrom.sys */
if (!LoadDriver(SourcePath, "cdrom.sys"))
return;
/*
* Load cdfs.sys
*/
/* Load cdfs.sys */
if (!LoadDriver(SourcePath, "cdfs.sys"))
return;
/*
* Load disk.sys
*/
/* Load disk.sys */
if (!LoadDriver(SourcePath, "disk.sys"))
return;
/*
* Load vfatfs.sys (could be loaded by the setup prog!)
*/
/* 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();
}

View 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;