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 "acnamesp.h"
0155 #include "acpredef.h"
0156
0157
0158 #define _COMPONENT ACPI_NAMESPACE
0159 ACPI_MODULE_NAME ("nsprepkg")
0160
0161
0162
0163
0164 static ACPI_STATUS
0165 AcpiNsCheckPackageList (
0166 ACPI_EVALUATE_INFO *Info,
0167 const ACPI_PREDEFINED_INFO *Package,
0168 ACPI_OPERAND_OBJECT **Elements,
0169 UINT32 Count);
0170
0171 static ACPI_STATUS
0172 AcpiNsCheckPackageElements (
0173 ACPI_EVALUATE_INFO *Info,
0174 ACPI_OPERAND_OBJECT **Elements,
0175 UINT8 Type1,
0176 UINT32 Count1,
0177 UINT8 Type2,
0178 UINT32 Count2,
0179 UINT32 StartIndex);
0180
0181 static ACPI_STATUS
0182 AcpiNsCustomPackage (
0183 ACPI_EVALUATE_INFO *Info,
0184 ACPI_OPERAND_OBJECT **Elements,
0185 UINT32 Count);
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203 ACPI_STATUS
0204 AcpiNsCheckPackage (
0205 ACPI_EVALUATE_INFO *Info,
0206 ACPI_OPERAND_OBJECT **ReturnObjectPtr)
0207 {
0208 ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
0209 const ACPI_PREDEFINED_INFO *Package;
0210 ACPI_OPERAND_OBJECT **Elements;
0211 ACPI_STATUS Status = AE_OK;
0212 UINT32 ExpectedCount;
0213 UINT32 Count;
0214 UINT32 i;
0215
0216
0217 ACPI_FUNCTION_TRACE (NsCheckPackage);
0218
0219
0220
0221
0222 Package = Info->Predefined + 1;
0223
0224 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
0225 "%s Validating return Package of Type %X, Count %X\n",
0226 Info->FullPathname, Package->RetInfo.Type,
0227 ReturnObject->Package.Count));
0228
0229
0230
0231
0232
0233 AcpiNsRemoveNullElements (Info, Package->RetInfo.Type, ReturnObject);
0234
0235
0236
0237 Elements = ReturnObject->Package.Elements;
0238 Count = ReturnObject->Package.Count;
0239
0240
0241
0242
0243
0244 if (!Count)
0245 {
0246 if (Package->RetInfo.Type == ACPI_PTYPE1_VAR)
0247 {
0248 return_ACPI_STATUS (AE_OK);
0249 }
0250
0251 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
0252 "Return Package has no elements (empty)"));
0253
0254 return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
0255 }
0256
0257
0258
0259
0260
0261
0262
0263 switch (Package->RetInfo.Type)
0264 {
0265 case ACPI_PTYPE_CUSTOM:
0266
0267 Status = AcpiNsCustomPackage (Info, Elements, Count);
0268 break;
0269
0270 case ACPI_PTYPE1_FIXED:
0271
0272
0273
0274
0275
0276
0277 ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
0278 if (Count < ExpectedCount)
0279 {
0280 goto PackageTooSmall;
0281 }
0282 else if (Count > ExpectedCount)
0283 {
0284 ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
0285 "%s: Return Package is larger than needed - "
0286 "found %u, expected %u\n",
0287 Info->FullPathname, Count, ExpectedCount));
0288 }
0289
0290
0291
0292 Status = AcpiNsCheckPackageElements (Info, Elements,
0293 Package->RetInfo.ObjectType1, Package->RetInfo.Count1,
0294 Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0);
0295 break;
0296
0297 case ACPI_PTYPE1_VAR:
0298
0299
0300
0301
0302 for (i = 0; i < Count; i++)
0303 {
0304 Status = AcpiNsCheckObjectType (Info, Elements,
0305 Package->RetInfo.ObjectType1, i);
0306 if (ACPI_FAILURE (Status))
0307 {
0308 return_ACPI_STATUS (Status);
0309 }
0310
0311 Elements++;
0312 }
0313 break;
0314
0315 case ACPI_PTYPE1_OPTION:
0316
0317
0318
0319
0320
0321
0322
0323 ExpectedCount = Package->RetInfo3.Count;
0324 if (Count < ExpectedCount)
0325 {
0326 goto PackageTooSmall;
0327 }
0328
0329
0330
0331 for (i = 0; i < Count; i++)
0332 {
0333 if (i < Package->RetInfo3.Count)
0334 {
0335
0336
0337 Status = AcpiNsCheckObjectType (Info, Elements,
0338 Package->RetInfo3.ObjectType[i], i);
0339 if (ACPI_FAILURE (Status))
0340 {
0341 return_ACPI_STATUS (Status);
0342 }
0343 }
0344 else
0345 {
0346
0347
0348 Status = AcpiNsCheckObjectType (Info, Elements,
0349 Package->RetInfo3.TailObjectType, i);
0350 if (ACPI_FAILURE (Status))
0351 {
0352 return_ACPI_STATUS (Status);
0353 }
0354 }
0355
0356 Elements++;
0357 }
0358 break;
0359
0360 case ACPI_PTYPE2_REV_FIXED:
0361
0362
0363
0364 Status = AcpiNsCheckObjectType (
0365 Info, Elements, ACPI_RTYPE_INTEGER, 0);
0366 if (ACPI_FAILURE (Status))
0367 {
0368 return_ACPI_STATUS (Status);
0369 }
0370
0371 Elements++;
0372 Count--;
0373
0374
0375
0376 Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
0377 break;
0378
0379 case ACPI_PTYPE2_PKG_COUNT:
0380
0381
0382
0383 Status = AcpiNsCheckObjectType (
0384 Info, Elements, ACPI_RTYPE_INTEGER, 0);
0385 if (ACPI_FAILURE (Status))
0386 {
0387 return_ACPI_STATUS (Status);
0388 }
0389
0390
0391
0392
0393
0394 ExpectedCount = (UINT32) (*Elements)->Integer.Value;
0395 if (ExpectedCount >= Count)
0396 {
0397 goto PackageTooSmall;
0398 }
0399
0400 Count = ExpectedCount;
0401 Elements++;
0402
0403
0404
0405 Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
0406 break;
0407
0408 case ACPI_PTYPE2:
0409 case ACPI_PTYPE2_FIXED:
0410 case ACPI_PTYPE2_MIN:
0411 case ACPI_PTYPE2_COUNT:
0412 case ACPI_PTYPE2_FIX_VAR:
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423 if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE))
0424 {
0425
0426
0427 Status = AcpiNsWrapWithPackage (
0428 Info, ReturnObject, ReturnObjectPtr);
0429 if (ACPI_FAILURE (Status))
0430 {
0431 return_ACPI_STATUS (Status);
0432 }
0433
0434
0435
0436 ReturnObject = *ReturnObjectPtr;
0437 Elements = ReturnObject->Package.Elements;
0438 Count = 1;
0439 }
0440
0441
0442
0443 Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
0444 break;
0445
0446 case ACPI_PTYPE2_VAR_VAR:
0447
0448
0449
0450
0451 break;
0452
0453 case ACPI_PTYPE2_UUID_PAIR:
0454
0455
0456
0457 if (Count & 1)
0458 {
0459 ExpectedCount = Count + 1;
0460 goto PackageTooSmall;
0461 }
0462
0463 while (Count > 0)
0464 {
0465 Status = AcpiNsCheckObjectType(Info, Elements,
0466 Package->RetInfo.ObjectType1, 0);
0467 if (ACPI_FAILURE(Status))
0468 {
0469 return_ACPI_STATUS (Status);
0470 }
0471
0472
0473
0474 if ((*Elements)->Buffer.Length != 16)
0475 {
0476 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname,
0477 Info->NodeFlags, "Invalid length for UUID Buffer"));
0478 return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
0479 }
0480
0481 Status = AcpiNsCheckObjectType(Info, Elements + 1,
0482 Package->RetInfo.ObjectType2, 0);
0483 if (ACPI_FAILURE(Status))
0484 {
0485 return_ACPI_STATUS (Status);
0486 }
0487
0488 Elements += 2;
0489 Count -= 2;
0490 }
0491 break;
0492
0493 default:
0494
0495
0496
0497 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
0498 "Invalid internal return type in table entry: %X",
0499 Package->RetInfo.Type));
0500
0501 return_ACPI_STATUS (AE_AML_INTERNAL);
0502 }
0503
0504 return_ACPI_STATUS (Status);
0505
0506
0507 PackageTooSmall:
0508
0509
0510
0511 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
0512 "Return Package is too small - found %u elements, expected %u",
0513 Count, ExpectedCount));
0514
0515 return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
0516 }
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535 static ACPI_STATUS
0536 AcpiNsCheckPackageList (
0537 ACPI_EVALUATE_INFO *Info,
0538 const ACPI_PREDEFINED_INFO *Package,
0539 ACPI_OPERAND_OBJECT **Elements,
0540 UINT32 Count)
0541 {
0542 ACPI_OPERAND_OBJECT *SubPackage;
0543 ACPI_OPERAND_OBJECT **SubElements;
0544 ACPI_STATUS Status;
0545 UINT32 ExpectedCount;
0546 UINT32 i;
0547 UINT32 j;
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557 for (i = 0; i < Count; i++)
0558 {
0559 SubPackage = *Elements;
0560 SubElements = SubPackage->Package.Elements;
0561 Info->ParentPackage = SubPackage;
0562
0563
0564
0565 Status = AcpiNsCheckObjectType (Info, &SubPackage,
0566 ACPI_RTYPE_PACKAGE, i);
0567 if (ACPI_FAILURE (Status))
0568 {
0569 return (Status);
0570 }
0571
0572
0573
0574 Info->ParentPackage = SubPackage;
0575 switch (Package->RetInfo.Type)
0576 {
0577 case ACPI_PTYPE2:
0578 case ACPI_PTYPE2_PKG_COUNT:
0579 case ACPI_PTYPE2_REV_FIXED:
0580
0581
0582
0583 ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
0584 if (SubPackage->Package.Count < ExpectedCount)
0585 {
0586 goto PackageTooSmall;
0587 }
0588
0589 Status = AcpiNsCheckPackageElements (Info, SubElements,
0590 Package->RetInfo.ObjectType1,
0591 Package->RetInfo.Count1,
0592 Package->RetInfo.ObjectType2,
0593 Package->RetInfo.Count2, 0);
0594 if (ACPI_FAILURE (Status))
0595 {
0596 return (Status);
0597 }
0598 break;
0599
0600 case ACPI_PTYPE2_FIX_VAR:
0601
0602
0603
0604
0605 ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
0606 if (SubPackage->Package.Count < ExpectedCount)
0607 {
0608 goto PackageTooSmall;
0609 }
0610
0611 Status = AcpiNsCheckPackageElements (Info, SubElements,
0612 Package->RetInfo.ObjectType1,
0613 Package->RetInfo.Count1,
0614 Package->RetInfo.ObjectType2,
0615 SubPackage->Package.Count - Package->RetInfo.Count1, 0);
0616 if (ACPI_FAILURE (Status))
0617 {
0618 return (Status);
0619 }
0620 break;
0621
0622 case ACPI_PTYPE2_VAR_VAR:
0623
0624
0625
0626 break;
0627
0628 case ACPI_PTYPE2_FIXED:
0629
0630
0631
0632 ExpectedCount = Package->RetInfo2.Count;
0633 if (SubPackage->Package.Count < ExpectedCount)
0634 {
0635 goto PackageTooSmall;
0636 }
0637
0638
0639
0640 for (j = 0; j < ExpectedCount; j++)
0641 {
0642 Status = AcpiNsCheckObjectType (Info, &SubElements[j],
0643 Package->RetInfo2.ObjectType[j], j);
0644 if (ACPI_FAILURE (Status))
0645 {
0646 return (Status);
0647 }
0648 }
0649 break;
0650
0651 case ACPI_PTYPE2_MIN:
0652
0653
0654
0655 ExpectedCount = Package->RetInfo.Count1;
0656 if (SubPackage->Package.Count < ExpectedCount)
0657 {
0658 goto PackageTooSmall;
0659 }
0660
0661
0662
0663 Status = AcpiNsCheckPackageElements (Info, SubElements,
0664 Package->RetInfo.ObjectType1,
0665 SubPackage->Package.Count, 0, 0, 0);
0666 if (ACPI_FAILURE (Status))
0667 {
0668 return (Status);
0669 }
0670 break;
0671
0672 case ACPI_PTYPE2_COUNT:
0673
0674
0675
0676
0677 Status = AcpiNsCheckObjectType (Info, SubElements,
0678 ACPI_RTYPE_INTEGER, 0);
0679 if (ACPI_FAILURE (Status))
0680 {
0681 return (Status);
0682 }
0683
0684
0685
0686
0687
0688 ExpectedCount = (UINT32) (*SubElements)->Integer.Value;
0689 if (SubPackage->Package.Count < ExpectedCount)
0690 {
0691 goto PackageTooSmall;
0692 }
0693
0694 if (SubPackage->Package.Count < Package->RetInfo.Count1)
0695 {
0696 ExpectedCount = Package->RetInfo.Count1;
0697 goto PackageTooSmall;
0698 }
0699
0700 if (ExpectedCount == 0)
0701 {
0702
0703
0704
0705
0706
0707
0708 ExpectedCount = SubPackage->Package.Count;
0709 (*SubElements)->Integer.Value = ExpectedCount;
0710 }
0711
0712
0713
0714 Status = AcpiNsCheckPackageElements (Info, (SubElements + 1),
0715 Package->RetInfo.ObjectType1,
0716 (ExpectedCount - 1), 0, 0, 1);
0717 if (ACPI_FAILURE (Status))
0718 {
0719 return (Status);
0720 }
0721 break;
0722
0723 default:
0724
0725 ACPI_ERROR ((AE_INFO, "Invalid Package type: %X",
0726 Package->RetInfo.Type));
0727 return (AE_AML_INTERNAL);
0728 }
0729
0730 Elements++;
0731 }
0732
0733 return (AE_OK);
0734
0735
0736 PackageTooSmall:
0737
0738
0739
0740 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
0741 "Return SubPackage[%u] is too small - found %u elements, expected %u",
0742 i, SubPackage->Package.Count, ExpectedCount));
0743
0744 return (AE_AML_OPERAND_VALUE);
0745 }
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766 static ACPI_STATUS
0767 AcpiNsCustomPackage (
0768 ACPI_EVALUATE_INFO *Info,
0769 ACPI_OPERAND_OBJECT **Elements,
0770 UINT32 Count)
0771 {
0772 UINT32 ExpectedCount;
0773 UINT32 Version;
0774 ACPI_STATUS Status = AE_OK;
0775
0776
0777 ACPI_FUNCTION_NAME (NsCustomPackage);
0778
0779
0780
0781
0782 if ((*Elements)->Common.Type != ACPI_TYPE_INTEGER)
0783 {
0784 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
0785 "Return Package has invalid object type for version number"));
0786 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
0787 }
0788
0789 Version = (UINT32) (*Elements)->Integer.Value;
0790 ExpectedCount = 21;
0791
0792 if (Version == 0)
0793 {
0794 ExpectedCount = 20;
0795 }
0796
0797 if (Count < ExpectedCount)
0798 {
0799 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
0800 "Return Package is too small - found %u elements, expected %u",
0801 Count, ExpectedCount));
0802 return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
0803 }
0804 else if (Count > ExpectedCount)
0805 {
0806 ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
0807 "%s: Return Package is larger than needed - "
0808 "found %u, expected %u\n",
0809 Info->FullPathname, Count, ExpectedCount));
0810 }
0811
0812
0813
0814 Status = AcpiNsCheckPackageElements (Info, Elements,
0815 ACPI_RTYPE_INTEGER, 16,
0816 ACPI_RTYPE_STRING, 4, 0);
0817 if (ACPI_FAILURE (Status))
0818 {
0819 return_ACPI_STATUS (Status);
0820 }
0821
0822
0823
0824 if (Version > 0)
0825 {
0826 Status = AcpiNsCheckPackageElements (Info, Elements + 20,
0827 ACPI_RTYPE_INTEGER, 1, 0, 0, 20);
0828 }
0829
0830 return_ACPI_STATUS (Status);
0831 }
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853 static ACPI_STATUS
0854 AcpiNsCheckPackageElements (
0855 ACPI_EVALUATE_INFO *Info,
0856 ACPI_OPERAND_OBJECT **Elements,
0857 UINT8 Type1,
0858 UINT32 Count1,
0859 UINT8 Type2,
0860 UINT32 Count2,
0861 UINT32 StartIndex)
0862 {
0863 ACPI_OPERAND_OBJECT **ThisElement = Elements;
0864 ACPI_STATUS Status;
0865 UINT32 i;
0866
0867
0868 ACPI_FUNCTION_TRACE (NsCheckPackageElements);
0869
0870
0871
0872
0873
0874
0875 for (i = 0; i < Count1; i++)
0876 {
0877 Status = AcpiNsCheckObjectType (Info, ThisElement,
0878 Type1, i + StartIndex);
0879 if (ACPI_FAILURE (Status))
0880 {
0881 return_ACPI_STATUS (Status);
0882 }
0883
0884 ThisElement++;
0885 }
0886
0887 for (i = 0; i < Count2; i++)
0888 {
0889 Status = AcpiNsCheckObjectType (Info, ThisElement,
0890 Type2, (i + Count1 + StartIndex));
0891 if (ACPI_FAILURE (Status))
0892 {
0893 return_ACPI_STATUS (Status);
0894 }
0895
0896 ThisElement++;
0897 }
0898
0899 return_ACPI_STATUS (AE_OK);
0900 }