Warning, cross-references for /kernel/drivers/acpica/exresop.c need to be fixed.
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 #define __EXRESOP_C__
0118
0119 #include "acpi.h"
0120 #include "accommon.h"
0121 #include "amlcode.h"
0122 #include "acparser.h"
0123 #include "acinterp.h"
0124 #include "acnamesp.h"
0125
0126
0127 #define _COMPONENT ACPI_EXECUTER
0128 ACPI_MODULE_NAME ("exresop")
0129
0130
0131
0132 static ACPI_STATUS
0133 AcpiExCheckObjectType (
0134 ACPI_OBJECT_TYPE TypeNeeded,
0135 ACPI_OBJECT_TYPE ThisType,
0136 void *Object);
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153 static ACPI_STATUS
0154 AcpiExCheckObjectType (
0155 ACPI_OBJECT_TYPE TypeNeeded,
0156 ACPI_OBJECT_TYPE ThisType,
0157 void *Object)
0158 {
0159 ACPI_FUNCTION_ENTRY ();
0160
0161
0162 if (TypeNeeded == ACPI_TYPE_ANY)
0163 {
0164
0165
0166 return (AE_OK);
0167 }
0168
0169 if (TypeNeeded == ACPI_TYPE_LOCAL_REFERENCE)
0170 {
0171
0172
0173
0174
0175
0176 if ((ThisType == ACPI_TYPE_INTEGER) &&
0177 (((ACPI_OPERAND_OBJECT *) Object)->Common.Flags & AOPOBJ_AML_CONSTANT))
0178 {
0179 return (AE_OK);
0180 }
0181 }
0182
0183 if (TypeNeeded != ThisType)
0184 {
0185 ACPI_ERROR ((AE_INFO,
0186 "Needed type [%s], found [%s] %p",
0187 AcpiUtGetTypeName (TypeNeeded),
0188 AcpiUtGetTypeName (ThisType), Object));
0189
0190 return (AE_AML_OPERAND_TYPE);
0191 }
0192
0193 return (AE_OK);
0194 }
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 ACPI_STATUS
0219 AcpiExResolveOperands (
0220 UINT16 Opcode,
0221 ACPI_OPERAND_OBJECT **StackPtr,
0222 ACPI_WALK_STATE *WalkState)
0223 {
0224 ACPI_OPERAND_OBJECT *ObjDesc;
0225 ACPI_STATUS Status = AE_OK;
0226 UINT8 ObjectType;
0227 UINT32 ArgTypes;
0228 const ACPI_OPCODE_INFO *OpInfo;
0229 UINT32 ThisArgType;
0230 ACPI_OBJECT_TYPE TypeNeeded;
0231 UINT16 TargetOp = 0;
0232
0233
0234 ACPI_FUNCTION_TRACE_U32 (ExResolveOperands, Opcode);
0235
0236
0237 OpInfo = AcpiPsGetOpcodeInfo (Opcode);
0238 if (OpInfo->Class == AML_CLASS_UNKNOWN)
0239 {
0240 return_ACPI_STATUS (AE_AML_BAD_OPCODE);
0241 }
0242
0243 ArgTypes = OpInfo->RuntimeArgs;
0244 if (ArgTypes == ARGI_INVALID_OPCODE)
0245 {
0246 ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
0247 Opcode));
0248
0249 return_ACPI_STATUS (AE_AML_INTERNAL);
0250 }
0251
0252 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
0253 "Opcode %X [%s] RequiredOperandTypes=%8.8X\n",
0254 Opcode, OpInfo->Name, ArgTypes));
0255
0256
0257
0258
0259
0260
0261
0262
0263 while (GET_CURRENT_ARG_TYPE (ArgTypes))
0264 {
0265 if (!StackPtr || !*StackPtr)
0266 {
0267 ACPI_ERROR ((AE_INFO, "Null stack entry at %p",
0268 StackPtr));
0269
0270 return_ACPI_STATUS (AE_AML_INTERNAL);
0271 }
0272
0273
0274
0275 ObjDesc = *StackPtr;
0276
0277
0278
0279 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
0280 {
0281 case ACPI_DESC_TYPE_NAMED:
0282
0283
0284
0285 ObjectType = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
0286
0287
0288
0289
0290
0291
0292 if (ObjectType == ACPI_TYPE_LOCAL_ALIAS)
0293 {
0294 ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
0295 *StackPtr = ObjDesc;
0296 ObjectType = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
0297 }
0298 break;
0299
0300
0301 case ACPI_DESC_TYPE_OPERAND:
0302
0303
0304
0305 ObjectType = ObjDesc->Common.Type;
0306
0307
0308
0309 if (!AcpiUtValidObjectType (ObjectType))
0310 {
0311 ACPI_ERROR ((AE_INFO,
0312 "Bad operand object type [%X]", ObjectType));
0313
0314 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0315 }
0316
0317 if (ObjectType == (UINT8) ACPI_TYPE_LOCAL_REFERENCE)
0318 {
0319
0320
0321 switch (ObjDesc->Reference.Class)
0322 {
0323 case ACPI_REFCLASS_DEBUG:
0324
0325 TargetOp = AML_DEBUG_OP;
0326
0327
0328
0329 case ACPI_REFCLASS_ARG:
0330 case ACPI_REFCLASS_LOCAL:
0331 case ACPI_REFCLASS_INDEX:
0332 case ACPI_REFCLASS_REFOF:
0333 case ACPI_REFCLASS_TABLE:
0334 case ACPI_REFCLASS_NAME:
0335
0336 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
0337 "Operand is a Reference, Class [%s] %2.2X\n",
0338 AcpiUtGetReferenceName (ObjDesc),
0339 ObjDesc->Reference.Class));
0340 break;
0341
0342 default:
0343
0344 ACPI_ERROR ((AE_INFO,
0345 "Unknown Reference Class %2.2X in %p",
0346 ObjDesc->Reference.Class, ObjDesc));
0347
0348 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0349 }
0350 }
0351 break;
0352
0353
0354 default:
0355
0356
0357
0358 ACPI_ERROR ((AE_INFO, "Invalid descriptor %p [%s]",
0359 ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
0360
0361 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0362 }
0363
0364
0365
0366 ThisArgType = GET_CURRENT_ARG_TYPE (ArgTypes);
0367 INCREMENT_ARG_LIST (ArgTypes);
0368
0369
0370
0371
0372
0373 switch (ThisArgType)
0374 {
0375 case ARGI_REF_OR_STRING:
0376
0377 if ((ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) &&
0378 (ObjDesc->Common.Type == ACPI_TYPE_STRING))
0379 {
0380
0381
0382
0383
0384 goto NextOperand;
0385 }
0386
0387
0388
0389
0390
0391
0392
0393 case ARGI_REFERENCE:
0394 case ARGI_INTEGER_REF:
0395 case ARGI_OBJECT_REF:
0396 case ARGI_DEVICE_REF:
0397 case ARGI_TARGETREF:
0398 case ARGI_FIXED_TARGET:
0399 case ARGI_SIMPLE_TARGET:
0400
0401
0402
0403
0404
0405 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
0406 {
0407 goto NextOperand;
0408 }
0409
0410 Status = AcpiExCheckObjectType (ACPI_TYPE_LOCAL_REFERENCE,
0411 ObjectType, ObjDesc);
0412 if (ACPI_FAILURE (Status))
0413 {
0414 return_ACPI_STATUS (Status);
0415 }
0416 goto NextOperand;
0417
0418
0419 case ARGI_DATAREFOBJ:
0420
0421
0422
0423
0424
0425
0426
0427 if ((Opcode == AML_STORE_OP) &&
0428 ((*StackPtr)->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
0429 ((*StackPtr)->Reference.Class == ACPI_REFCLASS_INDEX))
0430 {
0431 goto NextOperand;
0432 }
0433 break;
0434
0435 default:
0436
0437 break;
0438 }
0439
0440
0441
0442
0443 Status = AcpiExResolveToValue (StackPtr, WalkState);
0444 if (ACPI_FAILURE (Status))
0445 {
0446 return_ACPI_STATUS (Status);
0447 }
0448
0449
0450
0451 ObjDesc = *StackPtr;
0452
0453
0454
0455
0456 switch (ThisArgType)
0457 {
0458
0459
0460
0461
0462 case ARGI_MUTEX:
0463
0464
0465
0466 TypeNeeded = ACPI_TYPE_MUTEX;
0467 break;
0468
0469 case ARGI_EVENT:
0470
0471
0472
0473 TypeNeeded = ACPI_TYPE_EVENT;
0474 break;
0475
0476 case ARGI_PACKAGE:
0477
0478
0479
0480 TypeNeeded = ACPI_TYPE_PACKAGE;
0481 break;
0482
0483 case ARGI_ANYTYPE:
0484
0485
0486
0487 TypeNeeded = ACPI_TYPE_ANY;
0488 break;
0489
0490 case ARGI_DDBHANDLE:
0491
0492
0493
0494 TypeNeeded = ACPI_TYPE_LOCAL_REFERENCE;
0495 break;
0496
0497
0498
0499
0500
0501 case ARGI_INTEGER:
0502
0503
0504
0505
0506
0507
0508 Status = AcpiExConvertToInteger (ObjDesc, StackPtr, 16);
0509 if (ACPI_FAILURE (Status))
0510 {
0511 if (Status == AE_TYPE)
0512 {
0513 ACPI_ERROR ((AE_INFO,
0514 "Needed [Integer/String/Buffer], found [%s] %p",
0515 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0516
0517 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0518 }
0519
0520 return_ACPI_STATUS (Status);
0521 }
0522
0523 if (ObjDesc != *StackPtr)
0524 {
0525 AcpiUtRemoveReference (ObjDesc);
0526 }
0527 goto NextOperand;
0528
0529
0530 case ARGI_BUFFER:
0531
0532
0533
0534
0535
0536
0537 Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);
0538 if (ACPI_FAILURE (Status))
0539 {
0540 if (Status == AE_TYPE)
0541 {
0542 ACPI_ERROR ((AE_INFO,
0543 "Needed [Integer/String/Buffer], found [%s] %p",
0544 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0545
0546 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0547 }
0548
0549 return_ACPI_STATUS (Status);
0550 }
0551
0552 if (ObjDesc != *StackPtr)
0553 {
0554 AcpiUtRemoveReference (ObjDesc);
0555 }
0556 goto NextOperand;
0557
0558
0559 case ARGI_STRING:
0560
0561
0562
0563
0564
0565
0566 Status = AcpiExConvertToString (ObjDesc, StackPtr,
0567 ACPI_IMPLICIT_CONVERT_HEX);
0568 if (ACPI_FAILURE (Status))
0569 {
0570 if (Status == AE_TYPE)
0571 {
0572 ACPI_ERROR ((AE_INFO,
0573 "Needed [Integer/String/Buffer], found [%s] %p",
0574 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0575
0576 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0577 }
0578
0579 return_ACPI_STATUS (Status);
0580 }
0581
0582 if (ObjDesc != *StackPtr)
0583 {
0584 AcpiUtRemoveReference (ObjDesc);
0585 }
0586 goto NextOperand;
0587
0588
0589 case ARGI_COMPUTEDATA:
0590
0591
0592
0593 switch (ObjDesc->Common.Type)
0594 {
0595 case ACPI_TYPE_INTEGER:
0596 case ACPI_TYPE_STRING:
0597 case ACPI_TYPE_BUFFER:
0598
0599
0600 break;
0601
0602 default:
0603 ACPI_ERROR ((AE_INFO,
0604 "Needed [Integer/String/Buffer], found [%s] %p",
0605 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0606
0607 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0608 }
0609 goto NextOperand;
0610
0611
0612 case ARGI_BUFFER_OR_STRING:
0613
0614
0615
0616 switch (ObjDesc->Common.Type)
0617 {
0618 case ACPI_TYPE_STRING:
0619 case ACPI_TYPE_BUFFER:
0620
0621
0622 break;
0623
0624 case ACPI_TYPE_INTEGER:
0625
0626
0627
0628 Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);
0629 if (ACPI_FAILURE (Status))
0630 {
0631 return_ACPI_STATUS (Status);
0632 }
0633
0634 if (ObjDesc != *StackPtr)
0635 {
0636 AcpiUtRemoveReference (ObjDesc);
0637 }
0638 break;
0639
0640 default:
0641 ACPI_ERROR ((AE_INFO,
0642 "Needed [Integer/String/Buffer], found [%s] %p",
0643 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0644
0645 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0646 }
0647 goto NextOperand;
0648
0649
0650 case ARGI_DATAOBJECT:
0651
0652
0653
0654
0655
0656
0657
0658 switch (ObjDesc->Common.Type)
0659 {
0660 case ACPI_TYPE_PACKAGE:
0661 case ACPI_TYPE_STRING:
0662 case ACPI_TYPE_BUFFER:
0663 case ACPI_TYPE_LOCAL_REFERENCE:
0664
0665
0666 break;
0667
0668 default:
0669 ACPI_ERROR ((AE_INFO,
0670 "Needed [Buffer/String/Package/Reference], found [%s] %p",
0671 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0672
0673 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0674 }
0675 goto NextOperand;
0676
0677
0678 case ARGI_COMPLEXOBJ:
0679
0680
0681
0682 switch (ObjDesc->Common.Type)
0683 {
0684 case ACPI_TYPE_PACKAGE:
0685 case ACPI_TYPE_STRING:
0686 case ACPI_TYPE_BUFFER:
0687
0688
0689 break;
0690
0691 default:
0692 ACPI_ERROR ((AE_INFO,
0693 "Needed [Buffer/String/Package], found [%s] %p",
0694 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0695
0696 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0697 }
0698 goto NextOperand;
0699
0700
0701 case ARGI_REGION_OR_BUFFER:
0702
0703
0704
0705 switch (ObjDesc->Common.Type)
0706 {
0707 case ACPI_TYPE_BUFFER:
0708 case ACPI_TYPE_REGION:
0709
0710
0711 break;
0712
0713 default:
0714 ACPI_ERROR ((AE_INFO,
0715 "Needed [Region/Buffer], found [%s] %p",
0716 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0717
0718 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0719 }
0720 goto NextOperand;
0721
0722
0723 case ARGI_DATAREFOBJ:
0724
0725
0726
0727 switch (ObjDesc->Common.Type)
0728 {
0729 case ACPI_TYPE_INTEGER:
0730 case ACPI_TYPE_PACKAGE:
0731 case ACPI_TYPE_STRING:
0732 case ACPI_TYPE_BUFFER:
0733 case ACPI_TYPE_BUFFER_FIELD:
0734 case ACPI_TYPE_LOCAL_REFERENCE:
0735 case ACPI_TYPE_LOCAL_REGION_FIELD:
0736 case ACPI_TYPE_LOCAL_BANK_FIELD:
0737 case ACPI_TYPE_LOCAL_INDEX_FIELD:
0738 case ACPI_TYPE_DDB_HANDLE:
0739
0740
0741 break;
0742
0743 default:
0744
0745 if (AcpiGbl_EnableInterpreterSlack)
0746 {
0747
0748
0749
0750
0751
0752 break;
0753 }
0754
0755 if (TargetOp == AML_DEBUG_OP)
0756 {
0757
0758
0759 break;
0760 }
0761
0762 ACPI_ERROR ((AE_INFO,
0763 "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p",
0764 AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
0765
0766 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0767 }
0768 goto NextOperand;
0769
0770
0771 default:
0772
0773
0774
0775 ACPI_ERROR ((AE_INFO,
0776 "Internal - Unknown ARGI (required operand) type %X",
0777 ThisArgType));
0778
0779 return_ACPI_STATUS (AE_BAD_PARAMETER);
0780 }
0781
0782
0783
0784
0785
0786 Status = AcpiExCheckObjectType (TypeNeeded,
0787 (*StackPtr)->Common.Type, *StackPtr);
0788 if (ACPI_FAILURE (Status))
0789 {
0790 return_ACPI_STATUS (Status);
0791 }
0792
0793 NextOperand:
0794
0795
0796
0797
0798 if (GET_CURRENT_ARG_TYPE (ArgTypes))
0799 {
0800 StackPtr--;
0801 }
0802 }
0803
0804 ACPI_DUMP_OPERANDS (WalkState->Operands,
0805 AcpiPsGetOpcodeName (Opcode), WalkState->NumOperands);
0806
0807 return_ACPI_STATUS (Status);
0808 }
0809
0810