ReactOS  0.4.15-dev-338-g3dad100
dsfield.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Module Name: dsfield - Dispatcher field routines
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2020, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  * notice, this list of conditions, and the following disclaimer,
16  * without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  * substantially similar to the "NO WARRANTY" disclaimer below
19  * ("Disclaimer") and any redistribution must be conditioned upon
20  * including a substantially similar Disclaimer requirement for further
21  * binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  * of any contributors may be used to endorse or promote products derived
24  * from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "amlcode.h"
47 #include "acdispat.h"
48 #include "acinterp.h"
49 #include "acnamesp.h"
50 #include "acparser.h"
51 
52 #ifdef ACPI_EXEC_APP
53 #include "aecommon.h"
54 #endif
55 
56 
57 #define _COMPONENT ACPI_DISPATCHER
58  ACPI_MODULE_NAME ("dsfield")
59 
60 /* Local prototypes */
61 
62 #ifdef ACPI_ASL_COMPILER
63 #include "acdisasm.h"
64 
65 static ACPI_STATUS
66 AcpiDsCreateExternalRegion (
67  ACPI_STATUS LookupStatus,
69  char *Path,
70  ACPI_WALK_STATE *WalkState,
72 #endif
73 
74 static ACPI_STATUS
77  ACPI_WALK_STATE *WalkState,
78  ACPI_PARSE_OBJECT *Arg);
79 
80 
81 #ifdef ACPI_ASL_COMPILER
82 /*******************************************************************************
83  *
84  * FUNCTION: AcpiDsCreateExternalRegion (iASL Disassembler only)
85  *
86  * PARAMETERS: LookupStatus - Status from NsLookup operation
87  * Op - Op containing the Field definition and args
88  * Path - Pathname of the region
89  * ` WalkState - Current method state
90  * Node - Where the new region node is returned
91  *
92  * RETURN: Status
93  *
94  * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new
95  * region node/object.
96  *
97  ******************************************************************************/
98 
99 static ACPI_STATUS
100 AcpiDsCreateExternalRegion (
101  ACPI_STATUS LookupStatus,
102  ACPI_PARSE_OBJECT *Op,
103  char *Path,
104  ACPI_WALK_STATE *WalkState,
106 {
108  ACPI_OPERAND_OBJECT *ObjDesc;
109 
110 
111  if (LookupStatus != AE_NOT_FOUND)
112  {
113  return (LookupStatus);
114  }
115 
116  /*
117  * Table disassembly:
118  * OperationRegion not found. Generate an External for it, and
119  * insert the name into the namespace.
120  */
122 
125  if (ACPI_FAILURE (Status))
126  {
127  return (Status);
128  }
129 
130  /* Must create and install a region object for the new node */
131 
133  if (!ObjDesc)
134  {
135  return (AE_NO_MEMORY);
136  }
137 
138  ObjDesc->Region.Node = *Node;
140  return (Status);
141 }
142 #endif
143 
144 
145 /*******************************************************************************
146  *
147  * FUNCTION: AcpiDsCreateBufferField
148  *
149  * PARAMETERS: Op - Current parse op (CreateXXField)
150  * WalkState - Current state
151  *
152  * RETURN: Status
153  *
154  * DESCRIPTION: Execute the CreateField operators:
155  * CreateBitFieldOp,
156  * CreateByteFieldOp,
157  * CreateWordFieldOp,
158  * CreateDwordFieldOp,
159  * CreateQwordFieldOp,
160  * CreateFieldOp (all of which define a field in a buffer)
161  *
162  ******************************************************************************/
163 
166  ACPI_PARSE_OBJECT *Op,
167  ACPI_WALK_STATE *WalkState)
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 }
306 
307 
308 /*******************************************************************************
309  *
310  * FUNCTION: AcpiDsGetFieldNames
311  *
312  * PARAMETERS: Info - CreateField info structure
313  * WalkState - Current method state
314  * Arg - First parser arg for the field name list
315  *
316  * RETURN: Status
317  *
318  * DESCRIPTION: Process all named fields in a field declaration. Names are
319  * entered into the namespace.
320  *
321  ******************************************************************************/
322 
323 static ACPI_STATUS
326  ACPI_WALK_STATE *WalkState,
327  ACPI_PARSE_OBJECT *Arg)
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 }
517 
518 
519 /*******************************************************************************
520  *
521  * FUNCTION: AcpiDsCreateField
522  *
523  * PARAMETERS: Op - Op containing the Field definition and args
524  * RegionNode - Object for the containing Operation Region
525  * ` WalkState - Current method state
526  *
527  * RETURN: Status
528  *
529  * DESCRIPTION: Create a new field in the specified operation region
530  *
531  ******************************************************************************/
532 
535  ACPI_PARSE_OBJECT *Op,
536  ACPI_NAMESPACE_NODE *RegionNode,
537  ACPI_WALK_STATE *WalkState)
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 }
599 
600 
601 /*******************************************************************************
602  *
603  * FUNCTION: AcpiDsInitFieldObjects
604  *
605  * PARAMETERS: Op - Op containing the Field definition and args
606  * ` WalkState - Current method state
607  *
608  * RETURN: Status
609  *
610  * DESCRIPTION: For each "Field Unit" name in the argument list that is
611  * part of the field declaration, enter the name into the
612  * namespace.
613  *
614  ******************************************************************************/
615 
618  ACPI_PARSE_OBJECT *Op,
619  ACPI_WALK_STATE *WalkState)
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 }
731 
732 
733 /*******************************************************************************
734  *
735  * FUNCTION: AcpiDsCreateBankField
736  *
737  * PARAMETERS: Op - Op containing the Field definition and args
738  * RegionNode - Object for the containing Operation Region
739  * WalkState - Current method state
740  *
741  * RETURN: Status
742  *
743  * DESCRIPTION: Create a new bank field in the specified operation region
744  *
745  ******************************************************************************/
746 
749  ACPI_PARSE_OBJECT *Op,
750  ACPI_NAMESPACE_NODE *RegionNode,
751  ACPI_WALK_STATE *WalkState)
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 }
825 
826 
827 /*******************************************************************************
828  *
829  * FUNCTION: AcpiDsCreateIndexField
830  *
831  * PARAMETERS: Op - Op containing the Field definition and args
832  * RegionNode - Object for the containing Operation Region
833  * ` WalkState - Current method state
834  *
835  * RETURN: Status
836  *
837  * DESCRIPTION: Create a new index field in the specified operation region
838  *
839  ******************************************************************************/
840 
843  ACPI_PARSE_OBJECT *Op,
844  ACPI_NAMESPACE_NODE *RegionNode,
845  ACPI_WALK_STATE *WalkState)
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_TEMPORARY
Definition: acnamesp.h:69
#define ACPI_NS_SEARCH_PARENT
Definition: acnamesp.h:63
#define ACPI_FREE(a)
Definition: actypes.h:386
ACPI_STATUS AcpiDsInitFieldObjects(ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
Definition: dsfield.c:617
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
#define AML_INT_ACCESSFIELD_OP
Definition: amlcode.h:208
union acpi_operand_object * Object
Definition: aclocal.h:187
#define ACPI_ALLOCATE_ZEROED(a)
Definition: actypes.h:385
#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
Type
Definition: Type.h:6
#define AE_NO_MEMORY
Definition: acexcep.h:112
ACPI_NAMESPACE_NODE * Node
Definition: acobject.h:203
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
static COORD Position
Definition: mouse.c:34
#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
ACPI_STATUS AcpiDsCreateBankField(ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *RegionNode, ACPI_WALK_STATE *WalkState)
Definition: dsfield.c:748
struct TraceInfo Info
#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
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
ACPI_STATUS AcpiExWriteDataToField(ACPI_OPERAND_OBJECT *SourceDesc, ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT **ResultDesc)
Definition: exfield.c:315
#define ACPI_MODULE_NAME(Name)
Definition: acoutput.h:216
#define ACPI_ADR_SPACE_PLATFORM_COMM
Definition: actypes.h:862
#define AML_INT_EXTACCESSFIELD_OP
Definition: amlcode.h:214
ACPI_STATUS AcpiDsCreateField(ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *RegionNode, ACPI_WALK_STATE *WalkState)
Definition: dsfield.c:534
#define AE_INFO
Definition: acoutput.h:230
smooth NULL
Definition: ftsmooth.c:416
static ACPI_STATUS AcpiDsGetFieldNames(ACPI_CREATE_FIELD_INFO *Info, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg)
Definition: dsfield.c:324
#define AE_AML_BAD_OPCODE
Definition: acexcep.h:180
ACPI_STATUS AcpiExPrepFieldValue(ACPI_CREATE_FIELD_INFO *Info)
Definition: exprep.c:438
ACPI_OBJECT_REGION Region
Definition: acobject.h:525
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
ACPI_PARSE_OBJ_NAMED Named
Definition: aclocal.h:1079
void AcpiDmAddOpToExternalList(ACPI_PARSE_OBJECT *Op, char *Path, UINT8 Type, UINT32 Value, UINT16 Flags)
#define AML_BANK_FIELD_OP
Definition: amlcode.h:187
char * AcpiNsGetExternalPathname(ACPI_NAMESPACE_NODE *Node)
Definition: nsnames.c:70
#define AE_ALREADY_EXISTS
Definition: acexcep.h:115
#define ACPI_UINT32_MAX
Definition: actypes.h:66
#define AML_FIELD_OP
Definition: amlcode.h:181
#define AE_SUPPORT
Definition: acexcep.h:123
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
ACPI_STATUS AcpiDsCreateIndexField(ACPI_PARSE_OBJECT *Op, ACPI_NAMESPACE_NODE *RegionNode, ACPI_WALK_STATE *WalkState)
Definition: dsfield.c:842
#define AE_NOT_FOUND
Definition: acexcep.h:113
#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
#define ACPI_TYPE_ANY
Definition: actypes.h:679
#define AML_INT_CONNECTION_OP
Definition: amlcode.h:213
static const WCHAR Cleanup[]
Definition: register.c:80
struct acpi_namespace_node * MethodNode
Definition: acstruct.h:116
#define AML_INT_NAMEDFIELD_OP
Definition: amlcode.h:206
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
PRTL_UNICODE_STRING_BUFFER Path
#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
#define ACPI_NS_OVERRIDE_IF_FOUND
Definition: acnamesp.h:70
#define AML_INT_RESERVEDFIELD_OP
Definition: amlcode.h:207
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:785
unsigned short UINT16
ACPI_PARSE_OBJECT * AcpiPsGetArg(ACPI_PARSE_OBJECT *op, UINT32 argn)
Definition: pstree.c:76
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
ACPI_OBJECT_REGION_FIELD Field
Definition: acobject.h:532
#define ACPI_TYPE_REGION
Definition: actypes.h:689
#define ACPI_TYPE_LOCAL_BANK_FIELD
Definition: actypes.h:709
#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
UINT16 Opcode
Definition: acstruct.h:78
#define AcpiUtCreateInternalObject(t)
Definition: acutils.h:655
ACPI_STATUS AcpiDsCreateBufferField(ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
Definition: dsfield.c:165
ACPI_OBJECT_BUFFER_FIELD BufferField
Definition: acobject.h:533
unsigned long long UINT64
#define ACPI_PARSE_DEFERRED_OP
Definition: acparser.h:64
#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 memset(x, y, z)
Definition: compat.h:39
#define AE_OK
Definition: acexcep.h:97
UINT32 AmlLength
Definition: acobject.h:483
Definition: dlist.c:348
#define AML_FIELD_ACCESS_TYPE_MASK
Definition: amlcode.h:442