[NTOSKRNL]

- Fix a major off-by-one bug in resource conflict checking
- Respect requested alignment when checking for valid port/memory ranges

svn path=/trunk/; revision=54238
This commit is contained in:
Cameron Gutman 2011-10-23 03:06:23 +00:00
parent 25eae4b916
commit 69fdb2ac71

View file

@ -47,7 +47,7 @@ IopFindBusNumberResource(
ASSERT(IoDesc->Type == CmResourceTypeBusNumber); ASSERT(IoDesc->Type == CmResourceTypeBusNumber);
for (Start = IoDesc->u.BusNumber.MinBusNumber; for (Start = IoDesc->u.BusNumber.MinBusNumber;
Start < IoDesc->u.BusNumber.MaxBusNumber; Start <= IoDesc->u.BusNumber.MaxBusNumber;
Start++) Start++)
{ {
CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length; CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length;
@ -78,9 +78,12 @@ IopFindMemoryResource(
ASSERT(IoDesc->Type == CmDesc->Type); ASSERT(IoDesc->Type == CmDesc->Type);
ASSERT(IoDesc->Type == CmResourceTypeMemory); ASSERT(IoDesc->Type == CmResourceTypeMemory);
/* HACK */
if (IoDesc->u.Memory.Alignment == 0) IoDesc->u.Memory.Alignment = 1;
for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart;
Start < IoDesc->u.Memory.MaximumAddress.QuadPart; Start <= IoDesc->u.Memory.MaximumAddress.QuadPart;
Start++) Start += IoDesc->u.Memory.Alignment)
{ {
CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; CmDesc->u.Memory.Length = IoDesc->u.Memory.Length;
CmDesc->u.Memory.Start.QuadPart = Start; CmDesc->u.Memory.Start.QuadPart = Start;
@ -111,9 +114,12 @@ IopFindPortResource(
ASSERT(IoDesc->Type == CmDesc->Type); ASSERT(IoDesc->Type == CmDesc->Type);
ASSERT(IoDesc->Type == CmResourceTypePort); ASSERT(IoDesc->Type == CmResourceTypePort);
/* HACK */
if (IoDesc->u.Port.Alignment == 0) IoDesc->u.Port.Alignment = 1;
for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; for (Start = IoDesc->u.Port.MinimumAddress.QuadPart;
Start < IoDesc->u.Port.MaximumAddress.QuadPart; Start <= IoDesc->u.Port.MaximumAddress.QuadPart;
Start++) Start += IoDesc->u.Port.Alignment)
{ {
CmDesc->u.Port.Length = IoDesc->u.Port.Length; CmDesc->u.Port.Length = IoDesc->u.Port.Length;
CmDesc->u.Port.Start.QuadPart = Start; CmDesc->u.Port.Start.QuadPart = Start;
@ -143,7 +149,7 @@ IopFindDmaResource(
ASSERT(IoDesc->Type == CmResourceTypeDma); ASSERT(IoDesc->Type == CmResourceTypeDma);
for (Channel = IoDesc->u.Dma.MinimumChannel; for (Channel = IoDesc->u.Dma.MinimumChannel;
Channel < IoDesc->u.Dma.MaximumChannel; Channel <= IoDesc->u.Dma.MaximumChannel;
Channel++) Channel++)
{ {
CmDesc->u.Dma.Channel = Channel; CmDesc->u.Dma.Channel = Channel;
@ -168,7 +174,7 @@ IopFindInterruptResource(
ASSERT(IoDesc->Type == CmResourceTypeInterrupt); ASSERT(IoDesc->Type == CmResourceTypeInterrupt);
for (Vector = IoDesc->u.Interrupt.MinimumVector; for (Vector = IoDesc->u.Interrupt.MinimumVector;
Vector < IoDesc->u.Interrupt.MaximumVector; Vector <= IoDesc->u.Interrupt.MaximumVector;
Vector++) Vector++)
{ {
CmDesc->u.Interrupt.Vector = Vector; CmDesc->u.Interrupt.Vector = Vector;