Warning, cross-references for /kernel/drivers/acpica/psloop.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
0118
0119
0120
0121
0122
0123
0124
0125 #include "acpi.h"
0126 #include "accommon.h"
0127 #include "acparser.h"
0128 #include "acdispat.h"
0129 #include "amlcode.h"
0130
0131 #define _COMPONENT ACPI_PARSER
0132 ACPI_MODULE_NAME ("psloop")
0133
0134 static UINT32 AcpiGbl_Depth = 0;
0135
0136
0137
0138
0139 static ACPI_STATUS
0140 AcpiPsGetAmlOpcode (
0141 ACPI_WALK_STATE *WalkState);
0142
0143 static ACPI_STATUS
0144 AcpiPsBuildNamedOp (
0145 ACPI_WALK_STATE *WalkState,
0146 UINT8 *AmlOpStart,
0147 ACPI_PARSE_OBJECT *UnnamedOp,
0148 ACPI_PARSE_OBJECT **Op);
0149
0150 static ACPI_STATUS
0151 AcpiPsCreateOp (
0152 ACPI_WALK_STATE *WalkState,
0153 UINT8 *AmlOpStart,
0154 ACPI_PARSE_OBJECT **NewOp);
0155
0156 static ACPI_STATUS
0157 AcpiPsGetArguments (
0158 ACPI_WALK_STATE *WalkState,
0159 UINT8 *AmlOpStart,
0160 ACPI_PARSE_OBJECT *Op);
0161
0162 static ACPI_STATUS
0163 AcpiPsCompleteOp (
0164 ACPI_WALK_STATE *WalkState,
0165 ACPI_PARSE_OBJECT **Op,
0166 ACPI_STATUS Status);
0167
0168 static ACPI_STATUS
0169 AcpiPsCompleteFinalOp (
0170 ACPI_WALK_STATE *WalkState,
0171 ACPI_PARSE_OBJECT *Op,
0172 ACPI_STATUS Status);
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187 static ACPI_STATUS
0188 AcpiPsGetAmlOpcode (
0189 ACPI_WALK_STATE *WalkState)
0190 {
0191
0192 ACPI_FUNCTION_TRACE_PTR (PsGetAmlOpcode, WalkState);
0193
0194
0195 WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->ParserState.Aml,
0196 WalkState->ParserState.AmlStart);
0197 WalkState->Opcode = AcpiPsPeekOpcode (&(WalkState->ParserState));
0198
0199
0200
0201
0202
0203
0204
0205 WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
0206
0207 switch (WalkState->OpInfo->Class)
0208 {
0209 case AML_CLASS_ASCII:
0210 case AML_CLASS_PREFIX:
0211
0212
0213
0214
0215 WalkState->Opcode = AML_INT_NAMEPATH_OP;
0216 WalkState->ArgTypes = ARGP_NAMESTRING;
0217 break;
0218
0219 case AML_CLASS_UNKNOWN:
0220
0221
0222
0223 ACPI_ERROR ((AE_INFO,
0224 "Found unknown opcode %X at AML address %p offset %X, ignoring",
0225 WalkState->Opcode, WalkState->ParserState.Aml, WalkState->AmlOffset));
0226
0227 ACPI_DUMP_BUFFER (WalkState->ParserState.Aml, 128);
0228
0229
0230
0231 WalkState->ParserState.Aml++;
0232 return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
0233
0234 default:
0235
0236
0237
0238 WalkState->ParserState.Aml += AcpiPsGetOpcodeSize (WalkState->Opcode);
0239 WalkState->ArgTypes = WalkState->OpInfo->ParseArgs;
0240 break;
0241 }
0242
0243 return_ACPI_STATUS (AE_OK);
0244 }
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262 static ACPI_STATUS
0263 AcpiPsBuildNamedOp (
0264 ACPI_WALK_STATE *WalkState,
0265 UINT8 *AmlOpStart,
0266 ACPI_PARSE_OBJECT *UnnamedOp,
0267 ACPI_PARSE_OBJECT **Op)
0268 {
0269 ACPI_STATUS Status = AE_OK;
0270 ACPI_PARSE_OBJECT *Arg = NULL;
0271
0272
0273 ACPI_FUNCTION_TRACE_PTR (PsBuildNamedOp, WalkState);
0274
0275
0276 UnnamedOp->Common.Value.Arg = NULL;
0277 UnnamedOp->Common.ArgListLength = 0;
0278 UnnamedOp->Common.AmlOpcode = WalkState->Opcode;
0279
0280
0281
0282
0283
0284 while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) &&
0285 (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) != ARGP_NAME))
0286 {
0287 Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState),
0288 GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);
0289 if (ACPI_FAILURE (Status))
0290 {
0291 return_ACPI_STATUS (Status);
0292 }
0293
0294 AcpiPsAppendArg (UnnamedOp, Arg);
0295 INCREMENT_ARG_LIST (WalkState->ArgTypes);
0296 }
0297
0298
0299
0300
0301 if (!GET_CURRENT_ARG_TYPE (WalkState->ArgTypes))
0302 {
0303 return_ACPI_STATUS (AE_AML_NO_OPERAND);
0304 }
0305
0306
0307
0308 INCREMENT_ARG_LIST (WalkState->ArgTypes);
0309
0310
0311
0312
0313
0314 WalkState->Op = NULL;
0315
0316 Status = WalkState->DescendingCallback (WalkState, Op);
0317 if (ACPI_FAILURE (Status))
0318 {
0319 ACPI_EXCEPTION ((AE_INFO, Status, "During name lookup/catalog"));
0320 return_ACPI_STATUS (Status);
0321 }
0322
0323 if (!*Op)
0324 {
0325 return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
0326 }
0327
0328 Status = AcpiPsNextParseState (WalkState, *Op, Status);
0329 if (ACPI_FAILURE (Status))
0330 {
0331 if (Status == AE_CTRL_PENDING)
0332 {
0333 return_ACPI_STATUS (AE_CTRL_PARSE_PENDING);
0334 }
0335 return_ACPI_STATUS (Status);
0336 }
0337
0338 AcpiPsAppendArg (*Op, UnnamedOp->Common.Value.Arg);
0339 AcpiGbl_Depth++;
0340
0341 if ((*Op)->Common.AmlOpcode == AML_REGION_OP ||
0342 (*Op)->Common.AmlOpcode == AML_DATA_REGION_OP)
0343 {
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354 (*Op)->Named.Data = AmlOpStart;
0355 (*Op)->Named.Length = 0;
0356 }
0357
0358 return_ACPI_STATUS (AE_OK);
0359 }
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376 static ACPI_STATUS
0377 AcpiPsCreateOp (
0378 ACPI_WALK_STATE *WalkState,
0379 UINT8 *AmlOpStart,
0380 ACPI_PARSE_OBJECT **NewOp)
0381 {
0382 ACPI_STATUS Status = AE_OK;
0383 ACPI_PARSE_OBJECT *Op;
0384 ACPI_PARSE_OBJECT *NamedOp = NULL;
0385 ACPI_PARSE_OBJECT *ParentScope;
0386 UINT8 ArgumentCount;
0387 const ACPI_OPCODE_INFO *OpInfo;
0388
0389
0390 ACPI_FUNCTION_TRACE_PTR (PsCreateOp, WalkState);
0391
0392
0393 Status = AcpiPsGetAmlOpcode (WalkState);
0394 if (Status == AE_CTRL_PARSE_CONTINUE)
0395 {
0396 return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
0397 }
0398
0399
0400
0401 WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
0402 Op = AcpiPsAllocOp (WalkState->Opcode);
0403 if (!Op)
0404 {
0405 return_ACPI_STATUS (AE_NO_MEMORY);
0406 }
0407
0408 if (WalkState->OpInfo->Flags & AML_NAMED)
0409 {
0410 Status = AcpiPsBuildNamedOp (WalkState, AmlOpStart, Op, &NamedOp);
0411 AcpiPsFreeOp (Op);
0412 if (ACPI_FAILURE (Status))
0413 {
0414 return_ACPI_STATUS (Status);
0415 }
0416
0417 *NewOp = NamedOp;
0418 return_ACPI_STATUS (AE_OK);
0419 }
0420
0421
0422
0423 if (WalkState->OpInfo->Flags & AML_CREATE)
0424 {
0425
0426
0427
0428
0429 Op->Named.Data = AmlOpStart;
0430 Op->Named.Length = 0;
0431 }
0432
0433 if (WalkState->Opcode == AML_BANK_FIELD_OP)
0434 {
0435
0436
0437
0438
0439 Op->Named.Data = AmlOpStart;
0440 Op->Named.Length = 0;
0441 }
0442
0443 ParentScope = AcpiPsGetParentScope (&(WalkState->ParserState));
0444 AcpiPsAppendArg (ParentScope, Op);
0445
0446 if (ParentScope)
0447 {
0448 OpInfo = AcpiPsGetOpcodeInfo (ParentScope->Common.AmlOpcode);
0449 if (OpInfo->Flags & AML_HAS_TARGET)
0450 {
0451 ArgumentCount = AcpiPsGetArgumentCount (OpInfo->Type);
0452 if (ParentScope->Common.ArgListLength > ArgumentCount)
0453 {
0454 Op->Common.Flags |= ACPI_PARSEOP_TARGET;
0455 }
0456 }
0457 else if (ParentScope->Common.AmlOpcode == AML_INCREMENT_OP)
0458 {
0459 Op->Common.Flags |= ACPI_PARSEOP_TARGET;
0460 }
0461 }
0462
0463 if (WalkState->DescendingCallback != NULL)
0464 {
0465
0466
0467
0468
0469 WalkState->Op = *NewOp = Op;
0470
0471 Status = WalkState->DescendingCallback (WalkState, &Op);
0472 Status = AcpiPsNextParseState (WalkState, Op, Status);
0473 if (Status == AE_CTRL_PENDING)
0474 {
0475 Status = AE_CTRL_PARSE_PENDING;
0476 }
0477 }
0478
0479 return_ACPI_STATUS (Status);
0480 }
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497 static ACPI_STATUS
0498 AcpiPsGetArguments (
0499 ACPI_WALK_STATE *WalkState,
0500 UINT8 *AmlOpStart,
0501 ACPI_PARSE_OBJECT *Op)
0502 {
0503 ACPI_STATUS Status = AE_OK;
0504 ACPI_PARSE_OBJECT *Arg = NULL;
0505
0506
0507 ACPI_FUNCTION_TRACE_PTR (PsGetArguments, WalkState);
0508
0509
0510 switch (Op->Common.AmlOpcode)
0511 {
0512 case AML_BYTE_OP:
0513 case AML_WORD_OP:
0514 case AML_DWORD_OP:
0515 case AML_QWORD_OP:
0516 case AML_STRING_OP:
0517
0518
0519
0520 AcpiPsGetNextSimpleArg (&(WalkState->ParserState),
0521 GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), Op);
0522 break;
0523
0524 case AML_INT_NAMEPATH_OP:
0525
0526 Status = AcpiPsGetNextNamepath (WalkState, &(WalkState->ParserState), Op, 1);
0527 if (ACPI_FAILURE (Status))
0528 {
0529 return_ACPI_STATUS (Status);
0530 }
0531
0532 WalkState->ArgTypes = 0;
0533 break;
0534
0535 default:
0536
0537
0538
0539 while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) && !WalkState->ArgCount)
0540 {
0541 WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->ParserState.Aml,
0542 WalkState->ParserState.AmlStart);
0543
0544 Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState),
0545 GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);
0546 if (ACPI_FAILURE (Status))
0547 {
0548 return_ACPI_STATUS (Status);
0549 }
0550
0551 if (Arg)
0552 {
0553 Arg->Common.AmlOffset = WalkState->AmlOffset;
0554 AcpiPsAppendArg (Op, Arg);
0555 }
0556
0557 INCREMENT_ARG_LIST (WalkState->ArgTypes);
0558 }
0559
0560
0561
0562
0563
0564
0565 #ifdef ACPI_ENABLE_MODULE_LEVEL_CODE
0566
0567 if ((WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS1) &&
0568 ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) == 0))
0569 {
0570
0571
0572
0573
0574
0575
0576
0577 switch (Op->Common.AmlOpcode)
0578 {
0579 case AML_IF_OP:
0580 case AML_ELSE_OP:
0581 case AML_WHILE_OP:
0582
0583 ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
0584 "Pass1: Skipping an If/Else/While body\n"));
0585
0586
0587
0588 WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;
0589 WalkState->ArgCount = 0;
0590 break;
0591
0592 default:
0593 break;
0594 }
0595 }
0596 #endif
0597
0598 switch (Op->Common.AmlOpcode)
0599 {
0600 case AML_METHOD_OP:
0601
0602
0603
0604
0605
0606
0607 Op->Named.Data = WalkState->ParserState.Aml;
0608 Op->Named.Length = (UINT32)
0609 (WalkState->ParserState.PkgEnd - WalkState->ParserState.Aml);
0610
0611
0612
0613 WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;
0614 WalkState->ArgCount = 0;
0615 break;
0616
0617 case AML_BUFFER_OP:
0618 case AML_PACKAGE_OP:
0619 case AML_VAR_PACKAGE_OP:
0620
0621 if ((Op->Common.Parent) &&
0622 (Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
0623 (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
0624 {
0625
0626
0627
0628
0629 Op->Named.Data = AmlOpStart;
0630 Op->Named.Length = (UINT32)
0631 (WalkState->ParserState.PkgEnd - AmlOpStart);
0632
0633
0634
0635 WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;
0636 WalkState->ArgCount = 0;
0637 }
0638 break;
0639
0640 case AML_WHILE_OP:
0641
0642 if (WalkState->ControlState)
0643 {
0644 WalkState->ControlState->Control.PackageEnd =
0645 WalkState->ParserState.PkgEnd;
0646 }
0647 break;
0648
0649 default:
0650
0651
0652 break;
0653 }
0654
0655 break;
0656 }
0657
0658 return_ACPI_STATUS (AE_OK);
0659 }
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676 static ACPI_STATUS
0677 AcpiPsCompleteOp (
0678 ACPI_WALK_STATE *WalkState,
0679 ACPI_PARSE_OBJECT **Op,
0680 ACPI_STATUS Status)
0681 {
0682 ACPI_STATUS Status2;
0683
0684
0685 ACPI_FUNCTION_TRACE_PTR (PsCompleteOp, WalkState);
0686
0687
0688
0689
0690
0691 WalkState->ParserState.Scope->ParseScope.ArgCount--;
0692
0693
0694
0695 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0696 if (ACPI_FAILURE (Status2))
0697 {
0698 return_ACPI_STATUS (Status2);
0699 }
0700
0701 *Op = NULL;
0702
0703 switch (Status)
0704 {
0705 case AE_OK:
0706 break;
0707
0708
0709 case AE_CTRL_TRANSFER:
0710
0711
0712
0713 WalkState->PrevOp = NULL;
0714 WalkState->PrevArgTypes = WalkState->ArgTypes;
0715 return_ACPI_STATUS (Status);
0716
0717
0718 case AE_CTRL_END:
0719
0720 AcpiPsPopScope (&(WalkState->ParserState), Op,
0721 &WalkState->ArgTypes, &WalkState->ArgCount);
0722
0723 if (*Op)
0724 {
0725 WalkState->Op = *Op;
0726 WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
0727 WalkState->Opcode = (*Op)->Common.AmlOpcode;
0728
0729 Status = WalkState->AscendingCallback (WalkState);
0730 Status = AcpiPsNextParseState (WalkState, *Op, Status);
0731
0732 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0733 if (ACPI_FAILURE (Status2))
0734 {
0735 return_ACPI_STATUS (Status2);
0736 }
0737 }
0738
0739 Status = AE_OK;
0740 break;
0741
0742
0743 case AE_CTRL_BREAK:
0744 case AE_CTRL_CONTINUE:
0745
0746
0747
0748 while (!(*Op) || ((*Op)->Common.AmlOpcode != AML_WHILE_OP))
0749 {
0750 AcpiPsPopScope (&(WalkState->ParserState), Op,
0751 &WalkState->ArgTypes, &WalkState->ArgCount);
0752 }
0753
0754
0755
0756 WalkState->Op = *Op;
0757 WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
0758 WalkState->Opcode = (*Op)->Common.AmlOpcode;
0759
0760 Status = WalkState->AscendingCallback (WalkState);
0761 Status = AcpiPsNextParseState (WalkState, *Op, Status);
0762
0763 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0764 if (ACPI_FAILURE (Status2))
0765 {
0766 return_ACPI_STATUS (Status2);
0767 }
0768
0769 Status = AE_OK;
0770 break;
0771
0772
0773 case AE_CTRL_TERMINATE:
0774
0775
0776 do
0777 {
0778 if (*Op)
0779 {
0780 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0781 if (ACPI_FAILURE (Status2))
0782 {
0783 return_ACPI_STATUS (Status2);
0784 }
0785
0786 AcpiUtDeleteGenericState (
0787 AcpiUtPopGenericState (&WalkState->ControlState));
0788 }
0789
0790 AcpiPsPopScope (&(WalkState->ParserState), Op,
0791 &WalkState->ArgTypes, &WalkState->ArgCount);
0792
0793 } while (*Op);
0794
0795 return_ACPI_STATUS (AE_OK);
0796
0797
0798 default:
0799
0800 do
0801 {
0802 if (*Op)
0803 {
0804 Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
0805 if (ACPI_FAILURE (Status2))
0806 {
0807 return_ACPI_STATUS (Status2);
0808 }
0809 }
0810
0811 AcpiPsPopScope (&(WalkState->ParserState), Op,
0812 &WalkState->ArgTypes, &WalkState->ArgCount);
0813
0814 } while (*Op);
0815
0816
0817 #if 0
0818
0819
0820
0821 if (*Op == NULL)
0822 {
0823 AcpiPsPopScope (ParserState, Op,
0824 &WalkState->ArgTypes, &WalkState->ArgCount);
0825 }
0826 #endif
0827 WalkState->PrevOp = NULL;
0828 WalkState->PrevArgTypes = WalkState->ArgTypes;
0829 return_ACPI_STATUS (Status);
0830 }
0831
0832
0833
0834 if (AcpiPsHasCompletedScope (&(WalkState->ParserState)))
0835 {
0836 AcpiPsPopScope (&(WalkState->ParserState), Op,
0837 &WalkState->ArgTypes, &WalkState->ArgCount);
0838 ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *Op));
0839 }
0840 else
0841 {
0842 *Op = NULL;
0843 }
0844
0845 return_ACPI_STATUS (AE_OK);
0846 }
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864 static ACPI_STATUS
0865 AcpiPsCompleteFinalOp (
0866 ACPI_WALK_STATE *WalkState,
0867 ACPI_PARSE_OBJECT *Op,
0868 ACPI_STATUS Status)
0869 {
0870 ACPI_STATUS Status2;
0871
0872
0873 ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState);
0874
0875
0876
0877
0878
0879
0880
0881
0882 ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", Op));
0883 do
0884 {
0885 if (Op)
0886 {
0887 if (WalkState->AscendingCallback != NULL)
0888 {
0889 WalkState->Op = Op;
0890 WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
0891 WalkState->Opcode = Op->Common.AmlOpcode;
0892
0893 Status = WalkState->AscendingCallback (WalkState);
0894 Status = AcpiPsNextParseState (WalkState, Op, Status);
0895 if (Status == AE_CTRL_PENDING)
0896 {
0897 Status = AcpiPsCompleteOp (WalkState, &Op, AE_OK);
0898 if (ACPI_FAILURE (Status))
0899 {
0900 return_ACPI_STATUS (Status);
0901 }
0902 }
0903
0904 if (Status == AE_CTRL_TERMINATE)
0905 {
0906 Status = AE_OK;
0907
0908
0909 do
0910 {
0911 if (Op)
0912 {
0913 Status2 = AcpiPsCompleteThisOp (WalkState, Op);
0914 if (ACPI_FAILURE (Status2))
0915 {
0916 return_ACPI_STATUS (Status2);
0917 }
0918 }
0919
0920 AcpiPsPopScope (&(WalkState->ParserState), &Op,
0921 &WalkState->ArgTypes, &WalkState->ArgCount);
0922
0923 } while (Op);
0924
0925 return_ACPI_STATUS (Status);
0926 }
0927
0928 else if (ACPI_FAILURE (Status))
0929 {
0930
0931
0932 (void) AcpiPsCompleteThisOp (WalkState, Op);
0933 return_ACPI_STATUS (Status);
0934 }
0935 }
0936
0937 Status2 = AcpiPsCompleteThisOp (WalkState, Op);
0938 if (ACPI_FAILURE (Status2))
0939 {
0940 return_ACPI_STATUS (Status2);
0941 }
0942 }
0943
0944 AcpiPsPopScope (&(WalkState->ParserState), &Op, &WalkState->ArgTypes,
0945 &WalkState->ArgCount);
0946
0947 } while (Op);
0948
0949 return_ACPI_STATUS (Status);
0950 }
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966 ACPI_STATUS
0967 AcpiPsParseLoop (
0968 ACPI_WALK_STATE *WalkState)
0969 {
0970 ACPI_STATUS Status = AE_OK;
0971 ACPI_PARSE_OBJECT *Op = NULL;
0972 ACPI_PARSE_STATE *ParserState;
0973 UINT8 *AmlOpStart = NULL;
0974
0975
0976 ACPI_FUNCTION_TRACE_PTR (PsParseLoop, WalkState);
0977
0978
0979 if (WalkState->DescendingCallback == NULL)
0980 {
0981 return_ACPI_STATUS (AE_BAD_PARAMETER);
0982 }
0983
0984 ParserState = &WalkState->ParserState;
0985 WalkState->ArgTypes = 0;
0986
0987 #if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
0988
0989 if (WalkState->WalkType & ACPI_WALK_METHOD_RESTART)
0990 {
0991
0992
0993 if (AcpiPsHasCompletedScope (ParserState))
0994 {
0995
0996
0997
0998
0999 if ((ParserState->Scope->ParseScope.Op) &&
1000 ((ParserState->Scope->ParseScope.Op->Common.AmlOpcode == AML_IF_OP) ||
1001 (ParserState->Scope->ParseScope.Op->Common.AmlOpcode == AML_WHILE_OP)) &&
1002 (WalkState->ControlState) &&
1003 (WalkState->ControlState->Common.State ==
1004 ACPI_CONTROL_PREDICATE_EXECUTING))
1005 {
1006
1007
1008
1009
1010 WalkState->Op = NULL;
1011 Status = AcpiDsGetPredicateValue (WalkState, ACPI_TO_POINTER (TRUE));
1012 if (ACPI_FAILURE (Status) &&
1013 ((Status & AE_CODE_MASK) != AE_CODE_CONTROL))
1014 {
1015 if (Status == AE_AML_NO_RETURN_VALUE)
1016 {
1017 ACPI_EXCEPTION ((AE_INFO, Status,
1018 "Invoked method did not return a value"));
1019
1020 }
1021
1022 ACPI_EXCEPTION ((AE_INFO, Status, "GetPredicate Failed"));
1023 return_ACPI_STATUS (Status);
1024 }
1025
1026 Status = AcpiPsNextParseState (WalkState, Op, Status);
1027 }
1028
1029 AcpiPsPopScope (ParserState, &Op,
1030 &WalkState->ArgTypes, &WalkState->ArgCount);
1031 ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", Op));
1032 }
1033 else if (WalkState->PrevOp)
1034 {
1035
1036
1037 Op = WalkState->PrevOp;
1038 WalkState->ArgTypes = WalkState->PrevArgTypes;
1039 }
1040 }
1041 #endif
1042
1043
1044
1045 while ((ParserState->Aml < ParserState->AmlEnd) || (Op))
1046 {
1047 AmlOpStart = ParserState->Aml;
1048 if (!Op)
1049 {
1050 Status = AcpiPsCreateOp (WalkState, AmlOpStart, &Op);
1051 if (ACPI_FAILURE (Status))
1052 {
1053 if (Status == AE_CTRL_PARSE_CONTINUE)
1054 {
1055 continue;
1056 }
1057
1058 if (Status == AE_CTRL_PARSE_PENDING)
1059 {
1060 Status = AE_OK;
1061 }
1062
1063 Status = AcpiPsCompleteOp (WalkState, &Op, Status);
1064 if (ACPI_FAILURE (Status))
1065 {
1066 return_ACPI_STATUS (Status);
1067 }
1068
1069 continue;
1070 }
1071
1072 Op->Common.AmlOffset = WalkState->AmlOffset;
1073
1074 if (WalkState->OpInfo)
1075 {
1076 ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
1077 "Opcode %4.4X [%s] Op %p Aml %p AmlOffset %5.5X\n",
1078 (UINT32) Op->Common.AmlOpcode, WalkState->OpInfo->Name,
1079 Op, ParserState->Aml, Op->Common.AmlOffset));
1080 }
1081 }
1082
1083
1084
1085
1086
1087
1088 WalkState->ArgCount = 0;
1089
1090
1091
1092 if (WalkState->ArgTypes)
1093 {
1094
1095
1096 Status = AcpiPsGetArguments (WalkState, AmlOpStart, Op);
1097 if (ACPI_FAILURE (Status))
1098 {
1099 Status = AcpiPsCompleteOp (WalkState, &Op, Status);
1100 if (ACPI_FAILURE (Status))
1101 {
1102 return_ACPI_STATUS (Status);
1103 }
1104
1105 continue;
1106 }
1107 }
1108
1109
1110
1111 if (WalkState->ArgCount)
1112 {
1113
1114
1115
1116
1117 Status = AcpiPsPushScope (ParserState, Op,
1118 WalkState->ArgTypes, WalkState->ArgCount);
1119 if (ACPI_FAILURE (Status))
1120 {
1121 Status = AcpiPsCompleteOp (WalkState, &Op, Status);
1122 if (ACPI_FAILURE (Status))
1123 {
1124 return_ACPI_STATUS (Status);
1125 }
1126
1127 continue;
1128 }
1129
1130 Op = NULL;
1131 continue;
1132 }
1133
1134
1135
1136
1137
1138 WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
1139 if (WalkState->OpInfo->Flags & AML_NAMED)
1140 {
1141 if (AcpiGbl_Depth)
1142 {
1143 AcpiGbl_Depth--;
1144 }
1145
1146 if (Op->Common.AmlOpcode == AML_REGION_OP ||
1147 Op->Common.AmlOpcode == AML_DATA_REGION_OP)
1148 {
1149
1150
1151
1152
1153
1154
1155
1156
1157 Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);
1158 }
1159 }
1160
1161 if (WalkState->OpInfo->Flags & AML_CREATE)
1162 {
1163
1164
1165
1166
1167
1168
1169 Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);
1170 }
1171
1172 if (Op->Common.AmlOpcode == AML_BANK_FIELD_OP)
1173 {
1174
1175
1176
1177
1178
1179 Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);
1180 }
1181
1182
1183
1184 if (WalkState->AscendingCallback != NULL)
1185 {
1186 WalkState->Op = Op;
1187 WalkState->Opcode = Op->Common.AmlOpcode;
1188
1189 Status = WalkState->AscendingCallback (WalkState);
1190 Status = AcpiPsNextParseState (WalkState, Op, Status);
1191 if (Status == AE_CTRL_PENDING)
1192 {
1193 Status = AE_OK;
1194 }
1195 }
1196
1197 Status = AcpiPsCompleteOp (WalkState, &Op, Status);
1198 if (ACPI_FAILURE (Status))
1199 {
1200 return_ACPI_STATUS (Status);
1201 }
1202
1203 }
1204
1205 Status = AcpiPsCompleteFinalOp (WalkState, Op, Status);
1206 return_ACPI_STATUS (Status);
1207 }
1208