File indexing completed on 2025-05-11 08:24:03
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 "acconvert.h"
0157 #include "acnamesp.h"
0158
0159 #define _COMPONENT ACPI_PARSER
0160 ACPI_MODULE_NAME ("psobject")
0161
0162
0163
0164
0165 static ACPI_STATUS
0166 AcpiPsGetAmlOpcode (
0167 ACPI_WALK_STATE *WalkState);
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182 static ACPI_STATUS
0183 AcpiPsGetAmlOpcode (
0184 ACPI_WALK_STATE *WalkState)
0185 {
0186 ACPI_ERROR_ONLY (UINT32 AmlOffset);
0187
0188
0189 ACPI_FUNCTION_TRACE_PTR (PsGetAmlOpcode, WalkState);
0190
0191
0192 WalkState->Aml = WalkState->ParserState.Aml;
0193 WalkState->Opcode = AcpiPsPeekOpcode (&(WalkState->ParserState));
0194
0195
0196
0197
0198
0199
0200
0201 WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
0202
0203 switch (WalkState->OpInfo->Class)
0204 {
0205 case AML_CLASS_ASCII:
0206 case AML_CLASS_PREFIX:
0207
0208
0209
0210
0211 WalkState->Opcode = AML_INT_NAMEPATH_OP;
0212 WalkState->ArgTypes = ARGP_NAMESTRING;
0213 break;
0214
0215 case AML_CLASS_UNKNOWN:
0216
0217
0218
0219 if (WalkState->PassNumber == 2)
0220 {
0221 ACPI_ERROR_ONLY(AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->Aml,
0222 WalkState->ParserState.AmlStart));
0223
0224 ACPI_ERROR ((AE_INFO,
0225 "Unknown opcode 0x%.2X at table offset 0x%.4X, ignoring",
0226 WalkState->Opcode,
0227 (UINT32) (AmlOffset + sizeof (ACPI_TABLE_HEADER))));
0228
0229 ACPI_DUMP_BUFFER ((WalkState->ParserState.Aml - 16), 48);
0230
0231 #ifdef ACPI_ASL_COMPILER
0232
0233
0234
0235
0236 AcpiOsPrintf (
0237 "/*\nError: Unknown opcode 0x%.2X at table offset 0x%.4X, context:\n",
0238 WalkState->Opcode,
0239 (UINT32) (AmlOffset + sizeof (ACPI_TABLE_HEADER)));
0240
0241 ACPI_ERROR ((AE_INFO,
0242 "Aborting disassembly, AML byte code is corrupt"));
0243
0244
0245
0246 AcpiUtDumpBuffer (((UINT8 *) WalkState->ParserState.Aml - 16),
0247 48, DB_BYTE_DISPLAY,
0248 (AmlOffset + sizeof (ACPI_TABLE_HEADER) - 16));
0249 AcpiOsPrintf (" */\n");
0250
0251
0252
0253
0254
0255
0256
0257 return_ACPI_STATUS (AE_AML_BAD_OPCODE);
0258 #endif
0259 }
0260
0261
0262
0263 WalkState->ParserState.Aml++;
0264 if (WalkState->Opcode > 0xFF)
0265 {
0266 WalkState->ParserState.Aml++;
0267 }
0268
0269 return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
0270
0271 default:
0272
0273
0274
0275 WalkState->ParserState.Aml +=
0276 AcpiPsGetOpcodeSize (WalkState->Opcode);
0277 WalkState->ArgTypes = WalkState->OpInfo->ParseArgs;
0278 break;
0279 }
0280
0281 return_ACPI_STATUS (AE_OK);
0282 }
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300 ACPI_STATUS
0301 AcpiPsBuildNamedOp (
0302 ACPI_WALK_STATE *WalkState,
0303 UINT8 *AmlOpStart,
0304 ACPI_PARSE_OBJECT *UnnamedOp,
0305 ACPI_PARSE_OBJECT **Op)
0306 {
0307 ACPI_STATUS Status = AE_OK;
0308 ACPI_PARSE_OBJECT *Arg = NULL;
0309
0310
0311 ACPI_FUNCTION_TRACE_PTR (PsBuildNamedOp, WalkState);
0312
0313
0314 UnnamedOp->Common.Value.Arg = NULL;
0315 UnnamedOp->Common.ArgListLength = 0;
0316 UnnamedOp->Common.AmlOpcode = WalkState->Opcode;
0317
0318
0319
0320
0321
0322 while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) &&
0323 (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) != ARGP_NAME))
0324 {
0325 ASL_CV_CAPTURE_COMMENTS (WalkState);
0326 Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState),
0327 GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);
0328 if (ACPI_FAILURE (Status))
0329 {
0330 return_ACPI_STATUS (Status);
0331 }
0332
0333 AcpiPsAppendArg (UnnamedOp, Arg);
0334 INCREMENT_ARG_LIST (WalkState->ArgTypes);
0335 }
0336
0337
0338
0339 ASL_CV_CAPTURE_COMMENTS (WalkState);
0340
0341 #ifdef ACPI_ASL_COMPILER
0342 if (AcpiGbl_CurrentInlineComment != NULL)
0343 {
0344 UnnamedOp->Common.NameComment = AcpiGbl_CurrentInlineComment;
0345 AcpiGbl_CurrentInlineComment = NULL;
0346 }
0347 #endif
0348
0349
0350
0351
0352 if (!GET_CURRENT_ARG_TYPE (WalkState->ArgTypes))
0353 {
0354 return_ACPI_STATUS (AE_AML_NO_OPERAND);
0355 }
0356
0357
0358
0359 INCREMENT_ARG_LIST (WalkState->ArgTypes);
0360
0361
0362
0363
0364
0365 WalkState->Op = NULL;
0366
0367 Status = WalkState->DescendingCallback (WalkState, Op);
0368 if (ACPI_FAILURE (Status))
0369 {
0370 if (Status != AE_CTRL_TERMINATE)
0371 {
0372 ACPI_EXCEPTION ((AE_INFO, Status, "During name lookup/catalog"));
0373 }
0374 return_ACPI_STATUS (Status);
0375 }
0376
0377 if (!*Op)
0378 {
0379 return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
0380 }
0381
0382 Status = AcpiPsNextParseState (WalkState, *Op, Status);
0383 if (ACPI_FAILURE (Status))
0384 {
0385 if (Status == AE_CTRL_PENDING)
0386 {
0387 Status = AE_CTRL_PARSE_PENDING;
0388 }
0389 return_ACPI_STATUS (Status);
0390 }
0391
0392 AcpiPsAppendArg (*Op, UnnamedOp->Common.Value.Arg);
0393
0394 #ifdef ACPI_ASL_COMPILER
0395
0396
0397
0398 (*Op)->Common.InlineComment = UnnamedOp->Common.InlineComment;
0399 (*Op)->Common.EndNodeComment = UnnamedOp->Common.EndNodeComment;
0400 (*Op)->Common.CloseBraceComment = UnnamedOp->Common.CloseBraceComment;
0401 (*Op)->Common.NameComment = UnnamedOp->Common.NameComment;
0402 (*Op)->Common.CommentList = UnnamedOp->Common.CommentList;
0403 (*Op)->Common.EndBlkComment = UnnamedOp->Common.EndBlkComment;
0404 (*Op)->Common.CvFilename = UnnamedOp->Common.CvFilename;
0405 (*Op)->Common.CvParentFilename = UnnamedOp->Common.CvParentFilename;
0406 (*Op)->Named.Aml = UnnamedOp->Common.Aml;
0407
0408 UnnamedOp->Common.InlineComment = NULL;
0409 UnnamedOp->Common.EndNodeComment = NULL;
0410 UnnamedOp->Common.CloseBraceComment = NULL;
0411 UnnamedOp->Common.NameComment = NULL;
0412 UnnamedOp->Common.CommentList = NULL;
0413 UnnamedOp->Common.EndBlkComment = NULL;
0414 #endif
0415
0416 if ((*Op)->Common.AmlOpcode == AML_REGION_OP ||
0417 (*Op)->Common.AmlOpcode == AML_DATA_REGION_OP)
0418 {
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429 (*Op)->Named.Data = AmlOpStart;
0430 (*Op)->Named.Length = 0;
0431 }
0432
0433 return_ACPI_STATUS (AE_OK);
0434 }
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451 ACPI_STATUS
0452 AcpiPsCreateOp (
0453 ACPI_WALK_STATE *WalkState,
0454 UINT8 *AmlOpStart,
0455 ACPI_PARSE_OBJECT **NewOp)
0456 {
0457 ACPI_STATUS Status = AE_OK;
0458 ACPI_PARSE_OBJECT *Op;
0459 ACPI_PARSE_OBJECT *NamedOp = NULL;
0460 ACPI_PARSE_OBJECT *ParentScope;
0461 UINT8 ArgumentCount;
0462 const ACPI_OPCODE_INFO *OpInfo;
0463
0464
0465 ACPI_FUNCTION_TRACE_PTR (PsCreateOp, WalkState);
0466
0467
0468 Status = AcpiPsGetAmlOpcode (WalkState);
0469 if (Status == AE_CTRL_PARSE_CONTINUE)
0470 {
0471 return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
0472 }
0473 if (ACPI_FAILURE (Status))
0474 {
0475 return_ACPI_STATUS (Status);
0476 }
0477
0478
0479
0480 WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
0481 Op = AcpiPsAllocOp (WalkState->Opcode, AmlOpStart);
0482 if (!Op)
0483 {
0484 return_ACPI_STATUS (AE_NO_MEMORY);
0485 }
0486
0487 if (WalkState->OpInfo->Flags & AML_NAMED)
0488 {
0489 Status = AcpiPsBuildNamedOp (WalkState, AmlOpStart, Op, &NamedOp);
0490 AcpiPsFreeOp (Op);
0491
0492 #ifdef ACPI_ASL_COMPILER
0493 if (AcpiGbl_DisasmFlag && WalkState->Opcode == AML_EXTERNAL_OP &&
0494 Status == AE_NOT_FOUND)
0495 {
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506 WalkState->Aml = WalkState->ParserState.Aml + 2;
0507 WalkState->ParserState.Aml = WalkState->Aml;
0508 return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
0509 }
0510 #endif
0511 if (ACPI_FAILURE (Status))
0512 {
0513 return_ACPI_STATUS (Status);
0514 }
0515
0516 *NewOp = NamedOp;
0517 return_ACPI_STATUS (AE_OK);
0518 }
0519
0520
0521
0522 if (WalkState->OpInfo->Flags & AML_CREATE)
0523 {
0524
0525
0526
0527
0528 Op->Named.Data = AmlOpStart;
0529 Op->Named.Length = 0;
0530 }
0531
0532 if (WalkState->Opcode == AML_BANK_FIELD_OP)
0533 {
0534
0535
0536
0537
0538 Op->Named.Data = AmlOpStart;
0539 Op->Named.Length = 0;
0540 }
0541
0542 ParentScope = AcpiPsGetParentScope (&(WalkState->ParserState));
0543 AcpiPsAppendArg (ParentScope, Op);
0544
0545 if (ParentScope)
0546 {
0547 OpInfo = AcpiPsGetOpcodeInfo (ParentScope->Common.AmlOpcode);
0548 if (OpInfo->Flags & AML_HAS_TARGET)
0549 {
0550 ArgumentCount = AcpiPsGetArgumentCount (OpInfo->Type);
0551 if (ParentScope->Common.ArgListLength > ArgumentCount)
0552 {
0553 Op->Common.Flags |= ACPI_PARSEOP_TARGET;
0554 }
0555 }
0556
0557
0558
0559
0560
0561 else if ((ParentScope->Common.AmlOpcode == AML_INCREMENT_OP) ||
0562 (ParentScope->Common.AmlOpcode == AML_DECREMENT_OP))
0563 {
0564 Op->Common.Flags |= ACPI_PARSEOP_TARGET;
0565 }
0566 }
0567
0568 if (WalkState->DescendingCallback != NULL)
0569 {
0570
0571
0572
0573
0574 WalkState->Op = *NewOp = Op;
0575
0576 Status = WalkState->DescendingCallback (WalkState, &Op);
0577 Status = AcpiPsNextParseState (WalkState, Op, Status);
0578 if (Status == AE_CTRL_PENDING)
0579 {
0580 Status = AE_CTRL_PARSE_PENDING;
0581 }
0582 }
0583
0584 return_ACPI_STATUS (Status);
0585 }
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602 ACPI_STATUS
0603 AcpiPsCompleteOp (
0604 ACPI_WALK_STATE *WalkState,
0605 ACPI_PARSE_OBJECT **Op,
0606 ACPI_STATUS Status)
0607 {
0608 ACPI_STATUS Status2;
0609
0610
0611 ACPI_FUNCTION_TRACE_PTR (PsCompleteOp, WalkState);
0612
0613
0614
0615
0616
0617 WalkState->ParserState.Scope->ParseScope.ArgCount--;
0618
0619
0620
0621 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0622 if (ACPI_FAILURE (Status2))
0623 {
0624 return_ACPI_STATUS (Status2);
0625 }
0626
0627 *Op = NULL;
0628
0629 switch (Status)
0630 {
0631 case AE_OK:
0632
0633 break;
0634
0635 case AE_CTRL_TRANSFER:
0636
0637
0638
0639 WalkState->PrevOp = NULL;
0640 WalkState->PrevArgTypes = WalkState->ArgTypes;
0641 return_ACPI_STATUS (Status);
0642
0643 case AE_CTRL_END:
0644
0645 AcpiPsPopScope (&(WalkState->ParserState), Op,
0646 &WalkState->ArgTypes, &WalkState->ArgCount);
0647
0648 if (*Op)
0649 {
0650 WalkState->Op = *Op;
0651 WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
0652 WalkState->Opcode = (*Op)->Common.AmlOpcode;
0653
0654 Status = WalkState->AscendingCallback (WalkState);
0655 (void) AcpiPsNextParseState (WalkState, *Op, Status);
0656
0657 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0658 if (ACPI_FAILURE (Status2))
0659 {
0660 return_ACPI_STATUS (Status2);
0661 }
0662 }
0663
0664 break;
0665
0666 case AE_CTRL_BREAK:
0667 case AE_CTRL_CONTINUE:
0668
0669
0670
0671 while (!(*Op) || ((*Op)->Common.AmlOpcode != AML_WHILE_OP))
0672 {
0673 AcpiPsPopScope (&(WalkState->ParserState), Op,
0674 &WalkState->ArgTypes, &WalkState->ArgCount);
0675 }
0676
0677
0678
0679 WalkState->Op = *Op;
0680 WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
0681 WalkState->Opcode = (*Op)->Common.AmlOpcode;
0682
0683 Status = WalkState->AscendingCallback (WalkState);
0684 (void) AcpiPsNextParseState (WalkState, *Op, Status);
0685
0686 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0687 if (ACPI_FAILURE (Status2))
0688 {
0689 return_ACPI_STATUS (Status2);
0690 }
0691
0692 break;
0693
0694 case AE_CTRL_TERMINATE:
0695
0696
0697 do
0698 {
0699 if (*Op)
0700 {
0701 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0702 if (ACPI_FAILURE (Status2))
0703 {
0704 return_ACPI_STATUS (Status2);
0705 }
0706
0707 AcpiUtDeleteGenericState (
0708 AcpiUtPopGenericState (&WalkState->ControlState));
0709 }
0710
0711 AcpiPsPopScope (&(WalkState->ParserState), Op,
0712 &WalkState->ArgTypes, &WalkState->ArgCount);
0713
0714 } while (*Op);
0715
0716 return_ACPI_STATUS (AE_OK);
0717
0718 default:
0719
0720 do
0721 {
0722 if (*Op)
0723 {
0724
0725
0726
0727
0728
0729 if (((*Op)->Common.AmlOpcode == AML_REGION_OP) ||
0730 ((*Op)->Common.AmlOpcode == AML_DATA_REGION_OP))
0731 {
0732 AcpiNsDeleteChildren ((*Op)->Common.Node);
0733 AcpiNsRemoveNode ((*Op)->Common.Node);
0734 (*Op)->Common.Node = NULL;
0735 AcpiPsDeleteParseTree (*Op);
0736 }
0737
0738 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0739 if (ACPI_FAILURE (Status2))
0740 {
0741 return_ACPI_STATUS (Status2);
0742 }
0743 }
0744
0745 AcpiPsPopScope (&(WalkState->ParserState), Op,
0746 &WalkState->ArgTypes, &WalkState->ArgCount);
0747
0748 } while (*Op);
0749
0750
0751 #if 0
0752
0753
0754
0755 if (*Op == NULL)
0756 {
0757 AcpiPsPopScope (ParserState, Op,
0758 &WalkState->ArgTypes, &WalkState->ArgCount);
0759 }
0760 #endif
0761 WalkState->PrevOp = NULL;
0762 WalkState->PrevArgTypes = WalkState->ArgTypes;
0763
0764 if (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL)
0765 {
0766
0767
0768
0769
0770
0771
0772
0773
0774 ACPI_INFO (("Ignoring error and continuing table load"));
0775 return_ACPI_STATUS (AE_OK);
0776 }
0777 return_ACPI_STATUS (Status);
0778 }
0779
0780
0781
0782 if (AcpiPsHasCompletedScope (&(WalkState->ParserState)))
0783 {
0784 AcpiPsPopScope (&(WalkState->ParserState), Op,
0785 &WalkState->ArgTypes, &WalkState->ArgCount);
0786 ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *Op));
0787 }
0788 else
0789 {
0790 *Op = NULL;
0791 }
0792
0793 return_ACPI_STATUS (AE_OK);
0794 }
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812 ACPI_STATUS
0813 AcpiPsCompleteFinalOp (
0814 ACPI_WALK_STATE *WalkState,
0815 ACPI_PARSE_OBJECT *Op,
0816 ACPI_STATUS Status)
0817 {
0818 ACPI_STATUS Status2;
0819
0820
0821 ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState);
0822
0823
0824
0825
0826
0827
0828
0829
0830 ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", Op));
0831 do
0832 {
0833 if (Op)
0834 {
0835 if (WalkState->AscendingCallback != NULL)
0836 {
0837 WalkState->Op = Op;
0838 WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
0839 WalkState->Opcode = Op->Common.AmlOpcode;
0840
0841 Status = WalkState->AscendingCallback (WalkState);
0842 Status = AcpiPsNextParseState (WalkState, Op, Status);
0843 if (Status == AE_CTRL_PENDING)
0844 {
0845 Status = AcpiPsCompleteOp (WalkState, &Op, AE_OK);
0846 if (ACPI_FAILURE (Status))
0847 {
0848 return_ACPI_STATUS (Status);
0849 }
0850 }
0851
0852 if (Status == AE_CTRL_TERMINATE)
0853 {
0854 Status = AE_OK;
0855
0856
0857 do
0858 {
0859 if (Op)
0860 {
0861 Status2 = AcpiPsCompleteThisOp (WalkState, Op);
0862 if (ACPI_FAILURE (Status2))
0863 {
0864 return_ACPI_STATUS (Status2);
0865 }
0866 }
0867
0868 AcpiPsPopScope (&(WalkState->ParserState), &Op,
0869 &WalkState->ArgTypes, &WalkState->ArgCount);
0870
0871 } while (Op);
0872
0873 return_ACPI_STATUS (Status);
0874 }
0875
0876 else if (ACPI_FAILURE (Status))
0877 {
0878
0879
0880 (void) AcpiPsCompleteThisOp (WalkState, Op);
0881 return_ACPI_STATUS (Status);
0882 }
0883 }
0884
0885 Status2 = AcpiPsCompleteThisOp (WalkState, Op);
0886 if (ACPI_FAILURE (Status2))
0887 {
0888 return_ACPI_STATUS (Status2);
0889 }
0890 }
0891
0892 AcpiPsPopScope (&(WalkState->ParserState), &Op, &WalkState->ArgTypes,
0893 &WalkState->ArgCount);
0894
0895 } while (Op);
0896
0897 return_ACPI_STATUS (Status);
0898 }