Print this page
update to acpica-unix2-20130927
acpica-unix2-20130823
PANKOVs restructure
        
*** 3,13 ****
   * Module Name: exstore - AML Interpreter object store support
   *
   *****************************************************************************/
  
  /*
!  * Copyright (C) 2000 - 2011, Intel Corp.
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
--- 3,13 ----
   * Module Name: exstore - AML Interpreter object store support
   *
   *****************************************************************************/
  
  /*
!  * Copyright (C) 2000 - 2013, Intel Corp.
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
*** 60,77 ****
  AcpiExStoreObjectToIndex (
      ACPI_OPERAND_OBJECT     *ValDesc,
      ACPI_OPERAND_OBJECT     *DestDesc,
      ACPI_WALK_STATE         *WalkState);
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiExStore
   *
   * PARAMETERS:  *SourceDesc         - Value to be stored
   *              *DestDesc           - Where to store it.  Must be an NS node
!  *                                    or an ACPI_OPERAND_OBJECT of type
   *                                    Reference;
   *              WalkState           - Current walk state
   *
   * RETURN:      Status
   *
--- 60,83 ----
  AcpiExStoreObjectToIndex (
      ACPI_OPERAND_OBJECT     *ValDesc,
      ACPI_OPERAND_OBJECT     *DestDesc,
      ACPI_WALK_STATE         *WalkState);
  
+ static ACPI_STATUS
+ AcpiExStoreDirectToNode (
+     ACPI_OPERAND_OBJECT     *SourceDesc,
+     ACPI_NAMESPACE_NODE     *Node,
+     ACPI_WALK_STATE         *WalkState);
  
+ 
  /*******************************************************************************
   *
   * FUNCTION:    AcpiExStore
   *
   * PARAMETERS:  *SourceDesc         - Value to be stored
   *              *DestDesc           - Where to store it. Must be an NS node
!  *                                    or ACPI_OPERAND_OBJECT of type
   *                                    Reference;
   *              WalkState           - Current walk state
   *
   * RETURN:      Status
   *
*** 122,131 ****
--- 128,138 ----
      /* Destination object must be a Reference or a Constant object */
  
      switch (DestDesc->Common.Type)
      {
      case ACPI_TYPE_LOCAL_REFERENCE:
+ 
          break;
  
      case ACPI_TYPE_INTEGER:
  
          /* Allow stores to Constants -- a Noop as per ACPI spec */
*** 165,195 ****
          Status = AcpiExStoreObjectToNode (SourceDesc,
                      RefDesc->Reference.Object,
                      WalkState, ACPI_IMPLICIT_CONVERSION);
          break;
  
- 
      case ACPI_REFCLASS_INDEX:
  
          /* Storing to an Index (pointer into a packager or buffer) */
  
          Status = AcpiExStoreObjectToIndex (SourceDesc, RefDesc, WalkState);
          break;
  
- 
      case ACPI_REFCLASS_LOCAL:
      case ACPI_REFCLASS_ARG:
  
          /* Store to a method local/arg  */
  
          Status = AcpiDsStoreObjectToLocal (RefDesc->Reference.Class,
                      RefDesc->Reference.Value, SourceDesc, WalkState);
          break;
  
- 
      case ACPI_REFCLASS_DEBUG:
- 
          /*
           * Storing to the Debug object causes the value stored to be
           * displayed and otherwise has no effect -- see ACPI Specification
           */
          ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
--- 172,198 ----
*** 197,207 ****
              SourceDesc, AcpiUtGetObjectTypeName (SourceDesc)));
  
          ACPI_DEBUG_OBJECT (SourceDesc, 0, 0);
          break;
  
- 
      default:
  
          ACPI_ERROR ((AE_INFO, "Unknown Reference Class 0x%2.2X",
              RefDesc->Reference.Class));
          ACPI_DUMP_ENTRY (RefDesc, ACPI_LV_INFO);
--- 200,209 ----
*** 306,318 ****
              AcpiUtAddReference (NewDesc);
          }
  
          break;
  
- 
      case ACPI_TYPE_BUFFER_FIELD:
- 
          /*
           * Store into a Buffer or String (not actually a real BufferField)
           * at a location defined by an Index.
           *
           * The first 8-bit element of the source object is written to the
--- 308,318 ----
*** 366,376 ****
          /* Store the source value into the target buffer byte */
  
          ObjDesc->Buffer.Pointer[IndexDesc->Reference.Value] = Value;
          break;
  
- 
      default:
          ACPI_ERROR ((AE_INFO,
              "Target is not a Package or BufferField"));
          Status = AE_AML_OPERAND_TYPE;
          break;
--- 366,375 ----
*** 398,409 ****
   *              with the input value.
   *
   *              When storing into an object the data is converted to the
   *              target object type then stored in the object.  This means
   *              that the target object type (for an initialized target) will
!  *              not be changed by a store operation.
   *
   *              Assumes parameters are already validated.
   *
   ******************************************************************************/
  
  ACPI_STATUS
--- 397,412 ----
   *              with the input value.
   *
   *              When storing into an object the data is converted to the
   *              target object type then stored in the object. This means
   *              that the target object type (for an initialized target) will
!  *              not be changed by a store operation. A CopyObject can change
!  *              the target type, however.
   *
+  *              The ImplicitConversion flag is set to NO/FALSE only when
+  *              storing to an ArgX -- as per the rules of the ACPI spec.
+  *
   *              Assumes parameters are already validated.
   *
   ******************************************************************************/
  
  ACPI_STATUS
*** 425,435 ****
      /* Get current type of the node, and object attached to Node */
  
      TargetType = AcpiNsGetType (Node);
      TargetDesc = AcpiNsGetAttachedObject (Node);
  
!     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n",
          SourceDesc, AcpiUtGetObjectTypeName (SourceDesc),
                Node, AcpiUtGetTypeName (TargetType)));
  
      /*
       * Resolve the source object to an actual value
--- 428,438 ----
      /* Get current type of the node, and object attached to Node */
  
      TargetType = AcpiNsGetType (Node);
      TargetDesc = AcpiNsGetAttachedObject (Node);
  
!     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Storing %p (%s) to node %p (%s)\n",
          SourceDesc, AcpiUtGetObjectTypeName (SourceDesc),
                Node, AcpiUtGetTypeName (TargetType)));
  
      /*
       * Resolve the source object to an actual value
*** 439,491 ****
      if (ACPI_FAILURE (Status))
      {
          return_ACPI_STATUS (Status);
      }
  
-     /* If no implicit conversion, drop into the default case below */
- 
-     if ((!ImplicitConversion) ||
-           ((WalkState->Opcode == AML_COPY_OP) &&
-            (TargetType != ACPI_TYPE_LOCAL_REGION_FIELD) &&
-            (TargetType != ACPI_TYPE_LOCAL_BANK_FIELD) &&
-            (TargetType != ACPI_TYPE_LOCAL_INDEX_FIELD)))
-     {
-         /*
-          * Force execution of default (no implicit conversion). Note:
-          * CopyObject does not perform an implicit conversion, as per the ACPI
-          * spec -- except in case of region/bank/index fields -- because these
-          * objects must retain their original type permanently.
-          */
-         TargetType = ACPI_TYPE_ANY;
-     }
- 
      /* Do the actual store operation */
  
      switch (TargetType)
      {
-     case ACPI_TYPE_BUFFER_FIELD:
-     case ACPI_TYPE_LOCAL_REGION_FIELD:
-     case ACPI_TYPE_LOCAL_BANK_FIELD:
-     case ACPI_TYPE_LOCAL_INDEX_FIELD:
- 
-         /* For fields, copy the source data to the target field. */
- 
-         Status = AcpiExWriteDataToField (SourceDesc, TargetDesc,
-                     &WalkState->ResultObj);
-         break;
- 
- 
      case ACPI_TYPE_INTEGER:
      case ACPI_TYPE_STRING:
      case ACPI_TYPE_BUFFER:
  
          /*
!          * These target types are all of type Integer/String/Buffer, and
!          * therefore support implicit conversion before the store.
!          *
!          * Copy and/or convert the source object to a new target object
           */
          Status = AcpiExStoreObjectToObject (SourceDesc, TargetDesc,
                      &NewDesc, WalkState);
          if (ACPI_FAILURE (Status))
          {
              return_ACPI_STATUS (Status);
--- 442,478 ----
      if (ACPI_FAILURE (Status))
      {
          return_ACPI_STATUS (Status);
      }
  
      /* Do the actual store operation */
  
      switch (TargetType)
      {
      case ACPI_TYPE_INTEGER:
      case ACPI_TYPE_STRING:
      case ACPI_TYPE_BUFFER:
+         /*
+          * The simple data types all support implicit source operand
+          * conversion before the store.
+          */
  
+         if ((WalkState->Opcode == AML_COPY_OP) ||
+             !ImplicitConversion)
+         {
              /*
!              * However, CopyObject and Stores to ArgX do not perform
!              * an implicit conversion, as per the ACPI specification.
!              * A direct store is performed instead.
               */
+             Status = AcpiExStoreDirectToNode (SourceDesc, Node,
+                 WalkState);
+             break;
+         }
+ 
+         /* Store with implicit source operand conversion support */
+ 
          Status = AcpiExStoreObjectToObject (SourceDesc, TargetDesc,
              &NewDesc, WalkState);
          if (ACPI_FAILURE (Status))
          {
              return_ACPI_STATUS (Status);
*** 496,531 ****
              /*
               * Store the new NewDesc as the new value of the Name, and set
               * the Name's type to that of the value being stored in it.
               * SourceDesc reference count is incremented by AttachObject.
               *
!              * Note: This may change the type of the node if an explicit store
!              * has been performed such that the node/object type has been
!              * changed.
               */
!             Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
  
              ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
                  "Store %s into %s via Convert/Attach\n",
                  AcpiUtGetObjectTypeName (SourceDesc),
                  AcpiUtGetObjectTypeName (NewDesc)));
          }
          break;
  
  
      default:
  
          ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
!             "Storing %s (%p) directly into node (%p) with no implicit conversion\n",
!             AcpiUtGetObjectTypeName (SourceDesc), SourceDesc, Node));
  
!         /* No conversions for all other types.  Just attach the source object */
  
!         Status = AcpiNsAttachObject (Node, SourceDesc,
!                     SourceDesc->Common.Type);
!         break;
      }
  
      return_ACPI_STATUS (Status);
  }
- 
- 
--- 483,584 ----
              /*
               * Store the new NewDesc as the new value of the Name, and set
               * the Name's type to that of the value being stored in it.
               * SourceDesc reference count is incremented by AttachObject.
               *
!              * Note: This may change the type of the node if an explicit
!              * store has been performed such that the node/object type
!              * has been changed.
               */
!             Status = AcpiNsAttachObject (Node, NewDesc,
!                 NewDesc->Common.Type);
  
              ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
                  "Store %s into %s via Convert/Attach\n",
                  AcpiUtGetObjectTypeName (SourceDesc),
                  AcpiUtGetObjectTypeName (NewDesc)));
          }
          break;
  
+     case ACPI_TYPE_BUFFER_FIELD:
+     case ACPI_TYPE_LOCAL_REGION_FIELD:
+     case ACPI_TYPE_LOCAL_BANK_FIELD:
+     case ACPI_TYPE_LOCAL_INDEX_FIELD:
+         /*
+          * For all fields, always write the source data to the target
+          * field. Any required implicit source operand conversion is
+          * performed in the function below as necessary. Note, field
+          * objects must retain their original type permanently.
+          */
+         Status = AcpiExWriteDataToField (SourceDesc, TargetDesc,
+             &WalkState->ResultObj);
+         break;
  
      default:
+         /*
+          * No conversions for all other types. Directly store a copy of
+          * the source object. This is the ACPI spec-defined behavior for
+          * the CopyObject operator.
+          *
+          * NOTE: For the Store operator, this is a departure from the
+          * ACPI spec, which states "If conversion is impossible, abort
+          * the running control method". Instead, this code implements
+          * "If conversion is impossible, treat the Store operation as
+          * a CopyObject".
+          */
+         Status = AcpiExStoreDirectToNode (SourceDesc, Node,
+             WalkState);
+         break;
+     }
  
+     return_ACPI_STATUS (Status);
+ }
+ 
+ 
+ /*******************************************************************************
+  *
+  * FUNCTION:    AcpiExStoreDirectToNode
+  *
+  * PARAMETERS:  SourceDesc              - Value to be stored
+  *              Node                    - Named object to receive the value
+  *              WalkState               - Current walk state
+  *
+  * RETURN:      Status
+  *
+  * DESCRIPTION: "Store" an object directly to a node. This involves a copy
+  *              and an attach.
+  *
+  ******************************************************************************/
+ 
+ static ACPI_STATUS
+ AcpiExStoreDirectToNode (
+     ACPI_OPERAND_OBJECT     *SourceDesc,
+     ACPI_NAMESPACE_NODE     *Node,
+     ACPI_WALK_STATE         *WalkState)
+ {
+     ACPI_STATUS             Status;
+     ACPI_OPERAND_OBJECT     *NewDesc;
+ 
+ 
+     ACPI_FUNCTION_TRACE (ExStoreDirectToNode);
+ 
+ 
      ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
!         "Storing [%s] (%p) directly into node [%s] (%p)"
!         " with no implicit conversion\n",
!         AcpiUtGetObjectTypeName (SourceDesc), SourceDesc,
!         AcpiUtGetTypeName (Node->Type), Node));
  
!     /* Copy the source object to a new object */
  
!     Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState);
!     if (ACPI_FAILURE (Status))
!     {
!         return_ACPI_STATUS (Status);
      }
  
+     /* Attach the new object to the node */
+ 
+     Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
+     AcpiUtRemoveReference (NewDesc);
      return_ACPI_STATUS (Status);
  }