ReactOS  0.4.14-dev-114-gc8cbd56
dsutils.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "acparser.h"
#include "amlcode.h"
#include "acdispat.h"
#include "acinterp.h"
#include "acnamesp.h"
#include "acdebug.h"
Include dependency graph for dsutils.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_DISPATCHER
 

Functions

void AcpiDsClearImplicitReturn (ACPI_WALK_STATE *WalkState)
 
BOOLEAN AcpiDsDoImplicitReturn (ACPI_OPERAND_OBJECT *ReturnDesc, ACPI_WALK_STATE *WalkState, BOOLEAN AddReference)
 
BOOLEAN AcpiDsIsResultUsed (ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
 
void AcpiDsDeleteResultIfNotUsed (ACPI_PARSE_OBJECT *Op, ACPI_OPERAND_OBJECT *ResultObj, ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsResolveOperands (ACPI_WALK_STATE *WalkState)
 
void AcpiDsClearOperands (ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsCreateOperand (ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg, UINT32 ArgIndex)
 
ACPI_STATUS AcpiDsCreateOperands (ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *FirstArg)
 
ACPI_STATUS AcpiDsEvaluateNamePath (ACPI_WALK_STATE *WalkState)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_DISPATCHER

Definition at line 53 of file dsutils.c.

Function Documentation

◆ AcpiDsClearImplicitReturn()

void AcpiDsClearImplicitReturn ( ACPI_WALK_STATE WalkState)

Definition at line 73 of file dsutils.c.

75 {
76  ACPI_FUNCTION_NAME (DsClearImplicitReturn);
77 
78 
79  /*
80  * Slack must be enabled for this feature
81  */
82  if (!AcpiGbl_EnableInterpreterSlack)
83  {
84  return;
85  }
86 
87  if (WalkState->ImplicitReturnObj)
88  {
89  /*
90  * Delete any "stale" implicit return. However, in
91  * complex statements, the implicit return value can be
92  * bubbled up several levels.
93  */
95  "Removing reference on stale implicit return obj %p\n",
96  WalkState->ImplicitReturnObj));
97 
99  WalkState->ImplicitReturnObj = NULL;
100  }
101 }
union acpi_operand_object * ImplicitReturnObj
Definition: acstruct.h:112
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_DB_DISPATCH
Definition: acoutput.h:163
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:784
#define ACPI_FUNCTION_NAME(a)
Definition: acoutput.h:479

Referenced by AcpiDsDoImplicitReturn(), AcpiDsExecEndControlOp(), AcpiDsMethodError(), and AcpiPsParseAml().

◆ AcpiDsClearOperands()

void AcpiDsClearOperands ( ACPI_WALK_STATE WalkState)

Definition at line 453 of file dsutils.c.

455 {
456  UINT32 i;
457 
458 
459  ACPI_FUNCTION_TRACE_PTR (DsClearOperands, WalkState);
460 
461 
462  /* Remove a reference on each operand on the stack */
463 
464  for (i = 0; i < WalkState->NumOperands; i++)
465  {
466  /*
467  * Remove a reference to all operands, including both
468  * "Arguments" and "Targets".
469  */
470  AcpiUtRemoveReference (WalkState->Operands[i]);
471  WalkState->Operands[i] = NULL;
472  }
473 
474  WalkState->NumOperands = 0;
475  return_VOID;
476 }
UINT8 NumOperands
Definition: acstruct.h:80
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
unsigned int UINT32
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define return_VOID
Definition: acoutput.h:495
union acpi_operand_object * Operands[ACPI_OBJ_NUM_OPERANDS+1]
Definition: acstruct.h:105
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:784

Referenced by AcpiDsExecEndOp().

◆ AcpiDsCreateOperand()

ACPI_STATUS AcpiDsCreateOperand ( ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT Arg,
UINT32  ArgIndex 
)

Definition at line 497 of file dsutils.c.

501 {
503  char *NameString;
504  UINT32 NameLength;
505  ACPI_OPERAND_OBJECT *ObjDesc;
506  ACPI_PARSE_OBJECT *ParentOp;
507  UINT16 Opcode;
508  ACPI_INTERPRETER_MODE InterpreterMode;
509  const ACPI_OPCODE_INFO *OpInfo;
510 
511 
512  ACPI_FUNCTION_TRACE_PTR (DsCreateOperand, Arg);
513 
514 
515  /* A valid name must be looked up in the namespace */
516 
517  if ((Arg->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
518  (Arg->Common.Value.String) &&
519  !(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
520  {
521  ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Getting a name: Arg=%p\n", Arg));
522 
523  /* Get the entire name string from the AML stream */
524 
526  Arg->Common.Value.Buffer, &NameString, &NameLength);
527 
528  if (ACPI_FAILURE (Status))
529  {
531  }
532 
533  /* All prefixes have been handled, and the name is in NameString */
534 
535  /*
536  * Special handling for BufferField declarations. This is a deferred
537  * opcode that unfortunately defines the field name as the last
538  * parameter instead of the first. We get here when we are performing
539  * the deferred execution, so the actual name of the field is already
540  * in the namespace. We don't want to attempt to look it up again
541  * because we may be executing in a different scope than where the
542  * actual opcode exists.
543  */
544  if ((WalkState->DeferredNode) &&
545  (WalkState->DeferredNode->Type == ACPI_TYPE_BUFFER_FIELD) &&
546  (ArgIndex == (UINT32)
547  ((WalkState->Opcode == AML_CREATE_FIELD_OP) ? 3 : 2)))
548  {
549  ObjDesc = ACPI_CAST_PTR (
550  ACPI_OPERAND_OBJECT, WalkState->DeferredNode);
551  Status = AE_OK;
552  }
553  else /* All other opcodes */
554  {
555  /*
556  * Differentiate between a namespace "create" operation
557  * versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
558  * IMODE_EXECUTE) in order to support the creation of
559  * namespace objects during the execution of control methods.
560  */
561  ParentOp = Arg->Common.Parent;
562  OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
563 
564  if ((OpInfo->Flags & AML_NSNODE) &&
565  (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
566  (ParentOp->Common.AmlOpcode != AML_REGION_OP) &&
567  (ParentOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
568  {
569  /* Enter name into namespace if not found */
570 
571  InterpreterMode = ACPI_IMODE_LOAD_PASS2;
572  }
573  else
574  {
575  /* Return a failure if name not found */
576 
577  InterpreterMode = ACPI_IMODE_EXECUTE;
578  }
579 
580  Status = AcpiNsLookup (WalkState->ScopeInfo, NameString,
581  ACPI_TYPE_ANY, InterpreterMode,
584  /*
585  * The only case where we pass through (ignore) a NOT_FOUND
586  * error is for the CondRefOf opcode.
587  */
588  if (Status == AE_NOT_FOUND)
589  {
590  if (ParentOp->Common.AmlOpcode == AML_CONDITIONAL_REF_OF_OP)
591  {
592  /*
593  * For the Conditional Reference op, it's OK if
594  * the name is not found; We just need a way to
595  * indicate this to the interpreter, set the
596  * object to the root
597  */
598  ObjDesc = ACPI_CAST_PTR (
599  ACPI_OPERAND_OBJECT, AcpiGbl_RootNode);
600  Status = AE_OK;
601  }
602  else if (ParentOp->Common.AmlOpcode == AML_EXTERNAL_OP)
603  {
604  /*
605  * This opcode should never appear here. It is used only
606  * by AML disassemblers and is surrounded by an If(0)
607  * by the ASL compiler.
608  *
609  * Therefore, if we see it here, it is a serious error.
610  */
612  }
613  else
614  {
615  /*
616  * We just plain didn't find it -- which is a
617  * very serious error at this point
618  */
620  }
621  }
622 
623  if (ACPI_FAILURE (Status))
624  {
625  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
626  NameString, Status);
627  }
628  }
629 
630  /* Free the namestring created above */
631 
632  ACPI_FREE (NameString);
633 
634  /* Check status from the lookup */
635 
636  if (ACPI_FAILURE (Status))
637  {
639  }
640 
641  /* Put the resulting object onto the current object stack */
642 
643  Status = AcpiDsObjStackPush (ObjDesc, WalkState);
644  if (ACPI_FAILURE (Status))
645  {
647  }
648 
649  AcpiDbDisplayArgumentObject (ObjDesc, WalkState);
650  }
651  else
652  {
653  /* Check for null name case */
654 
655  if ((Arg->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
656  !(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
657  {
658  /*
659  * If the name is null, this means that this is an
660  * optional result parameter that was not specified
661  * in the original ASL. Create a Zero Constant for a
662  * placeholder. (Store to a constant is a Noop.)
663  */
664  Opcode = AML_ZERO_OP; /* Has no arguments! */
665 
667  "Null namepath: Arg=%p\n", Arg));
668  }
669  else
670  {
671  Opcode = Arg->Common.AmlOpcode;
672  }
673 
674  /* Get the object type of the argument */
675 
676  OpInfo = AcpiPsGetOpcodeInfo (Opcode);
677  if (OpInfo->ObjectType == ACPI_TYPE_INVALID)
678  {
680  }
681 
682  if ((OpInfo->Flags & AML_HAS_RETVAL) ||
683  (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
684  {
685  /*
686  * Use value that was already previously returned
687  * by the evaluation of this argument
688  */
689  Status = AcpiDsResultPop (&ObjDesc, WalkState);
690  if (ACPI_FAILURE (Status))
691  {
692  /*
693  * Only error is underflow, and this indicates
694  * a missing or null operand!
695  */
697  "Missing or null operand"));
699  }
700  }
701  else
702  {
703  /* Create an ACPI_INTERNAL_OBJECT for the argument */
704 
705  ObjDesc = AcpiUtCreateInternalObject (OpInfo->ObjectType);
706  if (!ObjDesc)
707  {
709  }
710 
711  /* Initialize the new object */
712 
714  WalkState, Arg, Opcode, &ObjDesc);
715  if (ACPI_FAILURE (Status))
716  {
717  AcpiUtDeleteObjectDesc (ObjDesc);
719  }
720  }
721 
722  /* Put the operand object on the object stack */
723 
724  Status = AcpiDsObjStackPush (ObjDesc, WalkState);
725  if (ACPI_FAILURE (Status))
726  {
728  }
729 
730  AcpiDbDisplayArgumentObject (ObjDesc, WalkState);
731  }
732 
734 }
#define ACPI_EXCEPTION(plist)
Definition: acoutput.h:239
#define ACPI_NS_SEARCH_PARENT
Definition: acnamesp.h:63
#define ACPI_FREE(a)
Definition: actypes.h:386
ACPI_INTERPRETER_MODE
Definition: aclocal.h:165
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
_In_ PVOID _In_ ULONG Opcode
Definition: hubbusif.h:330
ACPI_STATUS AcpiNsLookup(ACPI_GENERIC_STATE *ScopeInfo, char *Name, ACPI_OBJECT_TYPE Type, ACPI_INTERPRETER_MODE InterpreterMode, UINT32 Flags, ACPI_WALK_STATE *WalkState, ACPI_NAMESPACE_NODE **RetNode)
Definition: nsaccess.c:329
#define AE_NO_MEMORY
Definition: acexcep.h:112
ACPI_STATUS AcpiDsObjStackPush(void *Object, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:342
#define AML_INT_METHODCALL_OP
Definition: amlcode.h:210
UINT8 ObjectType
Definition: aclocal.h:874
ACPI_STATUS AcpiExGetNameString(ACPI_OBJECT_TYPE DataType, UINT8 *InAmlAddress, char **OutNameString, UINT32 *OutNameLength)
Definition: exnames.c:278
struct acpi_namespace_node * DeferredNode
Definition: acstruct.h:111
void AcpiUtDeleteObjectDesc(ACPI_OPERAND_OBJECT *Object)
Definition: utobject.c:473
const ACPI_OPCODE_INFO * AcpiPsGetOpcodeInfo(UINT16 Opcode)
Definition: psopinfo.c:72
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define AML_EXTERNAL_OP
Definition: amlcode.h:65
#define AML_REGION_OP
Definition: amlcode.h:180
#define AE_NOT_IMPLEMENTED
Definition: acexcep.h:122
#define AML_INT_NAMEPATH_OP
Definition: amlcode.h:205
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
#define AML_HAS_RETVAL
Definition: amlcode.h:327
unsigned int UINT32
#define ACPI_NS_DONT_OPEN_SCOPE
Definition: acnamesp.h:64
#define AML_NSNODE
Definition: amlcode.h:324
#define AML_CREATE_FIELD_OP
Definition: amlcode.h:163
#define AE_INFO
Definition: acoutput.h:230
#define AE_AML_BAD_OPCODE
Definition: acexcep.h:180
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define ACPI_DB_DISPATCH
Definition: acoutput.h:163
#define ACPI_PARSEOP_IN_STACK
Definition: aclocal.h:1121
#define ACPI_TYPE_INVALID
Definition: actypes.h:733
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define AE_AML_NAME_NOT_FOUND
Definition: acexcep.h:193
#define AE_NOT_FOUND
Definition: acexcep.h:113
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
#define ACPI_TYPE_ANY
Definition: actypes.h:678
#define AML_CONDITIONAL_REF_OF_OP
Definition: amlcode.h:162
Status
Definition: gdiplustypes.h:24
ACPI_STATUS AcpiDsInitObjectFromOp(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, UINT16 Opcode, ACPI_OPERAND_OBJECT **RetObjDesc)
Definition: dsobject.c:373
#define ACPI_CAST_INDIRECT_PTR(t, p)
Definition: actypes.h:545
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_TYPE_BUFFER_FIELD
Definition: actypes.h:692
unsigned short UINT16
ACPI_STATUS AcpiDsResultPop(ACPI_OPERAND_OBJECT **Object, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:78
UINT16 Opcode
Definition: acstruct.h:78
#define AcpiUtCreateInternalObject(t)
Definition: acutils.h:654
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
#define ACPI_ERROR_NAMESPACE(s, p, e)
Definition: acmacros.h:462
#define AE_OK
Definition: acexcep.h:97
UINT16 Flags
Definition: aclocal.h:873
#define AML_ZERO_OP
Definition: amlcode.h:51

Referenced by AcpiDsCreateOperands(), AcpiDsEvalBankFieldOperands(), AcpiDsEvalDataObjectOperands(), AcpiDsEvaluateNamePath(), and AcpiDsGetPredicateValue().

◆ AcpiDsCreateOperands()

ACPI_STATUS AcpiDsCreateOperands ( ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT FirstArg 
)

Definition at line 753 of file dsutils.c.

756 {
758  ACPI_PARSE_OBJECT *Arg;
760  UINT32 ArgCount = 0;
761  UINT32 Index = WalkState->NumOperands;
762  UINT32 i;
763 
764 
765  ACPI_FUNCTION_TRACE_PTR (DsCreateOperands, FirstArg);
766 
767 
768  /* Get all arguments in the list */
769 
770  Arg = FirstArg;
771  while (Arg)
772  {
774  {
776  }
777 
778  Arguments[Index] = Arg;
779  WalkState->Operands [Index] = NULL;
780 
781  /* Move on to next argument, if any */
782 
783  Arg = Arg->Common.Next;
784  ArgCount++;
785  Index++;
786  }
787 
789  "NumOperands %d, ArgCount %d, Index %d\n",
790  WalkState->NumOperands, ArgCount, Index));
791 
792  /* Create the interpreter arguments, in reverse order */
793 
794  Index--;
795  for (i = 0; i < ArgCount; i++)
796  {
797  Arg = Arguments[Index];
798  WalkState->OperandIndex = (UINT8) Index;
799 
800  Status = AcpiDsCreateOperand (WalkState, Arg, Index);
801  if (ACPI_FAILURE (Status))
802  {
803  goto Cleanup;
804  }
805 
807  "Created Arg #%u (%p) %u args total\n",
808  Index, Arg, ArgCount));
809  Index--;
810  }
811 
813 
814 
815 Cleanup:
816  /*
817  * We must undo everything done above; meaning that we must
818  * pop everything off of the operand stack and delete those
819  * objects
820  */
821  AcpiDsObjStackPopAndDelete (ArgCount, WalkState);
822 
823  ACPI_EXCEPTION ((AE_INFO, Status, "While creating Arg %u", Index));
825 }
#define ACPI_EXCEPTION(plist)
Definition: acoutput.h:239
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
UINT8 OperandIndex
Definition: acstruct.h:81
UINT8 NumOperands
Definition: acstruct.h:80
UINT32 ACPI_STATUS
Definition: actypes.h:460
ACPI_STATUS AcpiDsCreateOperand(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg, UINT32 ArgIndex)
Definition: dsutils.c:497
void AcpiDsObjStackPopAndDelete(UINT32 PopCount, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:441
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
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_OBJ_NUM_OPERANDS
Definition: acconfig.h:172
unsigned int UINT32
#define AE_INFO
Definition: acoutput.h:230
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define ACPI_DB_DISPATCH
Definition: acoutput.h:163
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
static const UCHAR Index[8]
Definition: usbohci.c:18
static const WCHAR Cleanup[]
Definition: register.c:80
Status
Definition: gdiplustypes.h:24
#define AE_BAD_DATA
Definition: acexcep.h:154
union acpi_operand_object * Operands[ACPI_OBJ_NUM_OPERANDS+1]
Definition: acstruct.h:105
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
unsigned char UINT8
#define AE_OK
Definition: acexcep.h:97

Referenced by AcpiDsEvalBufferFieldOperands(), AcpiDsEvalRegionOperands(), AcpiDsEvalTableRegionOperands(), AcpiDsExecEndControlOp(), AcpiDsExecEndOp(), AcpiDsLoad1EndOp(), and AcpiDsLoad2EndOp().

◆ AcpiDsDeleteResultIfNotUsed()

void AcpiDsDeleteResultIfNotUsed ( ACPI_PARSE_OBJECT Op,
ACPI_OPERAND_OBJECT ResultObj,
ACPI_WALK_STATE WalkState 
)

Definition at line 359 of file dsutils.c.

363 {
364  ACPI_OPERAND_OBJECT *ObjDesc;
366 
367 
368  ACPI_FUNCTION_TRACE_PTR (DsDeleteResultIfNotUsed, ResultObj);
369 
370 
371  if (!Op)
372  {
373  ACPI_ERROR ((AE_INFO, "Null Op"));
374  return_VOID;
375  }
376 
377  if (!ResultObj)
378  {
379  return_VOID;
380  }
381 
382  if (!AcpiDsIsResultUsed (Op, WalkState))
383  {
384  /* Must pop the result stack (ObjDesc should be equal to ResultObj) */
385 
386  Status = AcpiDsResultPop (&ObjDesc, WalkState);
387  if (ACPI_SUCCESS (Status))
388  {
389  AcpiUtRemoveReference (ResultObj);
390  }
391  }
392 
393  return_VOID;
394 }
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
BOOLEAN AcpiDsIsResultUsed(ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
Definition: dsutils.c:187
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define return_VOID
Definition: acoutput.h:495
Status
Definition: gdiplustypes.h:24
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:784
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
ACPI_STATUS AcpiDsResultPop(ACPI_OPERAND_OBJECT **Object, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:78

Referenced by AcpiDsExecEndOp().

◆ AcpiDsDoImplicitReturn()

BOOLEAN AcpiDsDoImplicitReturn ( ACPI_OPERAND_OBJECT ReturnDesc,
ACPI_WALK_STATE WalkState,
BOOLEAN  AddReference 
)

Definition at line 123 of file dsutils.c.

127 {
128  ACPI_FUNCTION_NAME (DsDoImplicitReturn);
129 
130 
131  /*
132  * Slack must be enabled for this feature, and we must
133  * have a valid return object
134  */
135  if ((!AcpiGbl_EnableInterpreterSlack) ||
136  (!ReturnDesc))
137  {
138  return (FALSE);
139  }
140 
142  "Result %p will be implicitly returned; Prev=%p\n",
143  ReturnDesc,
144  WalkState->ImplicitReturnObj));
145 
146  /*
147  * Delete any "stale" implicit return value first. However, in
148  * complex statements, the implicit return value can be
149  * bubbled up several levels, so we don't clear the value if it
150  * is the same as the ReturnDesc.
151  */
152  if (WalkState->ImplicitReturnObj)
153  {
154  if (WalkState->ImplicitReturnObj == ReturnDesc)
155  {
156  return (TRUE);
157  }
158  AcpiDsClearImplicitReturn (WalkState);
159  }
160 
161  /* Save the implicit return value, add a reference if requested */
162 
163  WalkState->ImplicitReturnObj = ReturnDesc;
164  if (AddReference)
165  {
166  AcpiUtAddReference (ReturnDesc);
167  }
168 
169  return (TRUE);
170 }
void AcpiUtAddReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:746
#define TRUE
Definition: types.h:120
union acpi_operand_object * ImplicitReturnObj
Definition: acstruct.h:112
#define ACPI_DB_DISPATCH
Definition: acoutput.h:163
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define ACPI_FUNCTION_NAME(a)
Definition: acoutput.h:479
void AcpiDsClearImplicitReturn(ACPI_WALK_STATE *WalkState)
Definition: dsutils.c:73

Referenced by AcpiDsGetPredicateValue(), AcpiDsIsResultUsed(), and AcpiDsRestartControlMethod().

◆ AcpiDsEvaluateNamePath()

ACPI_STATUS AcpiDsEvaluateNamePath ( ACPI_WALK_STATE WalkState)

Definition at line 845 of file dsutils.c.

847 {
849  ACPI_PARSE_OBJECT *Op = WalkState->Op;
850  ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
851  ACPI_OPERAND_OBJECT *NewObjDesc;
852  UINT8 Type;
853 
854 
855  ACPI_FUNCTION_TRACE_PTR (DsEvaluateNamePath, WalkState);
856 
857 
858  if (!Op->Common.Parent)
859  {
860  /* This happens after certain exception processing */
861 
862  goto Exit;
863  }
864 
865  if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
866  (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP) ||
867  (Op->Common.Parent->Common.AmlOpcode == AML_REF_OF_OP))
868  {
869  /* TBD: Should we specify this feature as a bit of OpInfo->Flags of these opcodes? */
870 
871  goto Exit;
872  }
873 
874  Status = AcpiDsCreateOperand (WalkState, Op, 0);
875  if (ACPI_FAILURE (Status))
876  {
877  goto Exit;
878  }
879 
880  if (Op->Common.Flags & ACPI_PARSEOP_TARGET)
881  {
882  NewObjDesc = *Operand;
883  goto PushResult;
884  }
885 
886  Type = (*Operand)->Common.Type;
887 
888  Status = AcpiExResolveToValue (Operand, WalkState);
889  if (ACPI_FAILURE (Status))
890  {
891  goto Exit;
892  }
893 
894  if (Type == ACPI_TYPE_INTEGER)
895  {
896  /* It was incremented by AcpiExResolveToValue */
897 
898  AcpiUtRemoveReference (*Operand);
899 
901  *Operand, &NewObjDesc, WalkState);
902  if (ACPI_FAILURE (Status))
903  {
904  goto Exit;
905  }
906  }
907  else
908  {
909  /*
910  * The object either was anew created or is
911  * a Namespace node - don't decrement it.
912  */
913  NewObjDesc = *Operand;
914  }
915 
916  /* Cleanup for name-path operand */
917 
918  Status = AcpiDsObjStackPop (1, WalkState);
919  if (ACPI_FAILURE (Status))
920  {
921  WalkState->ResultObj = NewObjDesc;
922  goto Exit;
923  }
924 
925 PushResult:
926 
927  WalkState->ResultObj = NewObjDesc;
928 
929  Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);
930  if (ACPI_SUCCESS (Status))
931  {
932  /* Force to take it from stack */
933 
934  Op->Common.Flags |= ACPI_PARSEOP_IN_STACK;
935  }
936 
937 Exit:
938 
940 }
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
Type
Definition: Type.h:6
#define ACPI_TYPE_INTEGER
Definition: actypes.h:679
#define ACPI_PARSEOP_TARGET
Definition: aclocal.h:1122
UINT32 ACPI_STATUS
Definition: actypes.h:460
ACPI_STATUS AcpiDsCreateOperand(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg, UINT32 ArgIndex)
Definition: dsutils.c:497
ACPI_STATUS AcpiDsObjStackPop(UINT32 PopCount, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:391
#define AML_VARIABLE_PACKAGE_OP
Definition: amlcode.h:63
ACPI_STATUS AcpiDsResultPush(ACPI_OPERAND_OBJECT *Object, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:160
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define ACPI_PARSEOP_IN_STACK
Definition: aclocal.h:1121
union acpi_operand_object * ResultObj
Definition: acstruct.h:121
static void Exit(void)
Definition: sock.c:1331
ACPI_PARSE_OBJECT * Op
Definition: acstruct.h:118
ACPI_STATUS AcpiExResolveToValue(ACPI_OPERAND_OBJECT **StackPtr, ACPI_WALK_STATE *WalkState)
Definition: exresolv.c:79
Status
Definition: gdiplustypes.h:24
union acpi_operand_object * Operands[ACPI_OBJ_NUM_OPERANDS+1]
Definition: acstruct.h:105
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
ACPI_OBJECT_COMMON Common
Definition: acobject.h:516
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:784
#define AML_REF_OF_OP
Definition: amlcode.h:89
ACPI_STATUS AcpiUtCopyIobjectToIobject(ACPI_OPERAND_OBJECT *SourceDesc, ACPI_OPERAND_OBJECT **DestDesc, ACPI_WALK_STATE *WalkState)
Definition: utcopy.c:1037
unsigned char UINT8
#define AE_OK
Definition: acexcep.h:97
#define AML_PACKAGE_OP
Definition: amlcode.h:62

Referenced by AcpiDsExecEndOp().

◆ AcpiDsIsResultUsed()

BOOLEAN AcpiDsIsResultUsed ( ACPI_PARSE_OBJECT Op,
ACPI_WALK_STATE WalkState 
)

Definition at line 187 of file dsutils.c.

190 {
191  const ACPI_OPCODE_INFO *ParentInfo;
192 
193  ACPI_FUNCTION_TRACE_PTR (DsIsResultUsed, Op);
194 
195 
196  /* Must have both an Op and a Result Object */
197 
198  if (!Op)
199  {
200  ACPI_ERROR ((AE_INFO, "Null Op"));
201  return_UINT8 (TRUE);
202  }
203 
204  /*
205  * We know that this operator is not a
206  * Return() operator (would not come here.) The following code is the
207  * optional support for a so-called "implicit return". Some AML code
208  * assumes that the last value of the method is "implicitly" returned
209  * to the caller. Just save the last result as the return value.
210  * NOTE: this is optional because the ASL language does not actually
211  * support this behavior.
212  */
213  (void) AcpiDsDoImplicitReturn (WalkState->ResultObj, WalkState, TRUE);
214 
215  /*
216  * Now determine if the parent will use the result
217  *
218  * If there is no parent, or the parent is a ScopeOp, we are executing
219  * at the method level. An executing method typically has no parent,
220  * since each method is parsed separately. A method invoked externally
221  * via ExecuteControlMethod has a ScopeOp as the parent.
222  */
223  if ((!Op->Common.Parent) ||
224  (Op->Common.Parent->Common.AmlOpcode == AML_SCOPE_OP))
225  {
226  /* No parent, the return value cannot possibly be used */
227 
229  "At Method level, result of [%s] not used\n",
230  AcpiPsGetOpcodeName (Op->Common.AmlOpcode)));
232  }
233 
234  /* Get info on the parent. The RootOp is AML_SCOPE */
235 
236  ParentInfo = AcpiPsGetOpcodeInfo (Op->Common.Parent->Common.AmlOpcode);
237  if (ParentInfo->Class == AML_CLASS_UNKNOWN)
238  {
240  "Unknown parent opcode Op=%p", Op));
242  }
243 
244  /*
245  * Decide what to do with the result based on the parent. If
246  * the parent opcode will not use the result, delete the object.
247  * Otherwise leave it as is, it will be deleted when it is used
248  * as an operand later.
249  */
250  switch (ParentInfo->Class)
251  {
252  case AML_CLASS_CONTROL:
253 
254  switch (Op->Common.Parent->Common.AmlOpcode)
255  {
256  case AML_RETURN_OP:
257 
258  /* Never delete the return value associated with a return opcode */
259 
260  goto ResultUsed;
261 
262  case AML_IF_OP:
263  case AML_WHILE_OP:
264  /*
265  * If we are executing the predicate AND this is the predicate op,
266  * we will use the return value
267  */
268  if ((WalkState->ControlState->Common.State ==
270  (WalkState->ControlState->Control.PredicateOp == Op))
271  {
272  goto ResultUsed;
273  }
274  break;
275 
276  default:
277 
278  /* Ignore other control opcodes */
279 
280  break;
281  }
282 
283  /* The general control opcode returns no result */
284 
285  goto ResultNotUsed;
286 
287  case AML_CLASS_CREATE:
288  /*
289  * These opcodes allow TermArg(s) as operands and therefore
290  * the operands can be method calls. The result is used.
291  */
292  goto ResultUsed;
293 
295 
296  if ((Op->Common.Parent->Common.AmlOpcode == AML_REGION_OP) ||
297  (Op->Common.Parent->Common.AmlOpcode == AML_DATA_REGION_OP) ||
298  (Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
299  (Op->Common.Parent->Common.AmlOpcode == AML_BUFFER_OP) ||
300  (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP) ||
301  (Op->Common.Parent->Common.AmlOpcode == AML_INT_EVAL_SUBTREE_OP) ||
302  (Op->Common.Parent->Common.AmlOpcode == AML_BANK_FIELD_OP))
303  {
304  /*
305  * These opcodes allow TermArg(s) as operands and therefore
306  * the operands can be method calls. The result is used.
307  */
308  goto ResultUsed;
309  }
310 
311  goto ResultNotUsed;
312 
313  default:
314  /*
315  * In all other cases. the parent will actually use the return
316  * object, so keep it.
317  */
318  goto ResultUsed;
319  }
320 
321 
322 ResultUsed:
324  "Result of [%s] used by Parent [%s] Op=%p\n",
325  AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
326  AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op));
327 
328  return_UINT8 (TRUE);
329 
330 
331 ResultNotUsed:
333  "Result of [%s] not used by Parent [%s] Op=%p\n",
334  AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
335  AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op));
336 
338 }
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
#define TRUE
Definition: types.h:120
const char * AcpiPsGetOpcodeName(UINT16 Opcode)
Definition: psopinfo.c:169
#define AML_INT_EVAL_SUBTREE_OP
Definition: amlcode.h:212
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define AML_CLASS_UNKNOWN
Definition: amlcode.h:410
#define AML_IF_OP
Definition: amlcode.h:134
#define AML_CLASS_CREATE
Definition: amlcode.h:401
#define AML_WHILE_OP
Definition: amlcode.h:136
#define AML_CLASS_CONTROL
Definition: amlcode.h:404
const ACPI_OPCODE_INFO * AcpiPsGetOpcodeInfo(UINT16 Opcode)
Definition: psopinfo.c:72
ACPI_GENERIC_STATE * ControlState
Definition: acstruct.h:110
#define AML_VARIABLE_PACKAGE_OP
Definition: amlcode.h:63
#define AML_REGION_OP
Definition: amlcode.h:180
#define AML_CLASS_NAMED_OBJECT
Definition: amlcode.h:403
BOOLEAN AcpiDsDoImplicitReturn(ACPI_OPERAND_OBJECT *ReturnDesc, ACPI_WALK_STATE *WalkState, BOOLEAN AddReference)
Definition: dsutils.c:123
#define ACPI_CONTROL_PREDICATE_EXECUTING
Definition: aclocal.h:671
union acpi_parse_object * PredicateOp
Definition: aclocal.h:726
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define ACPI_DB_DISPATCH
Definition: acoutput.h:163
ACPI_CONTROL_STATE Control
Definition: aclocal.h:823
#define AML_BANK_FIELD_OP
Definition: amlcode.h:187
union acpi_operand_object * ResultObj
Definition: acstruct.h:121
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define AML_RETURN_OP
Definition: amlcode.h:138
#define AML_SCOPE_OP
Definition: amlcode.h:60
ACPI_COMMON_STATE Common
Definition: aclocal.h:822
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define AML_BUFFER_OP
Definition: amlcode.h:61
#define AML_DATA_REGION_OP
Definition: amlcode.h:188
#define AML_PACKAGE_OP
Definition: amlcode.h:62
#define return_UINT8(s)
Definition: acoutput.h:500

Referenced by AcpiDsDeleteResultIfNotUsed(), and AcpiPsNextParseState().

◆ AcpiDsResolveOperands()

ACPI_STATUS AcpiDsResolveOperands ( ACPI_WALK_STATE WalkState)

Definition at line 412 of file dsutils.c.

414 {
415  UINT32 i;
417 
418 
419  ACPI_FUNCTION_TRACE_PTR (DsResolveOperands, WalkState);
420 
421 
422  /*
423  * Attempt to resolve each of the valid operands
424  * Method arguments are passed by reference, not by value. This means
425  * that the actual objects are passed, not copies of the objects.
426  */
427  for (i = 0; i < WalkState->NumOperands; i++)
428  {
429  Status = AcpiExResolveToValue (&WalkState->Operands[i], WalkState);
430  if (ACPI_FAILURE (Status))
431  {
432  break;
433  }
434  }
435 
437 }
UINT8 NumOperands
Definition: acstruct.h:80
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
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
unsigned int UINT32
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
ACPI_STATUS AcpiExResolveToValue(ACPI_OPERAND_OBJECT **StackPtr, ACPI_WALK_STATE *WalkState)
Definition: exresolv.c:79
Status
Definition: gdiplustypes.h:24
union acpi_operand_object * Operands[ACPI_OBJ_NUM_OPERANDS+1]
Definition: acstruct.h:105
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define AE_OK
Definition: acexcep.h:97

Referenced by AcpiDsExecEndOp().