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 "acdispat.h"
0156 #include "acinterp.h"
0157 #include "amlcode.h"
0158 #include "acnamesp.h"
0159
0160
0161 #define _COMPONENT ACPI_EXECUTER
0162 ACPI_MODULE_NAME ("exoparg1")
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199 ACPI_STATUS
0200 AcpiExOpcode_0A_0T_1R (
0201 ACPI_WALK_STATE *WalkState)
0202 {
0203 ACPI_STATUS Status = AE_OK;
0204 ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
0205
0206
0207 ACPI_FUNCTION_TRACE_STR (ExOpcode_0A_0T_1R,
0208 AcpiPsGetOpcodeName (WalkState->Opcode));
0209
0210
0211
0212
0213 switch (WalkState->Opcode)
0214 {
0215 case AML_TIMER_OP:
0216
0217
0218
0219 ReturnDesc = AcpiUtCreateIntegerObject (AcpiOsGetTimer ());
0220 if (!ReturnDesc)
0221 {
0222 Status = AE_NO_MEMORY;
0223 goto Cleanup;
0224 }
0225 break;
0226
0227 default:
0228
0229 ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
0230 WalkState->Opcode));
0231 Status = AE_AML_BAD_OPCODE;
0232 break;
0233 }
0234
0235 Cleanup:
0236
0237
0238
0239 if ((ACPI_FAILURE (Status)) || WalkState->ResultObj)
0240 {
0241 AcpiUtRemoveReference (ReturnDesc);
0242 WalkState->ResultObj = NULL;
0243 }
0244 else
0245 {
0246
0247
0248 WalkState->ResultObj = ReturnDesc;
0249 }
0250
0251 return_ACPI_STATUS (Status);
0252 }
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268 ACPI_STATUS
0269 AcpiExOpcode_1A_0T_0R (
0270 ACPI_WALK_STATE *WalkState)
0271 {
0272 ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
0273 ACPI_STATUS Status = AE_OK;
0274
0275
0276 ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_0R,
0277 AcpiPsGetOpcodeName (WalkState->Opcode));
0278
0279
0280
0281
0282 switch (WalkState->Opcode)
0283 {
0284 case AML_RELEASE_OP:
0285
0286 Status = AcpiExReleaseMutex (Operand[0], WalkState);
0287 break;
0288
0289 case AML_RESET_OP:
0290
0291 Status = AcpiExSystemResetEvent (Operand[0]);
0292 break;
0293
0294 case AML_SIGNAL_OP:
0295
0296 Status = AcpiExSystemSignalEvent (Operand[0]);
0297 break;
0298
0299 case AML_SLEEP_OP:
0300
0301 Status = AcpiExSystemDoSleep (Operand[0]->Integer.Value);
0302 break;
0303
0304 case AML_STALL_OP:
0305
0306 Status = AcpiExSystemDoStall ((UINT32) Operand[0]->Integer.Value);
0307 break;
0308
0309 case AML_UNLOAD_OP:
0310
0311 Status = AcpiExUnloadTable (Operand[0]);
0312 break;
0313
0314 default:
0315
0316 ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
0317 WalkState->Opcode));
0318 Status = AE_AML_BAD_OPCODE;
0319 break;
0320 }
0321
0322 return_ACPI_STATUS (Status);
0323 }
0324
0325
0326 #ifdef _OBSOLETE_CODE
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340 ACPI_STATUS
0341 AcpiExOpcode_1A_1T_0R (
0342 ACPI_WALK_STATE *WalkState)
0343 {
0344 ACPI_STATUS Status = AE_OK;
0345 ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
0346
0347
0348 ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_1T_0R,
0349 AcpiPsGetOpcodeName (WalkState->Opcode));
0350
0351
0352
0353
0354 switch (WalkState->Opcode)
0355 {
0356 #ifdef _OBSOLETE_CODE
0357 case AML_LOAD_OP:
0358
0359 Status = AcpiExLoadOp (Operand[0], Operand[1], WalkState);
0360 break;
0361 #endif
0362
0363 default:
0364
0365 ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
0366 WalkState->Opcode));
0367 Status = AE_AML_BAD_OPCODE;
0368 goto Cleanup;
0369 }
0370
0371
0372 Cleanup:
0373
0374 return_ACPI_STATUS (Status);
0375 }
0376 #endif
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393 ACPI_STATUS
0394 AcpiExOpcode_1A_1T_1R (
0395 ACPI_WALK_STATE *WalkState)
0396 {
0397 ACPI_STATUS Status = AE_OK;
0398 ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
0399 ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
0400 ACPI_OPERAND_OBJECT *ReturnDesc2 = NULL;
0401 UINT32 Temp32;
0402 UINT32 i;
0403 UINT64 PowerOfTen;
0404 UINT64 Digit;
0405
0406
0407 ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_1T_1R,
0408 AcpiPsGetOpcodeName (WalkState->Opcode));
0409
0410
0411
0412
0413 switch (WalkState->Opcode)
0414 {
0415 case AML_BIT_NOT_OP:
0416 case AML_FIND_SET_LEFT_BIT_OP:
0417 case AML_FIND_SET_RIGHT_BIT_OP:
0418 case AML_FROM_BCD_OP:
0419 case AML_LOAD_OP:
0420 case AML_TO_BCD_OP:
0421 case AML_CONDITIONAL_REF_OF_OP:
0422
0423
0424
0425 ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
0426 if (!ReturnDesc)
0427 {
0428 Status = AE_NO_MEMORY;
0429 goto Cleanup;
0430 }
0431
0432 switch (WalkState->Opcode)
0433 {
0434 case AML_BIT_NOT_OP:
0435
0436 ReturnDesc->Integer.Value = ~Operand[0]->Integer.Value;
0437 break;
0438
0439 case AML_FIND_SET_LEFT_BIT_OP:
0440
0441 ReturnDesc->Integer.Value = Operand[0]->Integer.Value;
0442
0443
0444
0445
0446
0447 for (Temp32 = 0; ReturnDesc->Integer.Value &&
0448 Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
0449 {
0450 ReturnDesc->Integer.Value >>= 1;
0451 }
0452
0453 ReturnDesc->Integer.Value = Temp32;
0454 break;
0455
0456 case AML_FIND_SET_RIGHT_BIT_OP:
0457
0458 ReturnDesc->Integer.Value = Operand[0]->Integer.Value;
0459
0460
0461
0462
0463
0464 for (Temp32 = 0; ReturnDesc->Integer.Value &&
0465 Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
0466 {
0467 ReturnDesc->Integer.Value <<= 1;
0468 }
0469
0470
0471
0472 ReturnDesc->Integer.Value =
0473 Temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - Temp32;
0474 break;
0475
0476 case AML_FROM_BCD_OP:
0477
0478
0479
0480
0481
0482 PowerOfTen = 1;
0483 ReturnDesc->Integer.Value = 0;
0484 Digit = Operand[0]->Integer.Value;
0485
0486
0487
0488 for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)
0489 {
0490
0491
0492 Temp32 = ((UINT32) Digit) & 0xF;
0493
0494
0495
0496 if (Temp32 > 9)
0497 {
0498 ACPI_ERROR ((AE_INFO,
0499 "BCD digit too large (not decimal): 0x%X",
0500 Temp32));
0501
0502 Status = AE_AML_NUMERIC_OVERFLOW;
0503 goto Cleanup;
0504 }
0505
0506
0507
0508 ReturnDesc->Integer.Value +=
0509 (((UINT64) Temp32) * PowerOfTen);
0510
0511
0512
0513 Digit >>= 4;
0514
0515
0516
0517 PowerOfTen *= 10;
0518 }
0519 break;
0520
0521 case AML_LOAD_OP:
0522
0523 ReturnDesc->Integer.Value = 0;
0524 Status = AcpiExLoadOp (Operand[0], ReturnDesc, WalkState);
0525 if (ACPI_SUCCESS (Status))
0526 {
0527
0528
0529 ReturnDesc->Integer.Value = 0xFFFFFFFFFFFFFFFF;
0530 }
0531 break;
0532
0533 case AML_TO_BCD_OP:
0534
0535 ReturnDesc->Integer.Value = 0;
0536 Digit = Operand[0]->Integer.Value;
0537
0538
0539
0540 for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)
0541 {
0542 (void) AcpiUtShortDivide (Digit, 10, &Digit, &Temp32);
0543
0544
0545
0546
0547
0548 ReturnDesc->Integer.Value |=
0549 (((UINT64) Temp32) << ACPI_MUL_4 (i));
0550 }
0551
0552
0553
0554 if (Digit > 0)
0555 {
0556 ACPI_ERROR ((AE_INFO,
0557 "Integer too large to convert to BCD: 0x%8.8X%8.8X",
0558 ACPI_FORMAT_UINT64 (Operand[0]->Integer.Value)));
0559 Status = AE_AML_NUMERIC_OVERFLOW;
0560 goto Cleanup;
0561 }
0562 break;
0563
0564 case AML_CONDITIONAL_REF_OF_OP:
0565
0566
0567
0568
0569
0570 if ((ACPI_NAMESPACE_NODE *) Operand[0] == AcpiGbl_RootNode)
0571 {
0572
0573
0574
0575
0576 ReturnDesc->Integer.Value = 0;
0577 goto Cleanup;
0578 }
0579
0580
0581
0582 Status = AcpiExGetObjectReference (Operand[0],
0583 &ReturnDesc2, WalkState);
0584 if (ACPI_FAILURE (Status))
0585 {
0586 goto Cleanup;
0587 }
0588
0589 Status = AcpiExStore (ReturnDesc2, Operand[1], WalkState);
0590 AcpiUtRemoveReference (ReturnDesc2);
0591
0592
0593
0594 ReturnDesc->Integer.Value = ACPI_UINT64_MAX;
0595 goto Cleanup;
0596
0597
0598 default:
0599
0600
0601
0602 break;
0603 }
0604 break;
0605
0606 case AML_STORE_OP:
0607
0608
0609
0610
0611
0612 Status = AcpiExStore (Operand[0], Operand[1], WalkState);
0613 if (ACPI_FAILURE (Status))
0614 {
0615 return_ACPI_STATUS (Status);
0616 }
0617
0618
0619
0620 if (!WalkState->ResultObj)
0621 {
0622
0623
0624
0625
0626
0627
0628 WalkState->ResultObj = Operand[0];
0629 WalkState->Operands[0] = NULL;
0630 }
0631 return_ACPI_STATUS (Status);
0632
0633
0634
0635
0636 case AML_COPY_OBJECT_OP:
0637
0638 Status = AcpiUtCopyIobjectToIobject (
0639 Operand[0], &ReturnDesc, WalkState);
0640 break;
0641
0642 case AML_TO_DECIMAL_STRING_OP:
0643
0644 Status = AcpiExConvertToString (
0645 Operand[0], &ReturnDesc, ACPI_EXPLICIT_CONVERT_DECIMAL);
0646 if (ReturnDesc == Operand[0])
0647 {
0648
0649
0650 AcpiUtAddReference (ReturnDesc);
0651 }
0652 break;
0653
0654 case AML_TO_HEX_STRING_OP:
0655
0656 Status = AcpiExConvertToString (
0657 Operand[0], &ReturnDesc, ACPI_EXPLICIT_CONVERT_HEX);
0658 if (ReturnDesc == Operand[0])
0659 {
0660
0661
0662 AcpiUtAddReference (ReturnDesc);
0663 }
0664 break;
0665
0666 case AML_TO_BUFFER_OP:
0667
0668 Status = AcpiExConvertToBuffer (Operand[0], &ReturnDesc);
0669 if (ReturnDesc == Operand[0])
0670 {
0671
0672
0673 AcpiUtAddReference (ReturnDesc);
0674 }
0675 break;
0676
0677 case AML_TO_INTEGER_OP:
0678
0679
0680
0681 Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc, 0);
0682 if (ReturnDesc == Operand[0])
0683 {
0684
0685
0686 AcpiUtAddReference (ReturnDesc);
0687 }
0688 break;
0689
0690 case AML_SHIFT_LEFT_BIT_OP:
0691 case AML_SHIFT_RIGHT_BIT_OP:
0692
0693
0694
0695 ACPI_ERROR ((AE_INFO,
0696 "%s is obsolete and not implemented",
0697 AcpiPsGetOpcodeName (WalkState->Opcode)));
0698 Status = AE_SUPPORT;
0699 goto Cleanup;
0700
0701 default:
0702
0703 ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
0704 WalkState->Opcode));
0705 Status = AE_AML_BAD_OPCODE;
0706 goto Cleanup;
0707 }
0708
0709 if (ACPI_SUCCESS (Status))
0710 {
0711
0712
0713 Status = AcpiExStore (ReturnDesc, Operand[1], WalkState);
0714 }
0715
0716
0717 Cleanup:
0718
0719
0720
0721 if (ACPI_FAILURE (Status))
0722 {
0723 AcpiUtRemoveReference (ReturnDesc);
0724 }
0725
0726
0727
0728 else if (!WalkState->ResultObj)
0729 {
0730 WalkState->ResultObj = ReturnDesc;
0731 }
0732
0733 return_ACPI_STATUS (Status);
0734 }
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749 ACPI_STATUS
0750 AcpiExOpcode_1A_0T_1R (
0751 ACPI_WALK_STATE *WalkState)
0752 {
0753 ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
0754 ACPI_OPERAND_OBJECT *TempDesc;
0755 ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
0756 ACPI_STATUS Status = AE_OK;
0757 UINT32 Type;
0758 UINT64 Value;
0759
0760
0761 ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_1R,
0762 AcpiPsGetOpcodeName (WalkState->Opcode));
0763
0764
0765
0766
0767 switch (WalkState->Opcode)
0768 {
0769 case AML_LOGICAL_NOT_OP:
0770
0771 ReturnDesc = AcpiUtCreateIntegerObject ((UINT64) 0);
0772 if (!ReturnDesc)
0773 {
0774 Status = AE_NO_MEMORY;
0775 goto Cleanup;
0776 }
0777
0778
0779
0780
0781
0782 if (!Operand[0]->Integer.Value)
0783 {
0784 ReturnDesc->Integer.Value = ACPI_UINT64_MAX;
0785 }
0786 break;
0787
0788 case AML_DECREMENT_OP:
0789 case AML_INCREMENT_OP:
0790
0791
0792
0793
0794 ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
0795 if (!ReturnDesc)
0796 {
0797 Status = AE_NO_MEMORY;
0798 goto Cleanup;
0799 }
0800
0801
0802
0803
0804
0805 TempDesc = Operand[0];
0806 if (ACPI_GET_DESCRIPTOR_TYPE (TempDesc) == ACPI_DESC_TYPE_OPERAND)
0807 {
0808
0809
0810 AcpiUtAddReference (TempDesc);
0811 }
0812
0813
0814
0815
0816
0817
0818
0819
0820 Status = AcpiExResolveOperands (AML_LOGICAL_NOT_OP,
0821 &TempDesc, WalkState);
0822 if (ACPI_FAILURE (Status))
0823 {
0824 ACPI_EXCEPTION ((AE_INFO, Status,
0825 "While resolving operands for [%s]",
0826 AcpiPsGetOpcodeName (WalkState->Opcode)));
0827
0828 goto Cleanup;
0829 }
0830
0831
0832
0833
0834
0835 if (WalkState->Opcode == AML_INCREMENT_OP)
0836 {
0837 ReturnDesc->Integer.Value = TempDesc->Integer.Value + 1;
0838 }
0839 else
0840 {
0841 ReturnDesc->Integer.Value = TempDesc->Integer.Value - 1;
0842 }
0843
0844
0845
0846 AcpiUtRemoveReference (TempDesc);
0847
0848
0849
0850
0851
0852 Status = AcpiExStore (ReturnDesc, Operand[0], WalkState);
0853 break;
0854
0855 case AML_OBJECT_TYPE_OP:
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865 Status = AcpiExResolveMultiple (WalkState, Operand[0], &Type, NULL);
0866 if (ACPI_FAILURE (Status))
0867 {
0868 goto Cleanup;
0869 }
0870
0871
0872
0873 ReturnDesc = AcpiUtCreateIntegerObject ((UINT64) Type);
0874 if (!ReturnDesc)
0875 {
0876 Status = AE_NO_MEMORY;
0877 goto Cleanup;
0878 }
0879 break;
0880
0881 case AML_SIZE_OF_OP:
0882
0883
0884
0885
0886
0887
0888
0889 Status = AcpiExResolveMultiple (
0890 WalkState, Operand[0], &Type, &TempDesc);
0891 if (ACPI_FAILURE (Status))
0892 {
0893 goto Cleanup;
0894 }
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905 switch (Type)
0906 {
0907 case ACPI_TYPE_INTEGER:
0908
0909 Value = AcpiGbl_IntegerByteWidth;
0910 break;
0911
0912 case ACPI_TYPE_STRING:
0913
0914 Value = TempDesc->String.Length;
0915 break;
0916
0917 case ACPI_TYPE_BUFFER:
0918
0919
0920
0921 Status = AcpiDsGetBufferArguments (TempDesc);
0922 Value = TempDesc->Buffer.Length;
0923 break;
0924
0925 case ACPI_TYPE_PACKAGE:
0926
0927
0928
0929 Status = AcpiDsGetPackageArguments (TempDesc);
0930 Value = TempDesc->Package.Count;
0931 break;
0932
0933 default:
0934
0935 ACPI_ERROR ((AE_INFO,
0936 "Operand must be Buffer/Integer/String/Package"
0937 " - found type %s",
0938 AcpiUtGetTypeName (Type)));
0939
0940 Status = AE_AML_OPERAND_TYPE;
0941 goto Cleanup;
0942 }
0943
0944 if (ACPI_FAILURE (Status))
0945 {
0946 goto Cleanup;
0947 }
0948
0949
0950
0951
0952
0953 ReturnDesc = AcpiUtCreateIntegerObject (Value);
0954 if (!ReturnDesc)
0955 {
0956 Status = AE_NO_MEMORY;
0957 goto Cleanup;
0958 }
0959 break;
0960
0961
0962 case AML_REF_OF_OP:
0963
0964 Status = AcpiExGetObjectReference (
0965 Operand[0], &ReturnDesc, WalkState);
0966 if (ACPI_FAILURE (Status))
0967 {
0968 goto Cleanup;
0969 }
0970 break;
0971
0972
0973 case AML_DEREF_OF_OP:
0974
0975
0976
0977 if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
0978 {
0979 TempDesc = AcpiNsGetAttachedObject (
0980 (ACPI_NAMESPACE_NODE *) Operand[0]);
0981 if (TempDesc &&
0982 ((TempDesc->Common.Type == ACPI_TYPE_STRING) ||
0983 (TempDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)))
0984 {
0985 Operand[0] = TempDesc;
0986 AcpiUtAddReference (TempDesc);
0987 }
0988 else
0989 {
0990 Status = AE_AML_OPERAND_TYPE;
0991 goto Cleanup;
0992 }
0993 }
0994 else
0995 {
0996 switch ((Operand[0])->Common.Type)
0997 {
0998 case ACPI_TYPE_LOCAL_REFERENCE:
0999
1000
1001
1002
1003
1004 switch (Operand[0]->Reference.Class)
1005 {
1006 case ACPI_REFCLASS_LOCAL:
1007 case ACPI_REFCLASS_ARG:
1008
1009
1010
1011 Status = AcpiDsMethodDataGetValue (
1012 Operand[0]->Reference.Class,
1013 Operand[0]->Reference.Value,
1014 WalkState, &TempDesc);
1015 if (ACPI_FAILURE (Status))
1016 {
1017 goto Cleanup;
1018 }
1019
1020
1021
1022
1023
1024 AcpiUtRemoveReference (Operand[0]);
1025 Operand[0] = TempDesc;
1026 break;
1027
1028 case ACPI_REFCLASS_REFOF:
1029
1030
1031
1032 TempDesc = Operand[0]->Reference.Object;
1033 AcpiUtRemoveReference (Operand[0]);
1034 Operand[0] = TempDesc;
1035 break;
1036
1037 default:
1038
1039
1040 break;
1041 }
1042 break;
1043
1044 case ACPI_TYPE_STRING:
1045
1046 break;
1047
1048 default:
1049
1050 Status = AE_AML_OPERAND_TYPE;
1051 goto Cleanup;
1052 }
1053 }
1054
1055 if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) != ACPI_DESC_TYPE_NAMED)
1056 {
1057 if ((Operand[0])->Common.Type == ACPI_TYPE_STRING)
1058 {
1059
1060
1061
1062
1063
1064
1065
1066
1067 Status = AcpiNsGetNodeUnlocked (WalkState->ScopeInfo->Scope.Node,
1068 Operand[0]->String.Pointer,
1069 ACPI_NS_SEARCH_PARENT,
1070 ACPI_CAST_INDIRECT_PTR (
1071 ACPI_NAMESPACE_NODE, &ReturnDesc));
1072 if (ACPI_FAILURE (Status))
1073 {
1074 goto Cleanup;
1075 }
1076
1077 Status = AcpiExResolveNodeToValue (
1078 ACPI_CAST_INDIRECT_PTR (
1079 ACPI_NAMESPACE_NODE, &ReturnDesc),
1080 WalkState);
1081 goto Cleanup;
1082 }
1083 }
1084
1085
1086
1087 if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
1088 {
1089
1090
1091
1092
1093
1094
1095
1096 switch (((ACPI_NAMESPACE_NODE *) Operand[0])->Type)
1097 {
1098 case ACPI_TYPE_DEVICE:
1099 case ACPI_TYPE_THERMAL:
1100
1101
1102
1103 ReturnDesc = Operand[0];
1104 break;
1105
1106 default:
1107
1108
1109 ReturnDesc = AcpiNsGetAttachedObject (
1110 (ACPI_NAMESPACE_NODE *) Operand[0]);
1111 AcpiUtAddReference (ReturnDesc);
1112 break;
1113 }
1114 }
1115 else
1116 {
1117
1118
1119
1120
1121 switch (Operand[0]->Reference.Class)
1122 {
1123 case ACPI_REFCLASS_INDEX:
1124
1125
1126
1127
1128 switch (Operand[0]->Reference.TargetType)
1129 {
1130 case ACPI_TYPE_BUFFER_FIELD:
1131
1132 TempDesc = Operand[0]->Reference.Object;
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146 ReturnDesc = AcpiUtCreateIntegerObject ((UINT64)
1147 TempDesc->Buffer.Pointer[Operand[0]->Reference.Value]);
1148 if (!ReturnDesc)
1149 {
1150 Status = AE_NO_MEMORY;
1151 goto Cleanup;
1152 }
1153 break;
1154
1155 case ACPI_TYPE_PACKAGE:
1156
1157
1158
1159
1160 ReturnDesc = *(Operand[0]->Reference.Where);
1161 if (!ReturnDesc)
1162 {
1163
1164
1165
1166
1167
1168 return_ACPI_STATUS (AE_AML_UNINITIALIZED_ELEMENT);
1169 }
1170
1171 AcpiUtAddReference (ReturnDesc);
1172 break;
1173
1174 default:
1175
1176 ACPI_ERROR ((AE_INFO,
1177 "Unknown Index TargetType 0x%X in reference object %p",
1178 Operand[0]->Reference.TargetType, Operand[0]));
1179
1180 Status = AE_AML_OPERAND_TYPE;
1181 goto Cleanup;
1182 }
1183 break;
1184
1185 case ACPI_REFCLASS_REFOF:
1186
1187 ReturnDesc = Operand[0]->Reference.Object;
1188
1189 if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
1190 ACPI_DESC_TYPE_NAMED)
1191 {
1192 ReturnDesc = AcpiNsGetAttachedObject (
1193 (ACPI_NAMESPACE_NODE *) ReturnDesc);
1194 if (!ReturnDesc)
1195 {
1196 break;
1197 }
1198
1199
1200
1201
1202
1203 switch (ReturnDesc->Common.Type)
1204 {
1205 case ACPI_TYPE_BUFFER_FIELD:
1206 case ACPI_TYPE_LOCAL_REGION_FIELD:
1207 case ACPI_TYPE_LOCAL_BANK_FIELD:
1208 case ACPI_TYPE_LOCAL_INDEX_FIELD:
1209
1210 Status = AcpiExReadDataFromField (
1211 WalkState, ReturnDesc, &TempDesc);
1212 if (ACPI_FAILURE (Status))
1213 {
1214 return_ACPI_STATUS (Status);
1215 }
1216
1217 ReturnDesc = TempDesc;
1218 break;
1219
1220 default:
1221
1222
1223
1224 AcpiUtAddReference (ReturnDesc);
1225 break;
1226 }
1227 }
1228 break;
1229
1230 default:
1231
1232 ACPI_ERROR ((AE_INFO,
1233 "Unknown class in reference(%p) - 0x%2.2X",
1234 Operand[0], Operand[0]->Reference.Class));
1235
1236 Status = AE_TYPE;
1237 goto Cleanup;
1238 }
1239 }
1240 break;
1241
1242 default:
1243
1244 ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
1245 WalkState->Opcode));
1246
1247 Status = AE_AML_BAD_OPCODE;
1248 goto Cleanup;
1249 }
1250
1251
1252 Cleanup:
1253
1254
1255
1256 if (ACPI_FAILURE (Status))
1257 {
1258 AcpiUtRemoveReference (ReturnDesc);
1259 }
1260
1261
1262
1263 else
1264 {
1265 WalkState->ResultObj = ReturnDesc;
1266 }
1267
1268 return_ACPI_STATUS (Status);
1269 }