1 /* 2 * Some or all of this work - Copyright (c) 2006 - 2021, Intel Corp. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * Neither the name of Intel Corporation nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 /* 29 * The Test Command Interface with the ACPICA (_TCI) 30 * 31 * Note: _TCI and TCI mean the same in comments below. 32 * But, actually the name of the relevant predefined 33 * Method is _TCI. 34 */ 35 Name (Z128, 0x80) 36 Name (DE00, 0x00) /* Disable reporting errors from m3a4, needed in m3aa (not enough params) */ 37 Name (FOPT, 0x00) /* Flag of optimization */ 38 /* 39 * Constants 40 */ 41 /* Opcodes of the Test Commands provided by _TCI */ 42 Name (C200, 0x00CD0000) /* _TCI-end statistics */ 43 Name (C201, 0x00CD0001) /* _TCI-begin statistics */ 44 Name (C202, 0x00CD0002) /* TCI_CMD_CHECK_SUPPORTED */ 45 Name (C203, 0x00CD0003) /* TCI_CMD_GET_ID_OF_THREADS */ 46 /* Tags of commands (to be filled into TCI Package by aslts) */ 47 48 Name (C208, 0xEEEE0596) /* TCI_TAG_GET_MC_STAT_AFTER_TCI_TERM */ 49 Name (C209, 0xBBBB063A) /* TCI_TAG_GET_MC_STAT_BEFORE_TCI_RUN */ 50 Name (C20A, 0xCCCC07B9) /* TCI_TAG_CHECK_SUPPORTED */ 51 Name (C20B, 0xDDDD01F5) /* TCI_TAG_GET_ID_OF_THREADS */ 52 /* 53 * The layout of the Package for Memory Consumption Statistics 54 * applied for TCI commands: 55 * _TCI-end statistics (command TCI_CMD_GET_MC_STAT_AFTER_TCI_TERM) 56 * _TCI-begin statistics (command TCI_CMD_GET_MC_STAT_BEFORE_TCI_RUN) 57 */ 58 Name (C210, 0x00) /* Title */ 59 Name (C211, 0x04) /* acq0 */ 60 Name (C212, 0x09) /* acq1 (-) */ 61 Name (C213, 0x0E) /* acq2 (-) */ 62 Name (C214, 0x13) /* acq3 */ 63 Name (C215, 0x18) /* acq4 (-) */ 64 Name (C216, 0x1D) /* acq5 */ 65 Name (C217, 0x22) /* rel0 */ 66 Name (C218, 0x27) /* rel1 */ 67 Name (C219, 0x2C) /* rel2 (-) */ 68 Name (C21A, 0x31) /* rel3 */ 69 Name (C21B, 0x36) /* Created Objects */ 70 Name (C21C, 0x54) /* Deleted Objects */ 71 Name (C21D, 0x72) /* Miscellaneous Stat */ 72 Name (C220, 0x79) /* the length of the Package for */ 73 /* Memory Consumption Statistics. */ 74 /* The layout of header of the common _TCI Package */ 75 /* Input, data of header passed to ACPICA */ 76 Name (C222, 0x00) /* Tag of command (to be set up by aslts) */ 77 /* Output, data of header returned to aslts from ACPICA */ 78 79 Name (C223, 0x01) /* Size (number of elements actually packed into TCI package, */ 80 /* to be filled by ACPICA) */ 81 82 Name (C224, 0x02) /* Cmd (command has been executed, to be filled by ACPICA) */ 83 Name (C225, 0x03) /* CACHE_ENABLED (object cache is enabled info flag, */ 84 /* to be filled by ACPICA) */ 85 86 Name (C22B, 0x04) /* length of the common _TCI Package header */ 87 /* The layout of header of TCI_CMD_GET_ID_OF_THREADS command */ 88 /* (returned to aslts from ACPICA) */ 89 Name (C22C, 0x04) /* TCI_PACKAGE_THR_NUM */ 90 Name (C22D, 0x05) /* TCI_PACKAGE_THR_NUM_REAL */ 91 Name (C22E, 0x06) /* TCI_PACKAGE_THR_ID */ 92 Name (C22F, 0x07) /* length TCI_PACKAGE_THR_HEADER_SIZE */ 93 Name (C221, 0x05) /* CACHE_LISTS_NUMBER (Object Caches): */ 94 /* CLIST_ID_NAMESPACE 0 -- Acpi-Namespace */ 95 /* CLIST_ID_STATE 1 -- Acpi-State */ 96 /* CLIST_ID_OPERAND 2 -- Acpi-Operand */ 97 /* CLIST_ID_PSNODE 3 -- Acpi-Parse */ 98 /* CLIST_ID_PSNODE_EXT 4 -- Acpi-ParseExt */ 99 Name (C226, 0x00) /* CLIST_ID_NAMESPACE */ 100 Name (C227, 0x01) /* CLIST_ID_STATE */ 101 Name (C228, 0x02) /* CLIST_ID_OPERAND */ 102 Name (C229, 0x03) /* CLIST_ID_PSNODE */ 103 Name (C22A, 0x04) /* CLIST_ID_PSNODE_EXT */ 104 /* 105 * The main Test Command interface with the ACPICA 106 * 107 * arg0 - opcode of the Test Command 108 * arg1 - Package for different needs depending on the command. 109 * So, in case of the Memory Consumption Statistics commands it 110 * is filled by ACPICA with the Memory Consumption Statistics. 111 * The length of package in this case should be not less than c220, 112 * otherwise, no any failure arises but not all data are returned 113 * by Package just only the relevant part of it. It is true for all 114 * commands. 115 * Note: use m3a0 or m165 to prepare the arg1-package. 116 */ 117 Method (_TCI, 2, NotSerialized) 118 { 119 /* 120 * Before to run this method reset location 121 * of Command which is to be filled by ACPICA 122 * to acknowledge the interconnection. 123 * It is performed in m3a0 and m3a4. 124 */ 125 Return (Arg1) 126 } 127 128 /* 129 * Create and initialize the Package for _TCI 130 * 131 * arg0 - opcode of the Test Command. 132 * Use 0 for allocation without initialization. 133 * arg1 - number of element of Package (for some of commands) 134 * 135 * Return the resulting Package: 136 * 137 * - if arg0 is zero - the Package of c220 length 138 * - otherwise - the Package of length depending on 139 * the command is additionally initialized 140 */ 141 Method (M165, 2, Serialized) 142 { 143 Name (NUM, 0x00) 144 Name (TAG, 0x00) 145 If (Arg0) 146 { 147 Switch (ToInteger (Arg0)) 148 { 149 Case (0x00CD0000) 150 { 151 /* _TCI-end statistics */ 152 153 TAG = C208 /* \C208 */ 154 NUM = C220 /* \C220 */ 155 } 156 Case (0x00CD0001) 157 { 158 /* _TCI-begin statistics */ 159 160 TAG = C209 /* \C209 */ 161 NUM = C220 /* \C220 */ 162 } 163 Case (0x00CD0002) 164 { 165 /* TCI_CMD_CHECK_SUPPORTED */ 166 167 TAG = C20A /* \C20A */ 168 NUM = C22B /* \C22B */ 169 } 170 Case (0x00CD0003) 171 { 172 /* TCI_CMD_GET_ID_OF_THREADS */ 173 174 TAG = C20B /* \C20B */ 175 NUM = Arg1 176 } 177 Default 178 { 179 ERR ("m165", Z128, __LINE__, 0x00, 0x00, Arg0, 0x00) 180 } 181 182 } 183 184 If ((NUM < C22B)) 185 { 186 ERR ("m165", Z128, __LINE__, 0x00, 0x00, NUM, C22B) 187 } 188 Else 189 { 190 Name (P000, Package (NUM){}) 191 Name (LPN0, 0x00) 192 Name (LPC0, 0x00) 193 LPN0 = NUM /* \M165.NUM_ */ 194 LPC0 = 0x00 195 While (LPN0) 196 { 197 P000 [LPC0] = 0x00 198 LPN0-- 199 LPC0++ 200 } 201 202 P000 [0x00] = TAG /* \M165.TAG_ */ 203 Return (P000) /* \M165.P000 */ 204 } 205 } 206 Else 207 { 208 Name (P001, Package (C220){}) 209 Return (P001) /* \M165.P001 */ 210 } 211 212 Return (0x00) 213 } 214 215 /* 216 * Create and initialize the Package for simple cases 217 * entirely specified by the opcode of command. 218 * 219 * a. for Memory Consumption Statistics 220 * (_TCI-begin or _TCI-end statistics). 221 * 222 * b. TCI_CMD_CHECK_SUPPORTED 223 * 224 * arg0 - opcode of the Test Command. 225 * Use 0 for allocation without initialization. 226 * 227 * Returns the TCI Package 228 */ 229 Method (M3A0, 1, NotSerialized) 230 { 231 Local0 = M165 (Arg0, 0x00) 232 Return (Local0) 233 } 234 235 Method (M3A1, 2, NotSerialized) 236 { 237 Local0 = DerefOf (NMTP [Arg1]) 238 Concatenate ("", Arg0, Local2) 239 Concatenate (Local2, " ", Local1) 240 Concatenate (Local1, Local0, Debug) 241 } 242 243 /* 244 * Print out the Memory Consumption Statistics Package 245 * 246 * arg0 - Memory Consumption Statistics Package 247 * arg1 - opcode of the title message 248 */ 249 Method (M3A2, 2, Serialized) 250 { 251 If ((Arg1 == 0x00)) 252 { 253 Debug = "==== _TCI-end statistics" 254 } 255 ElseIf ((Arg1 == 0x01)) 256 { 257 Debug = "==== _TCI-begin statistics" 258 } 259 ElseIf ((Arg1 == 0x02)) 260 { 261 Debug = "==== _TCI-end-begin difference" 262 } 263 Else 264 { 265 Debug = "???" 266 } 267 268 Name (LPN0, 0x00) 269 Name (LPC0, 0x00) 270 LPN0 = C220 /* \C220 */ 271 LPC0 = 0x00 272 Local1 = 0x00 273 Local2 = 0x00 274 While (LPN0) 275 { 276 If ((LPC0 == C210)) 277 { 278 Debug = "Title:" 279 } 280 ElseIf ((LPC0 == C211)) 281 { 282 Debug = "acq0: all calls to AcpiUtAcquireFromCache" 283 } 284 ElseIf ((LPC0 == C212)) 285 { 286 Debug = "acq1: +AcpiUtAcquireMutex" 287 } 288 ElseIf ((LPC0 == C213)) 289 { 290 Debug = "acq2: +there is a cache object available" 291 } 292 ElseIf ((LPC0 == C214)) 293 { 294 Debug = "acq3: +AcpiUtReleaseMutex" 295 } 296 ElseIf ((LPC0 == C215)) 297 { 298 Debug = "acq4: +otherwise, the cache is empty, create a new object" 299 } 300 ElseIf ((LPC0 == C216)) 301 { 302 Debug = "acq5: +AcpiUtReleaseMutex" 303 } 304 ElseIf ((LPC0 == C217)) 305 { 306 Debug = "rel0: all calls to AcpiUtReleaseToCache" 307 } 308 ElseIf ((LPC0 == C218)) 309 { 310 Debug = "rel1: +walk cache is full, just free this object" 311 } 312 ElseIf ((LPC0 == C219)) 313 { 314 Debug = "rel2: +otherwise, put this object back into the cache" 315 } 316 ElseIf ((LPC0 == C21A)) 317 { 318 Debug = "rel3: +AcpiUtAcquireMutex" 319 } 320 ElseIf ((LPC0 == C21B)) 321 { 322 Debug = "Created Objects:" 323 } 324 ElseIf ((LPC0 == C21C)) 325 { 326 Debug = "Deleted Objects:" 327 } 328 ElseIf ((LPC0 == C21D)) 329 { 330 Debug = "Miscellaneous Stat:" 331 } 332 333 If ((LPC0 >= C21D)) 334 { 335 Debug = DerefOf (Arg0 [LPC0]) 336 } 337 ElseIf ((LPC0 >= C21C)) 338 { 339 Local0 = DerefOf (Arg0 [LPC0]) 340 M3A1 (Local0, Local1) 341 Local1++ 342 } 343 ElseIf ((LPC0 >= C21B)) 344 { 345 Local0 = DerefOf (Arg0 [LPC0]) 346 M3A1 (Local0, Local2) 347 Local2++ 348 } 349 Else 350 { 351 Debug = DerefOf (Arg0 [LPC0]) 352 } 353 354 LPN0-- 355 LPC0++ 356 } 357 } 358 359 /* 360 * Calculate the difference between the two 361 * Memory Consumption Statistics Packages. 362 * 363 * arg0 - Package of _TCI-end statistics 364 * arg1 - Package of _TCI-begin statistics 365 * arg2 - Package for _TCI-end-begin difference 366 */ 367 Method (M3A3, 3, Serialized) 368 { 369 Name (LPN0, 0x00) 370 Name (LPC0, 0x00) 371 LPN0 = C220 /* \C220 */ 372 LPC0 = 0x00 373 While (LPN0) 374 { 375 Local0 = DerefOf (Arg0 [LPC0]) 376 Local1 = DerefOf (Arg1 [LPC0]) 377 Local2 = (Local1 - Local0) 378 Arg2 [LPC0] = Local2 379 LPN0-- 380 LPC0++ 381 } 382 } 383 384 /* 385 * Verify difference of Memory Consumption Statistics between 386 * two points: _TCI-end statistics and _TCI-begin statistics 387 * (and reset locations of Command of arg0 and arg1 Packages 388 * for the following run). 389 * 390 * Check that the Memory Consumption Statistics measured at the first point 391 * as '_TCI-end statistics' was then changed as expected to the second point 392 * where statistics was measured as '_TCI-begin statistics'. Between these 393 * two points we initiate some AML activity which involves the memory 394 * consumption acquire/release to be then analyzed and verified. 395 * 396 * 397 * arg0 - Package of _TCI-end statistics 398 * arg1 - Package of _TCI-begin statistics 399 * arg2 - Package for _TCI-end-begin difference 400 * arg3 - Package with the benchmark information on Created Objects 401 * arg4 - Package with the benchmark information on Deleted Objects 402 * (if non-Package, then arg3 is used) 403 * arg5 - Package with the benchmark information on memory acq0 and rel0 404 * (if non-Package, then compare acq0 and rel0 of arg2, 405 * otherwise, arg5 is a Package with the expected per-memory 406 * type differences, expected: acq0[i] - rel0[i] = arg5[i]) 407 * arg6 - index of checking (inside the file) 408 * 409 * Return: 410 * 0 - success 411 * 1 - incorrect Memory Consumption Statistics encountered 412 * otherwise - failed to determine the Memory Consumption Statistics 413 * 414 * See: the time of execution can be reduced (design and use additional flags): 415 * - exclude initialization before each operation 416 * (ACPICA writes all elements, benchmarks for the 417 * following sub-test mostly differ previous ones) 418 * - restrict checkings (use flag) by the acq0 & rel0, 419 * and add & del. 420 */ 421 Method (M3A4, 7, Serialized) 422 { 423 /* Flag of printing */ 424 425 Name (PR1, 0x00) 426 Name (PR2, 0x00) 427 Name (LPN0, 0x00) 428 Name (LPC0, 0x00) 429 If (PR1) 430 { 431 M3A2 (Arg0, 0x00) 432 M3A2 (Arg1, 0x01) 433 } 434 435 If (PR2) 436 { 437 M3A2 (Arg2, 0x02) 438 } 439 440 Local7 = 0x00 441 /* Check headers of Packages */ 442 443 If (M3A6 (Arg0, 0x00, Arg6)) 444 { 445 Local7 = 0x02 446 } 447 448 If (M3A6 (Arg1, 0x01, Arg6)) 449 { 450 Local7 = 0x02 451 } 452 453 /* Check statistics specified by index */ 454 455 If (M3A7 (Arg0, 0x00, Arg6)) 456 { 457 Local7 = 0x02 458 } 459 460 If (M3A7 (Arg1, 0x00, Arg6)) 461 { 462 Local7 = 0x02 463 } 464 465 If (M3A7 (Arg2, 0x01, Arg6)) 466 { 467 Local7 = 0x02 468 } 469 470 /* 471 * acq0 and rel0 of arg2-difference 472 * are to be equal each to another 473 * (or correspond to arg5): 474 */ 475 If ((ObjectType (Arg5) == C00C)) 476 { 477 Local0 = C211 /* \C211 */ 478 Local1 = C217 /* \C217 */ 479 Local4 = 0x00 480 LPN0 = C221 /* \C221 */ 481 LPC0 = 0x00 482 While (LPN0) 483 { 484 Local2 = DerefOf (Arg2 [Local0]) 485 Local3 = DerefOf (Arg2 [Local1]) 486 Local5 = DerefOf (Arg5 [Local4]) 487 Local6 = (Local2 - Local3) 488 If ((Local6 != Local5)) 489 { 490 If (!DE00) 491 { 492 ERR ("m3a4", Z128, __LINE__, 0x00, Arg6, Local6, Local5) 493 Debug = LPC0 /* \M3A4.LPC0 */ 494 Debug = Local0 495 Debug = Local1 496 Debug = Local4 497 Debug = Local2 498 Debug = Local3 499 Debug = Local5 500 Debug = Local6 501 } 502 503 Local7 = 0x01 504 } 505 506 Local0++ 507 Local1++ 508 Local4++ 509 LPN0-- 510 LPC0++ 511 } 512 } 513 Else 514 { 515 Local0 = C211 /* \C211 */ 516 Local1 = C217 /* \C217 */ 517 LPN0 = C221 /* \C221 */ 518 LPC0 = 0x00 519 While (LPN0) 520 { 521 Local2 = DerefOf (Arg2 [Local0]) 522 Local3 = DerefOf (Arg2 [Local1]) 523 If ((Local2 != Local3)) 524 { 525 If (!DE00) 526 { 527 ERR ("m3a4", Z128, __LINE__, 0x00, Arg6, Local2, Local3) 528 } 529 530 Local7 = 0x01 531 } 532 533 Local0++ 534 Local1++ 535 LPN0-- 536 LPC0++ 537 } 538 } 539 540 /* arg2-difference: acq0 == acq3 + acq5 */ 541 542 Local0 = C211 /* \C211 */ 543 Local1 = C214 /* \C214 */ 544 Local2 = C216 /* \C216 */ 545 LPN0 = C221 /* \C221 */ 546 LPC0 = 0x00 547 While (LPN0) 548 { 549 Local3 = DerefOf (Arg2 [Local0]) 550 Local4 = DerefOf (Arg2 [Local1]) 551 Local5 = DerefOf (Arg2 [Local2]) 552 Local6 = (Local4 + Local5) 553 If ((Local3 != Local6)) 554 { 555 If (!DE00) 556 { 557 ERR ("m3a4", Z128, __LINE__, 0x00, Arg6, Local3, Local6) 558 } 559 560 Local7 = 0x01 561 } 562 563 Local0++ 564 Local1++ 565 Local2++ 566 LPN0-- 567 LPC0++ 568 } 569 570 /* arg2-difference: rel0 == rel1 + rel3 */ 571 572 Local0 = C217 /* \C217 */ 573 Local1 = C218 /* \C218 */ 574 Local2 = C21A /* \C21A */ 575 LPN0 = C221 /* \C221 */ 576 LPC0 = 0x00 577 While (LPN0) 578 { 579 Local3 = DerefOf (Arg2 [Local0]) 580 Local4 = DerefOf (Arg2 [Local1]) 581 Local5 = DerefOf (Arg2 [Local2]) 582 Local6 = (Local4 + Local5) 583 If ((Local3 != Local6)) 584 { 585 If (!DE00) 586 { 587 ERR ("m3a4", Z128, __LINE__, 0x00, Arg6, Local3, Local6) 588 } 589 590 Local7 = 0x01 591 } 592 593 Local0++ 594 Local1++ 595 Local2++ 596 LPN0-- 597 LPC0++ 598 } 599 600 /* Check, created Objects are identical to the benchmark ones */ 601 602 If ((ObjectType (Arg3) == C00C)) 603 { 604 LPN0 = C027 /* \C027 */ 605 Local0 = C21B /* \C21B */ 606 Local1 = 0x00 607 While (LPN0) 608 { 609 Local2 = DerefOf (Arg2 [Local0]) 610 Local3 = DerefOf (Arg3 [Local1]) 611 If ((Local2 != Local3)) 612 { 613 If (!DE00) 614 { 615 ERR ("m3a4", Z128, __LINE__, 0x00, Arg6, Local2, Local3) 616 } 617 618 Local7 = 0x01 619 } 620 621 Local0++ 622 Local1++ 623 LPN0-- 624 } 625 } 626 627 /* Check, deleted Objects are identical to the benchmark ones */ 628 629 LPN0 = C027 /* \C027 */ 630 Local0 = C21C /* \C21C */ 631 Local1 = 0x00 632 Local4 = 0x00 633 If ((ObjectType (Arg4) == C00C)) 634 { 635 Local4 = Arg4 636 } 637 ElseIf ((ObjectType (Arg3) == C00C)) 638 { 639 Local4 = Arg3 640 } 641 642 If ((ObjectType (Local4) == C00C)) 643 { 644 While (LPN0) 645 { 646 Local2 = DerefOf (Arg2 [Local0]) 647 Local3 = DerefOf (Local4 [Local1]) 648 If ((Local2 != Local3)) 649 { 650 If (!DE00) 651 { 652 ERR ("m3a4", Z128, __LINE__, 0x00, Arg6, Local2, Local3) 653 } 654 655 Local7 = 0x01 656 } 657 658 Local0++ 659 Local1++ 660 LPN0-- 661 } 662 } 663 664 /* 665 * Reset locations of Command of arg0 and arg1 666 * Packages for the following run. 667 * Store(0, Index(arg0, c224)) 668 * Store(0, Index(arg1, c224)) 669 */ 670 Return (Local7) 671 } 672 673 /* 674 * Return non-zero in case the Test Command interface 675 * with the ACPICA (_TCI) is supported. 676 */ 677 Method (M3A5, 0, NotSerialized) 678 { 679 Local0 = M3A0 (C202) /* TCI_CMD_CHECK_SUPPORTED */ 680 _TCI (C202, Local0) 681 Local1 = DerefOf (Local0 [C224]) 682 If ((Local1 != C202)) 683 { 684 Return (0x00) 685 } 686 687 Return (0x01) 688 } 689 690 /* 691 * Check header of Memory Consumption Statistics Package 692 * arg0 - Memory Consumption Statistics Package 693 * arg1 - Means: 694 * 0 - _TCI-end statistics 695 * otherwise - _TCI-begin statistics 696 * arg2 - index of checking (inside the file) 697 */ 698 Method (M3A6, 3, NotSerialized) 699 { 700 Local7 = 0x00 701 /* Tag of command */ 702 703 If (Arg1) 704 { 705 Local0 = C209 /* \C209 */ 706 } 707 Else 708 { 709 Local0 = C208 /* \C208 */ 710 } 711 712 Local1 = DerefOf (Arg0 [0x00]) 713 If ((Local1 != Local0)) 714 { 715 ERR ("m3a6", Z128, __LINE__, 0x00, Arg2, Local1, Local0) 716 Local7 = 0x01 717 } 718 719 /* Number of elements actually packed */ 720 721 Local1 = DerefOf (Arg0 [0x01]) 722 If ((Local1 != C220)) 723 { 724 ERR ("m3a6", Z128, __LINE__, 0x00, Arg2, Local1, C220) 725 Local7 = 0x01 726 } 727 728 /* Command has been executed */ 729 730 If (Arg1) 731 { 732 Local0 = C201 /* \C201 */ 733 } 734 Else 735 { 736 Local0 = C200 /* \C200 */ 737 } 738 739 Local1 = DerefOf (Arg0 [0x02]) 740 If ((Local1 != Local0)) 741 { 742 ERR ("m3a6", Z128, __LINE__, 0x00, Arg2, Local1, Local0) 743 Local7 = 0x01 744 } 745 746 /* Object cache is enabled */ 747 748 Local1 = DerefOf (Arg0 [0x03]) 749 If (!Local1) 750 { 751 ERR ("m3a6", Z128, __LINE__, 0x00, Arg2, Local1, 0x01) 752 Local7 = 0x01 753 } 754 755 Return (Local7) 756 } 757 758 /* 759 * Check statistics specified by index 760 * 761 * arg0 - Memory Consumption Statistics Package 762 * arg1 - Means: 763 * non-zero - _TCI-end-begin difference Package 764 * otherwise - usual Memory Consumption Statistics Package 765 * arg2 - index of checking (inside the file) 766 */ 767 Method (M3A7, 3, NotSerialized) 768 { 769 Local7 = 0x00 770 If (Arg1){ /* 771 // ACPI_STAT_SUCCESS_FREE == ACPI_STAT_SUCCESS_ALLOC 772 Add(c21d, 5, Local0) 773 Store(DerefOf(Index(arg0, Local0)), Local1) 774 Increment(Local0) 775 Store(DerefOf(Index(arg0, Local0)), Local2) 776 if (LNotEqual(Local2, Local1)) { 777 err("m3a7", z128, __LINE__, 0, arg2, Local2, Local1) 778 Store(1, Local7) 779 } 780 */ 781 } 782 Else 783 { 784 /* ACPI_STAT_INVALID_EXBUF */ 785 786 Local0 = C21D /* \C21D */ 787 Local1 = DerefOf (Arg0 [Local0]) 788 If (Local1) 789 { 790 ERR ("m3a7", Z128, __LINE__, 0x00, Arg2, Local1, 0x00) 791 Local7 = 0x01 792 } 793 794 /* ACPI_STAT_ZONE0_CORRUPTED */ 795 796 Local0++ 797 Local1 = DerefOf (Arg0 [Local0]) 798 If (Local1) 799 { 800 ERR ("m3a7", Z128, __LINE__, 0x00, Arg2, Local1, 0x00) 801 Local7 = 0x01 802 } 803 804 /* ACPI_STAT_ZONE1_CORRUPTED */ 805 806 Local0++ 807 Local1 = DerefOf (Arg0 [Local0]) 808 If (Local1) 809 { 810 ERR ("m3a7", Z128, __LINE__, 0x00, Arg2, Local1, 0x00) 811 Local7 = 0x01 812 } 813 814 /* ACPI_STAT_FAILED_ALLOC */ 815 816 Local0++ 817 Local1 = DerefOf (Arg0 [Local0]) 818 If (Local1) 819 { 820 ERR ("m3a7", Z128, __LINE__, 0x00, Arg2, Local1, 0x00) 821 Local7 = 0x01 822 } 823 824 /* ACPI_STAT_NULL_FREE */ 825 826 Local0++ 827 Local1 = DerefOf (Arg0 [Local0]) 828 If (Local1) 829 { 830 ERR ("m3a7", Z128, __LINE__, 0x00, Arg2, Local1, 0x00) 831 Local7 = 0x01 832 } 833 } 834 835 Return (Local7) 836 } 837 838 /* 839 * Create and initialize the sample Package for the 840 * per-object type benchmark Memory Consumption Statistics 841 */ 842 Method (M3A8, 0, Serialized) 843 { 844 Name (P000, Package (0x20) 845 { 846 0x00, 847 0x00, 848 0x00, 849 0x00, 850 0x00, 851 0x00, 852 0x00, 853 0x00, 854 0x00, 855 0x00, 856 0x00, 857 0x00, 858 0x00, 859 0x00, 860 0x00, 861 0x00, 862 0x00, 863 0x00, 864 0x00, 865 0x00, 866 0x00, 867 0x00, 868 0x00, 869 0x00, 870 0x00, 871 0x00, 872 0x00, 873 0x00, 874 0x00, 875 0x00, 876 0x00, 877 0x00 878 }) 879 Return (P000) /* \M3A8.P000 */ 880 } 881 882 /* 883 * Create and initialize the sample Package for the 884 * per-memory type benchmark Memory Consumption Statistics 885 */ 886 Method (M3A9, 0, Serialized) 887 { 888 Name (P000, Package (0x07) 889 { 890 0x00, 891 0x00, 892 0x00, 893 0x00, 894 0x00, 895 0x00, 896 0x00 897 }) 898 Return (P000) /* \M3A9.P000 */ 899 } 900 901 /* 902 * Determine the flag of optimization: check that 903 * processing of the Add operation corresponds to 904 * the expectation: optimized/non-optimized. 905 * 906 * Mode of run, optimized/non-optimized, is essential 907 * for this kind tests (memory consumption). 908 * 909 * arg0 - Means: 910 * 0 - check for Optimization is tuned off 911 * otherwise - check for Optimization is tuned on 912 */ 913 Method (M3AA, 0, Serialized) 914 { 915 Name (I000, 0x00) 916 Name (P000, Package (0x01){}) 917 Name (P00B, Package (0x01){}) 918 FOPT = 0xFF 919 Local0 = M3A0 (C200) /* _TCI-end statistics */ 920 P00B = M3A0 (C201) /* _TCI-begin statistics */ 921 Local1 = M3A0 (0x00) /* difference */ 922 _TCI (C200, Local0) 923 Store ((0x03 + 0x04), I000) /* \M3AA.I000 */ 924 _TCI (C201, P00B) 925 M3A3 (Local0, P00B, Local1) 926 /* Statistics expected in case Optimization is tuned off */ 927 928 P000 = M3A8 () 929 P000 [C009] = 0x04 /* Integer */ 930 DE00 = 0x01 931 Local6 = M3A4 (Local0, P00B, Local1, P000, 0x00, 0x00, 0x00) 932 DE00 = 0x00 933 If ((Local6 == 0x02)) 934 { 935 Debug = "Failed to determine the flag of optimization" 936 Return (Zero) 937 } 938 Else 939 { 940 /* Statistics expected in case Optimization is tuned on */ 941 942 P000 = M3A8 () 943 P000 [C009] = 0x01 /* Integer */ 944 DE00 = 0x01 945 Local7 = M3A4 (Local0, P00B, Local1, P000, 0x00, 0x00, 0x01) 946 DE00 = 0x00 947 If ((Local7 == 0x02)) 948 { 949 Debug = "Failed to determine the flag of optimization" 950 Return (Zero) 951 } 952 } 953 954 If ((Local6 == Local7)) 955 { 956 Debug = "Internal error 0" 957 ERR ("m3aa", Z128, __LINE__, 0x00, 0x00, Local6, Local7) 958 } 959 ElseIf (Local6) 960 { 961 FOPT = 0x01 962 } 963 Else 964 { 965 FOPT = 0x00 966 } 967 } 968 969 /* 970 * Return Package with the array of thread indexes 971 * otherwise Integer 0. 972 * 973 * arg0 - number of threads 974 */ 975 Method (M163, 1, Serialized) 976 { 977 Name (SIZE, 0x00) 978 SIZE = (C22F + Arg0) 979 Local0 = M165 (C203, SIZE) /* TCI_CMD_GET_ID_OF_THREADS */ 980 _TCI (C203, Local0) 981 Local1 = DerefOf (Local0 [C224]) 982 If ((Local1 != C203)) 983 { 984 Return (0x00) 985 } 986 987 Return (Local0) 988 } 989