Author: cgutman Date: Sun Mar 1 07:52:32 2015 New Revision: 66511
URL: http://svn.reactos.org/svn/reactos?rev=66511&view=rev Log: [PCI] - Handle 64-bit PCI base address registers (BARs) - Fix maximum address in resource requirements for 20-bit resources - Fix flags on memory and I/O port resources [NTOS] - Fix handling of 64-bit resources
Modified: trunk/reactos/drivers/bus/pci/pdo.c trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c
Modified: trunk/reactos/drivers/bus/pci/pdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/pci/pdo.c?rev=6... ============================================================================== --- trunk/reactos/drivers/bus/pci/pdo.c [iso-8859-1] (original) +++ trunk/reactos/drivers/bus/pci/pdo.c [iso-8859-1] Sun Mar 1 07:52:32 2015 @@ -21,6 +21,9 @@ #define DBGPRINT(...) #endif
+#define PCI_ADDRESS_MEMORY_ADDRESS_MASK_64 0xfffffffffffffff0ull +#define PCI_ADDRESS_IO_ADDRESS_MASK_64 0xfffffffffffffffcull + /*** PRIVATE *****************************************************************/
static NTSTATUS @@ -191,80 +194,159 @@ return STATUS_SUCCESS; }
+static BOOLEAN +PdoReadPciBar(PPDO_DEVICE_EXTENSION DeviceExtension, + ULONG Offset, + PULONG OriginalValue, + PULONG NewValue) +{ + ULONG Size; + ULONG AllOnes; + + /* Read the original value */ + Size = HalGetBusDataByOffset(PCIConfiguration, + DeviceExtension->PciDevice->BusNumber, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + OriginalValue, + Offset, + sizeof(ULONG)); + if (Size != sizeof(ULONG)) + { + DPRINT1("Wrong size %lu\n", Size); + return FALSE; + } + + /* Write all ones to determine which bits are held to zero */ + AllOnes = MAXULONG; + Size = HalSetBusDataByOffset(PCIConfiguration, + DeviceExtension->PciDevice->BusNumber, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + &AllOnes, + Offset, + sizeof(ULONG)); + if (Size != sizeof(ULONG)) + { + DPRINT1("Wrong size %lu\n", Size); + return FALSE; + } + + /* Get the range length */ + Size = HalGetBusDataByOffset(PCIConfiguration, + DeviceExtension->PciDevice->BusNumber, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + NewValue, + Offset, + sizeof(ULONG)); + if (Size != sizeof(ULONG)) + { + DPRINT1("Wrong size %lu\n", Size); + return FALSE; + } + + /* Restore original value */ + Size = HalSetBusDataByOffset(PCIConfiguration, + DeviceExtension->PciDevice->BusNumber, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + OriginalValue, + Offset, + sizeof(ULONG)); + if (Size != sizeof(ULONG)) + { + DPRINT1("Wrong size %lu\n", Size); + return FALSE; + } + + return TRUE; +}
static BOOLEAN PdoGetRangeLength(PPDO_DEVICE_EXTENSION DeviceExtension, - ULONG Offset, - PULONG Base, - PULONG Length, - PULONG Flags) -{ - ULONG OrigValue; - ULONG BaseValue; - ULONG NewValue; - ULONG Size; - ULONG XLength; - - /* Save original value */ - Size= HalGetBusDataByOffset(PCIConfiguration, - DeviceExtension->PciDevice->BusNumber, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - &OrigValue, - Offset, - sizeof(ULONG)); - if (Size != sizeof(ULONG)) - { - DPRINT1("Wrong size %lu\n", Size); + UCHAR Bar, + PULONGLONG Base, + PULONGLONG Length, + PULONG Flags, + PUCHAR NextBar, + PULONGLONG MaximumAddress) +{ + union { + struct { + ULONG Bar0; + ULONG Bar1; + } Bars; + ULONGLONG Bar; + } OriginalValue; + union { + struct { + ULONG Bar0; + ULONG Bar1; + } Bars; + ULONGLONG Bar; + } NewValue; + ULONG Offset; + + /* Compute the offset of this BAR in PCI config space */ + Offset = 0x10 + Bar * 4; + + /* Assume this is a 32-bit BAR until we find wrong */ + *NextBar = Bar + 1; + + /* Initialize BAR values to zero */ + OriginalValue.Bar = 0ULL; + NewValue.Bar = 0ULL; + + /* Read the first BAR */ + if (!PdoReadPciBar(DeviceExtension, Offset, + &OriginalValue.Bars.Bar0, + &NewValue.Bars.Bar0)) + { return FALSE; } - - BaseValue = (OrigValue & PCI_ADDRESS_IO_SPACE) - ? (OrigValue & PCI_ADDRESS_IO_ADDRESS_MASK) - : (OrigValue & PCI_ADDRESS_MEMORY_ADDRESS_MASK); - - *Base = BaseValue; - - /* Set magic value */ - NewValue = MAXULONG; - Size= HalSetBusDataByOffset(PCIConfiguration, - DeviceExtension->PciDevice->BusNumber, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - &NewValue, - Offset, - sizeof(ULONG)); - if (Size != sizeof(ULONG)) - { - DPRINT1("Wrong size %lu\n", Size); - return FALSE; - } - - /* Get the range length */ - Size= HalGetBusDataByOffset(PCIConfiguration, - DeviceExtension->PciDevice->BusNumber, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - &NewValue, - Offset, - sizeof(ULONG)); - if (Size != sizeof(ULONG)) - { - DPRINT1("Wrong size %lu\n", Size); - return FALSE; - } - - /* Restore original value */ - Size= HalSetBusDataByOffset(PCIConfiguration, - DeviceExtension->PciDevice->BusNumber, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - &OrigValue, - Offset, - sizeof(ULONG)); - if (Size != sizeof(ULONG)) - { - DPRINT1("Wrong size %lu\n", Size); - return FALSE; - } - - if (NewValue == 0) + + /* Check if this is a memory BAR */ + if (!(OriginalValue.Bars.Bar0 & PCI_ADDRESS_IO_SPACE)) + { + /* Write the maximum address if the caller asked for it */ + if (MaximumAddress != NULL) + { + if ((OriginalValue.Bars.Bar0 & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_32BIT) + { + *MaximumAddress = 0x00000000FFFFFFFFULL; + } + else if ((OriginalValue.Bars.Bar0 & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_20BIT) + { + *MaximumAddress = 0x00000000000FFFFFULL; + } + else if ((OriginalValue.Bars.Bar0 & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT) + { + *MaximumAddress = 0xFFFFFFFFFFFFFFFFULL; + } + } + + /* Check if this is a 64-bit BAR */ + if ((OriginalValue.Bars.Bar0 & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT) + { + /* We've now consumed the next BAR too */ + *NextBar = Bar + 2; + + /* Read the next BAR */ + if (!PdoReadPciBar(DeviceExtension, Offset + 4, + &OriginalValue.Bars.Bar1, + &NewValue.Bars.Bar1)) + { + return FALSE; + } + } + } + else + { + /* Write the maximum I/O port address */ + if (MaximumAddress != NULL) + { + *MaximumAddress = 0x00000000FFFFFFFFULL; + } + } + + if (NewValue.Bar == 0) { DPRINT("Unused address register\n"); *Base = 0; @@ -272,48 +354,16 @@ *Flags = 0; return TRUE; } - - XLength = ~((NewValue & PCI_ADDRESS_IO_SPACE) - ? (NewValue & PCI_ADDRESS_IO_ADDRESS_MASK) - : (NewValue & PCI_ADDRESS_MEMORY_ADDRESS_MASK)) + 1; - -#if 0 - DbgPrint("BaseAddress 0x%08lx Length 0x%08lx", - BaseValue, XLength); - - if (NewValue & PCI_ADDRESS_IO_SPACE) - { - DbgPrint(" IO range"); - } - else - { - DbgPrint(" Memory range"); - if ((NewValue & PCI_ADDRESS_MEMORY_TYPE_MASK) == 0) - { - DbgPrint(" in 32-Bit address space"); - } - else if ((NewValue & PCI_ADDRESS_MEMORY_TYPE_MASK) == 2) - { - DbgPrint(" below 1BM "); - } - else if ((NewValue & PCI_ADDRESS_MEMORY_TYPE_MASK) == 4) - { - DbgPrint(" in 64-Bit address space"); - } - - if (NewValue & PCI_ADDRESS_MEMORY_PREFETCHABLE) - { - DbgPrint(" prefetchable"); - } - } - - DbgPrint("\n"); -#endif - - *Length = XLength; - *Flags = (NewValue & PCI_ADDRESS_IO_SPACE) - ? (NewValue & ~PCI_ADDRESS_IO_ADDRESS_MASK) - : (NewValue & ~PCI_ADDRESS_MEMORY_ADDRESS_MASK); + + *Base = OriginalValue.Bar & PCI_ADDRESS_MEMORY_ADDRESS_MASK_64; + + *Length = ~((NewValue.Bar & PCI_ADDRESS_IO_SPACE) + ? (NewValue.Bar & PCI_ADDRESS_IO_ADDRESS_MASK_64) + : (NewValue.Bar & PCI_ADDRESS_MEMORY_ADDRESS_MASK_64)) + 1; + + *Flags = (NewValue.Bar & PCI_ADDRESS_IO_SPACE) + ? (NewValue.Bar & ~PCI_ADDRESS_IO_ADDRESS_MASK_64) + : (NewValue.Bar & ~PCI_ADDRESS_MEMORY_ADDRESS_MASK_64);
return TRUE; } @@ -332,10 +382,11 @@ ULONG Size; ULONG ResCount = 0; ULONG ListSize; - ULONG i; - ULONG Base; - ULONG Length; + UCHAR Bar; + ULONGLONG Base; + ULONGLONG Length; ULONG Flags; + ULONGLONG MaximumAddress;
UNREFERENCED_PARAMETER(IrpSp); DPRINT("PdoQueryResourceRequirements() called\n"); @@ -361,13 +412,15 @@ ResCount = 0; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) { - for (i = 0; i < PCI_TYPE0_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) + &Flags, + &Bar, + NULL)) break;
if (Length != 0) @@ -381,13 +434,15 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) { - for (i = 0; i < PCI_TYPE1_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) + &Flags, + &Bar, + NULL)) break;
if (Length != 0) @@ -442,13 +497,15 @@ Descriptor = &ResourceList->List[0].Descriptors[0]; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) { - for (i = 0; i < PCI_TYPE0_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) + &Flags, + &Bar, + &MaximumAddress)) { DPRINT1("PdoGetRangeLength() failed\n"); break; @@ -472,19 +529,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = 1; - Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)Base; - Descriptor->u.Port.MaximumAddress.QuadPart = (ULONGLONG)(Base + Length - 1); + Descriptor->u.Port.MinimumAddress.QuadPart = Base; + Descriptor->u.Port.MaximumAddress.QuadPart = Base + Length - 1; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE; + Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE | + (Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ? CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = 1; - Descriptor->u.Memory.MinimumAddress.QuadPart = (ULONGLONG)Base; - Descriptor->u.Memory.MaximumAddress.QuadPart = (ULONGLONG)(Base + Length - 1); + Descriptor->u.Memory.MinimumAddress.QuadPart = Base; + Descriptor->u.Memory.MaximumAddress.QuadPart = Base + Length - 1; } Descriptor++;
@@ -500,19 +558,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = Length; - Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0; - Descriptor->u.Port.MaximumAddress.QuadPart = (ULONGLONG)0x00000000FFFFFFFF; + Descriptor->u.Port.MinimumAddress.QuadPart = 0; + Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE; + Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE | + (Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ? CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = Length; - Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0; - Descriptor->u.Port.MaximumAddress.QuadPart = (ULONGLONG)0x00000000FFFFFFFF; + Descriptor->u.Port.MinimumAddress.QuadPart = 0; + Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress; } Descriptor++; } @@ -532,13 +591,15 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) { - for (i = 0; i < PCI_TYPE1_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) + &Flags, + &Bar, + &MaximumAddress)) { DPRINT1("PdoGetRangeLength() failed\n"); break; @@ -562,19 +623,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = 1; - Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)Base; - Descriptor->u.Port.MaximumAddress.QuadPart = (ULONGLONG)(Base + Length - 1); + Descriptor->u.Port.MinimumAddress.QuadPart = Base; + Descriptor->u.Port.MaximumAddress.QuadPart = Base + Length - 1; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE; + Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE | + (Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ? CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = 1; - Descriptor->u.Memory.MinimumAddress.QuadPart = (ULONGLONG)Base; - Descriptor->u.Memory.MaximumAddress.QuadPart = (ULONGLONG)(Base + Length - 1); + Descriptor->u.Memory.MinimumAddress.QuadPart = Base; + Descriptor->u.Memory.MaximumAddress.QuadPart = Base + Length - 1; } Descriptor++;
@@ -590,19 +652,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = Length; - Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0; - Descriptor->u.Port.MaximumAddress.QuadPart = (ULONGLONG)0x00000000FFFFFFFF; + Descriptor->u.Port.MinimumAddress.QuadPart = 0; + Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE; + Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE | + (Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ? CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = Length; - Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0; - Descriptor->u.Port.MaximumAddress.QuadPart = (ULONGLONG)0x00000000FFFFFFFF; + Descriptor->u.Port.MinimumAddress.QuadPart = 0; + Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress; } Descriptor++; } @@ -645,9 +708,9 @@ ULONG Size; ULONG ResCount = 0; ULONG ListSize; - ULONG i; - ULONG Base; - ULONG Length; + UCHAR Bar; + ULONGLONG Base; + ULONGLONG Length; ULONG Flags;
DPRINT("PdoQueryResources() called\n"); @@ -674,13 +737,15 @@ ResCount = 0; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) { - for (i = 0; i < PCI_TYPE0_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) + &Flags, + &Bar, + NULL)) break;
if (Length) @@ -694,13 +759,15 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) { - for (i = 0; i < PCI_TYPE1_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) + &Flags, + &Bar, + NULL)) break;
if (Length != 0) @@ -749,17 +816,16 @@ Descriptor = &PartialList->PartialDescriptors[0]; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) { - for (i = 0; i < PCI_TYPE0_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) - { - DPRINT1("PdoGetRangeLength() failed\n"); + &Flags, + &Bar, + NULL)) break; - }
if (Length == 0) { @@ -771,7 +837,9 @@ { Descriptor->Type = CmResourceTypePort; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_PORT_IO; + Descriptor->Flags = CM_RESOURCE_PORT_IO | + CM_RESOURCE_PORT_16_BIT_DECODE | + CM_RESOURCE_PORT_POSITIVE_DECODE; Descriptor->u.Port.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Port.Length = Length;
@@ -782,7 +850,8 @@ { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE; + Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE | + (Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ? CM_RESOURCE_MEMORY_PREFETCHABLE : 0; Descriptor->u.Memory.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Memory.Length = Length;
@@ -811,17 +880,16 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) { - for (i = 0; i < PCI_TYPE1_ADDRESSES; i++) + for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension, - 0x10 + i * 4, + Bar, &Base, &Length, - &Flags)) - { - DPRINT1("PdoGetRangeLength() failed\n"); + &Flags, + &Bar, + NULL)) break; - }
if (Length == 0) { @@ -833,7 +901,9 @@ { Descriptor->Type = CmResourceTypePort; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_PORT_IO; + Descriptor->Flags = CM_RESOURCE_PORT_IO | + CM_RESOURCE_PORT_16_BIT_DECODE | + CM_RESOURCE_PORT_POSITIVE_DECODE; Descriptor->u.Port.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Port.Length = Length;
@@ -844,7 +914,8 @@ { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE; + Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE | + (Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ? CM_RESOURCE_MEMORY_PREFETCHABLE : 0; Descriptor->u.Memory.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Memory.Length = Length;
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c... ============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c [iso-8859-1] Sun Mar 1 07:52:32 2015 @@ -73,7 +73,7 @@ IN PIO_RESOURCE_DESCRIPTOR IoDesc, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) { - LONGLONG Start; + ULONGLONG Start; CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
ASSERT(IoDesc->Type == CmDesc->Type); @@ -82,16 +82,16 @@ /* HACK */ if (IoDesc->u.Memory.Alignment == 0) IoDesc->u.Memory.Alignment = 1;
- for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; - Start <= IoDesc->u.Memory.MaximumAddress.QuadPart - IoDesc->u.Memory.Length + 1; + for (Start = (ULONGLONG)IoDesc->u.Memory.MinimumAddress.QuadPart; + Start <= (ULONGLONG)IoDesc->u.Memory.MaximumAddress.QuadPart - IoDesc->u.Memory.Length + 1; Start += IoDesc->u.Memory.Alignment) { CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; - CmDesc->u.Memory.Start.QuadPart = Start; + CmDesc->u.Memory.Start.QuadPart = (LONGLONG)Start;
if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) { - Start += ConflictingDesc.u.Memory.Start.QuadPart + + Start += (ULONGLONG)ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; } else @@ -110,7 +110,7 @@ IN PIO_RESOURCE_DESCRIPTOR IoDesc, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) { - LONGLONG Start; + ULONGLONG Start; CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
ASSERT(IoDesc->Type == CmDesc->Type); @@ -119,16 +119,16 @@ /* HACK */ if (IoDesc->u.Port.Alignment == 0) IoDesc->u.Port.Alignment = 1;
- for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; - Start <= IoDesc->u.Port.MaximumAddress.QuadPart - IoDesc->u.Port.Length + 1; + for (Start = (ULONGLONG)IoDesc->u.Port.MinimumAddress.QuadPart; + Start <= (ULONGLONG)IoDesc->u.Port.MaximumAddress.QuadPart - IoDesc->u.Port.Length + 1; Start += IoDesc->u.Port.Alignment) { CmDesc->u.Port.Length = IoDesc->u.Port.Length; - CmDesc->u.Port.Start.QuadPart = Start; + CmDesc->u.Port.Start.QuadPart = (LONGLONG)Start;
if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) { - Start += ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; + Start += (ULONGLONG)ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; } else { @@ -300,8 +300,8 @@ case CmResourceTypePort: /* Make sure the length matches and it satisfies our address range */ if (CmDesc->u.Memory.Length == IoDesc->u.Memory.Length && - CmDesc->u.Memory.Start.QuadPart >= IoDesc->u.Memory.MinimumAddress.QuadPart && - CmDesc->u.Memory.Start.QuadPart + CmDesc->u.Memory.Length - 1 <= IoDesc->u.Memory.MaximumAddress.QuadPart) + (ULONGLONG)CmDesc->u.Memory.Start.QuadPart >= (ULONGLONG)IoDesc->u.Memory.MinimumAddress.QuadPart && + (ULONGLONG)CmDesc->u.Memory.Start.QuadPart + CmDesc->u.Memory.Length - 1 <= (ULONGLONG)IoDesc->u.Memory.MaximumAddress.QuadPart) { /* Found it */ Matched = TRUE; @@ -564,11 +564,11 @@ switch (ResDesc->Type) { case CmResourceTypeMemory: - if ((ResDesc->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && - ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > - ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < - ResDesc->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + - ResDesc2->u.Memory.Length > ResDesc->u.Memory.Start.QuadPart)) + if (((ULONGLONG)ResDesc->u.Memory.Start.QuadPart < (ULONGLONG)ResDesc2->u.Memory.Start.QuadPart && + (ULONGLONG)ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > + (ULONGLONG)ResDesc2->u.Memory.Start.QuadPart) || ((ULONGLONG)ResDesc2->u.Memory.Start.QuadPart < + (ULONGLONG)ResDesc->u.Memory.Start.QuadPart && (ULONGLONG)ResDesc2->u.Memory.Start.QuadPart + + ResDesc2->u.Memory.Length > (ULONGLONG)ResDesc->u.Memory.Start.QuadPart)) { if (!Silent) { @@ -585,11 +585,11 @@ break;
case CmResourceTypePort: - if ((ResDesc->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && - ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > - ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < - ResDesc->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + - ResDesc2->u.Port.Length > ResDesc->u.Port.Start.QuadPart)) + if (((ULONGLONG)ResDesc->u.Port.Start.QuadPart < (ULONGLONG)ResDesc2->u.Port.Start.QuadPart && + (ULONGLONG)ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > + (ULONGLONG)ResDesc2->u.Port.Start.QuadPart) || ((ULONGLONG)ResDesc2->u.Port.Start.QuadPart < + (ULONGLONG)ResDesc->u.Port.Start.QuadPart && (ULONGLONG)ResDesc2->u.Port.Start.QuadPart + + ResDesc2->u.Port.Length > (ULONGLONG)ResDesc->u.Port.Start.QuadPart)) { if (!Silent) {