ReactOS 0.4.15-dev-6056-gb29b268
dsopcode.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 "acevents.h"
#include "actables.h"
Include dependency graph for dsopcode.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_DISPATCHER
 

Functions

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)
 
ACPI_STATUS AcpiDsInitializeRegion (ACPI_HANDLE ObjHandle)
 
ACPI_STATUS AcpiDsEvalBufferFieldOperands (ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
 
ACPI_STATUS AcpiDsEvalRegionOperands (ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
 
ACPI_STATUS AcpiDsEvalTableRegionOperands (ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
 
ACPI_STATUS AcpiDsEvalDataObjectOperands (ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, ACPI_OPERAND_OBJECT *ObjDesc)
 
ACPI_STATUS AcpiDsEvalBankFieldOperands (ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_DISPATCHER

Definition at line 54 of file dsopcode.c.

Function Documentation

◆ AcpiDsEvalBankFieldOperands()

ACPI_STATUS AcpiDsEvalBankFieldOperands ( ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT Op 
)

Definition at line 755 of file dsopcode.c.

758{
760 ACPI_OPERAND_OBJECT *ObjDesc;
761 ACPI_OPERAND_OBJECT *OperandDesc;
763 ACPI_PARSE_OBJECT *NextOp;
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}
unsigned int UINT32
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
#define AE_NOT_EXIST
Definition: acexcep.h:114
#define ACPI_WALK_OPERANDS
Definition: acinterp.h:48
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
#define ACPI_FUNCTION_TRACE_PTR(a, b)
Definition: acoutput.h:481
#define ACPI_DUMP_OPERANDS(a, b, c)
Definition: acoutput.h:486
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
const char * AcpiPsGetOpcodeName(UINT16 Opcode)
Definition: psopinfo.c:169
ACPI_PARSE_OBJECT * AcpiPsGetArg(ACPI_PARSE_OBJECT *op, UINT32 argn)
Definition: pstree.c:76
UINT32 ACPI_STATUS
Definition: actypes.h:460
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:790
#define AML_INT_NAMEDFIELD_OP
Definition: amlcode.h:206
union node Node
Definition: types.h:1255
ACPI_STATUS AcpiDsCreateOperand(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Arg, UINT32 ArgIndex)
Definition: dsutils.c:497
ACPI_STATUS AcpiExResolveToValue(ACPI_OPERAND_OBJECT **StackPtr, ACPI_WALK_STATE *WalkState)
Definition: exresolv.c:79
Status
Definition: gdiplustypes.h:25
union acpi_operand_object * Operands[ACPI_OBJ_NUM_OPERANDS+1]
Definition: acstruct.h:105
UINT8 OperandIndex
Definition: acstruct.h:81
ACPI_OBJECT_BANK_FIELD BankField
Definition: acobject.h:536
ACPI_OBJECT_INTEGER Integer
Definition: acobject.h:520
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
Definition: dlist.c:348

Referenced by AcpiDsExecEndOp().

◆ AcpiDsEvalBufferFieldOperands()

ACPI_STATUS AcpiDsEvalBufferFieldOperands ( ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT Op 
)

Definition at line 321 of file dsopcode.c.

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}
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define AE_INFO
Definition: acoutput.h:230
#define AML_CREATE_FIELD_OP
Definition: amlcode.h:163
#define NULL
Definition: types.h:112
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
ACPI_STATUS AcpiDsCreateOperands(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *FirstArg)
Definition: dsutils.c:753
ACPI_STATUS AcpiExResolveOperands(UINT16 Opcode, ACPI_OPERAND_OBJECT **StackPtr, ACPI_WALK_STATE *WalkState)
Definition: exresop.c:145

Referenced by AcpiDsExecEndOp().

◆ AcpiDsEvalDataObjectOperands()

ACPI_STATUS AcpiDsEvalDataObjectOperands ( ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT Op,
ACPI_OPERAND_OBJECT ObjDesc 
)

Definition at line 637 of file dsopcode.c.

641{
643 ACPI_OPERAND_OBJECT *ArgDesc;
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}
#define AE_AML_BAD_OPCODE
Definition: acexcep.h:180
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
#define AE_OK
Definition: acexcep.h:97
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define AML_VARIABLE_PACKAGE_OP
Definition: amlcode.h:63
#define AML_NAME_OP
Definition: amlcode.h:54
#define AML_BUFFER_OP
Definition: amlcode.h:61
#define AML_PACKAGE_OP
Definition: amlcode.h:62
ACPI_STATUS AcpiDsBuildInternalBufferObj(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, UINT32 BufferLength, ACPI_OPERAND_OBJECT **ObjDescPtr)
Definition: dsobject.c:188
ACPI_STATUS AcpiDsBuildInternalPackageObj(ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op, UINT32 ElementCount, ACPI_OPERAND_OBJECT **ObjDescPtr)
Definition: dspkginit.c:94
ACPI_STATUS AcpiDsObjStackPop(UINT32 PopCount, ACPI_WALK_STATE *WalkState)
Definition: dswstate.c:391
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
union acpi_operand_object * ResultObj
Definition: acstruct.h:121
UINT16 Opcode
Definition: acstruct.h:78
UINT8 NumOperands
Definition: acstruct.h:80

Referenced by AcpiDsExecEndOp().

◆ AcpiDsEvalRegionOperands()

ACPI_STATUS AcpiDsEvalRegionOperands ( ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT Op 
)

Definition at line 408 of file dsopcode.c.

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
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}
#define ACPI_FORMAT_UINT64(i)
Definition: acmacros.h:71
#define AOPOBJ_DATA_VALID
Definition: acobject.h:96
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define ACPI_WARNING(plist)
Definition: acoutput.h:238
#define ACPI_DB_EXEC
Definition: acoutput.h:165
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
UINT8 ACPI_ADR_SPACE_TYPE
Definition: actypes.h:859
#define ACPI_NUM_PREDEFINED_REGIONS
Definition: actypes.h:874
ACPI_STATUS AcpiUtAddAddressRange(ACPI_ADR_SPACE_TYPE SpaceId, ACPI_PHYSICAL_ADDRESS Address, UINT32 Length, ACPI_NAMESPACE_NODE *RegionNode)
Definition: utaddress.c:78
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
ACPI_PHYSICAL_ADDRESS Address
Definition: acobject.h:206
ACPI_OBJECT_REGION Region
Definition: acobject.h:527

Referenced by AcpiDsExecEndOp().

◆ AcpiDsEvalTableRegionOperands()

ACPI_STATUS AcpiDsEvalTableRegionOperands ( ACPI_WALK_STATE WalkState,
ACPI_PARSE_OBJECT Op 
)

Definition at line 519 of file dsopcode.c.

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
612Cleanup:
613 AcpiUtRemoveReference (Operand[0]);
614 AcpiUtRemoveReference (Operand[1]);
615 AcpiUtRemoveReference (Operand[2]);
616
618}
#define AE_NOT_FOUND
Definition: acexcep.h:113
ACPI_STATUS AcpiTbFindTable(char *Signature, char *OemId, char *OemTableId, UINT32 *TableIndex)
Definition: tbfind.c:70
#define ACPI_PTR_TO_PHYSADDR(i)
Definition: actypes.h:559
static const WCHAR Cleanup[]
Definition: register.c:80
ASMGENDATA Table[]
Definition: genincdata.c:61
ACPI_STATUS AcpiGetTableByIndex(UINT32 TableIndex, ACPI_TABLE_HEADER **OutTable)
Definition: tbxface.c:491
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433

Referenced by AcpiDsExecEndOp().

◆ AcpiDsInitBufferField()

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 
)
static

Definition at line 116 of file dsopcode.c.

123{
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 {
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
277Cleanup:
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}
unsigned short UINT16
unsigned char UINT8
#define AE_AML_OPERAND_VALUE
Definition: acexcep.h:183
#define AE_AML_BUFFER_LIMIT
Definition: acexcep.h:189
#define AE_AML_OPERAND_TYPE
Definition: acexcep.h:182
#define ACPI_GET_DESCRIPTOR_TYPE(d)
Definition: acmacros.h:414
#define ACPI_DESC_TYPE_NAMED
Definition: acobject.h:577
#define ACPI_BIOS_EXCEPTION(plist)
Definition: acoutput.h:242
#define ACPI_BIOS_ERROR(plist)
Definition: acoutput.h:243
#define ACPI_TYPE_BUFFER
Definition: actypes.h:690
const char * AcpiUtGetNodeName(void *Object)
Definition: utdecode.c:306
const char * AcpiUtGetObjectTypeName(ACPI_OPERAND_OBJECT *ObjDesc)
Definition: utdecode.c:264
const char * AcpiUtGetDescriptorName(void *Object)
Definition: utdecode.c:382
#define AML_CREATE_BIT_FIELD_OP
Definition: amlcode.h:117
@ AML_FIELD_ACCESS_BYTE
Definition: amlcode.h:452
@ AML_FIELD_ACCESS_WORD
Definition: amlcode.h:453
@ AML_FIELD_ACCESS_DWORD
Definition: amlcode.h:454
@ AML_FIELD_ACCESS_QWORD
Definition: amlcode.h:455
#define AML_CREATE_DWORD_FIELD_OP
Definition: amlcode.h:114
#define AML_CREATE_BYTE_FIELD_OP
Definition: amlcode.h:116
#define AML_CREATE_WORD_FIELD_OP
Definition: amlcode.h:115
#define AML_CREATE_QWORD_FIELD_OP
Definition: amlcode.h:119
switch(r->id)
Definition: btrfs.c:3046
ACPI_STATUS AcpiExPrepCommonFieldObject(ACPI_OPERAND_OBJECT *ObjDesc, UINT8 FieldFlags, UINT8 FieldAttribute, UINT32 FieldBitPosition, UINT32 FieldBitLength)
Definition: exprep.c:347
if(dx< 0)
Definition: linetemp.h:194
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
union acpi_operand_object * BufferObj
Definition: acobject.h:386
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO BOOLEAN IsCreateField
Definition: acobject.h:385
ACPI_OBJECT_BUFFER_FIELD BufferField
Definition: acobject.h:535
ACPI_OBJECT_COMMON Common
Definition: acobject.h:519
ACPI_OBJECT_BUFFER Buffer
Definition: acobject.h:522

Referenced by AcpiDsEvalBufferFieldOperands().

◆ AcpiDsInitializeRegion()

ACPI_STATUS AcpiDsInitializeRegion ( ACPI_HANDLE  ObjHandle)

Definition at line 82 of file dsopcode.c.

84{
85 ACPI_OPERAND_OBJECT *ObjDesc;
87
88
89 ObjDesc = AcpiNsGetAttachedObject (ObjHandle);
90
91 /* Namespace is NOT locked */
92
94 return (Status);
95}
ACPI_STATUS AcpiEvInitializeRegion(ACPI_OPERAND_OBJECT *RegionObj)
Definition: evrgnini.c:629

Referenced by AcpiDsInitOneObject().