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 strategies to be managed and controlled by the 30 * Control Thread and fulfilled by the Worker Threads (Workers). 31 */ 32 Name (Z152, 0x98) 33 /* 34 * Acquire/Sleep/Release 35 * 36 * All workers: 37 * - Acquire the same mutex 38 * - increment global counter 39 * - set up another global to its Index 40 * - sleep for the specified period 41 * - check that the global contains just its Index 42 * - Release mutex 43 * Control thread: 44 * - check after all threads complete that counter is correct 45 * 46 * arg0 - number of threads 47 * arg1 - Level of mutex 48 * arg2 - Index of mutex 49 * arg3 - Number of mutexes of the same level 50 */ 51 Method (M801, 4, Serialized) 52 { 53 Name (LPN0, 0x00) 54 Name (LPC0, 0x00) 55 Name (NUMW, 0x00) /* number of threads in work */ 56 /* Number of threads to be actually in work */ 57 58 NUMW = M213 (Arg0, 0x05, 0x04) 59 /* Set up per-thread set of mutexes */ 60 61 M334 (NUMW, C300, Arg1, 0x00, Arg2, Arg3) 62 /* c103 for all first num threads */ 63 64 M210 (BS00, Arg0, C103, 0x00, NUMW, 0x01, C102) /* cmd: Acquire/Sleep/Release */ 65 M114 (Arg0) /* run */ 66 /* Wait for all Worker threads */ 67 68 M103 (Arg0) 69 /* Check up the values of counters of all Mutexes */ 70 /* lpC0 - Index of mutex */ 71 Local0 = (NUMW - 0x01) /* exclude the Control thread */ 72 LPN0 = Arg3 73 LPC0 = Arg2 74 While (LPN0) 75 { 76 M333 (Arg1, LPC0, Local0) 77 LPN0-- 78 LPC0++ 79 } 80 } 81 82 /* 83 * <Acquire/Sleep>(0-15 levels)/Release(15-0 levels) 84 * 85 * arg0 - number of threads 86 * arg1 - Index of mutex 87 * arg2 - Number of mutexes of the same level 88 */ 89 Method (M802, 3, Serialized) 90 { 91 Name (NUMW, 0x00) /* number of threads in work */ 92 Name (LPN0, 0x00) 93 Name (LPC0, 0x00) 94 Name (LPN1, 0x00) 95 Name (LPC1, 0x00) 96 /* Number of threads to be actually in work */ 97 98 NUMW = M213 (Arg0, 0x05, 0x05) 99 /* Set up per-thread set of mutexes */ 100 101 M334 (NUMW, C300, 0x00, 0x00, Arg1, Arg2) 102 /* c104 for all first num threads */ 103 104 M210 (BS00, Arg0, C104, 0x00, NUMW, 0x01, C102) /* cmd: <Acquire/Sleep>(0-15 levels)/Release(15-0 levels) */ 105 M114 (Arg0) /* run */ 106 /* Wait for all Worker threads */ 107 108 M103 (Arg0) 109 /* Check up the values of counters of all Mutexes */ 110 111 Local0 = (NUMW - 0x01) 112 LPN0 = MAX0 /* \MAX0 */ 113 LPC0 = 0x00 114 While (LPN0) 115 { 116 /* lpC0 - Level */ 117 118 LPN1 = Arg2 119 LPC1 = Arg1 120 While (LPN1) 121 { 122 /* lpC1 - Index of mutex */ 123 124 M333 (LPC0, LPC1, Local0) 125 LPN1-- 126 LPC1++ 127 } 128 129 LPN0-- 130 LPC0++ 131 } 132 } 133 134 /* 135 * Example 0 136 * 137 * arg0 - number of threads 138 * arg1 - Index of mutex 139 * arg2 - Number of mutexes of the same level 140 */ 141 Method (M803, 1, Serialized) 142 { 143 Name (NUMW, 0x00) /* number of threads in work */ 144 Name (LPN0, 0x00) 145 Name (LPC0, 0x00) 146 /* Number of threads to be actually in work */ 147 148 NUMW = M213 (Arg0, 0x06, 0x06) 149 /* c105 for all first num threads */ 150 151 M210 (BS00, Arg0, C105, 0x00, NUMW, 0x01, C102) /* cmd: Example 0 */ 152 M114 (Arg0) /* run */ 153 /* Wait for all Worker threads */ 154 155 M103 (Arg0) 156 } 157 158 /* 159 * Manage the test m804 160 * 161 * arg0 - number of threads 162 * arg1 - 0 - thread_2 Releases than thread_1 Releases 163 * non-zero - thread_1 Releases than thread_2 Releases 164 * Thread_1: 165 * arg2 - Level of mutex (initial) 166 * arg3 - Number of levels of mutexes 167 * Thread_2: 168 * arg4 - Level of mutex (initial) 169 * arg5 - Number of levels of mutexes 170 */ 171 Method (M8FF, 6, Serialized) 172 { 173 Name (LPN0, 0x00) 174 Name (LPC0, 0x00) 175 Name (THR, 0x00) 176 /* ACQUIRING */ 177 /* === Thread 1 === */ 178 THR = 0x01 179 /* Set up per-thread set of mutexes */ 180 181 M334 (Arg0, C300, Arg2, Arg3, 0x00, 0x01) 182 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 183 M208 (BS00, THR, C106) /* cmd: Acquire specified set of mutexes */ 184 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 185 M114 (Arg0) 186 /* Wait for all Worker threads */ 187 188 M103 (Arg0) 189 /* Check up the values of counters of all Mutexes */ 190 191 LPN0 = Arg3 192 LPC0 = Arg2 193 While (LPN0) 194 { 195 M333 (LPC0, 0x00, 0x01) 196 LPN0-- 197 LPC0++ 198 } 199 200 /* === Thread 2 === */ 201 202 THR = 0x02 203 /* Set up per-thread set of mutexes */ 204 205 M334 (Arg0, C300, Arg4, Arg5, 0x01, 0x01) 206 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 207 M208 (BS00, THR, C106) /* cmd: Acquire specified set of mutexes */ 208 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 209 M114 (Arg0) 210 /* Wait for all Worker threads */ 211 212 M103 (Arg0) 213 /* Check up the values of counters of all Mutexes */ 214 215 LPN0 = Arg5 216 LPC0 = Arg4 217 While (LPN0) 218 { 219 M333 (LPC0, 0x01, 0x01) 220 LPN0-- 221 LPC0++ 222 } 223 224 /* RELEASING */ 225 226 If (!Arg1) 227 { 228 /* === Thread 2 === */ 229 230 THR = 0x02 231 /* Set up per-thread set of mutexes */ 232 233 M334 (Arg0, C300, Arg4, Arg5, 0x01, 0x01) 234 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 235 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 236 M114 (Arg0) 237 /* Wait for all Worker threads */ 238 239 M103 (Arg0) 240 } 241 242 /* === Thread 1 === */ 243 244 THR = 0x01 245 /* Set up per-thread set of mutexes */ 246 247 M334 (Arg0, C300, Arg2, Arg3, 0x00, 0x01) 248 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 249 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 250 M114 (Arg0) 251 /* Wait for all Worker threads */ 252 253 M103 (Arg0) 254 If (Arg1) 255 { 256 /* === Thread 2 === */ 257 258 THR = 0x02 259 /* Set up per-thread set of mutexes */ 260 261 M334 (Arg0, C300, Arg4, Arg5, 0x01, 0x01) 262 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 263 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 264 M114 (Arg0) 265 /* Wait for all Worker threads */ 266 267 M103 (Arg0) 268 } 269 } 270 271 /* 272 * arg0 - number of threads 273 */ 274 Method (M804, 1, NotSerialized) 275 { 276 /* I */ 277 278 M8FF (Arg0, 0x00, 0x00, MAX0, 0x00, MAX0) 279 /* Reset all counters (cnt0) and flags (fl00) corresponding to all Mutexes */ 280 281 M330 () 282 /* II */ 283 284 M8FF (Arg0, 0x01, 0x00, MAX0, 0x00, MAX0) 285 /* Reset all counters (cnt0) and flags (fl00) corresponding to all Mutexes */ 286 287 M330 () 288 /* III */ 289 290 M8FF (Arg0, 0x01, 0x07, 0x01, 0x00, MAX0) 291 } 292 293 /* 294 * arg0 - number of threads 295 */ 296 Method (M805, 1, Serialized) 297 { 298 Name (LPN0, 0x00) 299 Name (LPC0, 0x00) 300 Name (THR, 0x00) 301 Name (EE01, Buffer (Arg0) 302 { 303 0x00, 0x3F, 0x00 // .?. 304 }) /* AE_AML_NOT_OWNER */ 305 Name (EE02, Buffer (Arg0) 306 { 307 0x00, 0x00, 0x3F // ..? 308 }) /* AE_AML_NOT_OWNER */ 309 /* 1. Thread_1 owns its set of all-level mutexes and falls into sleeping */ 310 311 THR = 0x01 312 /* Set up per-thread set of mutexes */ 313 314 M334 (Arg0, C300, 0x00, MAX0, 0x00, 0x01) 315 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 316 M208 (BS00, THR, C106) /* cmd: Acquire specified set of mutexes */ 317 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 318 M114 (Arg0) 319 /* Wait for all Worker threads */ 320 321 M103 (Arg0) 322 /* Check up the values of counters of all Mutexes */ 323 324 LPN0 = MAX0 /* \MAX0 */ 325 LPC0 = 0x00 326 While (LPN0) 327 { 328 M333 (LPC0, 0x00, 0x01) 329 LPN0-- 330 LPC0++ 331 } 332 333 /* 2,3. Thread_2 tries to Release all those mutexes owned by Thread_1 */ 334 335 THR = 0x02 336 /* Set up exception expectation on Release operation */ 337 338 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 339 M20F (Arg0, EE02, 0x00) /* Init the exceptional conditions flags (AE_AML_NOT_OWNER) */ 340 /* Set up per-thread set of mutexes */ 341 342 M334 (Arg0, C300, 0x00, MAX0, 0x00, 0x01) 343 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 344 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 345 M114 (Arg0) 346 /* Wait for all Worker threads */ 347 348 M103 (Arg0) 349 /* Reset exception expectation */ 350 351 M336 (Arg0, 0x01) 352 /* 4. Thread_2 owns its set of all-level mutexes (not intersecting with Thread_1) */ 353 354 THR = 0x02 355 /* Set up per-thread set of mutexes */ 356 357 M334 (Arg0, C300, 0x00, MAX0, 0x01, 0x01) 358 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 359 M208 (BS00, THR, C106) /* cmd: Acquire specified set of mutexes */ 360 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 361 M114 (Arg0) 362 /* Wait for all Worker threads */ 363 364 M103 (Arg0) 365 /* Check up the values of counters of all Mutexes */ 366 367 LPN0 = MAX0 /* \MAX0 */ 368 LPC0 = 0x00 369 While (LPN0) 370 { 371 M333 (LPC0, 0x00, 0x01) 372 LPN0-- 373 LPC0++ 374 } 375 376 /* 5,6. Thread_2 tries again to Release mutexes owned by Thread_1 */ 377 378 THR = 0x02 379 /* Set up exception expectation on Release operation */ 380 381 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 382 M20F (Arg0, EE02, 0x00) /* Init the exceptional conditions flags (AE_AML_NOT_OWNER) */ 383 /* Set up per-thread set of mutexes */ 384 385 M334 (Arg0, C300, 0x00, MAX0, 0x00, 0x01) 386 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 387 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 388 M114 (Arg0) 389 /* Wait for all Worker threads */ 390 391 M103 (Arg0) 392 /* Reset exception expectation */ 393 394 M336 (Arg0, 0x01) 395 /* 7,8. Thread_1 tries to Release mutexes owned by Thread_2 */ 396 397 THR = 0x01 398 /* Set up exception expectation on Release operation */ 399 400 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 401 M20F (Arg0, EE01, 0x00) /* Init the exceptional conditions flags (AE_AML_NOT_OWNER) */ 402 /* Set up per-thread set of mutexes */ 403 404 M334 (Arg0, C300, 0x00, MAX0, 0x01, 0x01) 405 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 406 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 407 M114 (Arg0) 408 /* Wait for all Worker threads */ 409 410 M103 (Arg0) 411 /* Reset exception expectation */ 412 413 M336 (Arg0, 0x01) 414 /* 9. Thread_1 Releases its mutexes */ 415 416 THR = 0x01 417 /* Set up per-thread set of mutexes */ 418 419 M334 (Arg0, C300, 0x00, MAX0, 0x00, 0x01) 420 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 421 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 422 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 423 M114 (Arg0) 424 /* Wait for all Worker threads */ 425 426 M103 (Arg0) 427 /* 10. Thread_2 Releases its mutexes */ 428 429 THR = 0x02 430 /* Set up per-thread set of mutexes */ 431 432 M334 (Arg0, C300, 0x00, MAX0, 0x01, 0x01) 433 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 434 M208 (BS00, THR, C107) /* cmd: Release specified set of mutexes */ 435 M114 (Arg0) 436 /* Wait for all Worker threads */ 437 438 M103 (Arg0) 439 } 440 441 /* 442 * arg0 - number of threads (total) 443 */ 444 Method (M806, 1, Serialized) 445 { 446 Name (NUMW, 0x00) /* number of threads in work */ 447 Name (LPN0, 0x00) 448 Name (LPC0, 0x00) 449 Name (NTH0, Buffer (0x02){}) 450 Name (IX00, Buffer ((MIN1 * 0x02)) 451 { 452 /* 0000 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, // ........ 453 /* 0008 */ 0x03, 0x01 // .. 454 }) 455 /* 456 * arg0-arg5 - same as m33f 457 * arg6 - index of thread according to the test scenario 458 */ 459 Method (M000, 7, Serialized) 460 { 461 Name (NTH1, 0x00) /* actually in work */ 462 NTH1 = DerefOf (Arg0 [0x01]) 463 If ((Arg6 < NTH1)) 464 { 465 M33F (Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, 0x00) 466 } 467 } 468 469 /* Number of threads to be actually in work */ 470 471 NUMW = M213 (Arg0, MIN1, 0x04) 472 /* Pack numbers of threads */ 473 474 NTH0 = M20D (Arg0, NUMW) 475 /* Data */ 476 477 Name (B001, Buffer ((MIN1 * 0x02)) 478 { 479 /* 0000 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, // ........ 480 /* 0008 */ 0x00, 0x01 // .. 481 }) 482 Name (B002, Buffer ((MIN1 * 0x02)) 483 { 484 /* 0000 */ 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, // ........ 485 /* 0008 */ 0x01, 0x01 // .. 486 }) 487 Name (B003, Buffer ((MIN1 * 0x02)) 488 { 489 /* 0000 */ 0x00, 0x00, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, // ........ 490 /* 0008 */ 0x02, 0x01 // .. 491 }) 492 Name (B004, Buffer ((MIN1 * 0x02)) 493 { 494 /* 0000 */ 0x00, 0x00, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, // ........ 495 /* 0008 */ 0x00, 0x00 // .. 496 }) 497 Name (CM01, Package (MIN1) 498 { 499 0x00, 500 C107, 501 0x00, 502 0x00, 503 0x00 504 }) 505 Name (EE01, Buffer (MIN1) 506 { 507 0x00, 0x3F, 0x00, 0x00, 0x00 // .?... 508 }) /* AE_AML_NOT_OWNER */ 509 Name (CM02, Package (MIN1) 510 { 511 0x00, 512 0x00, 513 C107, 514 0x00, 515 0x00 516 }) 517 Name (EE02, Buffer (MIN1) 518 { 519 0x00, 0x00, 0x3F, 0x00, 0x00 // ..?.. 520 }) /* AE_AML_NOT_OWNER */ 521 Name (CM03, Package (MIN1) 522 { 523 0x00, 524 0x00, 525 0x00, 526 C107, 527 0x00 528 }) 529 Name (EE03, Buffer (MIN1) 530 { 531 0x00, 0x00, 0x00, 0x3F, 0x00 // ...?. 532 }) /* AE_AML_NOT_OWNER */ 533 Name (CM04, Package (MIN1) 534 { 535 0x00, 536 0x00, 537 0x00, 538 0x00, 539 C107 540 }) 541 Name (EE04, Buffer (MIN1) 542 { 543 0x00, 0x00, 0x00, 0x00, 0x3F // ....? 544 }) /* AE_AML_NOT_OWNER */ 545 /* Acquire */ 546 547 LPN0 = MAX0 /* \MAX0 */ 548 LPC0 = 0x00 549 While (LPN0) 550 { 551 /* All threads Acquire their mutexes */ 552 553 M33F (NTH0, C106, 0x00, LPC0, IX00, C106, 0x00) /* Expected hang statuses (buffer/Integer) */ 554 /* 2. Threads thr-2, thr-3, thr-4 attempt to Release mutex of thr-1 */ 555 556 If ((NUMW > 0x01)) 557 { 558 M000 (NTH0, CM02, EE02, LPC0, B001, CM02, 0x02) 559 M000 (NTH0, CM03, EE03, LPC0, B001, CM03, 0x03) 560 M000 (NTH0, CM04, EE04, LPC0, B001, CM04, 0x04) 561 } 562 563 /* 3. Threads thr-1, thr-3, thr-4 attempt to Release mutex of thr-2 */ 564 565 If ((NUMW > 0x02)) 566 { 567 M000 (NTH0, CM01, EE01, LPC0, B002, CM01, 0x01) 568 M000 (NTH0, CM03, EE03, LPC0, B002, CM03, 0x03) 569 M000 (NTH0, CM04, EE04, LPC0, B002, CM04, 0x04) 570 } 571 572 /* 4. Threads thr-1, thr-2, thr-4 attempt to Release mutex of thr-3 */ 573 574 If ((NUMW > 0x03)) 575 { 576 M000 (NTH0, CM01, EE01, LPC0, B003, CM01, 0x01) 577 M000 (NTH0, CM02, EE02, LPC0, B003, CM02, 0x02) 578 M000 (NTH0, CM04, EE04, LPC0, B003, CM04, 0x04) 579 } 580 581 /* 5. Threads thr-1, thr-2, thr-3 attempt to Release mutex of thr-4 */ 582 583 If ((NUMW > 0x04)) 584 { 585 M000 (NTH0, CM01, EE01, LPC0, B004, CM01, 0x01) 586 M000 (NTH0, CM02, EE02, LPC0, B004, CM02, 0x02) 587 M000 (NTH0, CM03, EE03, LPC0, B004, CM03, 0x03) 588 } 589 590 /* All threads Release their mutexes */ 591 592 M33F (NTH0, C107, 0x00, LPC0, IX00, C107, 0x00) /* Expected hang statuses (buffer/Integer) */ 593 LPN0-- 594 LPC0++ 595 } 596 } 597 598 /* 599 * arg0 - number of threads 600 */ 601 Method (M807, 1, Serialized) 602 { 603 Name (LPN0, 0x00) 604 Name (LPC0, 0x00) 605 Name (LPN1, 0x00) 606 Name (LPC1, 0x00) 607 Name (IX00, 0x00) 608 Name (NUMW, 0x00) /* number of threads in work */ 609 /* Number of threads to be actually in work */ 610 611 NUMW = M213 (Arg0, MIN1, 0x03) 612 /* From 15 to 0 */ 613 614 LPN0 = MAX0 /* \MAX0 */ 615 IX00 = MAX0 /* \MAX0 */ 616 IX00-- 617 LPC0 = IX00 /* \M807.IX00 */ 618 While (LPN0) 619 { 620 If ((LPC0 != 0x00)) 621 { 622 /* 623 * 3. Acquire mutexes from 0 to (N-1) levels: 624 * - Set up per-thread set of mutexes 625 * - Acquire specified set of mutexes 626 * - Wait for all Worker threads 627 * - Check up the values of counters of all Mutexes 628 */ 629 M337 (Arg0, NUMW, 0x00, LPC0, 0x01, 0x00) 630 /* 631 * 4. Release mutexes from 0 to (N-1) levels: 632 * - Set up per-thread set of mutexes 633 * - Release specified set of mutexes 634 * - Wait for all Worker threads 635 */ 636 M338 (Arg0, NUMW, 0x00, LPC0) 637 /* Reset all counters (cnt0) and flags (fl00) corresponding to all Mutexes */ 638 639 M330 () 640 } 641 642 /* 5. Acquire mutex of level N */ 643 644 M337 (Arg0, NUMW, LPC0, 0x01, 0x01, 0x00) 645 If ((LPC0 != 0x00)) 646 { 647 /* 648 * 6. Attempt to Acquire mutexes from 0 to (N-1) levels 649 * 7. Exception is expected 650 */ 651 M337 (Arg0, NUMW, 0x00, LPC0, 0x00, 0x40) /* With exceptional conditions flags (AE_AML_MUTEX_ORDER) */ 652 /* Reset exception expectation */ 653 654 M336 (Arg0, 0x01) 655 } 656 657 If ((LPC0 != IX00)) 658 { 659 /* 660 * 8. Acquire mutexes from (N+1) to 15 levels 661 * - Set up per-thread set of mutexes 662 * - Acquire specified set of mutexes 663 * - Wait for all Worker threads 664 * - Check up the values of counters of all Mutexes 665 */ 666 Local0 = (LPC0 + 0x01) 667 Local1 = (IX00 - LPC0) /* \M807.LPC0 */ 668 M337 (Arg0, NUMW, Local0, Local1, 0x01, 0x00) 669 } 670 671 /* 672 * 9. Release all mutexes (starting with lpC0 up to 15 level): 673 * - Set up per-thread set of mutexes 674 * - Release specified set of mutexes 675 * - Wait for all Worker threads 676 */ 677 Local1 = (MAX0 - LPC0) /* \M807.LPC0 */ 678 M338 (Arg0, NUMW, LPC0, Local1) 679 /* Reset all counters (cnt0) and flags (fl00) corresponding to all Mutexes */ 680 681 M330 () 682 If ((LPC0 != 0x00)) 683 { 684 /* 685 * 10. Acquire mutexes from 0 to (N-1) levels: 686 * - Set up per-thread set of mutexes 687 * - Acquire specified set of mutexes 688 * - Wait for all Worker threads 689 * - Check up the values of counters of all Mutexes 690 */ 691 M337 (Arg0, NUMW, 0x00, LPC0, 0x01, 0x00) 692 /* 693 * 11. Release mutexes (from 0 to (N-1) levels): 694 * - Set up per-thread set of mutexes 695 * - Release specified set of mutexes 696 * - Wait for all Worker threads 697 */ 698 M338 (Arg0, NUMW, 0x00, LPC0) 699 /* Reset all counters (cnt0) and flags (fl00) corresponding to all Mutexes */ 700 701 M330 () 702 } 703 704 LPN0-- 705 LPC0-- 706 } 707 } 708 709 /* 710 * arg0 - number of threads (total) 711 */ 712 Method (M808, 1, Serialized) 713 { 714 Name (PR, 0x00) 715 Name (L000, 0x00) 716 Name (NTH0, Buffer (0x02){}) 717 /* 718 * Per-thread indexes of mutexes 719 * 720 * Ctl-thr, thr-1, thr-2, thr-3, thr-4 721 */ 722 Name (B000, Buffer ((MIN1 * 0x02)) 723 { 724 /* 0000 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, // ........ 725 /* 0008 */ 0x03, 0x01 // .. 726 }) 727 Name (B001, Buffer ((MIN1 * 0x02)) 728 { 729 /* 0000 */ 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, // ........ 730 /* 0008 */ 0x00, 0x01 // .. 731 }) 732 Name (B002, Buffer ((MIN1 * 0x02)) 733 { 734 /* 0000 */ 0x00, 0x00, 0x02, 0x01, 0x03, 0x01, 0x00, 0x01, // ........ 735 /* 0008 */ 0x01, 0x01 // .. 736 }) 737 Name (B003, Buffer ((MIN1 * 0x02)) 738 { 739 /* 0000 */ 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x01, 0x01, // ........ 740 /* 0008 */ 0x02, 0x01 // .. 741 }) 742 /* Pack numbers of threads */ 743 744 NTH0 = M20D (Arg0, MIN1) 745 /* x-0-123 */ 746 /* 747 * Acquire all x-0-123 and check owning 748 * 749 * Threads thr-1, thr-2, thr-3, thr-4 750 * acquire respectively all x-0-123 mutexes 751 * and check owning of all those mutexes. 752 */ 753 M33F (NTH0, C106, 0x00, L000, B000, C106, 0x00) /* Expected hang statuses (buffer/Integer) */ 754 If (PR) 755 { 756 M20B (0x00, "Acquire all x-0-123") 757 } 758 759 /* At this point threads have Acquired: x-0-123 */ 760 761 M8FE (NTH0, L000, B000, B001, PR) 762 M8FE (NTH0, L000, B001, B002, PR) 763 M8FE (NTH0, L000, B002, B003, PR) 764 M8FE (NTH0, L000, B003, B000, PR) 765 /* At this point threads have Acquired: x-0-123 */ 766 /* Release mutexes on all threads */ 767 Name (CM00, Package (MIN1) 768 { 769 0x00, 770 C107, 771 C107, 772 C107, 773 C107 774 }) 775 Name (CP00, Package (MIN1) 776 { 777 0x00, 778 C107, 779 C107, 780 C107, 781 C107 782 }) 783 M33F (NTH0, CM00, 0x00, L000, B000, CP00, 0x00) /* Expected hang statuses (buffer/Integer) */ 784 If (PR) 785 { 786 M20B (0x00, "Release all") 787 } 788 } 789 790 /* 791 * Manage the test m808 792 * 793 * agr0 - numbers of threads (buffer/Integer) 794 * arg1 - levels of mutexes (buffer/Integer) 795 * arg2 - indexes of mutexes (buffer/Integer) - start point 796 * arg3 - indexes of mutexes (buffer/Integer) - target point 797 * arg4 - printing flag 798 */ 799 Method (M8FE, 5, Serialized) 800 { 801 /* 802 * Comments are for one particular transfer step from 803 * x-0-123 to x-1-230, other steps are identical. 804 */ 805 /* At this point threads have Acquired: x-0-123 */ 806 /* x-1-230 */ 807 /* Acquire x-x-230 and check that all -230- hang */ 808 Name (CM00, Package (MIN1) 809 { 810 0x00, 811 0x00, 812 C106, 813 C106, 814 C106 815 }) 816 M33F (Arg0, CM00, 0x00, Arg1, Arg3, 0x00, CM00) /* Expected hang statuses (buffer/Integer) */ 817 If (Arg4) 818 { 819 M20B (0x00, "Acquire x-x-230") 820 } 821 822 /* Release x-0-xxx, this frees mux for thr-4 */ 823 824 Name (CM01, Package (MIN1) 825 { 826 0x00, 827 C107, 828 0x00, 829 0x00, 830 0x00 831 }) 832 Name (CP01, Package (MIN1) 833 { 834 0x00, 835 C107, 836 0x00, 837 0x00, 838 C106 839 }) 840 Name (HG01, Package (MIN1) 841 { 842 0x00, 843 0x00, 844 C106, 845 C106, 846 0x00 847 }) 848 M33F (Arg0, CM01, 0x00, Arg1, Arg2, CP01, HG01) /* Expected hang statuses (buffer/Integer) */ 849 If (Arg4) 850 { 851 M20B (0x00, "Release x-0-xxx") 852 } 853 854 /* Acquire x-1-xxx and check that it hangs too */ 855 856 Name (CM02, Package (MIN1) 857 { 858 0x00, 859 C106, 860 0x00, 861 0x00, 862 0x00 863 }) 864 Name (HG02, Package (MIN1) 865 { 866 0x00, 867 C106, 868 C106, 869 C106, 870 0x00 871 }) 872 M33F (Arg0, CM02, 0x00, Arg1, Arg3, 0x00, HG02) /* Expected hang statuses (buffer/Integer) */ 873 If (Arg4) 874 { 875 M20B (0x00, "Acquire x-1-xxx") 876 } 877 878 /* Release x-x-xx3, this frees mux for thr-3 */ 879 880 Name (CM03, Package (MIN1) 881 { 882 0x00, 883 0x00, 884 0x00, 885 0x00, 886 C107 887 }) 888 Name (CP03, Package (MIN1) 889 { 890 0x00, 891 0x00, 892 0x00, 893 C106, 894 C107 895 }) 896 Name (HG03, Package (MIN1) 897 { 898 0x00, 899 C106, 900 C106, 901 0x00, 902 0x00 903 }) 904 M33F (Arg0, CM03, 0x00, Arg1, Arg2, CP03, HG03) /* Expected hang statuses (buffer/Integer) */ 905 If (Arg4) 906 { 907 M20B (0x00, "Release x-x-xx3") 908 } 909 910 /* Release x-x-x2x, this frees mux for thr-2 */ 911 912 Name (CM04, Package (MIN1) 913 { 914 0x00, 915 0x00, 916 0x00, 917 C107, 918 0x00 919 }) 920 Name (CP04, Package (MIN1) 921 { 922 0x00, 923 0x00, 924 C106, 925 C107, 926 0x00 927 }) 928 Name (HG04, Package (MIN1) 929 { 930 0x00, 931 C106, 932 0x00, 933 0x00, 934 0x00 935 }) 936 M33F (Arg0, CM04, 0x00, Arg1, Arg2, CP04, HG04) /* Expected hang statuses (buffer/Integer) */ 937 If (Arg4) 938 { 939 M20B (0x00, "Release x-x-x2x") 940 } 941 942 /* Release x-x-1xx, this frees mux for thr-1 */ 943 944 Name (CM05, Package (MIN1) 945 { 946 0x00, 947 0x00, 948 C107, 949 0x00, 950 0x00 951 }) 952 Name (CP05, Package (MIN1) 953 { 954 0x00, 955 C106, 956 C107, 957 0x00, 958 0x00 959 }) 960 M33F (Arg0, CM05, 0x00, Arg1, Arg2, CP05, 0x00) /* Expected hang statuses (buffer/Integer) */ 961 If (Arg4) 962 { 963 M20B (0x00, "Release x-x-1xx") 964 } 965 /* At this point threads have Acquired: x-1-230 */ 966 } 967 968 /* 969 * arg0 - number of threads (total) 970 */ 971 Method (M809, 1, NotSerialized) 972 { 973 M80C (Arg0, 0x01) 974 } 975 976 /* 977 * arg0 - number of threads (total) 978 * arg1 - variant (of parameters passed to m8fd): 979 * 0: 980 * arg1 - indexes of mutexes (buffer/Integer) 981 * arg2 - levels of mutexes (buffer/Integer) - start point 982 * arg3 - levels of mutexes (buffer/Integer) - target point 983 * 1: 984 * arg1 - levels of mutexes (buffer/Integer) 985 * arg2 - indexes of mutexes (buffer/Integer) - start point 986 * arg3 - indexes of mutexes (buffer/Integer) - target point 987 */ 988 Method (M80C, 2, Serialized) 989 { 990 Name (PR, 0x00) 991 Name (IXLL, 0x00) 992 Name (NTH0, Buffer (0x02){}) 993 /* 994 * Per-thread indexes/levels (depending on arg1) of mutexes 995 * 996 * Ctl-thr, thr-1, thr-2, thr-3, thr-4 997 */ 998 Name (B000, Buffer ((MIN1 * 0x02)) 999 { 1000 /* 0000 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, // ........ 1001 /* 0008 */ 0x03, 0x01 // .. 1002 }) 1003 Name (B001, Buffer ((MIN1 * 0x02)) 1004 { 1005 /* 0000 */ 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, // ........ 1006 /* 0008 */ 0x04, 0x01 // .. 1007 }) 1008 Name (B002, Buffer ((MIN1 * 0x02)) 1009 { 1010 /* 0000 */ 0x00, 0x00, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, // ........ 1011 /* 0008 */ 0x05, 0x01 // .. 1012 }) 1013 Name (B003, Buffer ((MIN1 * 0x02)) 1014 { 1015 /* 0000 */ 0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, // ........ 1016 /* 0008 */ 0x06, 0x01 // .. 1017 }) 1018 Name (B004, Buffer ((MIN1 * 0x02)) 1019 { 1020 /* 0000 */ 0x00, 0x00, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, // ........ 1021 /* 0008 */ 0x07, 0x01 // .. 1022 }) 1023 Name (B005, Buffer ((MIN1 * 0x02)) 1024 { 1025 /* 0000 */ 0x00, 0x00, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, // ........ 1026 /* 0008 */ 0x08, 0x01 // .. 1027 }) 1028 Name (B006, Buffer ((MIN1 * 0x02)) 1029 { 1030 /* 0000 */ 0x00, 0x00, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, // ........ 1031 /* 0008 */ 0x09, 0x01 // .. 1032 }) 1033 Name (B007, Buffer ((MIN1 * 0x02)) 1034 { 1035 /* 0000 */ 0x00, 0x00, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, // ........ 1036 /* 0008 */ 0x0A, 0x01 // .. 1037 }) 1038 Name (B008, Buffer ((MIN1 * 0x02)) 1039 { 1040 /* 0000 */ 0x00, 0x00, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, // ........ 1041 /* 0008 */ 0x0B, 0x01 // .. 1042 }) 1043 Name (B009, Buffer ((MIN1 * 0x02)) 1044 { 1045 /* 0000 */ 0x00, 0x00, 0x09, 0x01, 0x0A, 0x01, 0x0B, 0x01, // ........ 1046 /* 0008 */ 0x0C, 0x01 // .. 1047 }) 1048 Name (B00A, Buffer ((MIN1 * 0x02)) 1049 { 1050 /* 0000 */ 0x00, 0x00, 0x0A, 0x01, 0x0B, 0x01, 0x0C, 0x01, // ........ 1051 /* 0008 */ 0x0D, 0x01 // .. 1052 }) 1053 Name (B00B, Buffer ((MIN1 * 0x02)) 1054 { 1055 /* 0000 */ 0x00, 0x00, 0x0B, 0x01, 0x0C, 0x01, 0x0D, 0x01, // ........ 1056 /* 0008 */ 0x0E, 0x01 // .. 1057 }) 1058 Name (B00C, Buffer ((MIN1 * 0x02)) 1059 { 1060 /* 0000 */ 0x00, 0x00, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, // ........ 1061 /* 0008 */ 0x0F, 0x01 // .. 1062 }) 1063 If (Arg1) 1064 { 1065 /* The same level of mutexes */ 1066 1067 IXLL = 0x00 1068 } 1069 Else 1070 { 1071 /* The same index of mutexes */ 1072 1073 IXLL = 0x00 1074 } 1075 1076 /* Pack numbers of threads */ 1077 1078 NTH0 = M20D (Arg0, MIN1) 1079 /* x-0123 */ 1080 /* 1081 * x-0-1-2-3 1082 * Acquire all x-0123 and check owning 1083 * 1084 * Threads thr-1, thr-2, thr-3, thr-4 1085 * acquire respectively all x-0123 mutexes 1086 * and check owning of all those mutexes. 1087 */ 1088 If (Arg1) 1089 { 1090 Local6 = IXLL /* \M80C.IXLL */ 1091 Local7 = B000 /* \M80C.B000 */ 1092 } 1093 Else 1094 { 1095 Local6 = B000 /* \M80C.B000 */ 1096 Local7 = IXLL /* \M80C.IXLL */ 1097 } 1098 1099 M33F (NTH0, C106, 0x00, Local6, Local7, C106, 0x00) /* Expected hang statuses (buffer/Integer) */ 1100 If (PR) 1101 { 1102 M20B (0x00, "Acquire all x-0123") 1103 } 1104 1105 M8FD (NTH0, IXLL, B000, B001, PR, Arg1) 1106 M8FD (NTH0, IXLL, B001, B002, PR, Arg1) 1107 M8FD (NTH0, IXLL, B002, B003, PR, Arg1) 1108 M8FD (NTH0, IXLL, B003, B004, PR, Arg1) 1109 M8FD (NTH0, IXLL, B004, B005, PR, Arg1) 1110 M8FD (NTH0, IXLL, B005, B006, PR, Arg1) 1111 M8FD (NTH0, IXLL, B006, B007, PR, Arg1) 1112 M8FD (NTH0, IXLL, B007, B008, PR, Arg1) 1113 M8FD (NTH0, IXLL, B008, B009, PR, Arg1) 1114 M8FD (NTH0, IXLL, B009, B00A, PR, Arg1) 1115 M8FD (NTH0, IXLL, B00A, B00B, PR, Arg1) 1116 M8FD (NTH0, IXLL, B00B, B00C, PR, Arg1) 1117 /* x-(12)-(13)-(14)-(15), Release=x-(12)(13)(14)(15), hang=x-xxxx, success=x-(12)(13)(14)(15) */ 1118 1119 If (Arg1) 1120 { 1121 Local6 = IXLL /* \M80C.IXLL */ 1122 Local7 = B00C /* \M80C.B00C */ 1123 } 1124 Else 1125 { 1126 Local6 = B00C /* \M80C.B00C */ 1127 Local7 = IXLL /* \M80C.IXLL */ 1128 } 1129 1130 M33F (NTH0, C107, 0x00, Local6, Local7, C107, 0x00) /* Expected hang statuses (buffer/Integer) */ 1131 If (PR) 1132 { 1133 M20B (0x00, "Release x-(12)(13)(14)(15)") 1134 } 1135 } 1136 1137 /* 1138 * arg0 - numbers of threads (buffer/Integer) 1139 * arg1 - indexes/levels of mutexes (buffer/Integer) 1140 * arg2 - levels/indexes of mutexes (buffer/Integer) - start point 1141 * arg3 - levels/indexes of mutexes (buffer/Integer) - target point 1142 * arg4 - printing flag 1143 * arg5 - variant (see m80c) 1144 */ 1145 Method (M8FD, 6, Serialized) 1146 { 1147 /* At this point threads have Acquired: x-0123 */ 1148 /* 1149 * Comments are given for one particular transfer step 1150 * from x-0-123 to x-1-230, other steps are identical. 1151 */ 1152 /* x-01-12-23-34, Acquire=x-1234, hang=x-123x, success=x-xxx4 */ 1153 Name (CM00, Package (MIN1) 1154 { 1155 0x00, 1156 C106, 1157 C106, 1158 C106, 1159 C106 1160 }) 1161 Name (CP00, Package (MIN1) 1162 { 1163 0x00, 1164 0x00, 1165 0x00, 1166 0x00, 1167 C106 1168 }) 1169 Name (HG00, Package (MIN1) 1170 { 1171 0x00, 1172 C106, 1173 C106, 1174 C106, 1175 0x00 1176 }) 1177 If (Arg5) 1178 { 1179 Local6 = Arg1 1180 Local7 = Arg3 1181 } 1182 Else 1183 { 1184 Local6 = Arg3 1185 Local7 = Arg1 1186 } 1187 1188 M33F (Arg0, CM00, 0x00, Local6, Local7, CP00, HG00) /* Expected hang statuses (buffer/Integer) */ 1189 If (Arg4) 1190 { 1191 M20B (0x00, "Acquire x-1234") 1192 } 1193 1194 /* x-01-12-23-3, Release=x-xxx4, hang=x-123x, success=x-xxx4 */ 1195 1196 Name (CM01, Package (MIN1) 1197 { 1198 0x00, 1199 0x00, 1200 0x00, 1201 0x00, 1202 C107 1203 }) 1204 Name (CP01, Package (MIN1) 1205 { 1206 0x00, 1207 0x00, 1208 0x00, 1209 0x00, 1210 C107 1211 }) 1212 Name (HG01, Package (MIN1) 1213 { 1214 0x00, 1215 C106, 1216 C106, 1217 C106, 1218 0x00 1219 }) 1220 If (Arg5) 1221 { 1222 Local6 = Arg1 1223 Local7 = Arg3 1224 } 1225 Else 1226 { 1227 Local6 = Arg3 1228 Local7 = Arg1 1229 } 1230 1231 M33F (Arg0, CM01, 0x00, Local6, Local7, CP01, HG01) /* Expected hang statuses (buffer/Integer) */ 1232 If (Arg4) 1233 { 1234 M20B (0x00, "Release x-xxx4") 1235 } 1236 1237 /* x-01-12-23-x, Release=x-xxx3, hang=x-12xx, success=x-xx33 */ 1238 1239 Name (CM02, Package (MIN1) 1240 { 1241 0x00, 1242 0x00, 1243 0x00, 1244 0x00, 1245 C107 1246 }) 1247 Name (CP02, Package (MIN1) 1248 { 1249 0x00, 1250 0x00, 1251 0x00, 1252 C106, 1253 C107 1254 }) 1255 Name (HG02, Package (MIN1) 1256 { 1257 0x00, 1258 C106, 1259 C106, 1260 0x00, 1261 0x00 1262 }) 1263 If (Arg5) 1264 { 1265 Local6 = Arg1 1266 Local7 = Arg2 1267 } 1268 Else 1269 { 1270 Local6 = Arg2 1271 Local7 = Arg1 1272 } 1273 1274 M33F (Arg0, CM02, 0x00, Local6, Local7, CP02, HG02) /* Expected hang statuses (buffer/Integer) */ 1275 If (Arg4) 1276 { 1277 M20B (0x00, "Release x-xxx3") 1278 } 1279 1280 /* x-01-12-23-4, Acquire=x-xxx4, hang=x-12xx, success=x-xxx4 */ 1281 1282 Name (CM03, Package (MIN1) 1283 { 1284 0x00, 1285 0x00, 1286 0x00, 1287 0x00, 1288 C106 1289 }) 1290 Name (CP03, Package (MIN1) 1291 { 1292 0x00, 1293 0x00, 1294 0x00, 1295 0x00, 1296 C106 1297 }) 1298 Name (HG03, Package (MIN1) 1299 { 1300 0x00, 1301 C106, 1302 C106, 1303 0x00, 1304 0x00 1305 }) 1306 If (Arg5) 1307 { 1308 Local6 = Arg1 1309 Local7 = Arg3 1310 } 1311 Else 1312 { 1313 Local6 = Arg3 1314 Local7 = Arg1 1315 } 1316 1317 M33F (Arg0, CM03, 0x00, Local6, Local7, CP03, HG03) /* Expected hang statuses (buffer/Integer) */ 1318 If (Arg4) 1319 { 1320 M20B (0x00, "Acquire x-xxx4") 1321 } 1322 1323 /* x-01-12-2-4, Release=x-xx3x, hang=x-12xx, success=x-xx3x */ 1324 1325 Name (CM05, Package (MIN1) 1326 { 1327 0x00, 1328 0x00, 1329 0x00, 1330 C107, 1331 0x00 1332 }) 1333 Name (CP05, Package (MIN1) 1334 { 1335 0x00, 1336 0x00, 1337 0x00, 1338 C107, 1339 0x00 1340 }) 1341 Name (HG05, Package (MIN1) 1342 { 1343 0x00, 1344 C106, 1345 C106, 1346 0x00, 1347 0x00 1348 }) 1349 If (Arg5) 1350 { 1351 Local6 = Arg1 1352 Local7 = Arg3 1353 } 1354 Else 1355 { 1356 Local6 = Arg3 1357 Local7 = Arg1 1358 } 1359 1360 M33F (Arg0, CM05, 0x00, Local6, Local7, CP05, HG05) /* Expected hang statuses (buffer/Integer) */ 1361 If (Arg4) 1362 { 1363 M20B (0x00, "Release x-xx3x") 1364 } 1365 1366 /* x-01-12-x-4, Release=x-xx2x, hang=x-1xxx, success=x-x22x */ 1367 1368 Name (CM06, Package (MIN1) 1369 { 1370 0x00, 1371 0x00, 1372 0x00, 1373 C107, 1374 0x00 1375 }) 1376 Name (CP06, Package (MIN1) 1377 { 1378 0x00, 1379 0x00, 1380 C106, 1381 C107, 1382 0x00 1383 }) 1384 Name (HG06, Package (MIN1) 1385 { 1386 0x00, 1387 C106, 1388 0x00, 1389 0x00, 1390 0x00 1391 }) 1392 If (Arg5) 1393 { 1394 Local6 = Arg1 1395 Local7 = Arg2 1396 } 1397 Else 1398 { 1399 Local6 = Arg2 1400 Local7 = Arg1 1401 } 1402 1403 M33F (Arg0, CM06, 0x00, Local6, Local7, CP06, HG06) /* Expected hang statuses (buffer/Integer) */ 1404 If (Arg4) 1405 { 1406 M20B (0x00, "Release x-xx2x") 1407 } 1408 1409 /* x-01-12-3-4, Acquire=x-xx3x, hang=x-1xxx, success=x-xx3x */ 1410 1411 Name (CM07, Package (MIN1) 1412 { 1413 0x00, 1414 0x00, 1415 0x00, 1416 C106, 1417 0x00 1418 }) 1419 Name (CP07, Package (MIN1) 1420 { 1421 0x00, 1422 0x00, 1423 0x00, 1424 C106, 1425 0x00 1426 }) 1427 Name (HG07, Package (MIN1) 1428 { 1429 0x00, 1430 C106, 1431 0x00, 1432 0x00, 1433 0x00 1434 }) 1435 If (Arg5) 1436 { 1437 Local6 = Arg1 1438 Local7 = Arg3 1439 } 1440 Else 1441 { 1442 Local6 = Arg3 1443 Local7 = Arg1 1444 } 1445 1446 M33F (Arg0, CM07, 0x00, Local6, Local7, CP07, HG07) /* Expected hang statuses (buffer/Integer) */ 1447 If (Arg4) 1448 { 1449 M20B (0x00, "Acquire x-xx3x") 1450 } 1451 1452 /* x-01-1-3-4, Release=x-x2xx, hang=x-1xxx, success=x-x2xx */ 1453 1454 Name (CM08, Package (MIN1) 1455 { 1456 0x00, 1457 0x00, 1458 C107, 1459 0x00, 1460 0x00 1461 }) 1462 Name (CP08, Package (MIN1) 1463 { 1464 0x00, 1465 0x00, 1466 C107, 1467 0x00, 1468 0x00 1469 }) 1470 Name (HG08, Package (MIN1) 1471 { 1472 0x00, 1473 C106, 1474 0x00, 1475 0x00, 1476 0x00 1477 }) 1478 If (Arg5) 1479 { 1480 Local6 = Arg1 1481 Local7 = Arg3 1482 } 1483 Else 1484 { 1485 Local6 = Arg3 1486 Local7 = Arg1 1487 } 1488 1489 M33F (Arg0, CM08, 0x00, Local6, Local7, CP08, HG08) /* Expected hang statuses (buffer/Integer) */ 1490 If (Arg4) 1491 { 1492 M20B (0x00, "Release x-x2xx") 1493 } 1494 1495 /* x-01-x-3-4, Release=x-x1xx, hang=x-xxxx, success=x-11xx */ 1496 1497 Name (CM09, Package (MIN1) 1498 { 1499 0x00, 1500 0x00, 1501 C107, 1502 0x00, 1503 0x00 1504 }) 1505 Name (CP09, Package (MIN1) 1506 { 1507 0x00, 1508 C106, 1509 C107, 1510 0x00, 1511 0x00 1512 }) 1513 If (Arg5) 1514 { 1515 Local6 = Arg1 1516 Local7 = Arg2 1517 } 1518 Else 1519 { 1520 Local6 = Arg2 1521 Local7 = Arg1 1522 } 1523 1524 M33F (Arg0, CM09, 0x00, Local6, Local7, CP09, 0x00) /* Expected hang statuses (buffer/Integer) */ 1525 If (Arg4) 1526 { 1527 M20B (0x00, "Release x-x1xx") 1528 } 1529 1530 /* x-01-2-3-4, Acquire=x-x2xx, hang=x-xxxx, success=x-x2xx */ 1531 1532 Name (CM0A, Package (MIN1) 1533 { 1534 0x00, 1535 0x00, 1536 C106, 1537 0x00, 1538 0x00 1539 }) 1540 Name (CP0A, Package (MIN1) 1541 { 1542 0x00, 1543 0x00, 1544 C106, 1545 0x00, 1546 0x00 1547 }) 1548 If (Arg5) 1549 { 1550 Local6 = Arg1 1551 Local7 = Arg3 1552 } 1553 Else 1554 { 1555 Local6 = Arg3 1556 Local7 = Arg1 1557 } 1558 1559 M33F (Arg0, CM0A, 0x00, Local6, Local7, CP0A, 0x00) /* Expected hang statuses (buffer/Integer) */ 1560 If (Arg4) 1561 { 1562 M20B (0x00, "Acquire x-x2xx") 1563 } 1564 1565 /* x-0-2-3-4, Release=x-1xxx, hang=x-xxxx, success=x-1xxx */ 1566 1567 Name (CM0B, Package (MIN1) 1568 { 1569 0x00, 1570 C107, 1571 0x00, 1572 0x00, 1573 0x00 1574 }) 1575 Name (CP0B, Package (MIN1) 1576 { 1577 0x00, 1578 C107, 1579 0x00, 1580 0x00, 1581 0x00 1582 }) 1583 If (Arg5) 1584 { 1585 Local6 = Arg1 1586 Local7 = Arg3 1587 } 1588 Else 1589 { 1590 Local6 = Arg3 1591 Local7 = Arg1 1592 } 1593 1594 M33F (Arg0, CM0B, 0x00, Local6, Local7, CP0B, 0x00) /* Expected hang statuses (buffer/Integer) */ 1595 If (Arg4) 1596 { 1597 M20B (0x00, "Release x-1xxx") 1598 } 1599 1600 /* x-x-2-3-4, Release=x-0xxx, hang=x-xxxx, success=x-0xxx */ 1601 1602 Name (CM0C, Package (MIN1) 1603 { 1604 0x00, 1605 C107, 1606 0x00, 1607 0x00, 1608 0x00 1609 }) 1610 Name (CP0C, Package (MIN1) 1611 { 1612 0x00, 1613 C107, 1614 0x00, 1615 0x00, 1616 0x00 1617 }) 1618 If (Arg5) 1619 { 1620 Local6 = Arg1 1621 Local7 = Arg2 1622 } 1623 Else 1624 { 1625 Local6 = Arg2 1626 Local7 = Arg1 1627 } 1628 1629 M33F (Arg0, CM0C, 0x00, Local6, Local7, CP0C, 0x00) /* Expected hang statuses (buffer/Integer) */ 1630 If (Arg4) 1631 { 1632 M20B (0x00, "Release x-0xxx") 1633 } 1634 1635 /* x-1-2-3-4, Acquire=x-1xxx, hang=x-xxxx, success=x-1xxx */ 1636 1637 Name (CM0D, Package (MIN1) 1638 { 1639 0x00, 1640 C106, 1641 0x00, 1642 0x00, 1643 0x00 1644 }) 1645 Name (CP0D, Package (MIN1) 1646 { 1647 0x00, 1648 C106, 1649 0x00, 1650 0x00, 1651 0x00 1652 }) 1653 If (Arg5) 1654 { 1655 Local6 = Arg1 1656 Local7 = Arg3 1657 } 1658 Else 1659 { 1660 Local6 = Arg3 1661 Local7 = Arg1 1662 } 1663 1664 M33F (Arg0, CM0D, 0x00, Local6, Local7, CP0D, 0x00) /* Expected hang statuses (buffer/Integer) */ 1665 If (Arg4) 1666 { 1667 M20B (0x00, "Acquire x-1xxx") 1668 } 1669 /* At this point threads have Acquired: x-1234 */ 1670 } 1671 1672 /* 1673 * arg0 - number of threads (total) 1674 */ 1675 Method (M810, 1, NotSerialized) 1676 { 1677 M80C (Arg0, 0x00) 1678 } 1679 1680 /* 1681 * arg0 - number of threads (total) 1682 */ 1683 Method (M811, 1, Serialized) 1684 { 1685 Name (RPT, 0x04) 1686 Name (LPN0, 0x00) 1687 Name (LPC0, 0x00) 1688 Name (LPN1, 0x00) 1689 Name (LPC1, 0x00) 1690 Name (NTH0, Buffer (0x02){}) 1691 Name (IX00, Buffer ((MIN1 * 0x02)) 1692 { 1693 /* 0000 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, // ........ 1694 /* 0008 */ 0x03, 0x01 // .. 1695 }) 1696 Name (NUMW, 0x00) /* number of threads in work */ 1697 /* Number of threads to be actually in work */ 1698 1699 NUMW = M213 (Arg0, MIN1, 0x04) 1700 /* Pack numbers of threads */ 1701 1702 NTH0 = M20D (Arg0, NUMW) 1703 /* Each thread Acquires successfully its mutex N times */ 1704 1705 LPN0 = MAX0 /* \MAX0 */ 1706 LPC0 = 0x00 1707 While (LPN0) 1708 { 1709 LPN1 = RPT /* \M811.RPT_ */ 1710 LPC1 = 0x00 1711 /* Repetition */ 1712 1713 While (LPN1) 1714 { 1715 M33F (NTH0, C106, 0x00, LPC0, IX00, C106, 0x00) /* Expected hang statuses (buffer/Integer) */ 1716 LPN1-- 1717 LPC1++ 1718 } 1719 1720 LPN0-- 1721 LPC0++ 1722 } 1723 1724 /* Each thread Releases successfully its mutex N times */ 1725 1726 LPN0 = MAX0 /* \MAX0 */ 1727 LPC0 = (MAX0 - 0x01) 1728 While (LPN0) 1729 { 1730 LPN1 = RPT /* \M811.RPT_ */ 1731 LPC1 = 0x00 1732 /* Repetition */ 1733 1734 While (LPN1) 1735 { 1736 M33F (NTH0, C107, 0x00, LPC0, IX00, C107, 0x00) /* Expected hang statuses (buffer/Integer) */ 1737 LPN1-- 1738 LPC1++ 1739 } 1740 1741 LPN0-- 1742 LPC0-- 1743 } 1744 1745 /* 1746 * Each thread gets exception AE_AML_MUTEX_NOT_ACQUIRED (65) 1747 * on additional Release. 1748 */ 1749 LPN0 = MAX0 /* \MAX0 */ 1750 LPC0 = (MAX0 - 0x01) 1751 While (LPN0) 1752 { 1753 M33F (NTH0, C107, 0x41, LPC0, IX00, C107, 0x00) /* Expected hang statuses (buffer/Integer) */ 1754 LPN0-- 1755 LPC0-- 1756 } 1757 } 1758 1759 /* 1760 * arg0 - number of threads (total) 1761 */ 1762 Method (M812, 1, Serialized) 1763 { 1764 Name (RPT, 0x03) /* number of repetition */ 1765 Name (LPN0, 0x00) /* level */ 1766 Name (LPC0, 0x00) 1767 Name (LPN1, 0x00) /* index-thread */ 1768 Name (LPC1, 0x00) 1769 Name (INDT, 0x00) /* index of thread */ 1770 Name (LPN2, 0x00) /* repetition */ 1771 Name (LPC2, 0x00) 1772 Name (LLS0, 0x00) 1773 Name (NUM2, 0x00) 1774 Name (IXSZ, 0x00) 1775 Name (NUMW, 0x00) /* number of threads in work */ 1776 Store ((MIN1 * 0x02), IXSZ) /* \M812.IXSZ */ 1777 Name (NTH0, Buffer (0x02){}) 1778 /* Buffers of indexes of mutexes */ 1779 1780 Name (PIXS, Package (MIN1) 1781 { 1782 0x00, 1783 Buffer (IXSZ) 1784 { 1785 /* 0000 */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // ........ 1786 /* 0008 */ 0x00, 0x01 // .. 1787 }, 1788 1789 Buffer (IXSZ) 1790 { 1791 /* 0000 */ 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // ........ 1792 /* 0008 */ 0x01, 0x01 // .. 1793 }, 1794 1795 Buffer (IXSZ) 1796 { 1797 /* 0000 */ 0x00, 0x00, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, // ........ 1798 /* 0008 */ 0x02, 0x01 // .. 1799 }, 1800 1801 Buffer (IXSZ) 1802 { 1803 /* 0000 */ 0x00, 0x00, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, // ........ 1804 /* 0008 */ 0x03, 0x01 // .. 1805 } 1806 }) 1807 Name (BIXS, Buffer (IXSZ){}) 1808 Name (CM00, Buffer (MIN1){}) 1809 Name (CP00, Buffer (MIN1){}) 1810 Name (HG00, Buffer (MIN1){}) 1811 /* 1812 * Determine num - number of threads actually in work 1813 * 1814 * Note: maximum for num is min1 here but it can be diminished 1815 * to reduce the time of execution. 1816 */ 1817 NUMW = M213 (Arg0, MIN1, 0x03) 1818 NUM2 = (NUMW - 0x01) /* except the control thread */ 1819 /* Pack numbers of threads */ 1820 1821 NTH0 = M20D (Arg0, NUMW) 1822 /* 1823 * Determine lls0 - number of levels to be in work 1824 * 1825 * Note: maximum for lls0 is max0 here but it can be diminished 1826 * to reduce the time of execution. 1827 */ 1828 If (REDM) 1829 { 1830 LLS0 = 0x03 1831 } 1832 Else 1833 { 1834 LLS0 = MAX0 /* \MAX0 */ 1835 } 1836 1837 /* 9. Do 1-8 for all Levels of mutex one by one */ 1838 1839 LPN0 = LLS0 /* \M812.LLS0 */ 1840 LPC0 = 0x00 1841 While (LPN0) 1842 { 1843 /* 1844 * 8. Do 1-7 for all threads one by one (so, for 0-3 Indexes of mutex as well) 1845 */ 1846 LPN1 = NUM2 /* \M812.NUM2 */ 1847 LPC1 = 0x00 1848 While (LPN1) 1849 { 1850 INDT = (LPC1 + 0x01) 1851 BIXS = DerefOf (PIXS [INDT]) 1852 /* 1. Thread thr-i Acquires successfully mutex M0 of (i-1)-th index for N times */ 1853 /* c106 for indt-th thread */ 1854 M210 (CM00, NUMW, C106, INDT, 0x01, 0x01, 0x00) 1855 /* Repetition */ 1856 1857 LPN2 = RPT /* \M812.RPT_ */ 1858 LPC2 = 0x00 1859 While (LPN2) 1860 { 1861 M33F (NTH0, CM00, 0x00, LPC0, BIXS, CM00, 0x00) /* Expected hang statuses (buffer/Integer) */ 1862 LPN2-- 1863 LPC2++ 1864 } 1865 1866 /* 2. Other threads Acquire M0 too and hang */ 1867 /* 1868 * c103 for all except indt-th thread 1869 * (and except 0-th thread naturally, 1870 * not mentioned more below) 1871 */ 1872 M200 (CM00, NUMW, C103) 1873 M208 (CM00, INDT, 0x00) 1874 M33F (NTH0, CM00, 0x00, LPC0, BIXS, 0x00, CM00) 1875 /* 3. Thread thr-i Acquires successfully mutex M0 for N times again */ 1876 /* c106 for indt-th thread */ 1877 M210 (CM00, NUMW, C106, INDT, 0x01, 0x01, 0x00) 1878 /* c103 for all except indt-th thread */ 1879 1880 M200 (HG00, NUMW, C103) 1881 M208 (HG00, INDT, 0x00) 1882 /* Repetition */ 1883 1884 LPN2 = RPT /* \M812.RPT_ */ 1885 LPC2 = 0x00 1886 While (LPN2) 1887 { 1888 M33F (NTH0, CM00, 0x00, LPC0, BIXS, CM00, HG00) 1889 LPN2-- 1890 LPC2++ 1891 } 1892 1893 /* 4. Thread thr-i Releases mutex M0 for 2*N times */ 1894 /* c107 for indt-th thread */ 1895 M210 (CM00, NUMW, C107, INDT, 0x01, 0x01, 0x00) 1896 /* c103 for all except indt-th thread */ 1897 1898 M200 (HG00, NUMW, C103) 1899 M208 (HG00, INDT, 0x00) 1900 /* Repetition */ 1901 1902 LPN2 = (RPT * 0x02) 1903 LPN2-- 1904 LPC2 = 0x00 1905 While (LPN2) 1906 { 1907 M33F (NTH0, CM00, 0x00, LPC0, BIXS, CM00, HG00) 1908 LPN2-- 1909 LPC2++ 1910 } 1911 1912 /* 1913 * 5. One of other threads (thr-j) owns M0 1914 * 6. Thread thr-j Release M0 1915 * 7. Do 5-6 items for all 'other' threads 1916 */ 1917 /* c107 for indt-th thread */ 1918 M210 (CM00, NUMW, C107, INDT, 0x01, 0x01, 0x00) 1919 /* c103 for all except indt-th thread, and c107 for indt-th thread */ 1920 1921 M200 (CP00, NUMW, C103) 1922 M208 (CP00, INDT, C107) 1923 M33F (NTH0, CM00, 0x00, LPC0, BIXS, CP00, 0x00) 1924 LPN1-- 1925 LPC1++ 1926 } 1927 1928 LPN0-- 1929 LPC0++ 1930 } 1931 } 1932 1933 /* 1934 * arg0 - number of threads (total) 1935 */ 1936 Method (M813, 1, Serialized) 1937 { 1938 Name (RPT, 0x0100) /* number of repetition */ 1939 Name (LPN0, 0x00) /* level */ 1940 Name (LPC0, 0x00) 1941 Name (LPN1, 0x00) /* index-thread */ 1942 Name (LPC1, 0x00) 1943 Name (INDT, 0x00) /* index of thread */ 1944 Name (LPN2, 0x00) /* repetition */ 1945 Name (LPC2, 0x00) 1946 Name (LLS0, 0x00) /* number of levels */ 1947 Name (NUM2, 0x00) 1948 Name (IXSZ, 0x00) 1949 Name (NUMW, 0x00) /* number of threads in work */ 1950 Store ((MIN1 * 0x02), IXSZ) /* \M813.IXSZ */ 1951 Name (NTH0, Buffer (0x02){}) 1952 /* Buffer of per-thread indexes of mutexes */ 1953 1954 Name (IX00, Buffer (IXSZ) 1955 { 1956 /* 0000 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, // ........ 1957 /* 0008 */ 0x03, 0x01 // .. 1958 }) 1959 Name (CM00, Buffer (MIN1){}) 1960 /* 1961 * Determine num - number of threads actually in work 1962 * See input control on arg0 (before m813) 1963 * 1964 * Note: maximum for num is min1 here but it can be diminished 1965 * to reduce the time of execution. 1966 */ 1967 NUMW = M213 (Arg0, 0x03, 0x02) 1968 NUM2 = (NUMW - 0x01) /* except the control thread */ 1969 /* Pack numbers of threads */ 1970 1971 NTH0 = M20D (Arg0, NUMW) 1972 /* 1973 * Determine lls0 - number of levels to be in work 1974 * 1975 * Note: maximum for lls0 is max0 here but it can be diminished 1976 * to reduce the time of execution. 1977 */ 1978 If (REDM) 1979 { 1980 LLS0 = 0x01 1981 } 1982 Else 1983 { 1984 LLS0 = MAX0 /* \MAX0 */ 1985 } 1986 1987 /* For all Levels of mutex one by one */ 1988 1989 LPN0 = LLS0 /* \M813.LLS0 */ 1990 LPC0 = 0x00 1991 While (LPN0) 1992 { 1993 /* For different indexes-threads one by one */ 1994 1995 LPN1 = NUM2 /* \M813.NUM2 */ 1996 LPC1 = 0x00 1997 While (LPN1) 1998 { 1999 INDT = (LPC1 + 0x01) 2000 /* Thread thr-i Acquires successfully mutex M0 of (i-1)-th index for N times */ 2001 /* c106 for indt-th thread */ 2002 M210 (CM00, NUMW, C106, INDT, 0x01, 0x01, 0x00) 2003 /* Repetition */ 2004 2005 LPN2 = RPT /* \M813.RPT_ */ 2006 LPC2 = 0x00 2007 While (LPN2) 2008 { 2009 M33F (NTH0, CM00, 0x00, LPC0, IX00, CM00, 0x00) /* Expected hang statuses (buffer/Integer) */ 2010 LPN2-- 2011 LPC2++ 2012 } 2013 2014 /* Thread thr-i Releases mutex M0 for N times */ 2015 /* c107 for indt-th thread */ 2016 M210 (CM00, NUMW, C107, INDT, 0x01, 0x01, 0x00) 2017 /* Repetition */ 2018 2019 LPN2 = RPT /* \M813.RPT_ */ 2020 LPC2 = 0x00 2021 While (LPN2) 2022 { 2023 M33F (NTH0, CM00, 0x00, LPC0, IX00, CM00, 0x00) 2024 LPN2-- 2025 LPC2++ 2026 } 2027 2028 LPN1-- 2029 LPC1++ 2030 } 2031 2032 LPN0-- 2033 LPC0++ 2034 } 2035 } 2036 2037 /* 2038 * arg0 - number of threads (total) 2039 */ 2040 Method (M814, 1, Serialized) 2041 { 2042 Name (LPN0, 0x00) /* level */ 2043 Name (LPC0, 0x00) 2044 Name (LPN1, 0x00) /* index */ 2045 Name (LPC1, 0x00) 2046 Name (THR1, 0x00) 2047 Name (THR2, 0x00) 2048 THR1 = 0x01 2049 THR2 = M115 (Arg0) /* thread with the greatest index */ 2050 If ((THR2 >= Arg0)) 2051 { 2052 Debug = "No alive threads for Test!" 2053 Debug = "Test mf14 skipped!" 2054 SKIP () 2055 Return (Zero) 2056 } 2057 2058 If ((THR2 <= THR1)) 2059 { 2060 Debug = "Insufficient number of threads for Test!" 2061 Debug = "Test mf14 skipped!" 2062 SKIP () 2063 Return (Zero) 2064 } 2065 2066 /* 1. Thread thr-N Acquires all the mutexes on all levels */ 2067 /* Set up per-thread set of mutexes */ 2068 M334 (Arg0, C300, 0x00, MAX0, 0x00, MIN0) 2069 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2070 M208 (BS00, THR2, C106) /* cmd: Acquire specified set of mutexes */ 2071 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2072 M114 (Arg0) /* run */ 2073 /* Wait for all Worker threads */ 2074 2075 M103 (Arg0) 2076 /* Check up the values of counters of all Mutexes */ 2077 2078 LPN0 = MAX0 /* \MAX0 */ 2079 LPC0 = 0x00 2080 While (LPN0) 2081 { 2082 LPN1 = MIN0 /* \MIN0 */ 2083 LPC1 = 0x00 2084 While (LPN1) 2085 { 2086 M333 (LPC0, LPC1, 0x01) 2087 LPN1-- 2088 LPC1++ 2089 } 2090 2091 LPN0-- 2092 LPC0++ 2093 } 2094 2095 /* 2096 * 2. Thread thr-1 tries to Acquire all the same mutexes 2097 * and gets FAIL (TimeOutValue is not 0xFFFF). 2098 */ 2099 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2100 M208 (BS00, THR1, C106) /* cmd: Acquire specified set of mutexes */ 2101 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2102 M214 (Arg0, Arg0, TOV1) /* TimeOutValue equal to 1 msec */ 2103 M20F (Arg0, EX0D, 0x00) /* Init the exceptional conditions flags (FAIL) */ 2104 M114 (Arg0) /* run */ 2105 /* Wait for all Worker threads */ 2106 2107 M103 (Arg0) 2108 /* 3. Thread thr-N terminates */ 2109 2110 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2111 M208 (BS00, THR2, C108) /* cmd: Terminate thread */ 2112 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2113 M114 (Arg0) /* run */ 2114 /* Wait for all Worker threads */ 2115 2116 M103 (Arg0) 2117 /* 2118 * 4. Thread thr-1 Acquire all those mutexes again 2119 * and gets success (TimeOutValue is 0xFFFF) 2120 */ 2121 /* Sleep, to ensure the thread thr-N terminates */ 2122 M206 (0x00, 0xC8) 2123 /* 2124 * Reset all counters (cnt0) and flags (fl00) corresponding 2125 * to all Mutexes which were set up by thread thr-N. 2126 */ 2127 M330 () 2128 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2129 M208 (BS00, THR1, C106) /* cmd: Acquire specified set of mutexes */ 2130 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2131 M114 (Arg0) /* run */ 2132 /* Wait for all Worker threads */ 2133 2134 M103 (Arg0) 2135 /* 5. Thread thr-1 Releases all mutexes */ 2136 2137 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2138 M208 (BS00, THR1, C107) /* cmd: Release specified set of mutexes */ 2139 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2140 M114 (Arg0) /* run */ 2141 /* Wait for all Worker threads */ 2142 2143 M103 (Arg0) 2144 } 2145 2146 /* 2147 * arg0 - number of threads (total) 2148 */ 2149 Method (M815, 1, Serialized) 2150 { 2151 Name (LPN0, 0x00) /* level */ 2152 Name (LPC0, 0x00) 2153 Name (LPN1, 0x00) /* index */ 2154 Name (LPC1, 0x00) 2155 Name (THR1, 0x00) 2156 Name (THR2, 0x00) 2157 THR1 = 0x01 2158 THR2 = M115 (Arg0) /* thread with the greatest index */ 2159 If ((THR2 >= Arg0)) 2160 { 2161 Debug = "No alive threads for Test!" 2162 Debug = "Test mf14 skipped!" 2163 SKIP () 2164 Return (Zero) 2165 } 2166 2167 If ((THR2 <= THR1)) 2168 { 2169 Debug = "Insufficient number of threads for Test!" 2170 Debug = "Test mf15 skipped!" 2171 SKIP () 2172 Return (Zero) 2173 } 2174 2175 /* 1. Thread thr-N Acquires all the mutexes on all levels */ 2176 /* Set up per-thread set of mutexes */ 2177 M334 (Arg0, C300, 0x00, MAX0, 0x00, MIN0) 2178 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2179 M208 (BS00, THR2, C106) /* cmd: Acquire specified set of mutexes */ 2180 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2181 M114 (Arg0) /* run */ 2182 /* Wait for all Worker threads */ 2183 2184 M103 (Arg0) 2185 /* Check up the values of counters of all Mutexes */ 2186 2187 LPN0 = MAX0 /* \MAX0 */ 2188 LPC0 = 0x00 2189 While (LPN0) 2190 { 2191 LPN1 = MIN0 /* \MIN0 */ 2192 LPC1 = 0x00 2193 While (LPN1) 2194 { 2195 M333 (LPC0, LPC1, 0x01) 2196 LPN1-- 2197 LPC1++ 2198 } 2199 2200 LPN0-- 2201 LPC0++ 2202 } 2203 2204 /* 2205 * 2. Thread thr-1 tries to Acquire all the same mutexes 2206 * and gets FAIL (TimeOutValue is not 0xFFFF). 2207 */ 2208 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2209 M208 (BS00, THR1, C106) /* cmd: Acquire specified set of mutexes */ 2210 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2211 M214 (Arg0, Arg0, TOV1) /* TimeOutValue equal to 1 msec */ 2212 M20F (Arg0, EX0D, 0x00) /* Init the exceptional conditions flags (FAIL) */ 2213 M114 (Arg0) /* run */ 2214 /* Wait for all Worker threads */ 2215 2216 M103 (Arg0) 2217 /* 2218 * 3. Thread thr-1 tries to Acquire all the same mutexes 2219 * and hang (TimeOutValue is 0xFFFF). 2220 */ 2221 /* 2222 * Reset all counters (cnt0) and flags (fl00) corresponding 2223 * to all Mutexes which were set up by thread thr-N. 2224 */ 2225 M330 () 2226 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2227 M208 (BS00, THR1, C106) /* cmd: Acquire specified set of mutexes */ 2228 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2229 M114 (Arg0) /* run */ 2230 /* Wait for all Worker threads */ 2231 2232 Name (CP00, Buffer (Arg0){}) 2233 Name (HG00, Buffer (Arg0){}) 2234 Name (ID00, Buffer (Arg0){}) 2235 CopyObject (BS00, CP00) /* \M815.CP00 */ 2236 CP00 [THR1] = 0x00 2237 HG00 [THR1] = C106 /* \C106 */ 2238 M110 (Arg0, CP00, HG00, ID00) 2239 /* 2240 * 4. Thread thr-N terminates 2241 * 5. Thread thr-1 owns all those mutexes 2242 */ 2243 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2244 M208 (BS00, THR2, C108) /* cmd: Terminate thread */ 2245 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2246 M114 (Arg0) /* run */ 2247 /* Wait for all Worker threads */ 2248 2249 Name (CP01, Buffer (Arg0){}) 2250 Name (HG01, Buffer (Arg0){}) 2251 Name (ID01, Buffer (Arg0){}) 2252 BS00 [THR1] = C106 /* thr-1 hangs on c106 */ /* \C106 */ 2253 CopyObject (BS00, CP01) /* \M815.CP01 */ 2254 M110 (Arg0, CP01, HG01, ID01) 2255 /* 6. Thread thr-1 Releases all mutexes */ 2256 2257 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2258 M208 (BS00, THR1, C107) /* cmd: Release specified set of mutexes */ 2259 M215 (Arg0) /* Reset TimeOutValue and exceptional condition flags */ 2260 M114 (Arg0) /* run */ 2261 /* Wait for all Worker threads */ 2262 2263 M103 (Arg0) 2264 } 2265 2266 /* 2267 * Serialized method to be executed by Worker thread 2268 * 2269 * arg0 - number of threads 2270 * arg1 - ID of current thread 2271 * arg2 - Index of current thread 2272 */ 2273 Method (M8FC, 3, Serialized) 2274 { 2275 If (FLG2) 2276 { 2277 SE00 (Arg2, ER10, "Error er10") 2278 } 2279 2280 FLG2 = Arg1 2281 M201 (Arg2, VB03, "Execution of Serialized method started") 2282 M206 (Arg2, SL01) /* Sleep */ 2283 /* 2284 * NOTE: it is a recurcive second call to m101: 2285 * 2286 * MAIN 2287 * mf00 2288 * mf16 2289 * m101 2290 * m8fc 2291 * m101 2292 * 2293 * So, additional command c101 is needed for it to exit that second call to m101. 2294 */ 2295 M201 (Arg2, VB03, "Call recursively m101") 2296 M101 (Arg0, Arg1, Arg2, 0x01) 2297 M206 (Arg2, SL01) /* Sleep */ 2298 M201 (Arg2, VB03, "Execution of Serialized method completed") 2299 If ((FLG2 != Arg1)) 2300 { 2301 SE00 (Arg2, ER11, "Error er11") 2302 } 2303 2304 FLG2 = 0x00 2305 } 2306 2307 /* 2308 * Non-serialized method to be executed by Worker thread, 2309 * use mutex for exclusive access to critical section. 2310 * 2311 * arg0 - number of threads 2312 * arg1 - ID of current thread 2313 * arg2 - Index of current thread 2314 */ 2315 Method (M8FA, 3, NotSerialized) 2316 { 2317 Local0 = MA00 (0x00, 0x00, 0xFFFF) 2318 If (Local0) 2319 { 2320 SE00 (Arg2, ER00, "Error er00") 2321 } 2322 2323 If (FLG2) 2324 { 2325 SE00 (Arg2, ER10, "Error er10") 2326 } 2327 2328 FLG2 = Arg1 2329 M201 (Arg2, VB03, "Execution of critical section started") 2330 M206 (Arg2, SL01) /* Sleep */ 2331 /* 2332 * NOTE: it is a recurcive second call to m101: 2333 * 2334 * MAIN 2335 * mf00 2336 * mf16 2337 * m101 2338 * m8fc 2339 * m101 2340 * 2341 * So, additional command c101 is needed for it to exit that second call to m101. 2342 */ 2343 M201 (Arg2, VB03, "Call recursively m101") 2344 M101 (Arg0, Arg1, Arg2, 0x01) 2345 M206 (Arg2, SL01) /* Sleep */ 2346 M201 (Arg2, VB03, "Execution of critical section completed") 2347 If ((FLG2 != Arg1)) 2348 { 2349 SE00 (Arg2, ER11, "Error er11") 2350 } 2351 2352 FLG2 = 0x00 2353 If (!Local0) 2354 { 2355 MA10 (0x00) 2356 } 2357 } 2358 2359 /* 2360 * Non-serialized method to be executed by Worker thread 2361 * 2362 * non-serialized method is grabbed simultaneously by several threads 2363 * 2364 * arg0 - number of threads 2365 * arg1 - ID of current thread 2366 * arg2 - Index of current thread 2367 */ 2368 Method (M8F9, 3, NotSerialized) 2369 { 2370 /* 2371 * Index of one of two threads participating in test is 1 2372 */ 2373 If ((Arg2 == 0x01)) 2374 { 2375 If (FLG2) 2376 { 2377 SE00 (Arg2, ER12, "Error er12") 2378 } 2379 Else 2380 { 2381 FLG2 = Arg2 2382 } 2383 } 2384 ElseIf (FLG3) 2385 { 2386 SE00 (Arg2, ER12, "Error er12") 2387 } 2388 Else 2389 { 2390 FLG3 = Arg2 2391 } 2392 2393 M201 (Arg2, VB03, "Execution of non-serialized method started") 2394 M206 (Arg2, SL01) /* Sleep */ 2395 /* 2396 * NOTE: it is a recurcive second call to m101: 2397 * 2398 * MAIN 2399 * mf00 2400 * mf16 2401 * m101 2402 * m8fc 2403 * m101 2404 * 2405 * So, additional command c101 is needed for it to exit that second call to m101. 2406 */ 2407 M201 (Arg2, VB03, "Call recursively m101") 2408 M101 (Arg0, Arg1, Arg2, 0x01) 2409 M206 (Arg2, SL01) /* Sleep */ 2410 M201 (Arg2, VB03, "Execution of non-serialized method completed") 2411 If (!FLG2) 2412 { 2413 SE00 (Arg2, ER12, "Error er12") 2414 } 2415 2416 If (!FLG3) 2417 { 2418 SE00 (Arg2, ER13, "Error er13") 2419 } 2420 } 2421 2422 /* 2423 * arg0 - number of threads (total) 2424 * arg1 - main command for worker thread 2425 */ 2426 Method (M8FB, 2, Serialized) 2427 { 2428 Name (LPN0, 0x00) /* level */ 2429 Name (LPC0, 0x00) 2430 Name (LPN1, 0x00) /* index */ 2431 Name (LPC1, 0x00) 2432 Name (THR1, 0x00) 2433 Name (THR2, 0x00) 2434 THR1 = 0x01 2435 THR2 = M115 (Arg0) /* thread with the greatest index */ 2436 If ((THR2 >= Arg0)) 2437 { 2438 Debug = "No alive threads for Test!" 2439 Debug = "Test mf14 skipped!" 2440 SKIP () 2441 Return (Zero) 2442 } 2443 2444 If ((THR2 <= THR1)) 2445 { 2446 Debug = "Insufficient number of threads for Test!" 2447 Debug = "Test mf15 skipped!" 2448 SKIP () 2449 Return (Zero) 2450 } 2451 2452 /* 2453 * 1. Thread thr-1 invokes method MXXX (by c109/c10a) which allows 2454 * exclusive access to the critical section. 2455 * Then it calls recursively m101 (infinite loop of worker threads) 2456 * so becomes identical to other threads for managing it. 2457 */ 2458 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2459 M208 (BS00, THR1, Arg1) /* cmd: c109/c10a */ 2460 M20F (Arg0, 0x00, 0x00) /* Init (Reset) the exceptional conditions flags (SUCCESS) */ 2461 M114 (Arg0) /* run */ 2462 /* Wait for all Worker threads */ 2463 2464 M103 (Arg0) 2465 /* 2466 * 2. Thread thr-2 invokes the same method MXXX (by c109/c10a) and hangs 2467 * because method MXXX provides exclusive access and is already grabbed by thr-1. 2468 */ 2469 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2470 M208 (BS00, THR2, Arg1) /* cmd: c109/c10a */ 2471 M20F (Arg0, 0x00, 0x00) /* Init (Reset) the exceptional conditions flags (SUCCESS) */ 2472 M114 (Arg0) /* run */ 2473 /* Wait for all Worker threads */ 2474 2475 Name (CP00, Buffer (Arg0){}) 2476 Name (HG00, Buffer (Arg0){}) 2477 Name (ID00, Buffer (Arg0){}) 2478 CopyObject (BS00, CP00) /* \M8FB.CP00 */ 2479 CP00 [THR2] = 0x00 2480 HG00 [THR2] = Arg1 2481 M110 (Arg0, CP00, HG00, ID00) 2482 /* 2483 * 3. Sleep for all 2484 */ 2485 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2486 M114 (Arg0) /* run */ 2487 /* Wait for all Worker threads */ 2488 2489 Name (CP01, Buffer (Arg0){}) 2490 Name (HG01, Buffer (Arg0){}) 2491 Name (ID01, Buffer (Arg0){}) 2492 CopyObject (BS00, CP01) /* \M8FB.CP01 */ 2493 CP01 [THR2] = 0x00 2494 HG01 [THR2] = Arg1 2495 M110 (Arg0, CP01, HG01, ID01) 2496 /* 2497 * 4. Thread thr-1 is directed to exit recursive (second) call to m101 2498 * (infinite loop of worker threads). 2499 */ 2500 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2501 M208 (BS00, THR1, C101) /* cmd: Exit the infinite loop */ 2502 M114 (Arg0) /* run */ 2503 /* Wait for all Worker threads */ 2504 2505 Name (CP02, Buffer (Arg0){}) 2506 Name (HG02, Buffer (Arg0){}) 2507 Name (ID02, Buffer (Arg0){}) 2508 CopyObject (BS00, CP02) /* \M8FB.CP02 */ 2509 CP02 [THR2] = 0x00 2510 HG02 [THR2] = Arg1 2511 M110 (Arg0, CP02, HG02, ID02) 2512 /* 2513 * 5. Thread thr-2 is directed to exit recursive (second) call to m101 2514 * (infinite loop of worker threads). 2515 */ 2516 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2517 M208 (BS00, THR2, C101) /* cmd: Exit the infinite loop */ 2518 M114 (Arg0) /* run */ 2519 /* Wait for all Worker threads */ 2520 2521 M103 (Arg0) 2522 } 2523 2524 /* 2525 * Use Serialized method for exclusive access to critical section 2526 * 2527 * arg0 - number of threads (total) 2528 */ 2529 Method (M816, 1, NotSerialized) 2530 { 2531 M8FB (Arg0, C109) 2532 } 2533 2534 /* 2535 * Use Mutex for exclusive access to critical section, invoke non-Serialized method 2536 * 2537 * arg0 - number of threads (total) 2538 */ 2539 Method (M817, 1, NotSerialized) 2540 { 2541 M8FB (Arg0, C10A) 2542 } 2543 2544 /* 2545 * Non-serialized method is grabbed simultaneously 2546 * 2547 * arg0 - number of threads (total) 2548 */ 2549 Method (M818, 1, Serialized) 2550 { 2551 Name (LPN0, 0x00) /* level */ 2552 Name (LPC0, 0x00) 2553 Name (LPN1, 0x00) /* index */ 2554 Name (LPC1, 0x00) 2555 Name (THR1, 0x00) 2556 Name (THR2, 0x00) 2557 FLG2 = 0x00 2558 FLG3 = 0x00 2559 THR1 = 0x01 2560 THR2 = M115 (Arg0) /* thread with the greatest index */ 2561 If ((THR2 >= Arg0)) 2562 { 2563 Debug = "No alive threads for Test!" 2564 Debug = "Test mf14 skipped!" 2565 SKIP () 2566 Return (Zero) 2567 } 2568 2569 If ((THR2 <= THR1)) 2570 { 2571 Debug = "Insufficient number of threads for Test!" 2572 Debug = "Test mf15 skipped!" 2573 SKIP () 2574 Return (Zero) 2575 } 2576 2577 /* 2578 * 1. Thread thr-1 invokes non-Serialized method MXXX. 2579 * Then it calls recursively m101 (infinite loop of worker threads) 2580 * so becomes identical to other threads for managing it. 2581 */ 2582 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2583 M208 (BS00, THR1, C10B) /* cmd: Invoke non-Serialized method */ 2584 M20F (Arg0, 0x00, 0x00) /* Init (Reset) the exceptional conditions flags (SUCCESS) */ 2585 M114 (Arg0) /* run */ 2586 /* Wait for all Worker threads */ 2587 2588 M103 (Arg0) 2589 /* 2590 * 2. Sleep for all 2591 */ 2592 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2593 M20F (Arg0, 0x00, 0x00) /* Init (Reset) the exceptional conditions flags (SUCCESS) */ 2594 M114 (Arg0) /* run */ 2595 /* Wait for all Worker threads */ 2596 2597 M103 (Arg0) 2598 /* 2599 * 3. Thread thr-N invokes non-Serialized method MXXX. 2600 * Then it calls recursively m101 (infinite loop of worker threads) 2601 * so becomes identical to other threads for managing it. 2602 */ 2603 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2604 M208 (BS00, THR2, C10B) /* cmd: Invoke non-Serialized method */ 2605 M20F (Arg0, 0x00, 0x00) /* Init (Reset) the exceptional conditions flags (SUCCESS) */ 2606 M114 (Arg0) /* run */ 2607 /* Wait for all Worker threads */ 2608 2609 M103 (Arg0) 2610 /* 2611 * 4. Sleep for all 2612 */ 2613 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2614 M20F (Arg0, 0x00, 0x00) /* Init (Reset) the exceptional conditions flags (SUCCESS) */ 2615 M114 (Arg0) /* run */ 2616 /* Wait for all Worker threads */ 2617 2618 M103 (Arg0) 2619 /* 2620 * 5. Both threads thr-1 and thr-N are directed to exit recursive (second) calls to m101 2621 * (infinite loops of worker threads). 2622 */ 2623 M200 (BS00, Arg0, C102) /* cmd: Sleep */ 2624 M208 (BS00, THR1, C101) /* cmd: Exit the infinite loop */ 2625 M208 (BS00, THR2, C101) /* cmd: Exit the infinite loop */ 2626 M20F (Arg0, 0x00, 0x00) /* Init (Reset) the exceptional conditions flags (SUCCESS) */ 2627 M114 (Arg0) /* run */ 2628 /* Wait for all Worker threads */ 2629 2630 M103 (Arg0) 2631 If ((FLG2 != THR1)) 2632 { 2633 ERR (Arg0, Z152, __LINE__, 0x00, 0x00, FLG2, THR1) 2634 } 2635 2636 If ((FLG3 != THR2)) 2637 { 2638 ERR (Arg0, Z152, __LINE__, 0x00, 0x00, FLG3, THR2) 2639 } 2640 } 2641