[ISAPNP] Detect I/O ports at runtime (#7411)

Improve the driver's portability.
CORE-17977
This commit is contained in:
Dmitry Borisov 2024-10-07 20:10:08 +06:00 committed by GitHub
parent 50a72881be
commit 10b08aa2bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 19 deletions

View file

@ -20,13 +20,19 @@
#endif /* UNIT_TEST */ #endif /* UNIT_TEST */
ULONG IsaConfigPorts[2] =
{
ISAPNP_WRITE_DATA_PCAT,
ISAPNP_ADDRESS_PCAT
};
static static
inline inline
VOID VOID
WriteAddress( WriteAddress(
_In_ UCHAR Address) _In_ UCHAR Address)
{ {
WRITE_PORT_UCHAR((PUCHAR)ISAPNP_ADDRESS, Address); WRITE_PORT_UCHAR(UlongToPtr(IsaConfigPorts[1]), Address);
} }
static static
@ -35,7 +41,7 @@ VOID
WriteData( WriteData(
_In_ UCHAR Data) _In_ UCHAR Data)
{ {
WRITE_PORT_UCHAR((PUCHAR)ISAPNP_WRITE_DATA, Data); WRITE_PORT_UCHAR(UlongToPtr(IsaConfigPorts[0]), Data);
} }
static static

View file

@ -28,6 +28,8 @@ LIST_ENTRY BusListHead;
#endif /* UNIT_TEST */ #endif /* UNIT_TEST */
extern ULONG IsaConfigPorts[2];
/* FUNCTIONS ******************************************************************/ /* FUNCTIONS ******************************************************************/
static static
@ -822,7 +824,6 @@ IsaPnpCreateReadPortDORequirements(
ULONG ResourceCount, ListSize, i; ULONG ResourceCount, ListSize, i;
PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList; PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
PIO_RESOURCE_DESCRIPTOR Descriptor; PIO_RESOURCE_DESCRIPTOR Descriptor;
const ULONG Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS };
const ULONG ReadPorts[] = { 0x274, 0x3E4, 0x204, 0x2E4, 0x354, 0x2F4 }; const ULONG ReadPorts[] = { 0x274, 0x3E4, 0x204, 0x2E4, 0x354, 0x2F4 };
PAGED_CODE(); PAGED_CODE();
@ -840,7 +841,7 @@ IsaPnpCreateReadPortDORequirements(
* [...] * [...]
* [IO descriptor: Read Port X - 1, optional] * [IO descriptor: Read Port X - 1, optional]
*/ */
ResourceCount = RTL_NUMBER_OF(Ports) * 2 + RTL_NUMBER_OF(ReadPorts); ResourceCount = RTL_NUMBER_OF(IsaConfigPorts) * 2 + RTL_NUMBER_OF(ReadPorts);
} }
else else
{ {
@ -857,7 +858,7 @@ IsaPnpCreateReadPortDORequirements(
* [IO descriptor: Read Port X, required] * [IO descriptor: Read Port X, required]
* [IO descriptor: Read Port X, optional] * [IO descriptor: Read Port X, optional]
*/ */
ResourceCount = (RTL_NUMBER_OF(Ports) + RTL_NUMBER_OF(ReadPorts)) * 2; ResourceCount = (RTL_NUMBER_OF(IsaConfigPorts) + RTL_NUMBER_OF(ReadPorts)) * 2;
} }
ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) +
sizeof(IO_RESOURCE_DESCRIPTOR) * (ResourceCount - 1); sizeof(IO_RESOURCE_DESCRIPTOR) * (ResourceCount - 1);
@ -875,7 +876,7 @@ IsaPnpCreateReadPortDORequirements(
Descriptor = &RequirementsList->List[0].Descriptors[0]; Descriptor = &RequirementsList->List[0].Descriptors[0];
/* Store the Data port and the Address port */ /* Store the Data port and the Address port */
for (i = 0; i < RTL_NUMBER_OF(Ports) * 2; i++) for (i = 0; i < RTL_NUMBER_OF(IsaConfigPorts) * 2; i++)
{ {
if ((i % 2) == 0) if ((i % 2) == 0)
{ {
@ -886,7 +887,7 @@ IsaPnpCreateReadPortDORequirements(
Descriptor->u.Port.Length = 0x01; Descriptor->u.Port.Length = 0x01;
Descriptor->u.Port.Alignment = 0x01; Descriptor->u.Port.Alignment = 0x01;
Descriptor->u.Port.MinimumAddress.LowPart = Descriptor->u.Port.MinimumAddress.LowPart =
Descriptor->u.Port.MaximumAddress.LowPart = Ports[i / 2]; Descriptor->u.Port.MaximumAddress.LowPart = IsaConfigPorts[i / 2];
} }
else else
{ {
@ -965,7 +966,6 @@ CODE_SEG("PAGE")
PCM_RESOURCE_LIST PCM_RESOURCE_LIST
IsaPnpCreateReadPortDOResources(VOID) IsaPnpCreateReadPortDOResources(VOID)
{ {
const USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS };
ULONG ListSize, i; ULONG ListSize, i;
PCM_RESOURCE_LIST ResourceList; PCM_RESOURCE_LIST ResourceList;
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor; PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
@ -973,7 +973,7 @@ IsaPnpCreateReadPortDOResources(VOID)
PAGED_CODE(); PAGED_CODE();
ListSize = sizeof(CM_RESOURCE_LIST) + ListSize = sizeof(CM_RESOURCE_LIST) +
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (RTL_NUMBER_OF(Ports) - 1); sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (RTL_NUMBER_OF(IsaConfigPorts) - 1);
ResourceList = ExAllocatePoolZero(PagedPool, ListSize, TAG_ISAPNP); ResourceList = ExAllocatePoolZero(PagedPool, ListSize, TAG_ISAPNP);
if (!ResourceList) if (!ResourceList)
return NULL; return NULL;
@ -982,16 +982,16 @@ IsaPnpCreateReadPortDOResources(VOID)
ResourceList->List[0].InterfaceType = Internal; ResourceList->List[0].InterfaceType = Internal;
ResourceList->List[0].PartialResourceList.Version = 1; ResourceList->List[0].PartialResourceList.Version = 1;
ResourceList->List[0].PartialResourceList.Revision = 1; ResourceList->List[0].PartialResourceList.Revision = 1;
ResourceList->List[0].PartialResourceList.Count = RTL_NUMBER_OF(Ports); ResourceList->List[0].PartialResourceList.Count = RTL_NUMBER_OF(IsaConfigPorts);
Descriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[0]; Descriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[0];
for (i = 0; i < RTL_NUMBER_OF(Ports); i++) for (i = 0; i < RTL_NUMBER_OF(IsaConfigPorts); i++)
{ {
Descriptor->Type = CmResourceTypePort; Descriptor->Type = CmResourceTypePort;
Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_PORT_16_BIT_DECODE; Descriptor->Flags = CM_RESOURCE_PORT_16_BIT_DECODE;
Descriptor->u.Port.Length = 0x01; Descriptor->u.Port.Length = 0x01;
Descriptor->u.Port.Start.LowPart = Ports[i]; Descriptor->u.Port.Start.LowPart = IsaConfigPorts[i];
Descriptor++; Descriptor++;
} }
@ -1415,6 +1415,12 @@ DriverEntry(
{ {
DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath); DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath);
if (IsNEC_98)
{
IsaConfigPorts[0] = ISAPNP_WRITE_DATA_PC98;
IsaConfigPorts[1] = ISAPNP_ADDRESS_PC98;
}
DriverObject->MajorFunction[IRP_MJ_CREATE] = IsaCreateClose; DriverObject->MajorFunction[IRP_MJ_CREATE] = IsaCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsaCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsaCreateClose;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsaForwardOrIgnore; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsaForwardOrIgnore;

View file

@ -13,13 +13,11 @@
extern "C" { extern "C" {
#endif #endif
#if defined(SARCH_PC98) #define ISAPNP_ADDRESS_PCAT 0x279
#define ISAPNP_ADDRESS 0x259 #define ISAPNP_WRITE_DATA_PCAT 0xA79
#define ISAPNP_WRITE_DATA 0xA59
#else #define ISAPNP_ADDRESS_PC98 0x259
#define ISAPNP_ADDRESS 0x279 #define ISAPNP_WRITE_DATA_PC98 0xA59
#define ISAPNP_WRITE_DATA 0xA79
#endif
#define ISAPNP_READPORT 0x00 #define ISAPNP_READPORT 0x00
#define ISAPNP_SERIALISOLATION 0x01 #define ISAPNP_SERIALISOLATION 0x01