ReactOS  0.4.15-dev-509-g96a357b
dsmthdat.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "acdispat.h"
#include "acnamesp.h"
#include "acinterp.h"
Include dependency graph for dsmthdat.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_DISPATCHER
 

Functions

static void AcpiDsMethodDataDeleteValue (UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState)
 
static ACPI_STATUS AcpiDsMethodDataSetValue (UINT8 Type, UINT32 Index, ACPI_OPERAND_OBJECT *Object, ACPI_WALK_STATE *WalkState)
 
void AcpiDsMethodDataInit (ACPI_WALK_STATE *WalkState)
 
void AcpiDsMethodDataDeleteAll (ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsMethodDataInitArgs (ACPI_OPERAND_OBJECT **Params, UINT32 MaxParamCount, ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsMethodDataGetNode (UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState, ACPI_NAMESPACE_NODE **Node)
 
ACPI_STATUS AcpiDsMethodDataGetValue (UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState, ACPI_OPERAND_OBJECT **DestDesc)
 
ACPI_STATUS AcpiDsStoreObjectToLocal (UINT8 Type, UINT32 Index, ACPI_OPERAND_OBJECT *ObjDesc, ACPI_WALK_STATE *WalkState)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_DISPATCHER

Definition at line 51 of file dsmthdat.c.

Function Documentation

◆ AcpiDsMethodDataDeleteAll()

void AcpiDsMethodDataDeleteAll ( ACPI_WALK_STATE WalkState)

Definition at line 153 of file dsmthdat.c.

155 {
156  UINT32 Index;
157 
158 
159  ACPI_FUNCTION_TRACE (DsMethodDataDeleteAll);
160 
161 
162  /* Detach the locals */
163 
164  for (Index = 0; Index < ACPI_METHOD_NUM_LOCALS; Index++)
165  {
166  if (WalkState->LocalVariables[Index].Object)
167  {
168  ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Local%u=%p\n",
169  Index, WalkState->LocalVariables[Index].Object));
170 
171  /* Detach object (if present) and remove a reference */
172 
173  AcpiNsDetachObject (&WalkState->LocalVariables[Index]);
174  }
175  }
176 
177  /* Detach the arguments */
178 
179  for (Index = 0; Index < ACPI_METHOD_NUM_ARGS; Index++)
180  {
181  if (WalkState->Arguments[Index].Object)
182  {
183  ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Arg%u=%p\n",
184  Index, WalkState->Arguments[Index].Object));
185 
186  /* Detach object (if present) and remove a reference */
187 
188  AcpiNsDetachObject (&WalkState->Arguments[Index]);
189  }
190  }
191 
192  return_VOID;
193 }
#define ACPI_METHOD_NUM_LOCALS
Definition: acconfig.h:163
unsigned int UINT32
void AcpiNsDetachObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:220
struct acpi_namespace_node Arguments[ACPI_METHOD_NUM_ARGS]
Definition: acstruct.h:103
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
static const UCHAR Index[8]
Definition: usbohci.c:18
#define return_VOID
Definition: acoutput.h:495
#define ACPI_DB_EXEC
Definition: acoutput.h:165
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
struct acpi_namespace_node LocalVariables[ACPI_METHOD_NUM_LOCALS]
Definition: acstruct.h:104
#define ACPI_METHOD_NUM_ARGS
Definition: acconfig.h:166

Referenced by AcpiDsTerminateControlMethod().

◆ AcpiDsMethodDataDeleteValue()

static void AcpiDsMethodDataDeleteValue ( UINT8  Type,
UINT32  Index,
ACPI_WALK_STATE WalkState 
)
static

Definition at line 519 of file dsmthdat.c.

523 {
527 
528 
529  ACPI_FUNCTION_TRACE (DsMethodDataDeleteValue);
530 
531 
532  /* Get the namespace node for the arg/local */
533 
534  Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
535  if (ACPI_FAILURE (Status))
536  {
537  return_VOID;
538  }
539 
540  /* Get the associated object */
541 
543 
544  /*
545  * Undefine the Arg or Local by setting its descriptor
546  * pointer to NULL. Locals/Args can contain both
547  * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs
548  */
549  Node->Object = NULL;
550 
551  if ((Object) &&
553  {
554  /*
555  * There is a valid object.
556  * Decrement the reference count by one to balance the
557  * increment when the object was stored.
558  */
560  }
561 
562  return_VOID;
563 }
ACPI_STATUS AcpiDsMethodDataGetNode(UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState, ACPI_NAMESPACE_NODE **Node)
Definition: dsmthdat.c:275
Type
Definition: Type.h:6
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
union node Node
Definition: types.h:1255
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_DESC_TYPE_OPERAND
Definition: acobject.h:574
static const UCHAR Index[8]
Definition: usbohci.c:18
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
static IUnknown Object
Definition: main.c:512
#define return_VOID
Definition: acoutput.h:495
Status
Definition: gdiplustypes.h:24
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:785
Definition: dlist.c:348
#define ACPI_GET_DESCRIPTOR_TYPE(d)
Definition: acmacros.h:414

Referenced by AcpiDsStoreObjectToLocal().

◆ AcpiDsMethodDataGetNode()

ACPI_STATUS AcpiDsMethodDataGetNode ( UINT8  Type,
UINT32  Index,
ACPI_WALK_STATE WalkState,
ACPI_NAMESPACE_NODE **  Node 
)

Definition at line 275 of file dsmthdat.c.

280 {
281  ACPI_FUNCTION_TRACE (DsMethodDataGetNode);
282 
283 
284  /*
285  * Method Locals and Arguments are supported
286  */
287  switch (Type)
288  {
289  case ACPI_REFCLASS_LOCAL:
290 
292  {
294  "Local index %u is invalid (max %u)",
297  }
298 
299  /* Return a pointer to the pseudo-node */
300 
301  *Node = &WalkState->LocalVariables[Index];
302  break;
303 
304  case ACPI_REFCLASS_ARG:
305 
307  {
309  "Arg index %u is invalid (max %u)",
312  }
313 
314  /* Return a pointer to the pseudo-node */
315 
316  *Node = &WalkState->Arguments[Index];
317  break;
318 
319  default:
320 
321  ACPI_ERROR ((AE_INFO, "Type %u is invalid", Type));
323  }
324 
326 }
Type
Definition: Type.h:6
#define ACPI_METHOD_MAX_ARG
Definition: acconfig.h:167
#define ACPI_METHOD_MAX_LOCAL
Definition: acconfig.h:164
#define AE_INFO
Definition: acoutput.h:230
struct acpi_namespace_node Arguments[ACPI_METHOD_NUM_ARGS]
Definition: acstruct.h:103
static const UCHAR Index[8]
Definition: usbohci.c:18
#define AE_AML_INVALID_INDEX
Definition: acexcep.h:203
#define AE_TYPE
Definition: acexcep.h:116
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
struct acpi_namespace_node LocalVariables[ACPI_METHOD_NUM_LOCALS]
Definition: acstruct.h:104
#define AE_OK
Definition: acexcep.h:97
Definition: dlist.c:348

Referenced by AcpiDsInitObjectFromOp(), AcpiDsMethodDataDeleteValue(), AcpiDsMethodDataGetValue(), AcpiDsMethodDataSetValue(), AcpiDsStoreObjectToLocal(), and AcpiExResolveMultiple().

◆ AcpiDsMethodDataGetValue()

ACPI_STATUS AcpiDsMethodDataGetValue ( UINT8  Type,
UINT32  Index,
ACPI_WALK_STATE WalkState,
ACPI_OPERAND_OBJECT **  DestDesc 
)

Definition at line 406 of file dsmthdat.c.

411 {
415 
416 
417  ACPI_FUNCTION_TRACE (DsMethodDataGetValue);
418 
419 
420  /* Validate the object descriptor */
421 
422  if (!DestDesc)
423  {
424  ACPI_ERROR ((AE_INFO, "Null object descriptor pointer"));
426  }
427 
428  /* Get the namespace node for the arg/local */
429 
430  Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
431  if (ACPI_FAILURE (Status))
432  {
434  }
435 
436  /* Get the object from the node */
437 
438  Object = Node->Object;
439 
440  /* Examine the returned object, it must be valid. */
441 
442  if (!Object)
443  {
444  /*
445  * Index points to uninitialized object.
446  * This means that either 1) The expected argument was
447  * not passed to the method, or 2) A local variable
448  * was referenced by the method (via the ASL)
449  * before it was initialized. Either case is an error.
450  */
451 
452  /* If slack enabled, init the LocalX/ArgX to an Integer of value zero */
453 
454  if (AcpiGbl_EnableInterpreterSlack)
455  {
457  if (!Object)
458  {
460  }
461 
462  Node->Object = Object;
463  }
464 
465  /* Otherwise, return the error */
466 
467  else switch (Type)
468  {
469  case ACPI_REFCLASS_ARG:
470 
472  "Uninitialized Arg[%u] at node %p",
473  Index, Node));
474 
476 
477  case ACPI_REFCLASS_LOCAL:
478  /*
479  * No error message for this case, will be trapped again later to
480  * detect and ignore cases of Store(LocalX,LocalX)
481  */
483 
484  default:
485 
486  ACPI_ERROR ((AE_INFO, "Not a Arg/Local opcode: 0x%X", Type));
488  }
489  }
490 
491  /*
492  * The Index points to an initialized and valid object.
493  * Return an additional reference to the object
494  */
495  *DestDesc = Object;
497 
499 }
ACPI_STATUS AcpiDsMethodDataGetNode(UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState, ACPI_NAMESPACE_NODE **Node)
Definition: dsmthdat.c:275
void AcpiUtAddReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:747
Type
Definition: Type.h:6
#define AE_NO_MEMORY
Definition: acexcep.h:112
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
#define AE_AML_INTERNAL
Definition: acexcep.h:194
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
#define AE_AML_UNINITIALIZED_LOCAL
Definition: acexcep.h:184
union node Node
Definition: types.h:1255
#define AE_INFO
Definition: acoutput.h:230
ACPI_OPERAND_OBJECT * AcpiUtCreateIntegerObject(UINT64 Value)
Definition: utobject.c:223
static const UCHAR Index[8]
Definition: usbohci.c:18
#define AE_AML_UNINITIALIZED_ARG
Definition: acexcep.h:185
static IUnknown Object
Definition: main.c:512
Status
Definition: gdiplustypes.h:24
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
unsigned long long UINT64
#define AE_OK
Definition: acexcep.h:97
Definition: dlist.c:348

Referenced by AcpiExOpcode_1A_0T_1R(), AcpiExResolveMultiple(), and AcpiExResolveObjectToValue().

◆ AcpiDsMethodDataInit()

void AcpiDsMethodDataInit ( ACPI_WALK_STATE WalkState)

Definition at line 100 of file dsmthdat.c.

102 {
103  UINT32 i;
104 
105 
106  ACPI_FUNCTION_TRACE (DsMethodDataInit);
107 
108 
109  /* Init the method arguments */
110 
111  for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
112  {
113  ACPI_MOVE_32_TO_32 (&WalkState->Arguments[i].Name,
115 
116  WalkState->Arguments[i].Name.Integer |= (i << 24);
117  WalkState->Arguments[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
118  WalkState->Arguments[i].Type = ACPI_TYPE_ANY;
119  WalkState->Arguments[i].Flags = ANOBJ_METHOD_ARG;
120  }
121 
122  /* Init the method locals */
123 
124  for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
125  {
126  ACPI_MOVE_32_TO_32 (&WalkState->LocalVariables[i].Name,
128 
129  WalkState->LocalVariables[i].Name.Integer |= (i << 24);
130  WalkState->LocalVariables[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
131  WalkState->LocalVariables[i].Type = ACPI_TYPE_ANY;
132  WalkState->LocalVariables[i].Flags = ANOBJ_METHOD_LOCAL;
133  }
134 
135  return_VOID;
136 }
#define NAMEOF_LOCAL_NTE
Definition: acdispat.h:48
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ACPI_METHOD_NUM_LOCALS
Definition: acconfig.h:163
unsigned int UINT32
#define NAMEOF_ARG_NTE
Definition: acdispat.h:49
#define ANOBJ_METHOD_ARG
Definition: aclocal.h:217
struct acpi_namespace_node Arguments[ACPI_METHOD_NUM_ARGS]
Definition: acstruct.h:103
#define return_VOID
Definition: acoutput.h:495
#define ACPI_TYPE_ANY
Definition: actypes.h:679
#define ACPI_MOVE_32_TO_32(d, s)
Definition: acmacros.h:148
#define ANOBJ_METHOD_LOCAL
Definition: aclocal.h:218
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
struct acpi_namespace_node LocalVariables[ACPI_METHOD_NUM_LOCALS]
Definition: acstruct.h:104
#define ACPI_DESC_TYPE_NAMED
Definition: acobject.h:575
#define ACPI_METHOD_NUM_ARGS
Definition: acconfig.h:166

Referenced by AcpiDsCreateWalkState().

◆ AcpiDsMethodDataInitArgs()

ACPI_STATUS AcpiDsMethodDataInitArgs ( ACPI_OPERAND_OBJECT **  Params,
UINT32  MaxParamCount,
ACPI_WALK_STATE WalkState 
)

Definition at line 213 of file dsmthdat.c.

217 {
219  UINT32 Index = 0;
220 
221 
222  ACPI_FUNCTION_TRACE_PTR (DsMethodDataInitArgs, Params);
223 
224 
225  if (!Params)
226  {
228  "No parameter list passed to method\n"));
230  }
231 
232  /* Copy passed parameters into the new method stack frame */
233 
234  while ((Index < ACPI_METHOD_NUM_ARGS) &&
235  (Index < MaxParamCount) &&
236  Params[Index])
237  {
238  /*
239  * A valid parameter.
240  * Store the argument in the method/walk descriptor.
241  * Do not copy the arg in order to implement call by reference
242  */
244  ACPI_REFCLASS_ARG, Index, Params[Index], WalkState);
245  if (ACPI_FAILURE (Status))
246  {
248  }
249 
250  Index++;
251  }
252 
253  ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%u args passed to method\n", Index));
255 }
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
unsigned int UINT32
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
static ACPI_STATUS AcpiDsMethodDataSetValue(UINT8 Type, UINT32 Index, ACPI_OPERAND_OBJECT *Object, ACPI_WALK_STATE *WalkState)
Definition: dsmthdat.c:347
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
static const UCHAR Index[8]
Definition: usbohci.c:18
Status
Definition: gdiplustypes.h:24
#define ACPI_DB_EXEC
Definition: acoutput.h:165
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_METHOD_NUM_ARGS
Definition: acconfig.h:166
#define AE_OK
Definition: acexcep.h:97

Referenced by AcpiDsInitAmlWalk().

◆ AcpiDsMethodDataSetValue()

static ACPI_STATUS AcpiDsMethodDataSetValue ( UINT8  Type,
UINT32  Index,
ACPI_OPERAND_OBJECT Object,
ACPI_WALK_STATE WalkState 
)
static

Definition at line 347 of file dsmthdat.c.

352 {
355 
356 
357  ACPI_FUNCTION_TRACE (DsMethodDataSetValue);
358 
359 
361  "NewObj %p Type %2.2X, Refs=%u [%s]\n", Object,
362  Type, Object->Common.ReferenceCount,
363  AcpiUtGetTypeName (Object->Common.Type)));
364 
365  /* Get the namespace node for the arg/local */
366 
367  Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
368  if (ACPI_FAILURE (Status))
369  {
371  }
372 
373  /*
374  * Increment ref count so object can't be deleted while installed.
375  * NOTE: We do not copy the object in order to preserve the call by
376  * reference semantics of ACPI Control Method invocation.
377  * (See ACPI Specification 2.0C)
378  */
380 
381  /* Install the object */
382 
383  Node->Object = Object;
385 }
ACPI_STATUS AcpiDsMethodDataGetNode(UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState, ACPI_NAMESPACE_NODE **Node)
Definition: dsmthdat.c:275
void AcpiUtAddReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:747
Type
Definition: Type.h:6
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
union node Node
Definition: types.h:1255
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
static const UCHAR Index[8]
Definition: usbohci.c:18
static IUnknown Object
Definition: main.c:512
Status
Definition: gdiplustypes.h:24
#define ACPI_DB_EXEC
Definition: acoutput.h:165
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
const char * AcpiUtGetTypeName(ACPI_OBJECT_TYPE Type)
Definition: utdecode.c:250
Definition: dlist.c:348

Referenced by AcpiDsMethodDataInitArgs(), and AcpiDsStoreObjectToLocal().

◆ AcpiDsStoreObjectToLocal()

ACPI_STATUS AcpiDsStoreObjectToLocal ( UINT8  Type,
UINT32  Index,
ACPI_OPERAND_OBJECT ObjDesc,
ACPI_WALK_STATE WalkState 
)

Definition at line 585 of file dsmthdat.c.

590 {
593  ACPI_OPERAND_OBJECT *CurrentObjDesc;
594  ACPI_OPERAND_OBJECT *NewObjDesc;
595 
596 
597  ACPI_FUNCTION_TRACE (DsStoreObjectToLocal);
598  ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Type=%2.2X Index=%u Obj=%p\n",
599  Type, Index, ObjDesc));
600 
601  /* Parameter validation */
602 
603  if (!ObjDesc)
604  {
606  }
607 
608  /* Get the namespace node for the arg/local */
609 
610  Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
611  if (ACPI_FAILURE (Status))
612  {
614  }
615 
616  CurrentObjDesc = AcpiNsGetAttachedObject (Node);
617  if (CurrentObjDesc == ObjDesc)
618  {
619  ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n",
620  ObjDesc));
622  }
623 
624  /*
625  * If the reference count on the object is more than one, we must
626  * take a copy of the object before we store. A reference count
627  * of exactly 1 means that the object was just created during the
628  * evaluation of an expression, and we can safely use it since it
629  * is not used anywhere else.
630  */
631  NewObjDesc = ObjDesc;
632  if (ObjDesc->Common.ReferenceCount > 1)
633  {
635  ObjDesc, &NewObjDesc, WalkState);
636  if (ACPI_FAILURE (Status))
637  {
639  }
640  }
641 
642  /*
643  * If there is an object already in this slot, we either
644  * have to delete it, or if this is an argument and there
645  * is an object reference stored there, we have to do
646  * an indirect store!
647  */
648  if (CurrentObjDesc)
649  {
650  /*
651  * Check for an indirect store if an argument
652  * contains an object reference (stored as an Node).
653  * We don't allow this automatic dereferencing for
654  * locals, since a store to a local should overwrite
655  * anything there, including an object reference.
656  *
657  * If both Arg0 and Local0 contain RefOf (Local4):
658  *
659  * Store (1, Arg0) - Causes indirect store to local4
660  * Store (1, Local0) - Stores 1 in local0, overwriting
661  * the reference to local4
662  * Store (1, DeRefof (Local0)) - Causes indirect store to local4
663  *
664  * Weird, but true.
665  */
666  if (Type == ACPI_REFCLASS_ARG)
667  {
668  /*
669  * If we have a valid reference object that came from RefOf(),
670  * do the indirect store
671  */
672  if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) ==
674  (CurrentObjDesc->Common.Type ==
676  (CurrentObjDesc->Reference.Class ==
678  {
680  "Arg (%p) is an ObjRef(Node), storing in node %p\n",
681  NewObjDesc, CurrentObjDesc));
682 
683  /*
684  * Store this object to the Node (perform the indirect store)
685  * NOTE: No implicit conversion is performed, as per the ACPI
686  * specification rules on storing to Locals/Args.
687  */
688  Status = AcpiExStoreObjectToNode (NewObjDesc,
689  CurrentObjDesc->Reference.Object, WalkState,
691 
692  /* Remove local reference if we copied the object above */
693 
694  if (NewObjDesc != ObjDesc)
695  {
696  AcpiUtRemoveReference (NewObjDesc);
697  }
698 
700  }
701  }
702 
703  /* Delete the existing object before storing the new one */
704 
705  AcpiDsMethodDataDeleteValue (Type, Index, WalkState);
706  }
707 
708  /*
709  * Install the Obj descriptor (*NewObjDesc) into
710  * the descriptor for the Arg or Local.
711  * (increments the object reference count by one)
712  */
713  Status = AcpiDsMethodDataSetValue (Type, Index, NewObjDesc, WalkState);
714 
715  /* Remove local reference if we copied the object above */
716 
717  if (NewObjDesc != ObjDesc)
718  {
719  AcpiUtRemoveReference (NewObjDesc);
720  }
721 
723 }
ACPI_STATUS AcpiDsMethodDataGetNode(UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState, ACPI_NAMESPACE_NODE **Node)
Definition: dsmthdat.c:275
Type
Definition: Type.h:6
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
static void AcpiDsMethodDataDeleteValue(UINT8 Type, UINT32 Index, ACPI_WALK_STATE *WalkState)
Definition: dsmthdat.c:519
#define ACPI_TYPE_LOCAL_REFERENCE
Definition: actypes.h:711
#define ACPI_NO_IMPLICIT_CONVERSION
Definition: acutils.h:145
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_OBJECT_COMMON_HEADER UINT8 Class
Definition: acobject.h:441
union node Node
Definition: types.h:1255
ACPI_OBJECT_REFERENCE Reference
Definition: acobject.h:538
#define ACPI_DESC_TYPE_OPERAND
Definition: acobject.h:574
static ACPI_STATUS AcpiDsMethodDataSetValue(UINT8 Type, UINT32 Index, ACPI_OPERAND_OBJECT *Object, ACPI_WALK_STATE *WalkState)
Definition: dsmthdat.c:347
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
static const UCHAR Index[8]
Definition: usbohci.c:18
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
Status
Definition: gdiplustypes.h:24
#define ACPI_DB_EXEC
Definition: acoutput.h:165
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
ACPI_OBJECT_COMMON Common
Definition: acobject.h:517
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:785
ACPI_STATUS AcpiUtCopyIobjectToIobject(ACPI_OPERAND_OBJECT *SourceDesc, ACPI_OPERAND_OBJECT **DestDesc, ACPI_WALK_STATE *WalkState)
Definition: utcopy.c:1037
ACPI_STATUS AcpiExStoreObjectToNode(ACPI_OPERAND_OBJECT *SourceDesc, ACPI_NAMESPACE_NODE *Node, ACPI_WALK_STATE *WalkState, UINT8 ImplicitConversion)
Definition: exstore.c:412
Definition: dlist.c:348
#define ACPI_GET_DESCRIPTOR_TYPE(d)
Definition: acmacros.h:414

Referenced by AcpiExStore().