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 * Check for exceptions on mutexes 30 */ 31 Name (Z150, 0x96) 32 /* 33 * Run checking that all mutexes are actually Released. 34 * To be used while debugging the tests mainly. 35 */ 36 Name (FL03, 0x00) 37 /* Counter for m08e */ 38 39 Name (CN00, 0x00) 40 /* 41 * These declarations are used for to check the Acquire 42 * and Release operations in a global level AML code. 43 */ 44 Name (I101, 0x00) /* non-zero means that this test was run */ 45 /* 46 * Valid sequence of requests, no exceptions expected. 47 * 48 * Acquire mutexes of monotone increasing level (Global lock 49 * on level 0 too) for all available levels from 0 up to 15, 50 * then Release them all in the inverse order. 51 */ 52 Method (M301, 0, Serialized) 53 { 54 Mutex (MT00, 0x00) 55 Mutex (MT10, 0x01) 56 Mutex (MT20, 0x02) 57 Mutex (MT30, 0x03) 58 Mutex (MT40, 0x04) 59 Mutex (MT50, 0x05) 60 Mutex (MT60, 0x06) 61 Mutex (MT70, 0x07) 62 Mutex (MT80, 0x08) 63 Mutex (MT90, 0x09) 64 Mutex (MTA0, 0x0A) 65 Mutex (MTB0, 0x0B) 66 Mutex (MTC0, 0x0C) 67 Mutex (MTD0, 0x0D) 68 Mutex (MTE0, 0x0E) 69 Mutex (MTF0, 0x0F) 70 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 71 Local0 = Acquire (MT00, 0xFFFF) 72 If (Local0) 73 { 74 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 75 } 76 Else 77 { 78 Local0 = Acquire (\_GL, 0xFFFF) 79 /* GL */ 80 81 If (Local0) 82 { 83 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 84 } 85 Else 86 { 87 Local0 = Acquire (MT10, 0xFFFF) 88 If (Local0) 89 { 90 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 91 } 92 Else 93 { 94 Local0 = Acquire (MT20, 0xFFFF) 95 If (Local0) 96 { 97 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 98 } 99 Else 100 { 101 Local0 = Acquire (MT30, 0xFFFF) 102 If (Local0) 103 { 104 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 105 } 106 Else 107 { 108 Local0 = Acquire (MT40, 0xFFFF) 109 If (Local0) 110 { 111 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 112 } 113 Else 114 { 115 Local0 = Acquire (MT50, 0xFFFF) 116 If (Local0) 117 { 118 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 119 } 120 Else 121 { 122 Local0 = Acquire (MT60, 0xFFFF) 123 If (Local0) 124 { 125 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 126 } 127 Else 128 { 129 Local0 = Acquire (MT70, 0xFFFF) 130 If (Local0) 131 { 132 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 133 } 134 Else 135 { 136 Local0 = Acquire (MT80, 0xFFFF) 137 If (Local0) 138 { 139 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 140 } 141 Else 142 { 143 Local0 = Acquire (MT90, 0xFFFF) 144 If (Local0) 145 { 146 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 147 } 148 Else 149 { 150 Local0 = Acquire (MTA0, 0xFFFF) 151 If (Local0) 152 { 153 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 154 } 155 Else 156 { 157 Local0 = Acquire (MTB0, 0xFFFF) 158 If (Local0) 159 { 160 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 161 } 162 Else 163 { 164 Local0 = Acquire (MTC0, 0xFFFF) 165 If (Local0) 166 { 167 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 168 } 169 Else 170 { 171 Local0 = Acquire (MTD0, 0xFFFF) 172 If (Local0) 173 { 174 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 175 } 176 Else 177 { 178 Local0 = Acquire (MTE0, 0xFFFF) 179 If (Local0) 180 { 181 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 182 } 183 Else 184 { 185 Local0 = Acquire (MTF0, 0xFFFF) 186 If (Local0) 187 { 188 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 189 } 190 Else 191 { 192 Release (MTF0) 193 Release (MTE0) 194 Release (MTD0) 195 Release (MTC0) 196 Release (MTB0) 197 Release (MTA0) 198 Release (MT90) 199 Release (MT80) 200 Release (MT70) 201 Release (MT60) 202 Release (MT50) 203 Release (MT40) 204 Release (MT30) 205 Release (MT20) 206 Release (MT10) 207 Release (\_GL) 208 Release (MT00) 209 } 210 } 211 } 212 } 213 } 214 } 215 } 216 } 217 } 218 } 219 } 220 } 221 } 222 } 223 } 224 } 225 } 226 227 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 228 } 229 230 /* 231 * Valid sequence of requests, no exceptions expected. 232 * 233 * Acquire mutexes of monotone increasing level (Global lock on level 0 too) 234 * for all available levels from 0 up to 15, Acquire 2 mutexes of each level, 235 * then Release them all in the inverse order (keep the exactly inverse order 236 * for Releasing mutexes of the same level too). 237 * 238 * arg0 - if to force AE_LIMIT by exceeding the maximal number of created mutexes 239 */ 240 Method (M369, 1, Serialized) 241 { 242 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 243 Mutex (MT00, 0x00) 244 Mutex (MT10, 0x01) 245 Mutex (MT20, 0x02) 246 Mutex (MT30, 0x03) 247 Mutex (MT40, 0x04) 248 Mutex (MT50, 0x05) 249 Mutex (MT60, 0x06) 250 Mutex (MT70, 0x07) 251 Mutex (MT80, 0x08) 252 Mutex (MT90, 0x09) 253 Mutex (MTA0, 0x0A) 254 Mutex (MTB0, 0x0B) 255 Mutex (MTC0, 0x0C) 256 Mutex (MTD0, 0x0D) 257 Mutex (MTE0, 0x0E) 258 Mutex (MTF0, 0x0F) 259 Mutex (MT01, 0x00) 260 Mutex (MT11, 0x01) 261 Mutex (MT21, 0x02) 262 Mutex (MT31, 0x03) 263 Mutex (MT41, 0x04) 264 Mutex (MT51, 0x05) 265 Mutex (MT61, 0x06) 266 Mutex (MT71, 0x07) 267 Mutex (MT81, 0x08) 268 Mutex (MT91, 0x09) 269 Mutex (MTA1, 0x0A) 270 Mutex (MTB1, 0x0B) 271 Mutex (MTC1, 0x0C) 272 Mutex (MTD1, 0x0D) 273 Mutex (MTE1, 0x0E) 274 If (Arg0) 275 { 276 /* Should be enough to exceed the maximal available number of mutexes */ 277 278 Mutex (MTF1, 0x0F) 279 Mutex (MTF2, 0x0F) 280 Mutex (MTF3, 0x0F) 281 Mutex (MTF4, 0x0F) 282 } 283 284 Local0 = Acquire (MT00, 0xFFFF) 285 If (Local0) 286 { 287 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 288 } 289 Else 290 { 291 Local0 = Acquire (MT01, 0xFFFF) 292 /* the same level */ 293 294 If (Local0) 295 { 296 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 297 } 298 Else 299 { 300 Local0 = Acquire (\_GL, 0xFFFF) 301 /* GL */ 302 303 If (Local0) 304 { 305 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 306 } 307 Else 308 { 309 Local0 = Acquire (MT10, 0xFFFF) 310 If (Local0) 311 { 312 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 313 } 314 Else 315 { 316 Local0 = Acquire (MT11, 0xFFFF) 317 If (Local0) 318 { 319 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 320 } 321 Else 322 { 323 Local0 = Acquire (MT20, 0xFFFF) 324 If (Local0) 325 { 326 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 327 } 328 Else 329 { 330 Local0 = Acquire (MT21, 0xFFFF) 331 If (Local0) 332 { 333 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 334 } 335 Else 336 { 337 Local0 = Acquire (MT30, 0xFFFF) 338 If (Local0) 339 { 340 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 341 } 342 Else 343 { 344 Local0 = Acquire (MT31, 0xFFFF) 345 If (Local0) 346 { 347 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 348 } 349 Else 350 { 351 Local0 = Acquire (MT40, 0xFFFF) 352 If (Local0) 353 { 354 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 355 } 356 Else 357 { 358 Local0 = Acquire (MT41, 0xFFFF) 359 If (Local0) 360 { 361 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 362 } 363 Else 364 { 365 Local0 = Acquire (MT50, 0xFFFF) 366 If (Local0) 367 { 368 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 369 } 370 Else 371 { 372 Local0 = Acquire (MT51, 0xFFFF) 373 If (Local0) 374 { 375 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 376 } 377 Else 378 { 379 Local0 = Acquire (MT60, 0xFFFF) 380 If (Local0) 381 { 382 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 383 } 384 Else 385 { 386 Local0 = Acquire (MT61, 0xFFFF) 387 If (Local0) 388 { 389 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 390 } 391 Else 392 { 393 Local0 = Acquire (MT70, 0xFFFF) 394 If (Local0) 395 { 396 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 397 } 398 Else 399 { 400 Local0 = Acquire (MT71, 0xFFFF) 401 If (Local0) 402 { 403 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 404 } 405 Else 406 { 407 Local0 = Acquire (MT80, 0xFFFF) 408 If (Local0) 409 { 410 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 411 } 412 Else 413 { 414 Local0 = Acquire (MT81, 0xFFFF) 415 If (Local0) 416 { 417 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 418 } 419 Else 420 { 421 Local0 = Acquire (MT90, 0xFFFF) 422 If (Local0) 423 { 424 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 425 } 426 Else 427 { 428 Local0 = Acquire (MT91, 0xFFFF) 429 If (Local0) 430 { 431 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 432 } 433 Else 434 { 435 Local0 = Acquire (MTA0, 0xFFFF) 436 If (Local0) 437 { 438 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 439 } 440 Else 441 { 442 Local0 = Acquire (MTA1, 0xFFFF) 443 If (Local0) 444 { 445 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 446 } 447 Else 448 { 449 Local0 = Acquire (MTB0, 0xFFFF) 450 If (Local0) 451 { 452 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 453 } 454 Else 455 { 456 Local0 = Acquire (MTB1, 0xFFFF) 457 If (Local0) 458 { 459 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 460 } 461 Else 462 { 463 Local0 = Acquire (MTC0, 0xFFFF) 464 If (Local0) 465 { 466 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 467 } 468 Else 469 { 470 Local0 = Acquire (MTC1, 0xFFFF) 471 If (Local0) 472 { 473 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 474 } 475 Else 476 { 477 Local0 = Acquire (MTD0, 0xFFFF) 478 If (Local0) 479 { 480 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 481 } 482 Else 483 { 484 Local0 = Acquire (MTD1, 0xFFFF) 485 If (Local0) 486 { 487 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 488 } 489 Else 490 { 491 Local0 = Acquire (MTE0, 0xFFFF) 492 If (Local0) 493 { 494 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 495 } 496 Else 497 { 498 Local0 = Acquire (MTE1, 0xFFFF) 499 If (Local0) 500 { 501 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 502 } 503 Else 504 { 505 Local0 = Acquire (MTF0, 0xFFFF) 506 If (Local0) 507 { 508 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 509 } 510 Else 511 { 512 If (Arg0) 513 { 514 Local0 = Acquire (MTF1, 0xFFFF) 515 } 516 Else 517 { 518 Local0 = 0x00 519 } 520 521 If (Local0) 522 { 523 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 524 } 525 Else 526 { 527 If (Arg0) 528 { 529 Release (MTF1) 530 } 531 532 Release (MTF0) 533 Release (MTE1) 534 Release (MTE0) 535 Release (MTD1) 536 Release (MTD0) 537 Release (MTC1) 538 Release (MTC0) 539 Release (MTB1) 540 Release (MTB0) 541 Release (MTA1) 542 Release (MTA0) 543 Release (MT91) 544 Release (MT90) 545 Release (MT81) 546 Release (MT80) 547 Release (MT71) 548 Release (MT70) 549 Release (MT61) 550 Release (MT60) 551 Release (MT51) 552 Release (MT50) 553 Release (MT41) 554 Release (MT40) 555 Release (MT31) 556 Release (MT30) 557 Release (MT21) 558 Release (MT20) 559 Release (MT11) 560 Release (MT10) 561 Release (\_GL) 562 Release (MT01) 563 Release (MT00) 564 } 565 } 566 } 567 } 568 } 569 } 570 } 571 } 572 } 573 } 574 } 575 } 576 } 577 } 578 } 579 } 580 } 581 } 582 } 583 } 584 } 585 } 586 } 587 } 588 } 589 } 590 } 591 } 592 } 593 } 594 } 595 } 596 } 597 598 If (Arg0) 599 { 600 CH04 (__METHOD__, 0x01, 0x12, Z150, __LINE__, 0x00, 0x00) /* AE_LIMIT */ 601 } 602 Else 603 { 604 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 605 } 606 } 607 608 /* 609 * Valid sequence of requests, no exceptions expected. 610 * 611 * Acquire mutexes of monotone increasing level (Global lock 612 * on level 0 too) for all available levels from 0 up to 15, 613 * then Release them all in the inverse order. 614 * 615 * Exactly m301 but additionally: 616 * all Release operations are located into separate method. 617 */ 618 Method (M36A, 0, Serialized) 619 { 620 Mutex (MT00, 0x00) 621 Mutex (MT10, 0x01) 622 Mutex (MT20, 0x02) 623 Mutex (MT30, 0x03) 624 Mutex (MT40, 0x04) 625 Mutex (MT50, 0x05) 626 Mutex (MT60, 0x06) 627 Mutex (MT70, 0x07) 628 Mutex (MT80, 0x08) 629 Mutex (MT90, 0x09) 630 Mutex (MTA0, 0x0A) 631 Mutex (MTB0, 0x0B) 632 Mutex (MTC0, 0x0C) 633 Mutex (MTD0, 0x0D) 634 Mutex (MTE0, 0x0E) 635 Mutex (MTF0, 0x0F) 636 Method (M000, 0, NotSerialized) 637 { 638 Local0 = Acquire (MT00, 0xFFFF) 639 If (Local0) 640 { 641 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 642 } 643 Else 644 { 645 Local0 = Acquire (\_GL, 0xFFFF) 646 If (Local0) 647 { 648 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 649 } 650 Else 651 { 652 Local0 = Acquire (MT10, 0xFFFF) 653 If (Local0) 654 { 655 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 656 } 657 Else 658 { 659 Local0 = Acquire (MT20, 0xFFFF) 660 If (Local0) 661 { 662 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 663 } 664 Else 665 { 666 Local0 = Acquire (MT30, 0xFFFF) 667 If (Local0) 668 { 669 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 670 } 671 Else 672 { 673 Local0 = Acquire (MT40, 0xFFFF) 674 If (Local0) 675 { 676 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 677 } 678 Else 679 { 680 Local0 = Acquire (MT50, 0xFFFF) 681 If (Local0) 682 { 683 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 684 } 685 Else 686 { 687 Local0 = Acquire (MT60, 0xFFFF) 688 If (Local0) 689 { 690 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 691 } 692 Else 693 { 694 Local0 = Acquire (MT70, 0xFFFF) 695 If (Local0) 696 { 697 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 698 } 699 Else 700 { 701 Local0 = Acquire (MT80, 0xFFFF) 702 If (Local0) 703 { 704 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 705 } 706 Else 707 { 708 Local0 = Acquire (MT90, 0xFFFF) 709 If (Local0) 710 { 711 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 712 } 713 Else 714 { 715 Local0 = Acquire (MTA0, 0xFFFF) 716 If (Local0) 717 { 718 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 719 } 720 Else 721 { 722 Local0 = Acquire (MTB0, 0xFFFF) 723 If (Local0) 724 { 725 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 726 } 727 Else 728 { 729 Local0 = Acquire (MTC0, 0xFFFF) 730 If (Local0) 731 { 732 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 733 } 734 Else 735 { 736 Local0 = Acquire (MTD0, 0xFFFF) 737 If (Local0) 738 { 739 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 740 } 741 Else 742 { 743 Local0 = Acquire (MTE0, 0xFFFF) 744 If (Local0) 745 { 746 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 747 } 748 Else 749 { 750 Local0 = Acquire (MTF0, 0xFFFF) 751 If (Local0) 752 { 753 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 754 } 755 Else 756 { 757 M001 () 758 } 759 } 760 } 761 } 762 } 763 } 764 } 765 } 766 } 767 } 768 } 769 } 770 } 771 } 772 } 773 } 774 } 775 } 776 777 /* m000 */ 778 779 Method (M001, 0, NotSerialized) 780 { 781 Release (MTF0) 782 Release (MTE0) 783 Release (MTD0) 784 Release (MTC0) 785 Release (MTB0) 786 Release (MTA0) 787 Release (MT90) 788 Release (MT80) 789 Release (MT70) 790 Release (MT60) 791 Release (MT50) 792 Release (MT40) 793 Release (MT30) 794 Release (MT20) 795 Release (MT10) 796 Release (\_GL) 797 Release (MT00) 798 } 799 800 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 801 M000 () 802 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 803 } 804 805 /* 806 * Valid sequence of requests, no exceptions expected. 807 * 808 * Acquire mutexes of monotone increasing level (Global lock 809 * on level 0 too) for all available levels from 0 up to 15, 810 * then Release them all in the inverse order. 811 * 812 * Exactly m301 but additionally: 813 * all Acquire and Release operations are located into separate methods. 814 */ 815 Method (M36B, 0, Serialized) 816 { 817 Mutex (MT00, 0x00) 818 Mutex (MT10, 0x01) 819 Mutex (MT20, 0x02) 820 Mutex (MT30, 0x03) 821 Mutex (MT40, 0x04) 822 Mutex (MT50, 0x05) 823 Mutex (MT60, 0x06) 824 Mutex (MT70, 0x07) 825 Mutex (MT80, 0x08) 826 Mutex (MT90, 0x09) 827 Mutex (MTA0, 0x0A) 828 Mutex (MTB0, 0x0B) 829 Mutex (MTC0, 0x0C) 830 Mutex (MTD0, 0x0D) 831 Mutex (MTE0, 0x0E) 832 Mutex (MTF0, 0x0F) 833 Method (M000, 0, NotSerialized) 834 { 835 Local0 = Acquire (MT00, 0xFFFF) 836 If (Local0) 837 { 838 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 839 } 840 Else 841 { 842 Local0 = Acquire (\_GL, 0xFFFF) 843 If (Local0) 844 { 845 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 846 } 847 Else 848 { 849 Local0 = Acquire (MT10, 0xFFFF) 850 If (Local0) 851 { 852 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 853 } 854 Else 855 { 856 Local0 = Acquire (MT20, 0xFFFF) 857 If (Local0) 858 { 859 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 860 } 861 Else 862 { 863 Local0 = Acquire (MT30, 0xFFFF) 864 If (Local0) 865 { 866 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 867 } 868 Else 869 { 870 Local0 = Acquire (MT40, 0xFFFF) 871 If (Local0) 872 { 873 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 874 } 875 Else 876 { 877 Local0 = Acquire (MT50, 0xFFFF) 878 If (Local0) 879 { 880 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 881 } 882 Else 883 { 884 Local0 = Acquire (MT60, 0xFFFF) 885 If (Local0) 886 { 887 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 888 } 889 Else 890 { 891 Local0 = Acquire (MT70, 0xFFFF) 892 If (Local0) 893 { 894 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 895 } 896 Else 897 { 898 Local0 = Acquire (MT80, 0xFFFF) 899 If (Local0) 900 { 901 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 902 } 903 Else 904 { 905 Local0 = Acquire (MT90, 0xFFFF) 906 If (Local0) 907 { 908 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 909 } 910 Else 911 { 912 Local0 = Acquire (MTA0, 0xFFFF) 913 If (Local0) 914 { 915 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 916 } 917 Else 918 { 919 Local0 = Acquire (MTB0, 0xFFFF) 920 If (Local0) 921 { 922 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 923 } 924 Else 925 { 926 Local0 = Acquire (MTC0, 0xFFFF) 927 If (Local0) 928 { 929 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 930 } 931 Else 932 { 933 Local0 = Acquire (MTD0, 0xFFFF) 934 If (Local0) 935 { 936 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 937 } 938 Else 939 { 940 Local0 = Acquire (MTE0, 0xFFFF) 941 If (Local0) 942 { 943 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 944 } 945 Else 946 { 947 Local0 = Acquire (MTF0, 0xFFFF) 948 If (Local0) 949 { 950 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 951 } 952 } 953 } 954 } 955 } 956 } 957 } 958 } 959 } 960 } 961 } 962 } 963 } 964 } 965 } 966 } 967 } 968 } 969 970 /* m000 */ 971 972 Method (M001, 0, NotSerialized) 973 { 974 Release (MTF0) 975 Release (MTE0) 976 Release (MTD0) 977 Release (MTC0) 978 Release (MTB0) 979 Release (MTA0) 980 Release (MT90) 981 Release (MT80) 982 Release (MT70) 983 Release (MT60) 984 Release (MT50) 985 Release (MT40) 986 Release (MT30) 987 Release (MT20) 988 Release (MT10) 989 Release (\_GL) 990 Release (MT00) 991 } 992 993 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 994 M000 () 995 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 996 M001 () 997 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 998 } 999 1000 /* 1001 * Invalid sequence of Acquire operations: 1002 * 1003 * 1) Acquire N-th level mutex (N>=1): 1004 * 2) Acquire: 1005 * - mutexes from 0 up to (N-1)-levels 1006 * - Global lock 1007 * 3) exception AE_AML_MUTEX_ORDER is expected for each Acquire of (2) 1008 */ 1009 Method (M36C, 0, Serialized) 1010 { 1011 Name (LPN0, 0x00) 1012 Name (LPC0, 0x00) 1013 /* 1014 * arg0 - level of mutex to be acquired first 1015 * arg1 - level of mutex to be acquired second 1016 * arg2 - 1 - acquire 0-level mutex instead of arg1 1017 * 2 - acquire Global lock instead of arg1 1018 */ 1019 Method (M000, 3, Serialized) 1020 { 1021 /* Acquire the first mutex */ 1022 1023 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1024 M36F (Arg0, 0x00, 0x00, 0x00) /* Acquire N-level mutex */ 1025 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1026 /* 1027 * Attempt to Acquire the second mutex (exception is expected). 1028 * 1029 * It is supposed that the second acquired 1030 * is a mutex of level not greater than (N-1) 1031 */ 1032 Switch (ToInteger (Arg2)) 1033 { 1034 Case (0x01) 1035 { 1036 M36F (0x00, 0x00, 0x01, 0x00) /* Acquire 0 level mux */ 1037 } 1038 Case (0x02) 1039 { 1040 M36F (GLLL, GLIX, 0x01, 0x00) /* Acquire GL */ 1041 } 1042 Default 1043 { 1044 M36F (Arg1, 0x00, 0x01, 0x00) /* Acquire arg1-level mux */ 1045 } 1046 1047 } 1048 1049 CH04 (__METHOD__, 0x00, 0x40, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_ORDER */ 1050 M388 (Arg0, 0x00, 0x00) /* Release */ 1051 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1052 } 1053 1054 /* 1055 * The second Acquires are run in range from 0 up to (N-1) levels 1056 * 1057 * arg0 - N level (to be in range from 1 up to 15) 1058 */ 1059 Method (M001, 1, Serialized) 1060 { 1061 Name (LPN0, 0x00) 1062 Name (LPC0, 0x00) 1063 LPN0 = Arg0 1064 LPC0 = 0x00 1065 While (LPN0) 1066 { 1067 M000 (Arg0, LPC0, 0x00) 1068 LPN0-- 1069 LPC0++ 1070 } 1071 } 1072 1073 /* From 1 up to 15 levels */ 1074 1075 LPN0 = (MAX0 - 0x01) 1076 LPC0 = 0x01 1077 While (LPN0) 1078 { 1079 If (LPC0) 1080 { 1081 M001 (LPC0) 1082 M000 (LPC0, 0x00, 0x01) /* 0 level mux */ 1083 M000 (LPC0, 0x00, 0x02) /* GL */ 1084 } 1085 1086 LPN0-- 1087 LPC0++ 1088 } 1089 } 1090 1091 /* 1092 * Exception on Release. 1093 * Release mutex twice. 1094 * 1095 * Attempt to Release free mutex: Acquire, Release, Release. 1096 * Exception is expected on the second Release. 1097 * Do it for all level mutexes and Global lock too. 1098 */ 1099 Method (M389, 0, Serialized) 1100 { 1101 Name (LPN0, 0x00) 1102 Name (LPC0, 0x00) 1103 /* arg0 - level of mutex */ 1104 1105 Method (M000, 1, NotSerialized) 1106 { 1107 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1108 M36F (Arg0, 0x00, 0x00, 0x00) /* Acquire */ 1109 M388 (Arg0, 0x00, 0x00) /* Release */ 1110 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1111 /* Attempt to Release free mutex */ 1112 1113 M388 (Arg0, 0x00, 0x00) /* Release */ 1114 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1115 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1116 M36F (Arg0, 0x00, 0x00, 0x00) /* Acquire */ 1117 M388 (Arg0, 0x00, 0x00) /* Release */ 1118 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1119 } 1120 1121 LPN0 = MAX0 /* \MAX0 */ 1122 LPC0 = 0x00 1123 While (LPN0) 1124 { 1125 M000 (LPC0) 1126 LPN0-- 1127 LPC0++ 1128 } 1129 1130 /* Separately for GL */ 1131 1132 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1133 M36F (GLLL, GLIX, 0x00, 0x00) /* Acquire */ 1134 M388 (GLLL, GLIX, 0x00) /* Release */ 1135 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1136 /* Attempt to Release free mutex */ 1137 1138 M388 (GLLL, GLIX, 0x00) /* Release */ 1139 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1140 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1141 M36F (GLLL, GLIX, 0x00, 0x00) /* Acquire */ 1142 M388 (GLLL, GLIX, 0x00) /* Release */ 1143 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1144 } 1145 1146 /* 1147 * Exception on Release. 1148 * Attempt to Release clean mutex which was never Acquired. 1149 */ 1150 Method (M07B, 0, Serialized) 1151 { 1152 Mutex (T000, 0x00) 1153 Mutex (T100, 0x01) 1154 Mutex (T200, 0x02) 1155 Mutex (T300, 0x03) 1156 Mutex (T400, 0x04) 1157 Mutex (T500, 0x05) 1158 Mutex (T600, 0x06) 1159 Mutex (T700, 0x07) 1160 Mutex (T800, 0x08) 1161 Mutex (T900, 0x09) 1162 Mutex (TA00, 0x0A) 1163 Mutex (TB00, 0x0B) 1164 Mutex (TC00, 0x0C) 1165 Mutex (TD00, 0x0D) 1166 Mutex (TE00, 0x0E) 1167 Mutex (TF00, 0x0F) 1168 /* First time */ 1169 1170 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1171 Release (T000) 1172 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1173 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1174 Release (\_GL) 1175 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1176 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1177 Release (T100) 1178 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1179 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1180 Release (T200) 1181 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1182 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1183 Release (T300) 1184 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1185 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1186 Release (T400) 1187 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1188 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1189 Release (T500) 1190 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1191 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1192 Release (T600) 1193 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1194 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1195 Release (T700) 1196 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1197 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1198 Release (T800) 1199 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1200 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1201 Release (T900) 1202 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1203 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1204 Release (TA00) 1205 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1206 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1207 Release (TB00) 1208 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1209 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1210 Release (TC00) 1211 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1212 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1213 Release (TD00) 1214 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1215 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1216 Release (TE00) 1217 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1218 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1219 Release (TF00) 1220 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1221 /* Second time */ 1222 1223 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1224 Release (T000) 1225 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1226 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1227 Release (T100) 1228 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1229 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1230 Release (T200) 1231 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1232 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1233 Release (T300) 1234 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1235 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1236 Release (T400) 1237 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1238 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1239 Release (T500) 1240 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1241 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1242 Release (T600) 1243 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1244 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1245 Release (T700) 1246 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1247 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1248 Release (T800) 1249 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1250 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1251 Release (T900) 1252 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1253 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1254 Release (TA00) 1255 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1256 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1257 Release (TB00) 1258 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1259 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1260 Release (TC00) 1261 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1262 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1263 Release (TD00) 1264 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1265 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1266 Release (TE00) 1267 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1268 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1269 Release (TF00) 1270 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) 1271 } 1272 1273 /* 1274 * Exception on Release. 1275 * Break the sequence of Acquiring mutexes while Releasing them, 1276 * jump over the level. 1277 * 1278 * Invalid sequence of Releases: 1279 * 1280 * 1) Take level from range (N>=1 & N<=15) 1281 * 2) Acquire mutexes of all levels from 0 up to N 1282 * 3) Try to Release any mutex: 1283 * - in the level range from (N-1) down to 0 1284 * - Global lock 1285 * 4) Do 1-3 for all levels in range (N>=1 & N<=15) 1286 */ 1287 Method (M38A, 0, Serialized) 1288 { 1289 Name (LPN0, 0x00) 1290 Name (LPC0, 0x00) 1291 Name (BR00, 0x00) 1292 LPN0 = (MAX0 - 0x01) 1293 LPC0 = 0x02 1294 While (LPN0) 1295 { 1296 /* Acquire lpC0 levels from 0 level */ 1297 1298 M38B (0x00, LPC0, 0x01, 0x00) 1299 /* 1300 * Exception is expected on each Release there. 1301 * 1302 * Break the sequence of Acquiring mutexes while Releasing them, 1303 * jump over the level. 1304 * Run Releasing mutexes NOT from (lpC0-1) level which would be 1305 * correct but from (lpC0-2) level down to 0 level so jumping over 1306 * the mutex of (lpC0-1) level which is Acquired which should cause 1307 * each of these Releases to generate AE_AML_MUTEX_ORDER exception. 1308 */ 1309 Local0 = (LPC0 - 0x02) 1310 Local1 = (LPC0 - 0x01) 1311 If (M38C (Local0, Local1, 0x01, 0x40)) 1312 { 1313 /* AE_AML_MUTEX_ORDER */ 1314 /* 1315 * Break for the first bunch of errors encountered, 1316 * don't waste log. 1317 */ 1318 BR00 = 0x01 1319 } 1320 1321 /* 1322 * Correct sequence of Releases. 1323 * Release lpC0 levels from (lpC0-1) down to 0 level. 1324 */ 1325 If (BR00) 1326 { 1327 M36F (HLMX, 0x00, 0x00, 0x00) 1328 M388 (HLMX, 0x00, 0x00) 1329 } 1330 1331 Local0 = (LPC0 - 0x01) 1332 M38C (Local0, LPC0, 0x01, 0x00) 1333 If (BR00) 1334 { 1335 Break 1336 } 1337 1338 LPN0-- 1339 LPC0++ 1340 } 1341 1342 CH03 ("m38a", Z150, __LINE__, 0x00, 0x00) 1343 } 1344 1345 /* 1346 * Manager for m38d. 1347 * 1348 * arg0 - the value of flag of GL 1349 * arg1 - order of Releasing bitmap (see m089) 1350 */ 1351 Method (M08C, 2, Serialized) 1352 { 1353 Name (LPN0, 0x00) 1354 Name (LPC0, 0x00) 1355 /* 1356 * arg0 - Level of mutex 1357 * arg1 - the value of flag of GL 1358 * arg2 - order of Releasing bitmap (see m089) 1359 */ 1360 Method (M000, 3, NotSerialized) 1361 { 1362 /* Set up the value of flag of Global lock */ 1363 1364 Local7 = M078 (Arg1) 1365 /* 1366 * min0 - number of mutexes existent for each level 1367 * 1368 * Acquire mutexes of level arg0 1369 * in the order from 0 index up 1370 * to (min0-1) one, then Release 1371 * them in the order specified 1372 * by arg2. 1373 */ 1374 M088 (Arg0, 0x01, 0x00, MIN0, 0x00, 0x00, 0x00) /* Acquire */ 1375 M089 (Arg0, 0x01, 0x00, MIN0, 0x00, 0x00, Arg2) /* Release */ 1376 /* Restore the value of flag of Global lock */ 1377 1378 M078 (Local7) 1379 } 1380 1381 /* For each level */ 1382 1383 LPN0 = MAX0 /* \MAX0 */ 1384 LPC0 = 0x00 1385 While (LPN0) 1386 { 1387 M000 (LPC0, Arg0, Arg1) 1388 LPN0-- 1389 LPC0++ 1390 } 1391 } 1392 1393 /* 1394 * Check up that the Releasing of the same level mutexes 1395 * can be performed in an arbitrary order, independently 1396 * on the order they were Acquired. 1397 * 1398 * For each level separately, one by one. 1399 */ 1400 Method (M38D, 0, NotSerialized) 1401 { 1402 M08C (0x00, 0x00) /* direct order of Releasing, Mutex(0,1) is usual mutex */ 1403 M08C (0x00, 0x01) /* inverse order of Releasing, Mutex(0,1) is usual mutex */ 1404 M08C (0x01, 0x00) /* direct order of Releasing, Mutex(0,1) is GL */ 1405 M08C (0x01, 0x01) /* inverse order of Releasing, Mutex(0,1) is GL */ 1406 /* Check that all mutexes are Released */ 1407 1408 M08A () 1409 } 1410 1411 /* 1412 * Check up that the Releasing of the same level mutexes 1413 * can be performed in an arbitrary order, independently 1414 * on the order they were Acquired. 1415 * 1416 * Cross through all the levels. 1417 * 1418 * arg0 - order of Releasing bitmap (see m089) 1419 */ 1420 Method (M07D, 1, NotSerialized) 1421 { 1422 M088 (0x00, MAX0, 0x00, MIN0, 0x00, 0x00, 0x00) /* Acquire all mutexes on all levels */ 1423 M089 (0x00, MAX0, 0x00, MIN0, 0x00, 0x00, Arg0) /* Release all mutexes on all levels */ 1424 } 1425 1426 /* 1427 * ACPI allows multiply own the same mutex 1428 * 1429 * arg0 - the value of flag of GL 1430 */ 1431 Method (M07A, 1, NotSerialized) 1432 { 1433 M079 (0x0A, Arg0) 1434 } 1435 1436 /* 1437 * Multiply owning the same ACPI mutex. 1438 * Acquire the same mutex arg2 times, then Release it (arg2+1) times, 1439 * expect exception on the last Release. 1440 * The repeated Acquire are made with TimeoutValue equal to zero. 1441 * 1442 * arg0 - how many times to Acquire it 1443 * arg1 - the value of flag of GL 1444 */ 1445 Method (M079, 2, Serialized) 1446 { 1447 Name (LPN0, 0x00) 1448 Name (LPC0, 0x00) 1449 Name (LPN1, 0x00) 1450 Name (LPC1, 0x00) 1451 Name (TOUT, 0x00) 1452 Name (IX00, 0x01) 1453 /* Set up the value of flag of Global lock */ 1454 1455 Local7 = M078 (Arg1) 1456 /* Acquire */ 1457 /* levels */ 1458 LPN0 = MAX0 /* \MAX0 */ 1459 LPC0 = 0x00 1460 While (LPN0) 1461 { 1462 /* repetitions */ 1463 1464 LPN1 = Arg0 1465 LPC1 = 0x00 1466 While (LPN1) 1467 { 1468 If (LPC1) 1469 { 1470 TOUT = TOV0 /* TimeOutValue equal to 0 */ /* \TOV0 */ 1471 } 1472 Else 1473 { 1474 TOUT = 0x00 /* TimeOutValue equal to 0xffff (once for the first Acquire) */ 1475 } 1476 1477 M36F (LPC0, IX00, 0x00, TOUT) 1478 LPN1-- 1479 LPC1++ 1480 } 1481 1482 LPN0-- 1483 LPC0++ 1484 } 1485 1486 /* Release */ 1487 1488 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1489 LPN0 = MAX0 /* \MAX0 */ 1490 LPC0 = (MAX0 - 0x01) 1491 While (LPN0) 1492 { 1493 /* repetitions */ 1494 1495 LPN1 = Arg0 1496 LPC1 = 0x00 1497 While (LPN1) 1498 { 1499 M388 (LPC0, IX00, 0x00) 1500 LPN1-- 1501 LPC1++ 1502 } 1503 1504 LPN0-- 1505 LPC0-- 1506 } 1507 1508 /* The 'owning counters' are exhausted, so exceptions are expected */ 1509 1510 LPN0 = MAX0 /* \MAX0 */ 1511 LPC0 = (MAX0 - 0x01) 1512 While (LPN0) 1513 { 1514 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1515 M388 (LPC0, IX00, 0x00) 1516 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1517 LPN0-- 1518 LPC0-- 1519 } 1520 1521 /* Restore the value of flag of Global lock */ 1522 1523 M078 (Local7) 1524 } 1525 1526 /* 1527 * ///////////////////////////////////////// 1528 * 1529 * The tests below examine different ways 1530 * to Acquire/Release mutexes 1531 * 1532 * ///////////////////////////////////////// 1533 */ 1534 /* 1535 * ATTENTION: this test must be run the first 1536 * 1537 * Different ways to Acquire/Release mutexes 1538 * 1539 * 1) Acquire and Release operations are in a global level AML code 1540 * 1541 * See m07c. 1542 */ 1543 Method (M0B9, 0, Serialized) 1544 { 1545 /* i101 - non-zero means that the test was run */ 1546 1547 If (!I101) 1548 { 1549 Return (Zero) 1550 } 1551 1552 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1553 } 1554 1555 /* 1556 * The same operations as m0b9 (the test for global level AML code) 1557 * but enclosed into Method. 1558 */ 1559 Method (M0BB, 0, Serialized) 1560 { 1561 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1562 Method (M137, 0, NotSerialized) 1563 { 1564 Debug = "m137 started" 1565 If (!I102) 1566 { 1567 Release (T804) 1568 } 1569 1570 Debug = "m137 completed" 1571 Return (0x01) 1572 } 1573 1574 Method (M13E, 0, NotSerialized) 1575 { 1576 Debug = "m13e started" 1577 I103 = Acquire (T805, 0xFFFF) 1578 If (I103) 1579 { 1580 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, I103) 1581 } 1582 1583 Debug = "m13e completed" 1584 Return (0x01) 1585 } 1586 1587 Method (M13F, 0, NotSerialized) 1588 { 1589 Debug = "m13f started" 1590 If (!I103) 1591 { 1592 Release (T805) 1593 } 1594 1595 Debug = "m13f completed" 1596 Return (0x01) 1597 } 1598 1599 Name (I102, 0x01) 1600 Name (I103, 0x01) 1601 Name (B11C, Buffer ((0x01 + I102 = Acquire (T804, 0xFFFF))) 1602 { 1603 0x00 // . 1604 }) 1605 Name (B11D, Buffer (M137 ()) 1606 { 1607 0x00 // . 1608 }) 1609 Name (B11E, Buffer (M13E ()) 1610 { 1611 0x00 // . 1612 }) 1613 Name (B11F, Buffer (M13F ()) 1614 { 1615 0x00 // . 1616 }) 1617 If (I102) 1618 { 1619 Debug = "Acquire(T804, 0xffff) failed" 1620 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, I102) 1621 } 1622 1623 If (I103) 1624 { 1625 Debug = "Acquire(T805, 0xffff) failed" 1626 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, I103) 1627 } 1628 1629 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1630 } 1631 1632 /* 1633 * Different ways to Acquire/Release mutexes 1634 * 1635 * 2) Acquire and Release operations are in the same method 1636 * 3) Acquire and Release operations are in different methods 1637 * 1638 * See m0b9. 1639 */ 1640 Method (M07C, 0, Serialized) 1641 { 1642 /* Acquire and Release operations are in the same method */ 1643 1644 Method (M000, 0, NotSerialized) 1645 { 1646 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1647 /* Acquire all */ 1648 1649 Local0 = Acquire (\_GL, 0xFFFF) 1650 If (Local0) 1651 { 1652 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1653 } 1654 1655 Local0 = Acquire (T000, 0xFFFF) 1656 If (Local0) 1657 { 1658 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1659 } 1660 1661 Local0 = Acquire (T100, 0xFFFF) 1662 If (Local0) 1663 { 1664 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1665 } 1666 1667 Local0 = Acquire (T200, 0xFFFF) 1668 If (Local0) 1669 { 1670 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1671 } 1672 1673 Local0 = Acquire (T300, 0xFFFF) 1674 If (Local0) 1675 { 1676 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1677 } 1678 1679 Local0 = Acquire (T400, 0xFFFF) 1680 If (Local0) 1681 { 1682 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1683 } 1684 1685 Local0 = Acquire (T500, 0xFFFF) 1686 If (Local0) 1687 { 1688 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1689 } 1690 1691 Local0 = Acquire (T600, 0xFFFF) 1692 If (Local0) 1693 { 1694 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1695 } 1696 1697 Local0 = Acquire (T700, 0xFFFF) 1698 If (Local0) 1699 { 1700 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1701 } 1702 1703 Local0 = Acquire (T800, 0xFFFF) 1704 If (Local0) 1705 { 1706 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1707 } 1708 1709 Local0 = Acquire (T900, 0xFFFF) 1710 If (Local0) 1711 { 1712 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1713 } 1714 1715 Local0 = Acquire (TA00, 0xFFFF) 1716 If (Local0) 1717 { 1718 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1719 } 1720 1721 Local0 = Acquire (TB00, 0xFFFF) 1722 If (Local0) 1723 { 1724 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1725 } 1726 1727 Local0 = Acquire (TC00, 0xFFFF) 1728 If (Local0) 1729 { 1730 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1731 } 1732 1733 Local0 = Acquire (TD00, 0xFFFF) 1734 If (Local0) 1735 { 1736 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1737 } 1738 1739 Local0 = Acquire (TE00, 0xFFFF) 1740 If (Local0) 1741 { 1742 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1743 } 1744 1745 Local0 = Acquire (TF00, 0xFFFF) 1746 If (Local0) 1747 { 1748 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1749 } 1750 1751 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1752 /* Release all */ 1753 1754 Release (TF00) 1755 Release (TE00) 1756 Release (TD00) 1757 Release (TC00) 1758 Release (TB00) 1759 Release (TA00) 1760 Release (T900) 1761 Release (T800) 1762 Release (T700) 1763 Release (T600) 1764 Release (T500) 1765 Release (T400) 1766 Release (T300) 1767 Release (T200) 1768 Release (T100) 1769 Release (T000) 1770 Release (\_GL) 1771 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1772 } 1773 1774 /* Acquire and Release operations are in different methods */ 1775 1776 Method (M001, 0, NotSerialized) 1777 { 1778 Method (MM00, 0, NotSerialized) 1779 { 1780 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1781 Local0 = Acquire (\_GL, 0xFFFF) 1782 If (Local0) 1783 { 1784 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1785 } 1786 1787 Local0 = Acquire (T000, 0xFFFF) 1788 If (Local0) 1789 { 1790 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1791 } 1792 1793 Local0 = Acquire (T100, 0xFFFF) 1794 If (Local0) 1795 { 1796 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1797 } 1798 1799 Local0 = Acquire (T200, 0xFFFF) 1800 If (Local0) 1801 { 1802 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1803 } 1804 1805 Local0 = Acquire (T300, 0xFFFF) 1806 If (Local0) 1807 { 1808 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1809 } 1810 1811 Local0 = Acquire (T400, 0xFFFF) 1812 If (Local0) 1813 { 1814 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1815 } 1816 1817 Local0 = Acquire (T500, 0xFFFF) 1818 If (Local0) 1819 { 1820 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1821 } 1822 1823 Local0 = Acquire (T600, 0xFFFF) 1824 If (Local0) 1825 { 1826 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1827 } 1828 1829 Local0 = Acquire (T700, 0xFFFF) 1830 If (Local0) 1831 { 1832 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1833 } 1834 1835 Local0 = Acquire (T800, 0xFFFF) 1836 If (Local0) 1837 { 1838 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1839 } 1840 1841 Local0 = Acquire (T900, 0xFFFF) 1842 If (Local0) 1843 { 1844 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1845 } 1846 1847 Local0 = Acquire (TA00, 0xFFFF) 1848 If (Local0) 1849 { 1850 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1851 } 1852 1853 Local0 = Acquire (TB00, 0xFFFF) 1854 If (Local0) 1855 { 1856 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1857 } 1858 1859 Local0 = Acquire (TC00, 0xFFFF) 1860 If (Local0) 1861 { 1862 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1863 } 1864 1865 Local0 = Acquire (TD00, 0xFFFF) 1866 If (Local0) 1867 { 1868 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1869 } 1870 1871 Local0 = Acquire (TE00, 0xFFFF) 1872 If (Local0) 1873 { 1874 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1875 } 1876 1877 Local0 = Acquire (TF00, 0xFFFF) 1878 If (Local0) 1879 { 1880 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1881 } 1882 1883 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1884 } 1885 1886 Method (MM01, 0, NotSerialized) 1887 { 1888 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1889 Release (TF00) 1890 Release (TE00) 1891 Release (TD00) 1892 Release (TC00) 1893 Release (TB00) 1894 Release (TA00) 1895 Release (T900) 1896 Release (T800) 1897 Release (T700) 1898 Release (T600) 1899 Release (T500) 1900 Release (T400) 1901 Release (T300) 1902 Release (T200) 1903 Release (T100) 1904 Release (T000) 1905 Release (\_GL) 1906 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1907 } 1908 1909 Method (MM02, 0, NotSerialized) 1910 { 1911 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1912 Release (TF00) 1913 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1914 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1915 Release (TE00) 1916 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1917 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1918 Release (TD00) 1919 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1920 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1921 Release (TC00) 1922 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1923 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1924 Release (TB00) 1925 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1926 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1927 Release (TA00) 1928 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1929 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1930 Release (T900) 1931 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1932 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1933 Release (T800) 1934 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1935 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1936 Release (T700) 1937 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1938 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1939 Release (T600) 1940 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1941 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1942 Release (T500) 1943 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1944 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1945 Release (T400) 1946 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1947 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1948 Release (T300) 1949 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1950 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1951 Release (T200) 1952 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1953 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1954 Release (T100) 1955 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1956 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1957 Release (T000) 1958 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1959 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1960 Release (\_GL) 1961 CH04 (__METHOD__, 0x00, 0x41, Z150, __LINE__, 0x00, 0x00) /* AE_AML_MUTEX_NOT_ACQUIRED */ 1962 } 1963 1964 MM00 () 1965 MM01 () 1966 MM02 () 1967 } 1968 1969 /* Acquire and Release operations are in the same method */ 1970 1971 M000 () 1972 /* Acquire and Release operations are in different methods */ 1973 1974 M001 () 1975 } 1976 1977 /* 1978 * Acquire/Release operations enclosed in other operations 1979 */ 1980 Method (M0BA, 0, Serialized) 1981 { 1982 CH03 (__METHOD__, Z150, __LINE__, 0x00, 0x00) 1983 /* Add */ 1984 1985 Local0 = (Acquire (\_GL, 0xFFFF) + 0x01) 1986 If ((Local0 != 0x01)) 1987 { 1988 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1989 } 1990 1991 Local0 = (Acquire (T500, 0xFFFF) + 0x01) 1992 If ((Local0 != 0x01)) 1993 { 1994 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 1995 } 1996 1997 Release (T500) 1998 Release (\_GL) 1999 /* Subtract */ 2000 2001 Local0 = (0x01 - Acquire (\_GL, 0xFFFF)) 2002 If ((Local0 != 0x01)) 2003 { 2004 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 2005 } 2006 2007 Local0 = (0x01 - Acquire (T500, 0xFFFF)) 2008 If ((Local0 != 0x01)) 2009 { 2010 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 2011 } 2012 2013 Release (T500) 2014 Release (\_GL) 2015 /* LEqual */ 2016 2017 If ((Acquire (T500, 0xFFFF) != 0x00)) 2018 { 2019 ERR (__METHOD__, Z150, __LINE__, 0x00, 0x00, 0x00, Local0) 2020 } 2021 2022 Release (T500) 2023 If (FL03) 2024 { 2025 /* Check that all mutexes are Released (doesn't check T804..) */ 2026 2027 M08A () 2028 } 2029 2030 CH04 (__METHOD__, 0x01, 0x40, Z150, __LINE__, 0x00, 0x00) 2031 } 2032 2033 /* 2034 * ///////////////////////////////////////////// 2035 * 2036 * The tests below generate some combinations 2037 * of Acquire/Release operations 2038 * 2039 * ///////////////////////////////////////////// 2040 */ 2041 /* 2042 * Get 0 or 1 value pseudo randomly 2043 * 2044 * arg0 - input Integer 2045 */ 2046 Method (M08E, 0, NotSerialized) 2047 { 2048 /* To be improved */ 2049 2050 Local0 = (CN00 & 0x01) 2051 CN00++ 2052 If (!Y242) 2053 { 2054 /* Always inverse order until the bug 242 is fixes */ 2055 2056 Local0 = 0x01 2057 } 2058 2059 Return (Local0) 2060 } 2061 2062 /* 2063 * Acquire/Release combination #1 2064 */ 2065 Method (M07E, 0, Serialized) 2066 { 2067 Name (NUM, 0x04) 2068 Name (RPT0, 0x00) 2069 Name (RPT1, 0x03) 2070 Name (LPN0, 0x00) 2071 Name (LPC0, 0x00) 2072 /* Set up the value of flag of Global lock */ 2073 2074 Local7 = M078 (0x00) 2075 LPN0 = NUM /* \M07E.NUM_ */ 2076 LPC0 = 0x00 2077 While (LPN0) 2078 { 2079 /* Set up the value of flag of Global lock */ 2080 2081 Divide (LPC0, 0x02, Local0) 2082 M078 (Local0) 2083 If (Local0) 2084 { 2085 RPT0 = RPT1 /* \M07E.RPT1 */ 2086 } 2087 Else 2088 { 2089 RPT0 = 0x01 2090 } 2091 2092 M088 (0x00, 0x03, 0x00, 0x04, 0x00, RPT0, 0x00) /* Step 0, Acquire */ 2093 M088 (0x03, 0x03, 0x01, 0x02, 0x00, RPT0, 0x00) /* Step 1, Acquire */ 2094 M089 (0x04, 0x02, 0x01, 0x02, 0x00, RPT0, M08E ()) /* Step 1, Release */ 2095 M088 (0x05, 0x03, 0x00, 0x04, 0x00, RPT0, 0x00) /* Step 2, Acquire */ 2096 M089 (0x07, 0x01, 0x01, 0x03, 0x00, RPT0, M08E ()) /* Step 2, Release */ 2097 M089 (0x07, 0x01, 0x00, 0x01, 0x00, RPT0, M08E ()) /* Step 2, Release */ 2098 M089 (0x06, 0x01, 0x00, 0x04, 0x00, RPT0, M08E ()) /* Step 2, Release */ 2099 M088 (0x09, 0x02, 0x02, 0x02, 0x00, RPT0, 0x00) /* Step 3, Acquire */ 2100 M089 (0x0A, 0x01, 0x03, 0x01, 0x00, RPT0, M08E ()) /* Step 3, Release */ 2101 M089 (0x0A, 0x01, 0x02, 0x01, 0x00, RPT0, M08E ()) /* Step 3, Release */ 2102 M089 (0x09, 0x01, 0x03, 0x01, 0x00, RPT0, M08E ()) /* Step 3, Release */ 2103 M088 (0x0A, 0x02, 0x00, 0x03, 0x00, RPT0, 0x00) /* Step 4, Acquire */ 2104 M089 (0x0A, 0x02, 0x00, 0x03, 0x00, RPT0, M08E ()) /* Step 4, Release */ 2105 M088 (0x0A, 0x02, 0x00, 0x03, 0x00, RPT0, 0x00) /* Step 5, Acquire */ 2106 M089 (0x0A, 0x02, 0x00, 0x03, 0x00, RPT0, M08E ()) /* Step 5, Release */ 2107 M088 (0x0C, 0x02, 0x00, 0x03, 0x00, RPT0, 0x00) /* Step 6, Acquire */ 2108 M089 (0x0C, 0x02, 0x00, 0x03, 0x00, RPT0, M08E ()) /* Step 6, Release */ 2109 M088 (0x0A, 0x06, 0x00, 0x04, 0x00, RPT0, 0x00) /* Step 7, Acquire */ 2110 M089 (0x0A, 0x06, 0x00, 0x04, 0x00, RPT0, M08E ()) /* Step 7, Release */ 2111 M088 (0x0C, 0x02, 0x00, 0x03, 0x00, RPT0, 0x00) /* Step 8, Acquire */ 2112 M089 (0x0C, 0x02, 0x00, 0x03, 0x00, RPT0, M08E ()) /* Step 8, Release */ 2113 M089 (0x09, 0x01, 0x02, 0x01, 0x00, RPT0, M08E ()) /* Step 3, Release */ 2114 M089 (0x05, 0x01, 0x00, 0x04, 0x00, RPT0, M08E ()) /* Step 2, Release */ 2115 M089 (0x03, 0x01, 0x01, 0x02, 0x00, RPT0, M08E ()) /* Step 1, Release */ 2116 M089 (0x01, 0x02, 0x00, 0x04, 0x00, RPT0, M08E ()) /* Step 0, Release */ 2117 M088 (0x01, 0x0F, 0x01, 0x02, 0x00, RPT0, 0x00) /* Step 9, Acquire */ 2118 M089 (0x01, 0x0F, 0x01, 0x02, 0x00, RPT0, M08E ()) /* Step 9, Release */ 2119 M089 (0x00, 0x01, 0x01, 0x01, 0x00, RPT0, M08E ()) /* Step 0, Release */ 2120 M089 (0x00, 0x01, 0x03, 0x01, 0x00, RPT0, M08E ()) /* Step 0, Release */ 2121 M089 (0x00, 0x01, 0x02, 0x01, 0x00, RPT0, M08E ()) /* Step 0, Release */ 2122 M089 (0x00, 0x01, 0x00, 0x01, 0x00, RPT0, M08E ()) /* Step 0, Release */ 2123 M088 (0x00, 0x10, 0x01, 0x02, 0x00, RPT0, 0x00) /* Step 10, Acquire */ 2124 M089 (0x00, 0x10, 0x01, 0x02, 0x00, RPT0, M08E ()) /* Step 10, Release */ 2125 LPN0-- 2126 LPC0++ 2127 } 2128 2129 /* Restore the value of flag of Global lock */ 2130 2131 M078 (Local7) 2132 If (FL03) 2133 { 2134 /* Check that all mutexes are Released */ 2135 2136 M08A () 2137 } 2138 } 2139 2140 /* 2141 * /////////////////////////////////////////////////// 2142 * 2143 * The tests below check behaviour after exceptions 2144 * 2145 * /////////////////////////////////////////////////// 2146 */ 2147 /* 2148 * Check the life after AE_AML_MUTEX_ORDER exception on Acquire 2149 * 2150 * 1) Acquire N-th level mutex MUX-N 2151 * 2) run Acquire (N-2)-th level mutex MUX-(N-2) and get AE_AML_MUTEX_ORDER exception 2152 * 3) run Acquire (N-1)-th level mutex MUX-(N-1) and get AE_AML_MUTEX_ORDER exception 2153 * 4) Acquire mutex MUX-N and check that no exception on this operation 2154 * 5) Release mutex MUX-N and check that no exception on this operation 2155 * 6) Release mutex MUX-N and check that no exception on this operation 2156 * 7) do 1-6 for all N in range 2-15 levels 2157 * 8) check additionally that all the mutexes are free (run Release and 2158 * get AE_AML_MUTEX_NOT_ACQUIRED exception for all the mutexes of all levels) 2159 * 9) Acquire all mutexes of all levels and check that no exceptions 2160 * 10) Release all mutexes of all levels and check that no exceptions 2161 * 11) check additionally that all the mutexes are free (see 8) 2162 * 2163 * 12) do it for GL mode too 2164 * 13) do additional Acquire of MUX-(N-2) and MUX-(N-1) before Acquire of MUX-N (Release them later) 2165 * 2166 * arg0 - the value of flag of GL 2167 * arg1 - if non-zero do additional Acquire of MUX-(N-2) and MUX-(N-1) before Acquire of MUX-N 2168 */ 2169 Method (M08B, 2, Serialized) 2170 { 2171 Name (RPT0, 0x01) 2172 Name (ORD0, 0x01) 2173 Name (LPN0, 0x00) /* level */ 2174 Name (LPC0, 0x00) 2175 /* Set up the value of flag of Global lock */ 2176 2177 Local7 = M078 (Arg0) 2178 LPN0 = (MAX0 - 0x02) 2179 LPC0 = 0x02 2180 While (LPN0) 2181 { 2182 Local0 = (LPC0 - 0x01) 2183 Local1 = (LPC0 - 0x02) 2184 If (Arg1) 2185 { 2186 M088 (Local1, 0x01, 0x00, 0x04, 0x00, RPT0, 0x00) /* Step -2, Acquire */ 2187 M088 (Local0, 0x01, 0x00, 0x04, 0x00, RPT0, 0x00) /* Step -1, Acquire */ 2188 } 2189 2190 M088 (LPC0, 0x01, 0x00, 0x01, 0x00, RPT0, 0x00) /* Step 0, Acquire */ 2191 M088 (Local1, 0x01, 0x00, 0x04, 0x40, RPT0, 0x00) /* Step 1, Acquire, AE_AML_MUTEX_ORDER */ 2192 M088 (Local0, 0x01, 0x00, 0x04, 0x40, RPT0, 0x00) /* Step 2, Acquire, AE_AML_MUTEX_ORDER */ 2193 M088 (LPC0, 0x01, 0x00, 0x04, 0x00, RPT0, 0x00) /* Step 3, Acquire */ 2194 M089 (LPC0, 0x01, 0x00, 0x04, 0x00, RPT0, ORD0) /* Step 3, Release */ 2195 M089 (LPC0, 0x01, 0x00, 0x01, 0x00, RPT0, ORD0) /* Step 0, Release */ 2196 If (Arg1) 2197 { 2198 M089 (Local0, 0x01, 0x00, 0x04, 0x00, RPT0, ORD0) /* Step -1, Release */ 2199 M089 (Local1, 0x01, 0x00, 0x04, 0x00, RPT0, ORD0) /* Step -2, Release */ 2200 } 2201 2202 LPN0-- 2203 LPC0++ 2204 } 2205 2206 /* Check that all mutexes are Released */ 2207 2208 M08A () 2209 M088 (0x00, MAX0, 0x00, MIN0, 0x00, RPT0, 0x00) /* Step 4, Acquire */ 2210 M089 (0x00, MAX0, 0x00, MIN0, 0x00, RPT0, ORD0) /* Step 4, Release */ 2211 /* Check that all mutexes are Released */ 2212 2213 M08A () 2214 /* Restore the value of flag of Global lock */ 2215 2216 M078 (Local7) 2217 } 2218 2219 /* 2220 * Check the life after AE_AML_MUTEX_ORDER exception on Release 2221 * 2222 * 1) Acquire (N-1)-th level mutex MUX-(N-1) 2223 * 2) Acquire (N)-th level mutex MUX-N 2224 * 3) run Release (N-1)-th level mutex MUX-(N-1) and get AE_AML_MUTEX_ORDER exception 2225 * 4) Release (N)-th level mutex MUX-N and check that no exception on this operation 2226 * 5) Release (N-1)-th level mutex MUX-(N-1) and check that no exception on this operation 2227 * 6) do 1-5 for all N in range 1-15 levels 2228 * 7) check additionally that all the mutexes are free (run Release and 2229 * get AE_AML_MUTEX_NOT_ACQUIRED exception for all the mutexes of all levels) 2230 * 8) Acquire all mutexes of all levels and check that no exceptions 2231 * 9) Release all mutexes of all levels and check that no exceptions 2232 * 10) check additionally that all the mutexes are free (see 7) 2233 * 2234 * 11) do it for GL mode too 2235 * 2236 * arg0 - the value of flag of GL 2237 */ 2238 Method (M08D, 1, Serialized) 2239 { 2240 Name (RPT0, 0x01) 2241 Name (ORD0, 0x01) 2242 Name (LPN0, 0x00) /* level */ 2243 Name (LPC0, 0x00) 2244 /* Set up the value of flag of Global lock */ 2245 2246 Local7 = M078 (Arg0) 2247 LPN0 = (MAX0 - 0x01) 2248 LPC0 = 0x01 2249 While (LPN0) 2250 { 2251 Local0 = (LPC0 - 0x01) 2252 M088 (Local0, 0x01, 0x00, MIN0, 0x00, RPT0, 0x00) /* Step 0, Acquire */ 2253 M088 (LPC0, 0x01, 0x00, MIN0, 0x00, RPT0, 0x00) /* Step 1, Acquire */ 2254 /* Jump over the level */ 2255 2256 M089 (Local0, 0x01, 0x00, MIN0, 0x40, RPT0, ORD0) /* Step 2, Release, AE_AML_MUTEX_ORDER */ 2257 M089 (LPC0, 0x01, 0x00, MIN0, 0x00, RPT0, ORD0) /* Step 1, Release */ 2258 M089 (Local0, 0x01, 0x00, MIN0, 0x00, RPT0, ORD0) /* Step 0, Release */ 2259 LPN0-- 2260 LPC0++ 2261 } 2262 2263 /* Check that all mutexes are Released */ 2264 2265 M08A () 2266 M088 (0x00, MAX0, 0x00, MIN0, 0x00, RPT0, 0x00) /* Step 3, Acquire */ 2267 M089 (0x00, MAX0, 0x00, MIN0, 0x00, RPT0, ORD0) /* Step 3, Release */ 2268 /* Check that all mutexes are Released */ 2269 2270 M08A () 2271 /* Restore the value of flag of Global lock */ 2272 2273 M078 (Local7) 2274 } 2275 2276 /* 2277 * Check the life after AE_AML_MUTEX_ORDER exception on Release 2278 * 2279 * Similar to the m08d but trying to heal situation by 2280 * Acquiring/Release operations applied to the greater 2281 * level so changing the current level upper than all the 2282 * currently Acquired levels so don't expect exceptions on 2283 * the following Release operations applied in the correct 2284 * inverse order to all the Acquired mutexes. 2285 * 2286 * (for the current 20060828 ACPICA this doesn't help). 2287 */ 2288 Method (M07F, 0, Serialized) 2289 { 2290 Name (RPT0, 0x01) 2291 Name (ORD0, 0x01) 2292 Name (LPN0, 0x00) /* level */ 2293 Name (LPC0, 0x00) 2294 LPN0 = (MAX0 - 0x02) 2295 LPC0 = 0x01 2296 While (LPN0) 2297 { 2298 Local0 = (LPC0 - 0x01) 2299 Local1 = (LPC0 + 0x01) 2300 M088 (Local0, 0x01, 0x00, MIN0, 0x00, RPT0, 0x00) /* Step 0, Acquire */ 2301 M088 (LPC0, 0x01, 0x00, MIN0, 0x00, RPT0, 0x00) /* Step 1, Acquire */ 2302 /* Jump over the level on Releasing */ 2303 2304 M089 (Local0, 0x01, 0x00, MIN0, 0x40, RPT0, ORD0) /* Step 2, Release, AE_AML_MUTEX_ORDER */ 2305 /* 2306 * Additional attempt is made to restore the normal calculation - 2307 * Acquire the mutex M0 of level greater than all the levels 2308 * touched at that moment so changing the current level by the 2309 * succeeded operation. Then do Release operations for all 2310 * the Acquired mutexes in the correct inverse order starting 2311 * with the M0 mutex expecting no exceptions on them. 2312 * 2313 * (for the current 20060828 ACPICA this doesn't help). 2314 */ 2315 M088 (LPC0, 0x01, 0x00, 0x01, 0x00, RPT0, 0x00) /* Step 3, Acquire */ 2316 M088 (Local1, 0x01, 0x00, 0x01, 0x00, RPT0, 0x00) /* Step 4, Acquire */ 2317 M088 (LPC0, 0x01, 0x00, 0x01, 0x40, RPT0, 0x00) /* Step 5, Acquire, AE_AML_MUTEX_ORDER */ 2318 M089 (Local1, 0x01, 0x00, 0x01, 0x00, RPT0, ORD0) /* Step 4, Release */ 2319 M089 (LPC0, 0x01, 0x00, 0x01, 0x00, RPT0, ORD0) /* Step 3, Release */ 2320 M089 (LPC0, 0x01, 0x00, MIN0, 0x00, RPT0, ORD0) /* Step 1, Release */ 2321 M089 (Local0, 0x01, 0x00, MIN0, 0x00, RPT0, ORD0) /* Step 0, Release */ 2322 LPN0-- 2323 LPC0++ 2324 } 2325 2326 /* Check that all mutexes are Released */ 2327 2328 M08A () 2329 M088 (0x00, MAX0, 0x00, MIN0, 0x00, RPT0, 0x00) /* Step 6, Acquire */ 2330 M089 (0x00, MAX0, 0x00, MIN0, 0x00, RPT0, ORD0) /* Step 6, Release */ 2331 /* Check that all mutexes are Released */ 2332 2333 M08A () 2334 } 2335 2336 /* ############################################### Run-method: */ 2337 2338 Method (M300, 0, NotSerialized) 2339 { 2340 If (FL03) 2341 { 2342 /* Check that all mutexes are Released (doesn't check T804..) */ 2343 2344 M08A () 2345 } 2346 2347 SRMT ("m300") 2348 If (ERR7) 2349 { 2350 ERR ("ERRORS were detected during the loading stage", Z150, __LINE__, 0x00, 0x00, 0x00, ERR7) 2351 } 2352 2353 /* ATTENTION: this test must be run the first */ 2354 2355 SRMT ("m0b9") 2356 M0B9 () 2357 SRMT ("m0bb") 2358 M0BB () 2359 SRMT ("m301") 2360 M301 () 2361 SRMT ("m369-0") 2362 M369 (0x00) 2363 SRMT ("m369-1") 2364 If (Y297) 2365 { 2366 M369 (0x01) 2367 } 2368 Else 2369 { 2370 BLCK () 2371 } 2372 2373 SRMT ("m369-0") 2374 M369 (0x00) 2375 SRMT ("m36a") 2376 M36A () 2377 SRMT ("m36b") 2378 M36B () 2379 SRMT ("m36c") 2380 M36C () 2381 SRMT ("m389") 2382 M389 () 2383 SRMT ("m07b") 2384 M07B () 2385 SRMT ("m38a") 2386 If (Y238) 2387 { 2388 M38A () 2389 } 2390 Else 2391 { 2392 BLCK () 2393 } 2394 2395 SRMT ("m38d") 2396 If (Y242) 2397 { 2398 M38D () 2399 } 2400 Else 2401 { 2402 BLCK () 2403 } 2404 2405 SRMT ("m07d-direct") 2406 If (Y242) 2407 { 2408 M07D (0x00) 2409 } 2410 Else 2411 { 2412 BLCK () 2413 } 2414 2415 SRMT ("m07d-inverse") 2416 M07D (0x01) 2417 SRMT ("m07a-no-GL") 2418 M07A (0x00) 2419 SRMT ("m07a-GL") 2420 M07A (0x01) 2421 SRMT ("m07e") 2422 M07E () 2423 SRMT ("m08b-no-GL-0") 2424 M08B (0x00, 0x00) 2425 SRMT ("m08b-no-GL-1") 2426 M08B (0x00, 0x01) 2427 SRMT ("m08b-GL-0") 2428 M08B (0x01, 0x00) 2429 SRMT ("m08b-GL-1") 2430 M08B (0x01, 0x01) 2431 SRMT ("m08d-no-GL") 2432 If (Y238) 2433 { 2434 M08D (0x00) 2435 } 2436 Else 2437 { 2438 BLCK () 2439 } 2440 2441 SRMT ("m08d-GL") 2442 If (Y238) 2443 { 2444 M08D (0x01) 2445 } 2446 Else 2447 { 2448 BLCK () 2449 } 2450 2451 SRMT ("m07f") 2452 If (Y243) 2453 { 2454 M07F () 2455 } 2456 Else 2457 { 2458 BLCK () 2459 } 2460 2461 SRMT ("m07c") 2462 M07C () 2463 SRMT ("m0ba") 2464 M0BA () 2465 /* 2466 * To see if the mutex-es framework can continue working after AE_LIMIT. 2467 * Now, after AE_LIMIT, it looks can't actually restore -- many messages 2468 * during the all further execution of tests, and even the tests 2469 * "TEST: WAI0, Wait for Events" somewhere hangs forever: 2470 * 2471 * **** AcpiExec: Exception AE_LIMIT during execution of method [M369] Opcode [Mutex] @E2 2472 * ACPI Exception (utmutex-0376): AE_BAD_PARAMETER, Thread 1475 could not acquire Mutex [0] [20074403] 2473 * ACPI Error (exutils-0180): Could not acquire AML Interpreter mutex [20074403] 2474 * ACPI Error (utmutex-0421): Mutex [0] is not acquired, cannot release [20074403] 2475 * ACPI Error (exutils-0250): Could not release AML Interpreter mutex [20074403] 2476 * **** AcpiExec: Exception override, new status AE_OK 2477 */ 2478 SRMT ("m369-0") 2479 M369 (0x00) 2480 SRMT ("m369-1") 2481 If (Y297) 2482 { 2483 M369 (0x01) 2484 } 2485 Else 2486 { 2487 BLCK () 2488 } 2489 2490 SRMT ("m369-0") 2491 M369 (0x00) 2492 If (FL03) 2493 { 2494 /* Check that all mutexes are Released */ 2495 2496 M08A () 2497 } 2498 2499 CH03 ("m300", Z150, __LINE__, 0x00, 0x00) 2500 } 2501