|
@@ -162,9 +162,11 @@ acpi_rs_stream_option_length(u32 resource_length,
|
|
|
resource_length - minimum_aml_resource_length - 1;
|
|
|
}
|
|
|
|
|
|
- /* Round up length to 32 bits for internal structure alignment */
|
|
|
-
|
|
|
- return ((u32) ACPI_ROUND_UP_to_32_bITS(string_length));
|
|
|
+ /*
|
|
|
+ * Round the length up to a multiple of the native word in order to
|
|
|
+ * guarantee that the entire resource descriptor is native word aligned
|
|
|
+ */
|
|
|
+ return ((u32) ACPI_ROUND_UP_TO_NATIVE_WORD(string_length));
|
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
@@ -336,7 +338,7 @@ acpi_rs_get_list_length(u8 * aml_buffer,
|
|
|
acpi_status status;
|
|
|
u8 *end_aml;
|
|
|
u8 *buffer;
|
|
|
- u32 buffer_size = 0;
|
|
|
+ u32 buffer_size;
|
|
|
u16 temp16;
|
|
|
u16 resource_length;
|
|
|
u32 extra_struct_bytes;
|
|
@@ -345,6 +347,7 @@ acpi_rs_get_list_length(u8 * aml_buffer,
|
|
|
|
|
|
ACPI_FUNCTION_TRACE("rs_get_list_length");
|
|
|
|
|
|
+ *size_needed = 0;
|
|
|
end_aml = aml_buffer + aml_buffer_length;
|
|
|
|
|
|
/* Walk the list of AML resource descriptors */
|
|
@@ -391,37 +394,28 @@ acpi_rs_get_list_length(u8 * aml_buffer,
|
|
|
break;
|
|
|
|
|
|
case ACPI_RESOURCE_NAME_VENDOR_SMALL:
|
|
|
+ case ACPI_RESOURCE_NAME_VENDOR_LARGE:
|
|
|
/*
|
|
|
* Vendor Resource:
|
|
|
- * Ensure a 32-bit boundary for the structure
|
|
|
+ * Get the number of vendor data bytes
|
|
|
*/
|
|
|
- extra_struct_bytes = (u32)
|
|
|
- ACPI_ROUND_UP_to_32_bITS(resource_length) -
|
|
|
- resource_length;
|
|
|
+ extra_struct_bytes = resource_length;
|
|
|
break;
|
|
|
|
|
|
case ACPI_RESOURCE_NAME_END_TAG:
|
|
|
/*
|
|
|
- * End Tag: This is the normal exit, add size of end_tag
|
|
|
+ * End Tag:
|
|
|
+ * This is the normal exit, add size of end_tag
|
|
|
*/
|
|
|
- *size_needed = buffer_size + ACPI_RS_SIZE_MIN;
|
|
|
+ *size_needed += ACPI_RS_SIZE_MIN;
|
|
|
return_ACPI_STATUS(AE_OK);
|
|
|
|
|
|
- case ACPI_RESOURCE_NAME_VENDOR_LARGE:
|
|
|
- /*
|
|
|
- * Vendor Resource:
|
|
|
- * Add vendor data and ensure a 32-bit boundary for the structure
|
|
|
- */
|
|
|
- extra_struct_bytes = (u32)
|
|
|
- ACPI_ROUND_UP_to_32_bITS(resource_length) -
|
|
|
- resource_length;
|
|
|
- break;
|
|
|
-
|
|
|
case ACPI_RESOURCE_NAME_ADDRESS32:
|
|
|
case ACPI_RESOURCE_NAME_ADDRESS16:
|
|
|
+ case ACPI_RESOURCE_NAME_ADDRESS64:
|
|
|
/*
|
|
|
- * 32-Bit or 16-bit Address Resource:
|
|
|
- * Add the size of any optional data (resource_source)
|
|
|
+ * Address Resource:
|
|
|
+ * Add the size of the optional resource_source
|
|
|
*/
|
|
|
extra_struct_bytes =
|
|
|
acpi_rs_stream_option_length(resource_length,
|
|
@@ -430,50 +424,46 @@ acpi_rs_get_list_length(u8 * aml_buffer,
|
|
|
|
|
|
case ACPI_RESOURCE_NAME_EXTENDED_IRQ:
|
|
|
/*
|
|
|
- * Extended IRQ:
|
|
|
- * Point past the interrupt_vector_flags to get the
|
|
|
- * interrupt_table_length.
|
|
|
+ * Extended IRQ Resource:
|
|
|
+ * Using the interrupt_table_length, add 4 bytes for each additional
|
|
|
+ * interrupt. Note: at least one interrupt is required and is
|
|
|
+ * included in the minimum descriptor size (reason for the -1)
|
|
|
*/
|
|
|
- buffer++;
|
|
|
-
|
|
|
- extra_struct_bytes = (u32)
|
|
|
- /*
|
|
|
- * Add 4 bytes for each additional interrupt. Note: at
|
|
|
- * least one interrupt is required and is included in
|
|
|
- * the minimum descriptor size
|
|
|
- */
|
|
|
- ((*buffer - 1) * sizeof(u32)) +
|
|
|
- /* Add the size of any optional data (resource_source) */
|
|
|
+ extra_struct_bytes = (buffer[1] - 1) * sizeof(u32);
|
|
|
+
|
|
|
+ /* Add the size of the optional resource_source */
|
|
|
+
|
|
|
+ extra_struct_bytes +=
|
|
|
acpi_rs_stream_option_length(resource_length -
|
|
|
extra_struct_bytes,
|
|
|
minimum_aml_resource_length);
|
|
|
break;
|
|
|
|
|
|
- case ACPI_RESOURCE_NAME_ADDRESS64:
|
|
|
- /*
|
|
|
- * 64-Bit Address Resource:
|
|
|
- * Add the size of any optional data (resource_source)
|
|
|
- * Ensure a 64-bit boundary for the structure
|
|
|
- */
|
|
|
- extra_struct_bytes = (u32)
|
|
|
- ACPI_ROUND_UP_to_64_bITS
|
|
|
- (acpi_rs_stream_option_length
|
|
|
- (resource_length, minimum_aml_resource_length));
|
|
|
- break;
|
|
|
-
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- /* Update the required buffer size for the internal descriptor structs */
|
|
|
+ /*
|
|
|
+ * Update the required buffer size for the internal descriptor structs
|
|
|
+ *
|
|
|
+ * Important: Round the size up for the appropriate alignment. This
|
|
|
+ * is a requirement on IA64.
|
|
|
+ */
|
|
|
+ buffer_size = acpi_gbl_resource_struct_sizes[resource_index] +
|
|
|
+ extra_struct_bytes;
|
|
|
+ buffer_size = ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
|
|
|
+
|
|
|
+ *size_needed += buffer_size;
|
|
|
|
|
|
- temp16 = (u16) (acpi_gbl_resource_struct_sizes[resource_index] +
|
|
|
- extra_struct_bytes);
|
|
|
- buffer_size += (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(temp16);
|
|
|
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
|
|
|
+ "Type %.2X, Aml %.2X internal %.2X\n",
|
|
|
+ acpi_ut_get_resource_type(aml_buffer),
|
|
|
+ acpi_ut_get_descriptor_length(aml_buffer),
|
|
|
+ buffer_size));
|
|
|
|
|
|
/*
|
|
|
- * Point to the next resource within the stream
|
|
|
- * using the size of the header plus the length contained in the header
|
|
|
+ * Point to the next resource within the AML stream using the length
|
|
|
+ * contained in the resource descriptor header
|
|
|
*/
|
|
|
aml_buffer += acpi_ut_get_descriptor_length(aml_buffer);
|
|
|
}
|
|
@@ -589,7 +579,7 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
|
|
|
|
|
|
/* Round up the size since each element must be aligned */
|
|
|
|
|
|
- temp_size_needed = ACPI_ROUND_UP_to_64_bITS(temp_size_needed);
|
|
|
+ temp_size_needed = ACPI_ROUND_UP_to_64_bIT(temp_size_needed);
|
|
|
|
|
|
/* Point to the next union acpi_operand_object */
|
|
|
|
|
@@ -597,7 +587,7 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Adding an extra element to the end of the list, essentially a
|
|
|
+ * Add an extra element to the end of the list, essentially a
|
|
|
* NULL terminator
|
|
|
*/
|
|
|
*buffer_size_needed =
|