ReactOS  0.4.15-dev-439-g292f67a
dsfield.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "amlcode.h"
#include "acdispat.h"
#include "acinterp.h"
#include "acnamesp.h"
#include "acparser.h"
Include dependency graph for dsfield.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_DISPATCHER
 

Functions

static ACPI_STATUS AcpiDsGetFieldNames (ACPI_CREATE_FIELD_INFO *Info, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg)
 
ACPI_STATUS AcpiDsCreateBufferField (ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsCreateField (ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *RegionNode, ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsInitFieldObjects (ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsCreateBankField (ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *RegionNode, ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiDsCreateIndexField (ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *RegionNode, ACPI_WALK_STATE *WalkState)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_DISPATCHER

Definition at line 57 of file dsfield.c.

Function Documentation

◆ AcpiDsCreateBankField()

ACPI_STATUS AcpiDsCreateBankField ( ACPI_PARSE_OBJECT Op,
ACPI_NAMESPACE_NODE RegionNode,
ACPI_WALK_STATE WalkState 
)

Definition at line 748 of file dsfield.c.

752 {
754  ACPI_PARSE_OBJECT *Arg;
756 
757 
758  ACPI_FUNCTION_TRACE_PTR (DsCreateBankField, Op);
759 
760 
761  /* First arg is the name of the parent OpRegion (must already exist) */
762 
763  Arg = Op->Common.Value.Arg;
764  if (!RegionNode)
765  {
766  Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
768  ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
769 #ifdef ACPI_ASL_COMPILER
770  Status = AcpiDsCreateExternalRegion (Status, Arg,
771  Arg->Common.Value.Name, WalkState, &RegionNode);
772 #endif
773  if (ACPI_FAILURE (Status))
774  {
775  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
776  Arg->Common.Value.Name, Status);
778  }
779  }
780 
781  /* Second arg is the Bank Register (Field) (must already exist) */
782 
783  Arg = Arg->Common.Next;
784  Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
786  ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
787  if (ACPI_FAILURE (Status))
788  {
789  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
790  Arg->Common.Value.String, Status);
792  }
793 
794  /*
795  * Third arg is the BankValue
796  * This arg is a TermArg, not a constant
797  * It will be evaluated later, by AcpiDsEvalBankFieldOperands
798  */
799  Arg = Arg->Common.Next;
800 
801  /* Fourth arg is the field flags */
802 
803  Arg = Arg->Common.Next;
804  Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
805 
806  /* Each remaining arg is a Named Field */
807 
808  Info.FieldType = ACPI_TYPE_LOCAL_BANK_FIELD;
809  Info.RegionNode = RegionNode;
810 
811  /*
812  * Use Info.DataRegisterNode to store BankField Op
813  * It's safe because DataRegisterNode will never be used when create
814  * bank field \we store AmlStart and AmlLength in the BankField Op for
815  * late evaluation. Used in AcpiExPrepFieldValue(Info)
816  *
817  * TBD: Or, should we add a field in ACPI_CREATE_FIELD_INFO, like
818  * "void *ParentOp"?
819  */
820  Info.DataRegisterNode = (ACPI_NAMESPACE_NODE*) Op;
821 
822  Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
824 }
#define ACPI_NS_SEARCH_PARENT
Definition: acnamesp.h:63
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
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
UINT32 ACPI_STATUS
Definition: actypes.h:460
struct TraceInfo Info
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
static ACPI_STATUS AcpiDsGetFieldNames(ACPI_CREATE_FIELD_INFO *Info, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg)
Definition: dsfield.c:324
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
#define ACPI_TYPE_ANY
Definition: actypes.h:679
Status
Definition: gdiplustypes.h:24
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_TYPE_REGION
Definition: actypes.h:689
#define ACPI_TYPE_LOCAL_BANK_FIELD
Definition: actypes.h:709
#define ACPI_ERROR_NAMESPACE(s, p, e)
Definition: acmacros.h:462
unsigned char UINT8

Referenced by AcpiDsLoad2EndOp().

◆ AcpiDsCreateBufferField()

ACPI_STATUS AcpiDsCreateBufferField ( ACPI_PARSE_OBJECT Op,
ACPI_WALK_STATE WalkState 
)

Definition at line 165 of file dsfield.c.

168 {
169  ACPI_PARSE_OBJECT *Arg;
172  ACPI_OPERAND_OBJECT *ObjDesc;
173  ACPI_OPERAND_OBJECT *SecondDesc = NULL;
174  UINT32 Flags;
175 
176 
177  ACPI_FUNCTION_TRACE (DsCreateBufferField);
178 
179 
180  /*
181  * Get the NameString argument (name of the new BufferField)
182  */
183  if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
184  {
185  /* For CreateField, name is the 4th argument */
186 
187  Arg = AcpiPsGetArg (Op, 3);
188  }
189  else
190  {
191  /* For all other CreateXXXField operators, name is the 3rd argument */
192 
193  Arg = AcpiPsGetArg (Op, 2);
194  }
195 
196  if (!Arg)
197  {
199  }
200 
201  if (WalkState->DeferredNode)
202  {
203  Node = WalkState->DeferredNode;
204  }
205  else
206  {
207  /* Execute flag should always be set when this function is entered */
208 
209  if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
210  {
212  "Parse execute mode is not set"));
214  }
215 
216  /* Creating new namespace node, should not already exist */
217 
220 
221  /*
222  * Mark node temporary if we are executing a normal control
223  * method. (Don't mark if this is a module-level code method)
224  */
225  if (WalkState->MethodNode &&
226  !(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
227  {
229  }
230 
231  /* Enter the NameString into the namespace */
232 
233  Status = AcpiNsLookup (WalkState->ScopeInfo,
234  Arg->Common.Value.String, ACPI_TYPE_ANY,
235  ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);
236  if ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) &&
238  {
239  Status = AE_OK;
240  }
241  else if (ACPI_FAILURE (Status))
242  {
243  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
244  Arg->Common.Value.String, Status);
246  }
247  }
248 
249  /*
250  * We could put the returned object (Node) on the object stack for later,
251  * but for now, we will put it in the "op" object that the parser uses,
252  * so we can get it again at the end of this scope.
253  */
254  Op->Common.Node = Node;
255 
256  /*
257  * If there is no object attached to the node, this node was just created
258  * and we need to create the field object. Otherwise, this was a lookup
259  * of an existing node and we don't want to create the field object again.
260  */
261  ObjDesc = AcpiNsGetAttachedObject (Node);
262  if (ObjDesc)
263  {
265  }
266 
267  /*
268  * The Field definition is not fully parsed at this time.
269  * (We must save the address of the AML for the buffer and index operands)
270  */
271 
272  /* Create the buffer field object */
273 
275  if (!ObjDesc)
276  {
278  goto Cleanup;
279  }
280 
281  /*
282  * Remember location in AML stream of the field unit opcode and operands
283  * -- since the buffer and index operands must be evaluated.
284  */
285  SecondDesc = ObjDesc->Common.NextObject;
286  SecondDesc->Extra.AmlStart = Op->Named.Data;
287  SecondDesc->Extra.AmlLength = Op->Named.Length;
288  ObjDesc->BufferField.Node = Node;
289 
290  /* Attach constructed field descriptors to parent node */
291 
293  if (ACPI_FAILURE (Status))
294  {
295  goto Cleanup;
296  }
297 
298 
299 Cleanup:
300 
301  /* Remove local reference to the object */
302 
303  AcpiUtRemoveReference (ObjDesc);
305 }
#define ACPI_NS_TEMPORARY
Definition: acnamesp.h:69
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
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
#define AE_AML_INTERNAL
Definition: acexcep.h:194
#define AE_AML_NO_OPERAND
Definition: acexcep.h:181
struct acpi_namespace_node * DeferredNode
Definition: acstruct.h:111
#define ACPI_NS_ERROR_IF_FOUND
Definition: acnamesp.h:66
UINT8 * AmlStart
Definition: acobject.h:482
UINT32 ParseFlags
Definition: acstruct.h:95
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_PARSE_EXECUTE
Definition: acparser.h:61
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_OBJECT_EXTRA Extra
Definition: acobject.h:539
unsigned int UINT32
union node Node
Definition: types.h:1255
#define ACPI_NS_DONT_OPEN_SCOPE
Definition: acnamesp.h:64
#define AML_CREATE_FIELD_OP
Definition: amlcode.h:163
#define AE_INFO
Definition: acoutput.h:230
smooth NULL
Definition: ftsmooth.c:416
ACPI_PARSE_OBJ_NAMED Named
Definition: aclocal.h:1079
#define AE_ALREADY_EXISTS
Definition: acexcep.h:115
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
#define ACPI_TYPE_ANY
Definition: actypes.h:679
static const WCHAR Cleanup[]
Definition: register.c:80
struct acpi_namespace_node * MethodNode
Definition: acstruct.h:116
Status
Definition: gdiplustypes.h:24
#define ACPI_PARSE_DISASSEMBLE
Definition: acparser.h:65
ACPI_STATUS AcpiNsAttachObject(ACPI_NAMESPACE_NODE *Node, ACPI_OPERAND_OBJECT *Object, ACPI_OBJECT_TYPE Type)
Definition: nsobject.c:76
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_NS_NO_UPSEARCH
Definition: acnamesp.h:62
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_PARSE_MODULE_LEVEL
Definition: acparser.h:67
#define ACPI_TYPE_BUFFER_FIELD
Definition: actypes.h:693
ACPI_OBJECT_COMMON Common
Definition: acobject.h:517
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:785
ACPI_PARSE_OBJECT * AcpiPsGetArg(ACPI_PARSE_OBJECT *op, UINT32 argn)
Definition: pstree.c:76
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define AcpiUtCreateInternalObject(t)
Definition: acutils.h:655
ACPI_OBJECT_BUFFER_FIELD BufferField
Definition: acobject.h:533
#define ACPI_ERROR_NAMESPACE(s, p, e)
Definition: acmacros.h:462
#define AE_OK
Definition: acexcep.h:97
UINT32 AmlLength
Definition: acobject.h:483
Definition: dlist.c:348

Referenced by AcpiDsLoad1EndOp(), and AcpiDsLoad2EndOp().

◆ AcpiDsCreateField()

ACPI_STATUS AcpiDsCreateField ( ACPI_PARSE_OBJECT Op,
ACPI_NAMESPACE_NODE RegionNode,
ACPI_WALK_STATE WalkState 
)

Definition at line 534 of file dsfield.c.

538 {
540  ACPI_PARSE_OBJECT *Arg;
542 
543 
544  ACPI_FUNCTION_TRACE_PTR (DsCreateField, Op);
545 
546 
547  /* First arg is the name of the parent OpRegion (must already exist) */
548 
549  Arg = Op->Common.Value.Arg;
550 
551  if (!RegionNode)
552  {
553  Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
555  ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
556 #ifdef ACPI_ASL_COMPILER
557  Status = AcpiDsCreateExternalRegion (Status, Arg,
558  Arg->Common.Value.Name, WalkState, &RegionNode);
559 #endif
560  if (ACPI_FAILURE (Status))
561  {
562  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
563  Arg->Common.Value.Name, Status);
565  }
566  }
567 
568  memset (&Info, 0, sizeof (ACPI_CREATE_FIELD_INFO));
569 
570  /* Second arg is the field flags */
571 
572  Arg = Arg->Common.Next;
573  Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
574  Info.Attribute = 0;
575 
576  /* Each remaining arg is a Named Field */
577 
579  Info.RegionNode = RegionNode;
580 
581  Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
582  if (ACPI_FAILURE (Status))
583  {
585  }
586 
587  if (Info.RegionNode->Object->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_COMM)
588  {
589  RegionNode->Object->Field.InternalPccBuffer =
590  ACPI_ALLOCATE_ZEROED(Info.RegionNode->Object->Region.Length);
591  if (!RegionNode->Object->Field.InternalPccBuffer)
592  {
594  }
595  }
596 
598 }
#define ACPI_NS_SEARCH_PARENT
Definition: acnamesp.h:63
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
union acpi_operand_object * Object
Definition: aclocal.h:187
#define ACPI_ALLOCATE_ZEROED(a)
Definition: actypes.h:385
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
UINT32 ACPI_STATUS
Definition: actypes.h:460
struct TraceInfo Info
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
#define ACPI_ADR_SPACE_PLATFORM_COMM
Definition: actypes.h:862
static ACPI_STATUS AcpiDsGetFieldNames(ACPI_CREATE_FIELD_INFO *Info, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg)
Definition: dsfield.c:324
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define ACPI_TYPE_LOCAL_REGION_FIELD
Definition: actypes.h:708
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
Status
Definition: gdiplustypes.h:24
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
ACPI_OBJECT_REGION_FIELD Field
Definition: acobject.h:532
#define ACPI_TYPE_REGION
Definition: actypes.h:689
#define ACPI_ERROR_NAMESPACE(s, p, e)
Definition: acmacros.h:462
unsigned char UINT8
#define memset(x, y, z)
Definition: compat.h:39

Referenced by AcpiDsLoad2EndOp().

◆ AcpiDsCreateIndexField()

ACPI_STATUS AcpiDsCreateIndexField ( ACPI_PARSE_OBJECT Op,
ACPI_NAMESPACE_NODE RegionNode,
ACPI_WALK_STATE WalkState 
)

Definition at line 842 of file dsfield.c.

846 {
848  ACPI_PARSE_OBJECT *Arg;
850 
851 
852  ACPI_FUNCTION_TRACE_PTR (DsCreateIndexField, Op);
853 
854 
855  /* First arg is the name of the Index register (must already exist) */
856 
857  Arg = Op->Common.Value.Arg;
858  Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
860  ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
861  if (ACPI_FAILURE (Status))
862  {
863  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
864  Arg->Common.Value.String, Status);
866  }
867 
868  /* Second arg is the data register (must already exist) */
869 
870  Arg = Arg->Common.Next;
871  Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
873  ACPI_NS_SEARCH_PARENT, WalkState, &Info.DataRegisterNode);
874  if (ACPI_FAILURE (Status))
875  {
876  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
877  Arg->Common.Value.String, Status);
879  }
880 
881  /* Next arg is the field flags */
882 
883  Arg = Arg->Common.Next;
884  Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
885 
886  /* Each remaining arg is a Named Field */
887 
888  Info.FieldType = ACPI_TYPE_LOCAL_INDEX_FIELD;
889  Info.RegionNode = RegionNode;
890 
891  Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
893 }
#define ACPI_NS_SEARCH_PARENT
Definition: acnamesp.h:63
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
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
UINT32 ACPI_STATUS
Definition: actypes.h:460
struct TraceInfo Info
#define ACPI_TYPE_LOCAL_INDEX_FIELD
Definition: actypes.h:710
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
static ACPI_STATUS AcpiDsGetFieldNames(ACPI_CREATE_FIELD_INFO *Info, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg)
Definition: dsfield.c:324
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
#define ACPI_TYPE_ANY
Definition: actypes.h:679
Status
Definition: gdiplustypes.h:24
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_ERROR_NAMESPACE(s, p, e)
Definition: acmacros.h:462
unsigned char UINT8

Referenced by AcpiDsLoad2EndOp().

◆ AcpiDsGetFieldNames()

static ACPI_STATUS AcpiDsGetFieldNames ( ACPI_CREATE_FIELD_INFO Info,
ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT Arg 
)
static

Definition at line 324 of file dsfield.c.

328 {
332 
333 #ifdef ACPI_EXEC_APP
334  ACPI_OPERAND_OBJECT *ResultDesc;
335  ACPI_OPERAND_OBJECT *ObjDesc;
336  char *NamePath;
337 #endif
338 
339 
340  ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info);
341 
342 
343  /* First field starts at bit zero */
344 
345  Info->FieldBitPosition = 0;
346 
347  /* Process all elements in the field list (of parse nodes) */
348 
349  while (Arg)
350  {
351  /*
352  * Four types of field elements are handled:
353  * 1) Name - Enters a new named field into the namespace
354  * 2) Offset - specifies a bit offset
355  * 3) AccessAs - changes the access mode/attributes
356  * 4) Connection - Associate a resource template with the field
357  */
358  switch (Arg->Common.AmlOpcode)
359  {
361 
362  Position = (UINT64) Info->FieldBitPosition +
363  (UINT64) Arg->Common.Value.Size;
364 
366  {
368  "Bit offset within field too large (> 0xFFFFFFFF)"));
370  }
371 
372  Info->FieldBitPosition = (UINT32) Position;
373  break;
374 
377  /*
378  * Get new AccessType, AccessAttribute, and AccessLength fields
379  * -- to be used for all field units that follow, until the
380  * end-of-field or another AccessAs keyword is encountered.
381  * NOTE. These three bytes are encoded in the integer value
382  * of the parseop for convenience.
383  *
384  * In FieldFlags, preserve the flag bits other than the
385  * ACCESS_TYPE bits.
386  */
387 
388  /* AccessType (ByteAcc, WordAcc, etc.) */
389 
390  Info->FieldFlags = (UINT8)
391  ((Info->FieldFlags & ~(AML_FIELD_ACCESS_TYPE_MASK)) |
392  ((UINT8) ((UINT32) (Arg->Common.Value.Integer & 0x07))));
393 
394  /* AccessAttribute (AttribQuick, AttribByte, etc.) */
395 
396  Info->Attribute = (UINT8)
397  ((Arg->Common.Value.Integer >> 8) & 0xFF);
398 
399  /* AccessLength (for serial/buffer protocols) */
400 
401  Info->AccessLength = (UINT8)
402  ((Arg->Common.Value.Integer >> 16) & 0xFF);
403  break;
404 
406  /*
407  * Clear any previous connection. New connection is used for all
408  * fields that follow, similar to AccessAs
409  */
410  Info->ResourceBuffer = NULL;
411  Info->ConnectionNode = NULL;
412  Info->PinNumberIndex = 0;
413 
414  /*
415  * A Connection() is either an actual resource descriptor (buffer)
416  * or a named reference to a resource template
417  */
418  Child = Arg->Common.Value.Arg;
419  if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
420  {
421  Info->ResourceBuffer = Child->Named.Data;
422  Info->ResourceLength = (UINT16) Child->Named.Value.Integer;
423  }
424  else
425  {
426  /* Lookup the Connection() namepath, it should already exist */
427 
428  Status = AcpiNsLookup (WalkState->ScopeInfo,
429  Child->Common.Value.Name, ACPI_TYPE_ANY,
431  WalkState, &Info->ConnectionNode);
432  if (ACPI_FAILURE (Status))
433  {
434  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
435  Child->Common.Value.Name, Status);
437  }
438  }
439  break;
440 
442 
443  /* Lookup the name, it should already exist */
444 
445  Status = AcpiNsLookup (WalkState->ScopeInfo,
446  (char *) &Arg->Named.Name, Info->FieldType,
448  WalkState, &Info->FieldNode);
449  if (ACPI_FAILURE (Status))
450  {
451  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
452  (char *) &Arg->Named.Name, Status);
454  }
455  else
456  {
457  Arg->Common.Node = Info->FieldNode;
458  Info->FieldBitLength = Arg->Common.Value.Size;
459 
460  /*
461  * If there is no object attached to the node, this node was
462  * just created and we need to create the field object.
463  * Otherwise, this was a lookup of an existing node and we
464  * don't want to create the field object again.
465  */
466  if (!AcpiNsGetAttachedObject (Info->FieldNode))
467  {
469  if (ACPI_FAILURE (Status))
470  {
472  }
473 #ifdef ACPI_EXEC_APP
474  NamePath = AcpiNsGetExternalPathname (Info->FieldNode);
475  if (ACPI_SUCCESS (AeLookupInitFileEntry (NamePath, &ObjDesc)))
476  {
477  AcpiExWriteDataToField (ObjDesc,
478  AcpiNsGetAttachedObject (Info->FieldNode),
479  &ResultDesc);
480  AcpiUtRemoveReference (ObjDesc);
481  }
482  ACPI_FREE (NamePath);
483 #endif
484  }
485  }
486 
487  /* Keep track of bit position for the next field */
488 
489  Position = (UINT64) Info->FieldBitPosition +
490  (UINT64) Arg->Common.Value.Size;
491 
493  {
495  "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)",
496  ACPI_CAST_PTR (char, &Info->FieldNode->Name)));
498  }
499 
500  Info->FieldBitPosition += Info->FieldBitLength;
501  Info->PinNumberIndex++; /* Index relative to previous Connection() */
502  break;
503 
504  default:
505 
507  "Invalid opcode in field list: 0x%X",
508  Arg->Common.AmlOpcode));
510  }
511 
512  Arg = Arg->Common.Next;
513  }
514 
516 }
#define ACPI_FREE(a)
Definition: actypes.h:386
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
#define AML_INT_ACCESSFIELD_OP
Definition: amlcode.h:208
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
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
static COORD Position
Definition: mouse.c:34
UINT32 ACPI_STATUS
Definition: actypes.h:460
struct TraceInfo Info
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
unsigned int UINT32
#define ACPI_NS_DONT_OPEN_SCOPE
Definition: acnamesp.h:64
ACPI_STATUS AcpiExWriteDataToField(ACPI_OPERAND_OBJECT *SourceDesc, ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT **ResultDesc)
Definition: exfield.c:315
#define AML_INT_EXTACCESSFIELD_OP
Definition: amlcode.h:214
smooth NULL
Definition: ftsmooth.c:416
#define AE_INFO
Definition: acoutput.h:230
#define AE_AML_BAD_OPCODE
Definition: acexcep.h:180
ACPI_STATUS AcpiExPrepFieldValue(ACPI_CREATE_FIELD_INFO *Info)
Definition: exprep.c:438
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
ACPI_PARSE_OBJ_NAMED Named
Definition: aclocal.h:1079
char * AcpiNsGetExternalPathname(ACPI_NAMESPACE_NODE *Node)
Definition: nsnames.c:70
#define ACPI_UINT32_MAX
Definition: actypes.h:66
#define AE_SUPPORT
Definition: acexcep.h:123
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
#define ACPI_TYPE_ANY
Definition: actypes.h:679
#define AML_INT_CONNECTION_OP
Definition: amlcode.h:213
#define AML_INT_NAMEDFIELD_OP
Definition: amlcode.h:206
Status
Definition: gdiplustypes.h:24
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define AML_INT_RESERVEDFIELD_OP
Definition: amlcode.h:207
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:785
unsigned short UINT16
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define AML_INT_BYTELIST_OP
Definition: amlcode.h:209
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE ACPI_HANDLE Child
Definition: acpixf.h:728
unsigned long long UINT64
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
#define ACPI_ERROR_NAMESPACE(s, p, e)
Definition: acmacros.h:462
unsigned char UINT8
#define AE_OK
Definition: acexcep.h:97
#define AML_FIELD_ACCESS_TYPE_MASK
Definition: amlcode.h:442

Referenced by AcpiDsCreateBankField(), AcpiDsCreateField(), and AcpiDsCreateIndexField().

◆ AcpiDsInitFieldObjects()

ACPI_STATUS AcpiDsInitFieldObjects ( ACPI_PARSE_OBJECT Op,
ACPI_WALK_STATE WalkState 
)

Definition at line 617 of file dsfield.c.

620 {
622  ACPI_PARSE_OBJECT *Arg = NULL;
624  UINT8 Type = 0;
625  UINT32 Flags;
626 
627 
628  ACPI_FUNCTION_TRACE_PTR (DsInitFieldObjects, Op);
629 
630 
631  /* Execute flag should always be set when this function is entered */
632 
633  if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
634  {
635  if (WalkState->ParseFlags & ACPI_PARSE_DEFERRED_OP)
636  {
637  /* BankField Op is deferred, just return OK */
638 
640  }
641 
643  "Parse deferred mode is not set"));
645  }
646 
647  /*
648  * Get the FieldList argument for this opcode. This is the start of the
649  * list of field elements.
650  */
651  switch (WalkState->Opcode)
652  {
653  case AML_FIELD_OP:
654 
655  Arg = AcpiPsGetArg (Op, 2);
657  break;
658 
659  case AML_BANK_FIELD_OP:
660 
661  Arg = AcpiPsGetArg (Op, 4);
663  break;
664 
665  case AML_INDEX_FIELD_OP:
666 
667  Arg = AcpiPsGetArg (Op, 3);
669  break;
670 
671  default:
672 
674  }
675 
676  /* Creating new namespace node(s), should not already exist */
677 
680 
681  /*
682  * Mark node(s) temporary if we are executing a normal control
683  * method. (Don't mark if this is a module-level code method)
684  */
685  if (WalkState->MethodNode &&
686  !(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
687  {
689  }
690 
691 #ifdef ACPI_EXEC_APP
693 #endif
694  /*
695  * Walk the list of entries in the FieldList
696  * Note: FieldList can be of zero length. In this case, Arg will be NULL.
697  */
698  while (Arg)
699  {
700  /*
701  * Ignore OFFSET/ACCESSAS/CONNECTION terms here; we are only interested
702  * in the field names in order to enter them into the namespace.
703  */
704  if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
705  {
706  Status = AcpiNsLookup (WalkState->ScopeInfo,
707  (char *) &Arg->Named.Name, Type, ACPI_IMODE_LOAD_PASS1,
708  Flags, WalkState, &Node);
709  if (ACPI_FAILURE (Status))
710  {
711  ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
712  (char *) &Arg->Named.Name, Status);
713  if (Status != AE_ALREADY_EXISTS)
714  {
716  }
717 
718  /* Name already exists, just ignore this error */
719  }
720 
721  Arg->Common.Node = Node;
722  }
723 
724  /* Get the next field element in the list */
725 
726  Arg = Arg->Common.Next;
727  }
728 
730 }
#define ACPI_NS_TEMPORARY
Definition: acnamesp.h:69
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
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
Type
Definition: Type.h:6
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
#define AE_AML_INTERNAL
Definition: acexcep.h:194
#define ACPI_NS_ERROR_IF_FOUND
Definition: acnamesp.h:66
UINT32 ParseFlags
Definition: acstruct.h:95
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_PARSE_EXECUTE
Definition: acparser.h:61
#define ACPI_TYPE_LOCAL_INDEX_FIELD
Definition: actypes.h:710
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
unsigned int UINT32
union node Node
Definition: types.h:1255
#define ACPI_NS_DONT_OPEN_SCOPE
Definition: acnamesp.h:64
#define AE_INFO
Definition: acoutput.h:230
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
ACPI_PARSE_OBJ_NAMED Named
Definition: aclocal.h:1079
#define AML_BANK_FIELD_OP
Definition: amlcode.h:187
#define AE_ALREADY_EXISTS
Definition: acexcep.h:115
#define AML_FIELD_OP
Definition: amlcode.h:181
#define AML_INDEX_FIELD_OP
Definition: amlcode.h:186
#define ACPI_TYPE_LOCAL_REGION_FIELD
Definition: actypes.h:708
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
struct acpi_namespace_node * MethodNode
Definition: acstruct.h:116
#define AML_INT_NAMEDFIELD_OP
Definition: amlcode.h:206
Status
Definition: gdiplustypes.h:24
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_NS_NO_UPSEARCH
Definition: acnamesp.h:62
#define ACPI_PARSE_MODULE_LEVEL
Definition: acparser.h:67
#define ACPI_NS_OVERRIDE_IF_FOUND
Definition: acnamesp.h:70
ACPI_PARSE_OBJECT * AcpiPsGetArg(ACPI_PARSE_OBJECT *op, UINT32 argn)
Definition: pstree.c:76
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define ACPI_TYPE_LOCAL_BANK_FIELD
Definition: actypes.h:709
UINT16 Opcode
Definition: acstruct.h:78
#define ACPI_PARSE_DEFERRED_OP
Definition: acparser.h:64
#define ACPI_ERROR_NAMESPACE(s, p, e)
Definition: acmacros.h:462
unsigned char UINT8
#define AE_OK
Definition: acexcep.h:97
Definition: dlist.c:348

Referenced by AcpiDsLoad1EndOp(), and AcpiDsLoad2EndOp().