ALIGN_RESOURCE_SIZE macro added to fix a reported IA-64 alignment

issue (reported by Kochi Takayoshi)


date	2002.01.22.23.19.00;	author mwalz;	state Exp;
This commit is contained in:
aystarik 2005-06-29 18:43:53 +00:00
parent 4d5b54cf2d
commit ad47cec830
2 changed files with 275 additions and 288 deletions

View File

@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: rscalc - Calculate stream and list lengths
* $Revision: 1.34 $
* $Revision: 1.38 $
*
******************************************************************************/
@ -9,7 +9,7 @@
*
* 1. Copyright Notice
*
* Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp.
* Some or all of this work - Copyright (c) 1999 - 2002, Intel Corp.
* All rights reserved.
*
* 2. License
@ -144,10 +144,10 @@
ACPI_STATUS
AcpiRsCalculateByteStreamLength (
ACPI_RESOURCE *LinkedList,
UINT32 *SizeNeeded)
ACPI_SIZE *SizeNeeded)
{
UINT32 ByteStreamSizeNeeded = 0;
UINT32 SegmentSize;
ACPI_SIZE ByteStreamSizeNeeded = 0;
ACPI_SIZE SegmentSize;
ACPI_RESOURCE_EXT_IRQ *ExIrq = NULL;
BOOLEAN Done = FALSE;
@ -343,7 +343,6 @@ AcpiRsCalculateByteStreamLength (
* so exit with an error
*/
return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
break;
} /* switch (LinkedList->Id) */
@ -355,7 +354,7 @@ AcpiRsCalculateByteStreamLength (
/*
* Point to the next object
*/
LinkedList = POINTER_ADD (ACPI_RESOURCE,
LinkedList = ACPI_PTR_ADD (ACPI_RESOURCE,
LinkedList, LinkedList->Length);
}
@ -389,7 +388,7 @@ ACPI_STATUS
AcpiRsCalculateListLength (
UINT8 *ByteStreamBuffer,
UINT32 ByteStreamBufferLength,
UINT32 *SizeNeeded)
ACPI_SIZE *SizeNeeded)
{
UINT32 BufferSize = 0;
UINT32 BytesParsed = 0;
@ -800,13 +799,12 @@ AcpiRsCalculateListLength (
* so exit with an error
*/
return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
break;
}
/*
* Update the return value and counter
*/
BufferSize += StructureSize;
BufferSize += ALIGN_RESOURCE_SIZE(StructureSize);
BytesParsed += BytesConsumed;
/*
@ -843,7 +841,7 @@ AcpiRsCalculateListLength (
ACPI_STATUS
AcpiRsCalculatePciRoutingTableLength (
ACPI_OPERAND_OBJECT *PackageObject,
UINT32 *BufferSizeNeeded)
ACPI_SIZE *BufferSizeNeeded)
{
UINT32 NumberOfElements;
UINT32 TempSizeNeeded = 0;

View File

@ -1,8 +1,7 @@
/*******************************************************************************
*
* Module Name: rslist - AcpiRsByteStreamToList
* AcpiListToByteStream
* $Revision: 1.11 $
* Module Name: rslist - Linked list utilities
* $Revision: 1.24 $
*
******************************************************************************/
@ -10,7 +9,7 @@
*
* 1. Copyright Notice
*
* Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp.
* Some or all of this work - Copyright (c) 1999 - 2002, Intel Corp.
* All rights reserved.
*
* 2. License
@ -120,10 +119,56 @@
#include "acpi.h"
#include "acresrc.h"
#define _COMPONENT RESOURCE_MANAGER
#define _COMPONENT ACPI_RESOURCES
MODULE_NAME ("rslist")
/*******************************************************************************
*
* FUNCTION: AcpiRsGetResourceType
*
* PARAMETERS: ResourceStartByte - Byte 0 of a resource descriptor
*
* RETURN: The Resource Type (Name) with no extraneous bits
*
* DESCRIPTION: Extract the Resource Type/Name from the first byte of
* a resource descriptor.
*
******************************************************************************/
UINT8
AcpiRsGetResourceType (
UINT8 ResourceStartByte)
{
FUNCTION_ENTRY ();
/*
* Determine if this is a small or large resource
*/
switch (ResourceStartByte & RESOURCE_DESC_TYPE_MASK)
{
case RESOURCE_DESC_TYPE_SMALL:
/*
* Small Resource Type -- Only bits 6:3 are valid
*/
return ((UINT8) (ResourceStartByte & RESOURCE_DESC_SMALL_MASK));
case RESOURCE_DESC_TYPE_LARGE:
/*
* Large Resource Type -- All bits are valid
*/
return (ResourceStartByte);
}
return (0xFF);
}
/*******************************************************************************
*
* FUNCTION: AcpiRsByteStreamToList
@ -131,9 +176,9 @@
* PARAMETERS: ByteStreamBuffer - Pointer to the resource byte stream
* ByteStreamBufferLength - Length of ByteStreamBuffer
* OutputBuffer - Pointer to the buffer that will
* contain the output structures
* contain the output structures
*
* RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code
* RETURN: Status
*
* DESCRIPTION: Takes the resource byte stream and parses it, creating a
* linked list of resources in the caller's output buffer
@ -144,16 +189,16 @@ ACPI_STATUS
AcpiRsByteStreamToList (
UINT8 *ByteStreamBuffer,
UINT32 ByteStreamBufferLength,
UINT8 **OutputBuffer)
UINT8 *OutputBuffer)
{
ACPI_STATUS Status;
UINT32 BytesParsed = 0;
UINT8 ResourceType = 0;
UINT32 BytesConsumed = 0;
UINT8 **Buffer = OutputBuffer;
UINT32 StructureSize = 0;
ACPI_SIZE BytesConsumed = 0;
UINT8 *Buffer = OutputBuffer;
ACPI_SIZE StructureSize = 0;
BOOLEAN EndTagProcessed = FALSE;
ACPI_RESOURCE *Resource;
FUNCTION_TRACE ("RsByteStreamToList");
@ -162,222 +207,170 @@ AcpiRsByteStreamToList (
FALSE == EndTagProcessed)
{
/*
* Look at the next byte in the stream
* The next byte in the stream is the resource type
*/
ResourceType = *ByteStreamBuffer;
ResourceType = AcpiRsGetResourceType (*ByteStreamBuffer);
/*
* See if this is a small or large resource
*/
if(ResourceType & 0x80)
switch (ResourceType)
{
case RESOURCE_DESC_MEMORY_24:
/*
* Large Resource Type
* 24-Bit Memory Resource
*/
switch (ResourceType)
{
case MEMORY_RANGE_24:
/*
* 24-Bit Memory Resource
*/
Status = AcpiRsMemory24Resource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
Status = AcpiRsMemory24Resource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
break;
case LARGE_VENDOR_DEFINED:
/*
* Vendor Defined Resource
*/
Status = AcpiRsVendorResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
case RESOURCE_DESC_LARGE_VENDOR:
/*
* Vendor Defined Resource
*/
Status = AcpiRsVendorResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
break;
case MEMORY_RANGE_32:
/*
* 32-Bit Memory Range Resource
*/
Status = AcpiRsMemory32RangeResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
case RESOURCE_DESC_MEMORY_32:
/*
* 32-Bit Memory Range Resource
*/
Status = AcpiRsMemory32RangeResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
break;
case FIXED_MEMORY_RANGE_32:
/*
* 32-Bit Fixed Memory Resource
*/
Status = AcpiRsFixedMemory32Resource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
case RESOURCE_DESC_FIXED_MEMORY_32:
/*
* 32-Bit Fixed Memory Resource
*/
Status = AcpiRsFixedMemory32Resource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
break;
case DWORD_ADDRESS_SPACE:
/*
* 32-Bit Address Resource
*/
Status = AcpiRsAddress32Resource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
case RESOURCE_DESC_QWORD_ADDRESS_SPACE:
/*
* 64-Bit Address Resource
*/
Status = AcpiRsAddress64Resource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
break;
case WORD_ADDRESS_SPACE:
/*
* 16-Bit Address Resource
*/
Status = AcpiRsAddress16Resource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
case RESOURCE_DESC_DWORD_ADDRESS_SPACE:
/*
* 32-Bit Address Resource
*/
Status = AcpiRsAddress32Resource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
break;
case EXTENDED_IRQ:
/*
* Extended IRQ
*/
Status = AcpiRsExtendedIrqResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
case RESOURCE_DESC_WORD_ADDRESS_SPACE:
/*
* 16-Bit Address Resource
*/
Status = AcpiRsAddress16Resource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
break;
/* TBD: [Future] 64-bit not currently supported */
/*
case 0x8A:
break;
*/
case RESOURCE_DESC_EXTENDED_XRUPT:
/*
* Extended IRQ
*/
Status = AcpiRsExtendedIrqResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
default:
/*
* If we get here, everything is out of sync,
* so exit with an error
*/
return_ACPI_STATUS (AE_AML_ERROR);
break;
}
case RESOURCE_DESC_IRQ_FORMAT:
/*
* IRQ Resource
*/
Status = AcpiRsIrqResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
case RESOURCE_DESC_DMA_FORMAT:
/*
* DMA Resource
*/
Status = AcpiRsDmaResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
case RESOURCE_DESC_START_DEPENDENT:
/*
* Start Dependent Functions Resource
*/
Status = AcpiRsStartDependFnsResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
case RESOURCE_DESC_END_DEPENDENT:
/*
* End Dependent Functions Resource
*/
Status = AcpiRsEndDependFnsResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
case RESOURCE_DESC_IO_PORT:
/*
* IO Port Resource
*/
Status = AcpiRsIoResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
case RESOURCE_DESC_FIXED_IO_PORT:
/*
* Fixed IO Port Resource
*/
Status = AcpiRsFixedIoResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
case RESOURCE_DESC_SMALL_VENDOR:
/*
* Vendor Specific Resource
*/
Status = AcpiRsVendorResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
case RESOURCE_DESC_END_TAG:
/*
* End Tag
*/
EndTagProcessed = TRUE;
Status = AcpiRsEndTagResource (ByteStreamBuffer,
&BytesConsumed, &Buffer, &StructureSize);
break;
default:
/*
* Invalid/Unknowns resource type
*/
Status = AE_AML_ERROR;
break;
}
else
if (!ACPI_SUCCESS(Status))
{
/*
* Small Resource Type
* Only bits 7:3 are valid
*/
ResourceType >>= 3;
switch(ResourceType)
{
case IRQ_FORMAT:
/*
* IRQ Resource
*/
Status = AcpiRsIrqResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
break;
case DMA_FORMAT:
/*
* DMA Resource
*/
Status = AcpiRsDmaResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
break;
case START_DEPENDENT_TAG:
/*
* Start Dependent Functions Resource
*/
Status = AcpiRsStartDependentFunctionsResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
break;
case END_DEPENDENT_TAG:
/*
* End Dependent Functions Resource
*/
Status = AcpiRsEndDependentFunctionsResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
break;
case IO_PORT_DESCRIPTOR:
/*
* IO Port Resource
*/
Status = AcpiRsIoResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
break;
case FIXED_LOCATION_IO_DESCRIPTOR:
/*
* Fixed IO Port Resource
*/
Status = AcpiRsFixedIoResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
break;
case SMALL_VENDOR_DEFINED:
/*
* Vendor Specific Resource
*/
Status = AcpiRsVendorResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
break;
case END_TAG:
/*
* End Tag
*/
Status = AcpiRsEndTagResource(ByteStreamBuffer,
&BytesConsumed,
Buffer,
&StructureSize);
EndTagProcessed = TRUE;
break;
default:
/*
* If we get here, everything is out of sync,
* so exit with an error
*/
return_ACPI_STATUS (AE_AML_ERROR);
break;
} /* switch */
} /* end else */
return_ACPI_STATUS (Status);
}
/*
* Update the return value and counter
@ -392,7 +385,9 @@ AcpiRsByteStreamToList (
/*
* Set the Buffer to the next structure
*/
*Buffer += StructureSize;
Resource = (ACPI_RESOURCE *)Buffer;
Resource->Length = ALIGN_RESOURCE_SIZE(Resource->Length);
Buffer += ALIGN_RESOURCE_SIZE(StructureSize);
} /* end while */
@ -414,15 +409,15 @@ AcpiRsByteStreamToList (
*
* PARAMETERS: LinkedList - Pointer to the resource linked list
* ByteSteamSizeNeeded - Calculated size of the byte stream
* needed from calling
* AcpiRsCalculateByteStreamLength()
* The size of the OutputBuffer is
* guaranteed to be >=
* ByteStreamSizeNeeded
* needed from calling
* AcpiRsCalculateByteStreamLength()
* The size of the OutputBuffer is
* guaranteed to be >=
* ByteStreamSizeNeeded
* OutputBuffer - Pointer to the buffer that will
* contain the byte stream
* contain the byte stream
*
* RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code
* RETURN: Status
*
* DESCRIPTION: Takes the resource linked list and parses it, creating a
* byte stream of resources in the caller's output buffer
@ -431,92 +426,79 @@ AcpiRsByteStreamToList (
ACPI_STATUS
AcpiRsListToByteStream (
RESOURCE *LinkedList,
ACPI_RESOURCE *LinkedList,
UINT32 ByteStreamSizeNeeded,
UINT8 **OutputBuffer)
UINT8 *OutputBuffer)
{
ACPI_STATUS Status;
UINT8 *Buffer = *OutputBuffer;
UINT32 BytesConsumed = 0;
UINT8 *Buffer = OutputBuffer;
ACPI_SIZE BytesConsumed = 0;
BOOLEAN Done = FALSE;
FUNCTION_TRACE ("RsListToByteStream");
while (!Done)
{
switch (LinkedList->Id)
{
case Irq:
case ACPI_RSTYPE_IRQ:
/*
* IRQ Resource
*/
Status = AcpiRsIrqStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsIrqStream (LinkedList, &Buffer, &BytesConsumed);
break;
case Dma:
case ACPI_RSTYPE_DMA:
/*
* DMA Resource
*/
Status = AcpiRsDmaStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsDmaStream (LinkedList, &Buffer, &BytesConsumed);
break;
case StartDependentFunctions:
case ACPI_RSTYPE_START_DPF:
/*
* Start Dependent Functions Resource
*/
Status = AcpiRsStartDependentFunctionsStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsStartDependFnsStream (LinkedList,
&Buffer, &BytesConsumed);
break;
case EndDependentFunctions:
case ACPI_RSTYPE_END_DPF:
/*
* End Dependent Functions Resource
*/
Status = AcpiRsEndDependentFunctionsStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsEndDependFnsStream (LinkedList,
&Buffer, &BytesConsumed);
break;
case Io:
case ACPI_RSTYPE_IO:
/*
* IO Port Resource
*/
Status = AcpiRsIoStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsIoStream (LinkedList, &Buffer, &BytesConsumed);
break;
case FixedIo:
case ACPI_RSTYPE_FIXED_IO:
/*
* Fixed IO Port Resource
*/
Status = AcpiRsFixedIoStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsFixedIoStream (LinkedList, &Buffer, &BytesConsumed);
break;
case VendorSpecific:
case ACPI_RSTYPE_VENDOR:
/*
* Vendor Defined Resource
*/
Status = AcpiRsVendorStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsVendorStream (LinkedList, &Buffer, &BytesConsumed);
break;
case EndTag:
case ACPI_RSTYPE_END_TAG:
/*
* End Tag
*/
Status = AcpiRsEndTagStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsEndTagStream (LinkedList, &Buffer, &BytesConsumed);
/*
* An End Tag indicates the end of the Resource Template
@ -524,58 +506,59 @@ AcpiRsListToByteStream (
Done = TRUE;
break;
case Memory24:
case ACPI_RSTYPE_MEM24:
/*
* 24-Bit Memory Resource
*/
Status = AcpiRsMemory24Stream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsMemory24Stream (LinkedList, &Buffer, &BytesConsumed);
break;
case Memory32:
case ACPI_RSTYPE_MEM32:
/*
* 32-Bit Memory Range Resource
*/
Status = AcpiRsMemory32RangeStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsMemory32RangeStream (LinkedList, &Buffer,
&BytesConsumed);
break;
case FixedMemory32:
case ACPI_RSTYPE_FIXED_MEM32:
/*
* 32-Bit Fixed Memory Resource
*/
Status = AcpiRsFixedMemory32Stream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsFixedMemory32Stream (LinkedList, &Buffer,
&BytesConsumed);
break;
case Address16:
case ACPI_RSTYPE_ADDRESS16:
/*
* 16-Bit Address Descriptor Resource
*/
Status = AcpiRsAddress16Stream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsAddress16Stream (LinkedList, &Buffer,
&BytesConsumed);
break;
case Address32:
case ACPI_RSTYPE_ADDRESS32:
/*
* 32-Bit Address Descriptor Resource
*/
Status = AcpiRsAddress32Stream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsAddress32Stream (LinkedList, &Buffer,
&BytesConsumed);
break;
case ExtendedIrq:
case ACPI_RSTYPE_ADDRESS64:
/*
* 64-Bit Address Descriptor Resource
*/
Status = AcpiRsAddress64Stream (LinkedList, &Buffer,
&BytesConsumed);
break;
case ACPI_RSTYPE_EXT_IRQ:
/*
* Extended IRQ Resource
*/
Status = AcpiRsExtendedIrqStream (LinkedList,
&Buffer,
&BytesConsumed);
Status = AcpiRsExtendedIrqStream (LinkedList, &Buffer,
&BytesConsumed);
break;
default:
@ -583,11 +566,17 @@ AcpiRsListToByteStream (
* If we get here, everything is out of sync,
* so exit with an error
*/
return_ACPI_STATUS (AE_BAD_DATA);
Status = AE_BAD_DATA;
break;
} /* switch (LinkedList->Id) */
if (!ACPI_SUCCESS(Status))
{
return_ACPI_STATUS (Status);
}
/*
* Set the Buffer to point to the open byte
*/
@ -596,10 +585,10 @@ AcpiRsListToByteStream (
/*
* Point to the next object
*/
LinkedList = (RESOURCE *) ((NATIVE_UINT) LinkedList +
(NATIVE_UINT) LinkedList->Length);
LinkedList = ACPI_PTR_ADD (ACPI_RESOURCE,
LinkedList, LinkedList->Length);
}
return_ACPI_STATUS (AE_OK);
return_ACPI_STATUS (AE_OK);
}