ReactOS  0.4.15-dev-5487-ge7bbbf0
dsopcode.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Module Name: dsopcode - Dispatcher support for regions and fields
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2022, 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 MERCHANTABILITY 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 "acparser.h"
47 #include "amlcode.h"
48 #include "acdispat.h"
49 #include "acinterp.h"
50 #include "acnamesp.h"
51 #include "acevents.h"
52 #include "actables.h"
53 
54 #define _COMPONENT ACPI_DISPATCHER
55  ACPI_MODULE_NAME ("dsopcode")
56 
57 /* Local prototypes */
58 
59 static ACPI_STATUS
61  UINT16 AmlOpcode,
62  ACPI_OPERAND_OBJECT *ObjDesc,
63  ACPI_OPERAND_OBJECT *BufferDesc,
64  ACPI_OPERAND_OBJECT *OffsetDesc,
65  ACPI_OPERAND_OBJECT *LengthDesc,
66  ACPI_OPERAND_OBJECT *ResultDesc);
67 
68 
69 /*******************************************************************************
70  *
71  * FUNCTION: AcpiDsInitializeRegion
72  *
73  * PARAMETERS: ObjHandle - Region namespace node
74  *
75  * RETURN: Status
76  *
77  * DESCRIPTION: Front end to EvInitializeRegion
78  *
79  ******************************************************************************/
80 
83  ACPI_HANDLE ObjHandle)
84 {
85  ACPI_OPERAND_OBJECT *ObjDesc;
87 
88 
89  ObjDesc = AcpiNsGetAttachedObject (ObjHandle);
90 
91  /* Namespace is NOT locked */
92 
93  Status = AcpiEvInitializeRegion (ObjDesc);
94  return (Status);
95 }
96 
97 
98 /*******************************************************************************
99  *
100  * FUNCTION: AcpiDsInitBufferField
101  *
102  * PARAMETERS: AmlOpcode - CreateXxxField
103  * ObjDesc - BufferField object
104  * BufferDesc - Host Buffer
105  * OffsetDesc - Offset into buffer
106  * LengthDesc - Length of field (CREATE_FIELD_OP only)
107  * ResultDesc - Where to store the result
108  *
109  * RETURN: Status
110  *
111  * DESCRIPTION: Perform actual initialization of a buffer field
112  *
113  ******************************************************************************/
114 
115 static ACPI_STATUS
117  UINT16 AmlOpcode,
118  ACPI_OPERAND_OBJECT *ObjDesc,
119  ACPI_OPERAND_OBJECT *BufferDesc,
120  ACPI_OPERAND_OBJECT *OffsetDesc,
121  ACPI_OPERAND_OBJECT *LengthDesc,
122  ACPI_OPERAND_OBJECT *ResultDesc)
123 {
124  UINT32 Offset;
125  UINT32 BitOffset;
126  UINT32 BitCount;
127  UINT8 FieldFlags;
129 
130 
131  ACPI_FUNCTION_TRACE_PTR (DsInitBufferField, ObjDesc);
132 
133 
134  /* Host object must be a Buffer */
135 
136  if (BufferDesc->Common.Type != ACPI_TYPE_BUFFER)
137  {
139  "Target of Create Field is not a Buffer object - %s",
140  AcpiUtGetObjectTypeName (BufferDesc)));
141 
143  goto Cleanup;
144  }
145 
146  /*
147  * The last parameter to all of these opcodes (ResultDesc) started
148  * out as a NameString, and should therefore now be a NS node
149  * after resolution in AcpiExResolveOperands().
150  */
152  {
154  "(%s) destination not a NS Node [%s]",
155  AcpiPsGetOpcodeName (AmlOpcode),
156  AcpiUtGetDescriptorName (ResultDesc)));
157 
159  goto Cleanup;
160  }
161 
162  Offset = (UINT32) OffsetDesc->Integer.Value;
163 
164  /*
165  * Setup the Bit offsets and counts, according to the opcode
166  */
167  switch (AmlOpcode)
168  {
169  case AML_CREATE_FIELD_OP:
170 
171  /* Offset is in bits, count is in bits */
172 
173  FieldFlags = AML_FIELD_ACCESS_BYTE;
174  BitOffset = Offset;
175  BitCount = (UINT32) LengthDesc->Integer.Value;
176 
177  /* Must have a valid (>0) bit count */
178 
179  if (BitCount == 0)
180  {
182  "Attempt to CreateField of length zero"));
184  goto Cleanup;
185  }
186  break;
187 
189 
190  /* Offset is in bits, Field is one bit */
191 
192  BitOffset = Offset;
193  BitCount = 1;
194  FieldFlags = AML_FIELD_ACCESS_BYTE;
195  break;
196 
198 
199  /* Offset is in bytes, field is one byte */
200 
201  BitOffset = 8 * Offset;
202  BitCount = 8;
203  FieldFlags = AML_FIELD_ACCESS_BYTE;
204  break;
205 
207 
208  /* Offset is in bytes, field is one word */
209 
210  BitOffset = 8 * Offset;
211  BitCount = 16;
212  FieldFlags = AML_FIELD_ACCESS_WORD;
213  break;
214 
216 
217  /* Offset is in bytes, field is one dword */
218 
219  BitOffset = 8 * Offset;
220  BitCount = 32;
221  FieldFlags = AML_FIELD_ACCESS_DWORD;
222  break;
223 
225 
226  /* Offset is in bytes, field is one qword */
227 
228  BitOffset = 8 * Offset;
229  BitCount = 64;
230  FieldFlags = AML_FIELD_ACCESS_QWORD;
231  break;
232 
233  default:
234 
236  "Unknown field creation opcode 0x%02X",
237  AmlOpcode));
239  goto Cleanup;
240  }
241 
242  /* Entire field must fit within the current length of the buffer */
243 
244  if ((BitOffset + BitCount) >
245  (8 * (UINT32) BufferDesc->Buffer.Length))
246  {
249  "Field [%4.4s] at bit offset/length %u/%u "
250  "exceeds size of target Buffer (%u bits)",
251  AcpiUtGetNodeName (ResultDesc), BitOffset, BitCount,
252  8 * (UINT32) BufferDesc->Buffer.Length));
253  goto Cleanup;
254  }
255 
256  /*
257  * Initialize areas of the field object that are common to all fields
258  * For FieldFlags, use LOCK_RULE = 0 (NO_LOCK),
259  * UPDATE_RULE = 0 (UPDATE_PRESERVE)
260  */
262  ObjDesc, FieldFlags, 0, BitOffset, BitCount);
263  if (ACPI_FAILURE (Status))
264  {
265  goto Cleanup;
266  }
267 
268  ObjDesc->BufferField.BufferObj = BufferDesc;
269  ObjDesc->BufferField.IsCreateField = AmlOpcode == AML_CREATE_FIELD_OP;
270 
271  /* Reference count for BufferDesc inherits ObjDesc count */
272 
273  BufferDesc->Common.ReferenceCount = (UINT16)
274  (BufferDesc->Common.ReferenceCount + ObjDesc->Common.ReferenceCount);
275 
276 
277 Cleanup:
278 
279  /* Always delete the operands */
280 
281  AcpiUtRemoveReference (OffsetDesc);
282  AcpiUtRemoveReference (BufferDesc);
283 
284  if (AmlOpcode == AML_CREATE_FIELD_OP)
285  {
286  AcpiUtRemoveReference (LengthDesc);
287  }
288 
289  /* On failure, delete the result descriptor */
290 
291  if (ACPI_FAILURE (Status))
292  {
293  AcpiUtRemoveReference (ResultDesc); /* Result descriptor */
294  }
295  else
296  {
297  /* Now the address and length are valid for this BufferField */
298 
299  ObjDesc->BufferField.Flags |= AOPOBJ_DATA_VALID;
300  }
301 
303 }
304 
305 
306 /*******************************************************************************
307  *
308  * FUNCTION: AcpiDsEvalBufferFieldOperands
309  *
310  * PARAMETERS: WalkState - Current walk
311  * Op - A valid BufferField Op object
312  *
313  * RETURN: Status
314  *
315  * DESCRIPTION: Get BufferField Buffer and Index
316  * Called from AcpiDsExecEndOp during BufferField parse tree walk
317  *
318  ******************************************************************************/
319 
322  ACPI_WALK_STATE *WalkState,
323  ACPI_PARSE_OBJECT *Op)
324 {
326  ACPI_OPERAND_OBJECT *ObjDesc;
328  ACPI_PARSE_OBJECT *NextOp;
329 
330 
331  ACPI_FUNCTION_TRACE_PTR (DsEvalBufferFieldOperands, Op);
332 
333 
334  /*
335  * This is where we evaluate the address and length fields of the
336  * CreateXxxField declaration
337  */
338  Node = Op->Common.Node;
339 
340  /* NextOp points to the op that holds the Buffer */
341 
342  NextOp = Op->Common.Value.Arg;
343 
344  /* Evaluate/create the address and length operands */
345 
346  Status = AcpiDsCreateOperands (WalkState, NextOp);
347  if (ACPI_FAILURE (Status))
348  {
350  }
351 
352  ObjDesc = AcpiNsGetAttachedObject (Node);
353  if (!ObjDesc)
354  {
356  }
357 
358  /* Resolve the operands */
359 
361  Op->Common.AmlOpcode, ACPI_WALK_OPERANDS, WalkState);
362  if (ACPI_FAILURE (Status))
363  {
364  ACPI_ERROR ((AE_INFO, "(%s) bad operand(s), status 0x%X",
365  AcpiPsGetOpcodeName (Op->Common.AmlOpcode), Status));
366 
368  }
369 
370  /* Initialize the Buffer Field */
371 
372  if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
373  {
374  /* NOTE: Slightly different operands for this opcode */
375 
376  Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,
377  WalkState->Operands[0], WalkState->Operands[1],
378  WalkState->Operands[2], WalkState->Operands[3]);
379  }
380  else
381  {
382  /* All other, CreateXxxField opcodes */
383 
384  Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,
385  WalkState->Operands[0], WalkState->Operands[1],
386  NULL, WalkState->Operands[2]);
387  }
388 
390 }
391 
392 
393 /*******************************************************************************
394  *
395  * FUNCTION: AcpiDsEvalRegionOperands
396  *
397  * PARAMETERS: WalkState - Current walk
398  * Op - A valid region Op object
399  *
400  * RETURN: Status
401  *
402  * DESCRIPTION: Get region address and length
403  * Called from AcpiDsExecEndOp during OpRegion parse tree walk
404  *
405  ******************************************************************************/
406 
409  ACPI_WALK_STATE *WalkState,
410  ACPI_PARSE_OBJECT *Op)
411 {
413  ACPI_OPERAND_OBJECT *ObjDesc;
414  ACPI_OPERAND_OBJECT *OperandDesc;
416  ACPI_PARSE_OBJECT *NextOp;
418 
419 
420  ACPI_FUNCTION_TRACE_PTR (DsEvalRegionOperands, Op);
421 
422 
423  /*
424  * This is where we evaluate the address and length fields of the
425  * OpRegion declaration
426  */
427  Node = Op->Common.Node;
428 
429  /* NextOp points to the op that holds the SpaceID */
430 
431  NextOp = Op->Common.Value.Arg;
432  SpaceId = (ACPI_ADR_SPACE_TYPE) NextOp->Common.Value.Integer;
433 
434  /* NextOp points to address op */
435 
436  NextOp = NextOp->Common.Next;
437 
438  /* Evaluate/create the address and length operands */
439 
440  Status = AcpiDsCreateOperands (WalkState, NextOp);
441  if (ACPI_FAILURE (Status))
442  {
444  }
445 
446  /* Resolve the length and address operands to numbers */
447 
449  Op->Common.AmlOpcode, ACPI_WALK_OPERANDS, WalkState);
450  if (ACPI_FAILURE (Status))
451  {
453  }
454 
455  ObjDesc = AcpiNsGetAttachedObject (Node);
456  if (!ObjDesc)
457  {
459  }
460 
461  /*
462  * Get the length operand and save it
463  * (at Top of stack)
464  */
465  OperandDesc = WalkState->Operands[WalkState->NumOperands - 1];
466 
467  ObjDesc->Region.Length = (UINT32) OperandDesc->Integer.Value;
468  AcpiUtRemoveReference (OperandDesc);
469 
470  /* A zero-length operation region is unusable. Just warn */
471 
472  if (!ObjDesc->Region.Length && (SpaceId < ACPI_NUM_PREDEFINED_REGIONS))
473  {
475  "Operation Region [%4.4s] has zero length (SpaceId %X)",
476  Node->Name.Ascii, SpaceId));
477  }
478 
479  /*
480  * Get the address and save it
481  * (at top of stack - 1)
482  */
483  OperandDesc = WalkState->Operands[WalkState->NumOperands - 2];
484 
485  ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS)
486  OperandDesc->Integer.Value;
487  AcpiUtRemoveReference (OperandDesc);
488 
489  ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
490  ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
491  ObjDesc->Region.Length));
492 
494  ObjDesc->Region.Address, ObjDesc->Region.Length, Node);
495 
496  /* Now the address and length are valid for this opregion */
497 
498  ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;
500 }
501 
502 
503 /*******************************************************************************
504  *
505  * FUNCTION: AcpiDsEvalTableRegionOperands
506  *
507  * PARAMETERS: WalkState - Current walk
508  * Op - A valid region Op object
509  *
510  * RETURN: Status
511  *
512  * DESCRIPTION: Get region address and length.
513  * Called from AcpiDsExecEndOp during DataTableRegion parse
514  * tree walk.
515  *
516  ******************************************************************************/
517 
520  ACPI_WALK_STATE *WalkState,
521  ACPI_PARSE_OBJECT *Op)
522 {
524  ACPI_OPERAND_OBJECT *ObjDesc;
525  ACPI_OPERAND_OBJECT **Operand;
527  ACPI_PARSE_OBJECT *NextOp;
529  UINT32 TableIndex;
530 
531 
532  ACPI_FUNCTION_TRACE_PTR (DsEvalTableRegionOperands, Op);
533 
534 
535  /*
536  * This is where we evaluate the Signature string, OemId string,
537  * and OemTableId string of the Data Table Region declaration
538  */
539  Node = Op->Common.Node;
540 
541  /* NextOp points to Signature string op */
542 
543  NextOp = Op->Common.Value.Arg;
544 
545  /*
546  * Evaluate/create the Signature string, OemId string,
547  * and OemTableId string operands
548  */
549  Status = AcpiDsCreateOperands (WalkState, NextOp);
550  if (ACPI_FAILURE (Status))
551  {
553  }
554 
555  Operand = &WalkState->Operands[0];
556 
557  /*
558  * Resolve the Signature string, OemId string,
559  * and OemTableId string operands
560  */
562  Op->Common.AmlOpcode, ACPI_WALK_OPERANDS, WalkState);
563  if (ACPI_FAILURE (Status))
564  {
565  goto Cleanup;
566  }
567 
568  /* Find the ACPI table */
569 
571  Operand[0]->String.Pointer,
572  Operand[1]->String.Pointer,
573  Operand[2]->String.Pointer, &TableIndex);
574  if (ACPI_FAILURE (Status))
575  {
576  if (Status == AE_NOT_FOUND)
577  {
579  "ACPI Table [%4.4s] OEM:(%s, %s) not found in RSDT/XSDT",
580  Operand[0]->String.Pointer,
581  Operand[1]->String.Pointer,
582  Operand[2]->String.Pointer));
583  }
584  goto Cleanup;
585  }
586 
587  Status = AcpiGetTableByIndex (TableIndex, &Table);
588  if (ACPI_FAILURE (Status))
589  {
590  goto Cleanup;
591  }
592 
593  ObjDesc = AcpiNsGetAttachedObject (Node);
594  if (!ObjDesc)
595  {
597  goto Cleanup;
598  }
599 
601  ObjDesc->Region.Length = Table->Length;
602  ObjDesc->Region.Pointer = Table;
603 
604  ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
605  ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
606  ObjDesc->Region.Length));
607 
608  /* Now the address and length are valid for this opregion */
609 
610  ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;
611 
612 Cleanup:
613  AcpiUtRemoveReference (Operand[0]);
614  AcpiUtRemoveReference (Operand[1]);
615  AcpiUtRemoveReference (Operand[2]);
616 
618 }
619 
620 
621 /*******************************************************************************
622  *
623  * FUNCTION: AcpiDsEvalDataObjectOperands
624  *
625  * PARAMETERS: WalkState - Current walk
626  * Op - A valid DataObject Op object
627  * ObjDesc - DataObject
628  *
629  * RETURN: Status
630  *
631  * DESCRIPTION: Get the operands and complete the following data object types:
632  * Buffer, Package.
633  *
634  ******************************************************************************/
635 
638  ACPI_WALK_STATE *WalkState,
639  ACPI_PARSE_OBJECT *Op,
640  ACPI_OPERAND_OBJECT *ObjDesc)
641 {
643  ACPI_OPERAND_OBJECT *ArgDesc;
644  UINT32 Length;
645 
646 
647  ACPI_FUNCTION_TRACE (DsEvalDataObjectOperands);
648 
649 
650  /* The first operand (for all of these data objects) is the length */
651 
652  /*
653  * Set proper index into operand stack for AcpiDsObjStackPush
654  * invoked inside AcpiDsCreateOperand.
655  */
656  WalkState->OperandIndex = WalkState->NumOperands;
657 
658  /* Ignore if child is not valid */
659 
660  if (!Op->Common.Value.Arg)
661  {
663  "Missing child while evaluating opcode %4.4X, Op %p",
664  Op->Common.AmlOpcode, Op));
666  }
667 
668  Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
669  if (ACPI_FAILURE (Status))
670  {
672  }
673 
674  Status = AcpiExResolveOperands (WalkState->Opcode,
675  &(WalkState->Operands [WalkState->NumOperands -1]),
676  WalkState);
677  if (ACPI_FAILURE (Status))
678  {
680  }
681 
682  /* Extract length operand */
683 
684  ArgDesc = WalkState->Operands [WalkState->NumOperands - 1];
685  Length = (UINT32) ArgDesc->Integer.Value;
686 
687  /* Cleanup for length operand */
688 
689  Status = AcpiDsObjStackPop (1, WalkState);
690  if (ACPI_FAILURE (Status))
691  {
693  }
694 
695  AcpiUtRemoveReference (ArgDesc);
696 
697  /*
698  * Create the actual data object
699  */
700  switch (Op->Common.AmlOpcode)
701  {
702  case AML_BUFFER_OP:
703 
705  WalkState, Op, Length, &ObjDesc);
706  break;
707 
708  case AML_PACKAGE_OP:
710 
712  WalkState, Op, Length, &ObjDesc);
713  break;
714 
715  default:
716 
718  }
719 
720  if (ACPI_SUCCESS (Status))
721  {
722  /*
723  * Return the object in the WalkState, unless the parent is a package -
724  * in this case, the return object will be stored in the parse tree
725  * for the package.
726  */
727  if ((!Op->Common.Parent) ||
728  ((Op->Common.Parent->Common.AmlOpcode != AML_PACKAGE_OP) &&
729  (Op->Common.Parent->Common.AmlOpcode != AML_VARIABLE_PACKAGE_OP) &&
730  (Op->Common.Parent->Common.AmlOpcode != AML_NAME_OP)))
731  {
732  WalkState->ResultObj = ObjDesc;
733  }
734  }
735 
737 }
738 
739 
740 /*******************************************************************************
741  *
742  * FUNCTION: AcpiDsEvalBankFieldOperands
743  *
744  * PARAMETERS: WalkState - Current walk
745  * Op - A valid BankField Op object
746  *
747  * RETURN: Status
748  *
749  * DESCRIPTION: Get BankField BankValue
750  * Called from AcpiDsExecEndOp during BankField parse tree walk
751  *
752  ******************************************************************************/
753 
756  ACPI_WALK_STATE *WalkState,
757  ACPI_PARSE_OBJECT *Op)
758 {
760  ACPI_OPERAND_OBJECT *ObjDesc;
761  ACPI_OPERAND_OBJECT *OperandDesc;
763  ACPI_PARSE_OBJECT *NextOp;
764  ACPI_PARSE_OBJECT *Arg;
765 
766 
767  ACPI_FUNCTION_TRACE_PTR (DsEvalBankFieldOperands, Op);
768 
769 
770  /*
771  * This is where we evaluate the BankValue field of the
772  * BankField declaration
773  */
774 
775  /* NextOp points to the op that holds the Region */
776 
777  NextOp = Op->Common.Value.Arg;
778 
779  /* NextOp points to the op that holds the Bank Register */
780 
781  NextOp = NextOp->Common.Next;
782 
783  /* NextOp points to the op that holds the Bank Value */
784 
785  NextOp = NextOp->Common.Next;
786 
787  /*
788  * Set proper index into operand stack for AcpiDsObjStackPush
789  * invoked inside AcpiDsCreateOperand.
790  *
791  * We use WalkState->Operands[0] to store the evaluated BankValue
792  */
793  WalkState->OperandIndex = 0;
794 
795  Status = AcpiDsCreateOperand (WalkState, NextOp, 0);
796  if (ACPI_FAILURE (Status))
797  {
799  }
800 
801  Status = AcpiExResolveToValue (&WalkState->Operands[0], WalkState);
802  if (ACPI_FAILURE (Status))
803  {
805  }
806 
808  AcpiPsGetOpcodeName (Op->Common.AmlOpcode), 1);
809  /*
810  * Get the BankValue operand and save it
811  * (at Top of stack)
812  */
813  OperandDesc = WalkState->Operands[0];
814 
815  /* Arg points to the start Bank Field */
816 
817  Arg = AcpiPsGetArg (Op, 4);
818  while (Arg)
819  {
820  /* Ignore OFFSET and ACCESSAS terms here */
821 
822  if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
823  {
824  Node = Arg->Common.Node;
825 
826  ObjDesc = AcpiNsGetAttachedObject (Node);
827  if (!ObjDesc)
828  {
830  }
831 
832  ObjDesc->BankField.Value = (UINT32) OperandDesc->Integer.Value;
833  }
834 
835  /* Move to next field in the list */
836 
837  Arg = Arg->Common.Next;
838  }
839 
840  AcpiUtRemoveReference (OperandDesc);
842 }
ACPI_STATUS AcpiDsCreateOperands(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *FirstArg)
Definition: dsutils.c:753
#define AE_AML_BUFFER_LIMIT
Definition: acexcep.h:189
ACPI_STATUS AcpiDsEvalRegionOperands(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
Definition: dsopcode.c:408
const char * AcpiUtGetDescriptorName(void *Object)
Definition: utdecode.c:382
ACPI_STATUS AcpiEvInitializeRegion(ACPI_OPERAND_OBJECT *RegionObj)
Definition: evrgnini.c:629
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
ASMGENDATA Table[]
Definition: genincdata.c:61
UINT8 ACPI_ADR_SPACE_TYPE
Definition: actypes.h:859
const char * AcpiPsGetOpcodeName(UINT16 Opcode)
Definition: psopinfo.c:169
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
#define AML_CREATE_WORD_FIELD_OP
Definition: amlcode.h:115
UINT8 OperandIndex
Definition: acstruct.h:81
#define AML_CREATE_BYTE_FIELD_OP
Definition: amlcode.h:116
#define ACPI_WARNING(plist)
Definition: acoutput.h:238
UINT8 NumOperands
Definition: acstruct.h:80
ACPI_STATUS AcpiDsBuildInternalPackageObj(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, UINT32 ElementCount, ACPI_OPERAND_OBJECT **ObjDescPtr)
Definition: dspkginit.c:94
#define ACPI_TYPE_BUFFER
Definition: actypes.h:690
#define AE_AML_OPERAND_VALUE
Definition: acexcep.h:183
ACPI_STATUS AcpiDsBuildInternalBufferObj(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, UINT32 BufferLength, ACPI_OPERAND_OBJECT **ObjDescPtr)
Definition: dsobject.c:188
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO BOOLEAN IsCreateField
Definition: acobject.h:385
#define ACPI_DUMP_OPERANDS(a, b, c)
Definition: acoutput.h:486
UINT32 ACPI_STATUS
Definition: actypes.h:460
if(dx==0 &&dy==0)
Definition: linetemp.h:174
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
ACPI_STATUS AcpiDsCreateOperand(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg, UINT32 ArgIndex)
Definition: dsutils.c:497
#define AE_AML_OPERAND_TYPE
Definition: acexcep.h:182
ACPI_STATUS AcpiDsObjStackPop(UINT32 PopCount, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:391
#define AML_VARIABLE_PACKAGE_OP
Definition: amlcode.h:63
ACPI_STATUS AcpiExPrepCommonFieldObject(ACPI_OPERAND_OBJECT *ObjDesc, UINT8 FieldFlags, UINT8 FieldAttribute, UINT32 FieldBitPosition, UINT32 FieldBitLength)
Definition: exprep.c:347
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
#define AML_NAME_OP
Definition: amlcode.h:54
ACPI_STATUS AcpiGetTableByIndex(UINT32 TableIndex, ACPI_TABLE_HEADER **OutTable)
Definition: tbxface.c:491
ACPI_OBJECT_BANK_FIELD BankField
Definition: acobject.h:536
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2430
unsigned int UINT32
union node Node
Definition: types.h:1255
ACPI_STATUS AcpiDsEvalBufferFieldOperands(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
Definition: dsopcode.c:321
#define AML_CREATE_FIELD_OP
Definition: amlcode.h:163
#define ACPI_MODULE_NAME(Name)
Definition: acoutput.h:216
#define AE_INFO
Definition: acoutput.h:230
#define AE_AML_BAD_OPCODE
Definition: acexcep.h:180
#define ACPI_BIOS_ERROR(plist)
Definition: acoutput.h:243
switch(r->id)
Definition: btrfs.c:3046
ACPI_OBJECT_REGION Region
Definition: acobject.h:527
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
Status
Definition: gdiplustypes.h:24
ACPI_STATUS AcpiUtAddAddressRange(ACPI_ADR_SPACE_TYPE SpaceId, ACPI_PHYSICAL_ADDRESS Address, UINT32 Length, ACPI_NAMESPACE_NODE *RegionNode)
Definition: utaddress.c:78
ACPI_STATUS AcpiDsEvalBankFieldOperands(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
Definition: dsopcode.c:755
ACPI_OBJECT_BUFFER Buffer
Definition: acobject.h:522
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx 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 ACPI_HANDLE *OutHandle ACPI_HANDLE *OutHandle void *Context void *Context ACPI_EVENT_HANDLER Handler UINT32 UINT32 ACPI_GPE_HANDLER void *Context UINT32 ACPI_NOTIFY_HANDLER void *Context ACPI_ADR_SPACE_TYPE SpaceId
Definition: acpixf.h:832
union acpi_operand_object * ResultObj
Definition: acstruct.h:121
static ACPI_STATUS AcpiDsInitBufferField(UINT16 AmlOpcode, ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT *BufferDesc, ACPI_OPERAND_OBJECT *OffsetDesc, ACPI_OPERAND_OBJECT *LengthDesc, ACPI_OPERAND_OBJECT *ResultDesc)
Definition: dsopcode.c:116
#define ACPI_BIOS_EXCEPTION(plist)
Definition: acoutput.h:242
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
#define AE_NOT_FOUND
Definition: acexcep.h:113
ACPI_STATUS AcpiDsEvalDataObjectOperands(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, ACPI_OPERAND_OBJECT *ObjDesc)
Definition: dsopcode.c:637
#define AML_CREATE_BIT_FIELD_OP
Definition: amlcode.h:117
#define AE_NOT_EXIST
Definition: acexcep.h:114
ACPI_STATUS AcpiDsEvalTableRegionOperands(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
Definition: dsopcode.c:519
#define ACPI_PTR_TO_PHYSADDR(i)
Definition: actypes.h:559
ACPI_OBJECT_INTEGER Integer
Definition: acobject.h:520
ACPI_STATUS AcpiExResolveToValue(ACPI_OPERAND_OBJECT **StackPtr, ACPI_WALK_STATE *WalkState)
Definition: exresolv.c:79
union acpi_operand_object * BufferObj
Definition: acobject.h:386
static const WCHAR Cleanup[]
Definition: register.c:80
#define AML_CREATE_QWORD_FIELD_OP
Definition: amlcode.h:119
ACPI_OBJECT_STRING String
Definition: acobject.h:521
#define AML_INT_NAMEDFIELD_OP
Definition: amlcode.h:206
#define AML_CREATE_DWORD_FIELD_OP
Definition: amlcode.h:114
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
union acpi_operand_object * Operands[ACPI_OBJ_NUM_OPERANDS+1]
Definition: acstruct.h:105
#define ACPI_DB_EXEC
Definition: acoutput.h:165
ACPI_STATUS AcpiDsInitializeRegion(ACPI_HANDLE ObjHandle)
Definition: dsopcode.c:82
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_FORMAT_UINT64(i)
Definition: acmacros.h:71
ACPI_OBJECT_COMMON Common
Definition: acobject.h:519
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:790
unsigned short UINT16
#define NULL
Definition: types.h:112
ACPI_PARSE_OBJECT * AcpiPsGetArg(ACPI_PARSE_OBJECT *op, UINT32 argn)
Definition: pstree.c:76
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
const char * AcpiUtGetNodeName(void *Object)
Definition: utdecode.c:306
#define AOPOBJ_DATA_VALID
Definition: acobject.h:96
ACPI_PHYSICAL_ADDRESS Address
Definition: acobject.h:206
#define AML_BUFFER_OP
Definition: amlcode.h:61
UINT16 Opcode
Definition: acstruct.h:78
ACPI_OBJECT_BUFFER_FIELD BufferField
Definition: acobject.h:535
#define ACPI_DESC_TYPE_NAMED
Definition: acobject.h:577
#define ACPI_NUM_PREDEFINED_REGIONS
Definition: actypes.h:874
ACPI_STATUS AcpiExResolveOperands(UINT16 Opcode, ACPI_OPERAND_OBJECT **StackPtr, ACPI_WALK_STATE *WalkState)
Definition: exresop.c:145
#define ACPI_WALK_OPERANDS
Definition: acinterp.h:48
unsigned char UINT8
const char * AcpiUtGetObjectTypeName(ACPI_OPERAND_OBJECT *ObjDesc)
Definition: utdecode.c:264
#define AE_OK
Definition: acexcep.h:97
#define AML_PACKAGE_OP
Definition: amlcode.h:62
ACPI_STATUS AcpiTbFindTable(char *Signature, char *OemId, char *OemTableId, UINT32 *TableIndex)
Definition: tbfind.c:70
Definition: dlist.c:348
#define ACPI_GET_DESCRIPTOR_TYPE(d)
Definition: acmacros.h:414