File indexing completed on 2025-05-11 08:24:02
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152 #include "acpi.h"
0153 #include "accommon.h"
0154 #include "acparser.h"
0155 #include "amlcode.h"
0156 #include "acdispat.h"
0157 #include "acinterp.h"
0158 #include "acnamesp.h"
0159 #include "acevents.h"
0160 #ifdef ACPI_EXEC_APP
0161 #include "aecommon.h"
0162 #endif
0163
0164 #define _COMPONENT ACPI_DISPATCHER
0165 ACPI_MODULE_NAME ("dswload2")
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181 ACPI_STATUS
0182 AcpiDsLoad2BeginOp (
0183 ACPI_WALK_STATE *WalkState,
0184 ACPI_PARSE_OBJECT **OutOp)
0185 {
0186 ACPI_PARSE_OBJECT *Op;
0187 ACPI_NAMESPACE_NODE *Node;
0188 ACPI_STATUS Status;
0189 ACPI_OBJECT_TYPE ObjectType;
0190 char *BufferPtr;
0191 UINT32 Flags;
0192
0193
0194 ACPI_FUNCTION_TRACE (DsLoad2BeginOp);
0195
0196
0197 Op = WalkState->Op;
0198 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
0199
0200 if (Op)
0201 {
0202 if ((WalkState->ControlState) &&
0203 (WalkState->ControlState->Common.State ==
0204 ACPI_CONTROL_CONDITIONAL_EXECUTING))
0205 {
0206
0207
0208 Status = AcpiDsExecBeginOp (WalkState, OutOp);
0209 return_ACPI_STATUS (Status);
0210 }
0211
0212
0213
0214 if ((!(WalkState->OpInfo->Flags & AML_NSOPCODE) &&
0215 (WalkState->Opcode != AML_INT_NAMEPATH_OP)) ||
0216 (!(WalkState->OpInfo->Flags & AML_NAMED)))
0217 {
0218 return_ACPI_STATUS (AE_OK);
0219 }
0220
0221
0222
0223 if (WalkState->Opcode == AML_INT_NAMEPATH_OP)
0224 {
0225
0226
0227 BufferPtr = Op->Common.Value.String;
0228 if (!BufferPtr)
0229 {
0230
0231
0232 return_ACPI_STATUS (AE_OK);
0233 }
0234 }
0235 else
0236 {
0237
0238
0239 BufferPtr = ACPI_CAST_PTR (char, &Op->Named.Name);
0240 }
0241 }
0242 else
0243 {
0244
0245
0246 BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState);
0247 }
0248
0249
0250
0251 ObjectType = WalkState->OpInfo->ObjectType;
0252
0253 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
0254 "State=%p Op=%p Type=%X\n", WalkState, Op, ObjectType));
0255
0256 switch (WalkState->Opcode)
0257 {
0258 case AML_FIELD_OP:
0259 case AML_BANK_FIELD_OP:
0260 case AML_INDEX_FIELD_OP:
0261
0262 Node = NULL;
0263 Status = AE_OK;
0264 break;
0265
0266 case AML_INT_NAMEPATH_OP:
0267
0268
0269
0270
0271
0272 Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
0273 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
0274 WalkState, &(Node));
0275 break;
0276
0277 case AML_SCOPE_OP:
0278
0279
0280
0281 if (Op && (Op->Named.Node == AcpiGbl_RootNode))
0282 {
0283 Node = Op->Named.Node;
0284
0285 Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
0286 if (ACPI_FAILURE (Status))
0287 {
0288 return_ACPI_STATUS (Status);
0289 }
0290 }
0291 else
0292 {
0293
0294
0295
0296
0297
0298 Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
0299 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
0300 WalkState, &(Node));
0301 if (ACPI_FAILURE (Status))
0302 {
0303 #ifdef ACPI_ASL_COMPILER
0304 if (Status == AE_NOT_FOUND)
0305 {
0306 Status = AE_OK;
0307 }
0308 else
0309 {
0310 ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
0311 BufferPtr, Status);
0312 }
0313 #else
0314 ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
0315 BufferPtr, Status);
0316 #endif
0317 return_ACPI_STATUS (Status);
0318 }
0319 }
0320
0321
0322
0323
0324
0325 switch (Node->Type)
0326 {
0327 case ACPI_TYPE_ANY:
0328 case ACPI_TYPE_LOCAL_SCOPE:
0329 case ACPI_TYPE_DEVICE:
0330 case ACPI_TYPE_POWER:
0331 case ACPI_TYPE_PROCESSOR:
0332 case ACPI_TYPE_THERMAL:
0333
0334
0335 break;
0336
0337 case ACPI_TYPE_INTEGER:
0338 case ACPI_TYPE_STRING:
0339 case ACPI_TYPE_BUFFER:
0340
0341
0342
0343
0344
0345
0346
0347
0348 ACPI_WARNING ((AE_INFO,
0349 "Type override - [%4.4s] had invalid type (%s) "
0350 "for Scope operator, changed to type ANY",
0351 AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)));
0352
0353 Node->Type = ACPI_TYPE_ANY;
0354 WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
0355 break;
0356
0357 case ACPI_TYPE_METHOD:
0358
0359
0360
0361
0362
0363 if ((Node == AcpiGbl_RootNode) &&
0364 (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
0365 {
0366 break;
0367 }
0368
0369 ACPI_FALLTHROUGH;
0370
0371 default:
0372
0373
0374
0375 ACPI_ERROR ((AE_INFO,
0376 "Invalid type (%s) for target of "
0377 "Scope operator [%4.4s] (Cannot override)",
0378 AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node)));
0379
0380 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0381 }
0382 break;
0383
0384 default:
0385
0386
0387
0388 if (Op && Op->Common.Node)
0389 {
0390
0391
0392 Node = Op->Common.Node;
0393
0394 if (AcpiNsOpensScope (ObjectType))
0395 {
0396 Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
0397 if (ACPI_FAILURE (Status))
0398 {
0399 return_ACPI_STATUS (Status);
0400 }
0401 }
0402
0403 return_ACPI_STATUS (AE_OK);
0404 }
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414 if (WalkState->DeferredNode)
0415 {
0416
0417
0418 Node = WalkState->DeferredNode;
0419 Status = AE_OK;
0420 break;
0421 }
0422
0423 Flags = ACPI_NS_NO_UPSEARCH;
0424 if (WalkState->PassNumber == ACPI_IMODE_EXECUTE)
0425 {
0426
0427
0428 Flags |= ACPI_NS_ERROR_IF_FOUND;
0429
0430 if (!(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
0431 {
0432 Flags |= ACPI_NS_TEMPORARY;
0433 }
0434 }
0435
0436 #ifdef ACPI_ASL_COMPILER
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448 if (WalkState->Opcode == AML_EXTERNAL_OP)
0449 {
0450 Flags |= ACPI_NS_DONT_OPEN_SCOPE;
0451 }
0452 #endif
0453
0454
0455
0456
0457
0458 if (WalkState->OpInfo->Flags & AML_NAMED)
0459 {
0460 Flags |= ACPI_NS_PREFIX_MUST_EXIST;
0461 }
0462
0463
0464
0465 Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
0466 ACPI_IMODE_LOAD_PASS2, Flags, WalkState, &Node);
0467
0468 if (ACPI_SUCCESS (Status) && (Flags & ACPI_NS_TEMPORARY))
0469 {
0470 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
0471 "***New Node [%4.4s] %p is temporary\n",
0472 AcpiUtGetNodeName (Node), Node));
0473 }
0474 break;
0475 }
0476
0477 if (ACPI_FAILURE (Status))
0478 {
0479 ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
0480 BufferPtr, Status);
0481 return_ACPI_STATUS (Status);
0482 }
0483
0484 if (!Op)
0485 {
0486
0487
0488 Op = AcpiPsAllocOp (WalkState->Opcode, WalkState->Aml);
0489 if (!Op)
0490 {
0491 return_ACPI_STATUS (AE_NO_MEMORY);
0492 }
0493
0494
0495
0496 if (Node)
0497 {
0498 Op->Named.Name = Node->Name.Integer;
0499 }
0500 *OutOp = Op;
0501 }
0502
0503
0504
0505
0506
0507 Op->Common.Node = Node;
0508 return_ACPI_STATUS (Status);
0509 }
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525 ACPI_STATUS
0526 AcpiDsLoad2EndOp (
0527 ACPI_WALK_STATE *WalkState)
0528 {
0529 ACPI_PARSE_OBJECT *Op;
0530 ACPI_STATUS Status = AE_OK;
0531 ACPI_OBJECT_TYPE ObjectType;
0532 ACPI_NAMESPACE_NODE *Node;
0533 ACPI_PARSE_OBJECT *Arg;
0534 ACPI_NAMESPACE_NODE *NewNode;
0535 UINT32 i;
0536 UINT8 RegionSpace;
0537 #ifdef ACPI_EXEC_APP
0538 ACPI_OPERAND_OBJECT *ObjDesc;
0539 char *Namepath;
0540 #endif
0541
0542
0543 ACPI_FUNCTION_TRACE (DsLoad2EndOp);
0544
0545 Op = WalkState->Op;
0546 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n",
0547 WalkState->OpInfo->Name, Op, WalkState));
0548
0549
0550
0551 if (!(WalkState->OpInfo->Flags & AML_NSOBJECT))
0552 {
0553 return_ACPI_STATUS (AE_OK);
0554 }
0555
0556 if (Op->Common.AmlOpcode == AML_SCOPE_OP)
0557 {
0558 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
0559 "Ending scope Op=%p State=%p\n", Op, WalkState));
0560 }
0561
0562 ObjectType = WalkState->OpInfo->ObjectType;
0563
0564
0565
0566
0567
0568 Node = Op->Common.Node;
0569
0570
0571
0572
0573
0574 WalkState->Operands[0] = (void *) Node;
0575 WalkState->NumOperands = 1;
0576
0577
0578
0579 if (AcpiNsOpensScope (ObjectType) &&
0580 (Op->Common.AmlOpcode != AML_INT_METHODCALL_OP))
0581 {
0582 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n",
0583 AcpiUtGetTypeName (ObjectType), Op));
0584
0585 Status = AcpiDsScopeStackPop (WalkState);
0586 if (ACPI_FAILURE (Status))
0587 {
0588 goto Cleanup;
0589 }
0590 }
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
0621 "Create-Load [%s] State=%p Op=%p NamedObj=%p\n",
0622 AcpiPsGetOpcodeName (Op->Common.AmlOpcode), WalkState, Op, Node));
0623
0624
0625
0626 Arg = Op->Common.Value.Arg;
0627
0628 switch (WalkState->OpInfo->Type)
0629 {
0630
0631 case AML_TYPE_CREATE_FIELD:
0632
0633
0634
0635
0636 Status = AcpiDsCreateBufferField (Op, WalkState);
0637 if ACPI_FAILURE (Status)
0638 {
0639 ACPI_EXCEPTION ((AE_INFO, Status, "CreateBufferField failure"));
0640 goto Cleanup;
0641 }
0642 break;
0643
0644 case AML_TYPE_NAMED_FIELD:
0645
0646
0647
0648 if (WalkState->MethodNode)
0649 {
0650 Status = AcpiDsInitFieldObjects (Op, WalkState);
0651 }
0652
0653 switch (Op->Common.AmlOpcode)
0654 {
0655 case AML_INDEX_FIELD_OP:
0656
0657 Status = AcpiDsCreateIndexField (
0658 Op, (ACPI_HANDLE) Arg->Common.Node, WalkState);
0659 break;
0660
0661 case AML_BANK_FIELD_OP:
0662
0663 Status = AcpiDsCreateBankField (Op, Arg->Common.Node, WalkState);
0664 break;
0665
0666 case AML_FIELD_OP:
0667
0668 Status = AcpiDsCreateField (Op, Arg->Common.Node, WalkState);
0669 break;
0670
0671 default:
0672
0673
0674 break;
0675 }
0676 break;
0677
0678 case AML_TYPE_NAMED_SIMPLE:
0679
0680 Status = AcpiDsCreateOperands (WalkState, Arg);
0681 if (ACPI_FAILURE (Status))
0682 {
0683 goto Cleanup;
0684 }
0685
0686 switch (Op->Common.AmlOpcode)
0687 {
0688 case AML_PROCESSOR_OP:
0689
0690 Status = AcpiExCreateProcessor (WalkState);
0691 break;
0692
0693 case AML_POWER_RESOURCE_OP:
0694
0695 Status = AcpiExCreatePowerResource (WalkState);
0696 break;
0697
0698 case AML_MUTEX_OP:
0699
0700 Status = AcpiExCreateMutex (WalkState);
0701 break;
0702
0703 case AML_EVENT_OP:
0704
0705 Status = AcpiExCreateEvent (WalkState);
0706 break;
0707
0708 case AML_ALIAS_OP:
0709
0710 Status = AcpiExCreateAlias (WalkState);
0711 break;
0712
0713 default:
0714
0715
0716
0717 Status = AE_OK;
0718 goto Cleanup;
0719 }
0720
0721
0722
0723 for (i = 1; i < WalkState->NumOperands; i++)
0724 {
0725 AcpiUtRemoveReference (WalkState->Operands[i]);
0726 WalkState->Operands[i] = NULL;
0727 }
0728
0729 break;
0730
0731 case AML_TYPE_NAMED_COMPLEX:
0732
0733 switch (Op->Common.AmlOpcode)
0734 {
0735 case AML_REGION_OP:
0736 case AML_DATA_REGION_OP:
0737
0738 if (Op->Common.AmlOpcode == AML_REGION_OP)
0739 {
0740 RegionSpace = (ACPI_ADR_SPACE_TYPE)
0741 ((Op->Common.Value.Arg)->Common.Value.Integer);
0742 }
0743 else
0744 {
0745 RegionSpace = ACPI_ADR_SPACE_DATA_TABLE;
0746 }
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760 if (WalkState->MethodNode)
0761 {
0762
0763
0764
0765
0766 Status = AcpiExCreateRegion (Op->Named.Data,
0767 Op->Named.Length, RegionSpace, WalkState);
0768 if (ACPI_FAILURE (Status))
0769 {
0770 return_ACPI_STATUS (Status);
0771 }
0772 }
0773
0774 Status = AcpiEvInitializeRegion (
0775 AcpiNsGetAttachedObject (Node));
0776 break;
0777
0778 case AML_NAME_OP:
0779
0780 Status = AcpiDsCreateNode (WalkState, Node, Op);
0781 if (ACPI_FAILURE (Status))
0782 {
0783 goto Cleanup;
0784 }
0785
0786 #ifdef ACPI_EXEC_APP
0787
0788
0789
0790
0791 Namepath = AcpiNsGetExternalPathname (Node);
0792 Status = AeLookupInitFileEntry (Namepath, &ObjDesc);
0793 if (ACPI_SUCCESS (Status))
0794 {
0795
0796
0797 if (Node->Object)
0798 {
0799 AcpiNsDetachObject (Node);
0800 }
0801 AcpiNsAttachObject (Node, ObjDesc, ObjDesc->Common.Type);
0802 }
0803 ACPI_FREE (Namepath);
0804 Status = AE_OK;
0805 #endif
0806 break;
0807
0808 case AML_METHOD_OP:
0809
0810
0811
0812
0813
0814
0815
0816
0817 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
0818 "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
0819 WalkState, Op, Op->Named.Node));
0820
0821 if (!AcpiNsGetAttachedObject (Op->Named.Node))
0822 {
0823 WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
0824 WalkState->NumOperands = 1;
0825
0826 Status = AcpiDsCreateOperands (
0827 WalkState, Op->Common.Value.Arg);
0828 if (ACPI_SUCCESS (Status))
0829 {
0830 Status = AcpiExCreateMethod (
0831 Op->Named.Data, Op->Named.Length, WalkState);
0832 }
0833
0834 WalkState->Operands[0] = NULL;
0835 WalkState->NumOperands = 0;
0836
0837 if (ACPI_FAILURE (Status))
0838 {
0839 return_ACPI_STATUS (Status);
0840 }
0841 }
0842 break;
0843
0844
0845 default:
0846
0847
0848 break;
0849 }
0850 break;
0851
0852 case AML_CLASS_INTERNAL:
0853
0854
0855 break;
0856
0857 case AML_CLASS_METHOD_CALL:
0858
0859 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
0860 "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n",
0861 WalkState, Op, Node));
0862
0863
0864
0865
0866 Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
0867 ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS2,
0868 ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
0869 WalkState, &(NewNode));
0870 if (ACPI_SUCCESS (Status))
0871 {
0872
0873
0874
0875
0876
0877 if (NewNode->Type != ACPI_TYPE_METHOD)
0878 {
0879 Status = AE_AML_OPERAND_TYPE;
0880 }
0881
0882
0883
0884
0885
0886 Op->Common.Node = NewNode;
0887 }
0888 else
0889 {
0890 ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
0891 Arg->Common.Value.String, Status);
0892 }
0893 break;
0894
0895
0896 default:
0897
0898 break;
0899 }
0900
0901 Cleanup:
0902
0903
0904
0905 WalkState->Operands[0] = NULL;
0906 WalkState->NumOperands = 0;
0907 return_ACPI_STATUS (Status);
0908 }