aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/dev/acpica/components/executer/exfield.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/components/executer/exfield.c')
-rw-r--r--sys/contrib/dev/acpica/components/executer/exfield.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/contrib/dev/acpica/components/executer/exfield.c b/sys/contrib/dev/acpica/components/executer/exfield.c
index 14a0c4fc5ff7..c2bb040ce40d 100644
--- a/sys/contrib/dev/acpica/components/executer/exfield.c
+++ b/sys/contrib/dev/acpica/components/executer/exfield.c
@@ -246,7 +246,8 @@ AcpiExGetProtocolBufferLength (
* RETURN: Status
*
* DESCRIPTION: Read from a named field. Returns either an Integer or a
- * Buffer, depending on the size of the field.
+ * Buffer, depending on the size of the field and whether if a
+ * field is created by the CreateField() operator.
*
******************************************************************************/
@@ -310,12 +311,17 @@ AcpiExReadDataFromField (
* the use of arithmetic operators on the returned value if the
* field size is equal or smaller than an Integer.
*
+ * However, all buffer fields created by CreateField operator needs to
+ * remain as a buffer to match other AML interpreter implementations.
+ *
* Note: Field.length is in bits.
*/
BufferLength = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES (
ObjDesc->Field.BitLength);
- if (BufferLength > AcpiGbl_IntegerByteWidth)
+ if (BufferLength > AcpiGbl_IntegerByteWidth ||
+ (ObjDesc->Common.Type == ACPI_TYPE_BUFFER_FIELD &&
+ ObjDesc->BufferField.IsCreateField))
{
/* Field is too large for an Integer, create a Buffer instead */