1/* 2 * Some or all of this work - Copyright (c) 2006 - 2016, 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/* 30 * Check for serialized methods 31 */ 32 33Name(z173, 173) 34 35/* 36 * Proper sequence of calls to Serialized methods with different levels, 0-15, all Serialized 37 */ 38Method(m3b0, 0, Serialized, 0) 39{ 40 Name(ts, "m3b0") 41 Name(i000, 0) 42 43 Method(m000, 0, Serialized, 0) { Increment(i000) m001() } 44 Method(m001, 0, Serialized, 1) { Increment(i000) m002() } 45 Method(m002, 0, Serialized, 2) { Increment(i000) m003() } 46 Method(m003, 0, Serialized, 3) { Increment(i000) m004() } 47 Method(m004, 0, Serialized, 4) { Increment(i000) m005() } 48 Method(m005, 0, Serialized, 5) { Increment(i000) m006() } 49 Method(m006, 0, Serialized, 6) { Increment(i000) m007() } 50 Method(m007, 0, Serialized, 7) { Increment(i000) m008() } 51 Method(m008, 0, Serialized, 8) { Increment(i000) m009() } 52 Method(m009, 0, Serialized, 9) { Increment(i000) m010() } 53 Method(m010, 0, Serialized, 10) { Increment(i000) m011() } 54 Method(m011, 0, Serialized, 11) { Increment(i000) m012() } 55 Method(m012, 0, Serialized, 12) { Increment(i000) m013() } 56 Method(m013, 0, Serialized, 13) { Increment(i000) m014() } 57 Method(m014, 0, Serialized, 14) { Increment(i000) m015() } 58 Method(m015, 0, Serialized, 15) { Increment(i000) m016() } 59 Method(m016, 0, Serialized, 15) { 60 Increment(i000) 61 Store("m016", Debug) 62 if (LNotEqual(i000, 17)) { 63 err(ts, z173, 0x000, 0, 0, i000, 17) 64 } 65 } 66 67 CH03(ts, z173, 0x001, 0, 0) 68 m000() 69 CH03(ts, z173, 0x002, 0, 0) 70} 71 72/* 73 * Proper sequence of calls to Serialized methods with different levels, 0-15, 74 * alternating Serialized and not-Serialized 75 */ 76Method(m3b1,, Serialized) 77{ 78 Name(ts, "m3b1") 79 Name(i000, 0) 80 81 Method(m000, 0, Serialized, 0) { Increment(i000) m001() } 82 Method(m001 ) { Increment(i000) m002() } 83 Method(m002, 0, Serialized, 2) { Increment(i000) m003() } 84 Method(m003 ) { Increment(i000) m004() } 85 Method(m004 ) { Increment(i000) m005() } 86 Method(m005, 0, Serialized, 5) { Increment(i000) m006() } 87 Method(m006, 0, Serialized, 6) { Increment(i000) m007() } 88 Method(m007 ) { Increment(i000) m008() } 89 Method(m008, 0, Serialized, 8) { Increment(i000) m009() } 90 Method(m009, 0, Serialized, 9) { Increment(i000) m010() } 91 Method(m010 ) { Increment(i000) m011() } 92 Method(m011 ) { Increment(i000) m012() } 93 Method(m012, 0, Serialized, 12) { Increment(i000) m013() } 94 Method(m013, 0, Serialized, 13) { Increment(i000) m014() } 95 Method(m014, 0, Serialized, 14) { Increment(i000) m015() } 96 Method(m015 ) { Increment(i000) m016() } 97 Method(m016, 0, Serialized, 15) { 98 Increment(i000) 99 Store("m016", Debug) 100 if (LNotEqual(i000, 17)) { 101 err(ts, z173, 0x003, 0, 0, i000, 17) 102 } 103 } 104 105 CH03(ts, z173, 0x004, 0, 0) 106 m000() 107 CH03(ts, z173, 0x005, 0, 0) 108} 109 110/* 111 * Proper sequence of calls to Serialized methods with different levels, 0-15, all Serialized, 112 * 1-3 on each level 113 */ 114Method(m3b2, 0, Serialized, 0) 115{ 116 Name(ts, "m3b2") 117 Name(i000, 0) 118 Name(i001, 0) 119 120 Method(m000, 0, Serialized, 0) { Increment(i000) m100() } 121 Method(m100, 0, Serialized, 0) { Increment(i000) m001() } 122 123 Method(m001, 0, Serialized, 1) { Increment(i000) m002() } 124 125 Method(m002, 0, Serialized, 2) { Increment(i000) m102() } 126 Method(m102, 0, Serialized, 2) { Increment(i000) m003() } 127 128 Method(m003, 0, Serialized, 3) { Increment(i000) m004() } 129 130 Method(m004, 0, Serialized, 4) { Increment(i000) m104() } 131 Method(m104, 0, Serialized, 4) { Increment(i000) m005() } 132 133 Method(m005, 0, Serialized, 5) { Increment(i000) m006() } 134 135 Method(m006, 0, Serialized, 6) { Increment(i000) m106() } 136 Method(m106, 0, Serialized, 6) { Increment(i000) m007() } 137 138 Method(m007, 0, Serialized, 7) { Increment(i000) m107() } 139 Method(m107, 0, Serialized, 7) { Increment(i000) m008() } 140 141 Method(m008, 0, Serialized, 8) { Increment(i000) m108() } 142 Method(m108, 0, Serialized, 8) { Increment(i000) m009() } 143 144 Method(m009, 0, Serialized, 9) { Increment(i000) m109() } 145 Method(m109, 0, Serialized, 9) { Increment(i000) m209() } 146 Method(m209, 0, Serialized, 9) { Increment(i000) m010() } 147 148 Method(m010, 0, Serialized, 10) { Increment(i000) m110() } 149 Method(m110, 0, Serialized, 10) { Increment(i000) m011() } 150 151 Method(m011, 0, Serialized, 11) { Increment(i000) m111() } 152 Method(m111, 0, Serialized, 11) { Increment(i000) m012() } 153 154 Method(m012, 0, Serialized, 12) { Increment(i000) m112() } 155 Method(m112, 0, Serialized, 12) { Increment(i000) m013() } 156 157 Method(m013, 0, Serialized, 13) { Increment(i000) m014() } 158 159 Method(m014, 0, Serialized, 14) { Increment(i000) m015() } 160 161 Method(m015, 0, Serialized, 15) { Increment(i000) m115() } 162 Method(m115, 0, Serialized, 15) { 163 Increment(i000) 164 Store("m016", Debug) 165 if (LNotEqual(i000, 28)) { 166 err(ts, z173, 0x006, 0, 0, i000, 28) 167 } 168 Store(0xabcd0000, i001) 169 } 170 171 CH03(ts, z173, 0x007, 0, 0) 172 m000() 173 174 if (LNotEqual(i001, 0xabcd0000)) { 175 err(ts, z173, 0x008, 0, 0, i001, 0xabcd0000) 176 } 177 CH03(ts, z173, 0x009, 0, 0) 178} 179 180/* 181 * Check pairs of calls to Serialized methods, 182 * the second method is invoked from the first method. 183 * 184 * All the 256 combinations are verified (16*16): 185 * - the level of the first method in pair changes in range from 0 up to 15 186 * - the level of the second method in pair changes in range from 0 up to 15 187 * 188 * So all the checkings are provided: 189 * 190 * - proper sequence of levels (from i-th level to all possible correct levels) 191 * - proper sequence of levels (from i-th level to i-th level (in particular)) 192 * - improper sequence of levels (from i-th level to all possible incorrect levels) 193 * 194 * arg0 - level of first call 195 * arg1 - level of second call 196 * arg2 - how many calls to do 197 */ 198Method(m3b3, 3, Serialized) 199{ 200 Name(ts, "m3b3") 201 202 Name(i000, 0) 203 Name(i001, 0) 204 Name(i002, 0) 205 Name(i003, 0xabcd0003) 206 Name(i004, 0xabcd0004) 207 Name(i005, 0) 208 209 Method(m000,1,Serialized, 0) {if (arg0) {Store( 0,i004)} else {Store( 0,i003)} mm00(1,i000,i001)} 210 Method(m001,1,Serialized, 1) {if (arg0) {Store( 1,i004)} else {Store( 1,i003)} mm00(1,i000,i001)} 211 Method(m002,1,Serialized, 2) {if (arg0) {Store( 2,i004)} else {Store( 2,i003)} mm00(1,i000,i001)} 212 Method(m003,1,Serialized, 3) {if (arg0) {Store( 3,i004)} else {Store( 3,i003)} mm00(1,i000,i001)} 213 Method(m004,1,Serialized, 4) {if (arg0) {Store( 4,i004)} else {Store( 4,i003)} mm00(1,i000,i001)} 214 Method(m005,1,Serialized, 5) {if (arg0) {Store( 5,i004)} else {Store( 5,i003)} mm00(1,i000,i001)} 215 Method(m006,1,Serialized, 6) {if (arg0) {Store( 6,i004)} else {Store( 6,i003)} mm00(1,i000,i001)} 216 Method(m007,1,Serialized, 7) {if (arg0) {Store( 7,i004)} else {Store( 7,i003)} mm00(1,i000,i001)} 217 Method(m008,1,Serialized, 8) {if (arg0) {Store( 8,i004)} else {Store( 8,i003)} mm00(1,i000,i001)} 218 Method(m009,1,Serialized, 9) {if (arg0) {Store( 9,i004)} else {Store( 9,i003)} mm00(1,i000,i001)} 219 Method(m010,1,Serialized,10) {if (arg0) {Store(10,i004)} else {Store(10,i003)} mm00(1,i000,i001)} 220 Method(m011,1,Serialized,11) {if (arg0) {Store(11,i004)} else {Store(11,i003)} mm00(1,i000,i001)} 221 Method(m012,1,Serialized,12) {if (arg0) {Store(12,i004)} else {Store(12,i003)} mm00(1,i000,i001)} 222 Method(m013,1,Serialized,13) {if (arg0) {Store(13,i004)} else {Store(13,i003)} mm00(1,i000,i001)} 223 Method(m014,1,Serialized,14) {if (arg0) {Store(14,i004)} else {Store(14,i003)} mm00(1,i000,i001)} 224 Method(m015,1,Serialized,15) {if (arg0) {Store(15,i004)} else {Store(15,i003)} mm00(1,i000,i001)} 225 226 227 Method(mm00, 3, Serialized) 228 { 229 Name(iii0, 0) 230 Name(iii1, 0) 231 Name(iii2, 0) 232 Name(iii3, 0) 233 234 Store(i002, Local0) 235 Increment(i002) 236 237 if (LGreater(i002, i005)) { 238 Return 239 } 240 241 if (arg0) { 242 Store(arg2, Local1) 243 } else { 244 Store(arg1, Local1) 245 } 246 247 Switch (ToInteger (Local1)) { 248 Case (0) { 249 m000(Local0) 250 } 251 Case (1) { 252 m001(Local0) 253 } 254 Case (2) { 255 m002(Local0) 256 } 257 Case (3) { 258 m003(Local0) 259 } 260 Case (4) { 261 m004(Local0) 262 } 263 Case (5) { 264 m005(Local0) 265 } 266 Case (6) { 267 m006(Local0) 268 } 269 Case (7) { 270 m007(Local0) 271 } 272 Case (8) { 273 m008(Local0) 274 } 275 Case (9) { 276 m009(Local0) 277 } 278 Case (10) { 279 m010(Local0) 280 } 281 Case (11) { 282 m011(Local0) 283 } 284 Case (12) { 285 m012(Local0) 286 } 287 Case (13) { 288 m013(Local0) 289 } 290 Case (14) { 291 m014(Local0) 292 } 293 Case (15) { 294 m015(Local0) 295 } 296 } 297 } 298 299 CH03(ts, z173, 0x00a, 0, 0) 300 301 Store(arg0, i000) 302 Store(arg1, i001) 303 Store(arg2, i005) 304 305 mm00(0, i000, i001) 306 307 if (LGreater(arg0, arg1)) { 308 CH04(ts, 0, 64, z173, 0x00b, 0, 0) // AE_AML_MUTEX_ORDER 309 } else { 310 if (LNotEqual(i003, arg0)) { 311 err(ts, z173, 0x00c, 0, 0, i003, arg0) 312 } 313 if (LNotEqual(i004, arg1)) { 314 err(ts, z173, 0x00d, 0, 0, i004, arg1) 315 } 316 } 317 318 CH03(ts, z173, 0x00e, 0, 0) 319} 320 321Method(m3b4,, Serialized) 322{ 323 Name(ts, "m3b4") 324 325 Name(lpN0, 0) 326 Name(lpC0, 0) 327 Name(lpN1, 0) 328 Name(lpC1, 0) 329 330 Store(16, lpN0) 331 Store(0, lpC0) 332 333 While (lpN0) { 334 Store(16, lpN1) 335 Store(0, lpC1) 336 While (lpN1) { 337 338 m3b3(lpC0, lpC1, 2) 339 340 Decrement(lpN1) 341 Increment(lpC1) 342 } 343 Decrement(lpN0) 344 Increment(lpC0) 345 } 346} 347 348/* 349 * The same as m3b3 but without Switch 350 * 351 * arg0 - level of first call 352 * arg1 - level of second call 353 */ 354Method(m3b5, 2, Serialized) 355{ 356 Name(ts, "m3b5") 357 358 Name(i000, 0) 359 Name(i001, 0) 360 Name(i002, 0) 361 Name(i003, 0xabcd0003) 362 Name(i004, 0xabcd0004) 363 364 Method(m000,1,Serialized, 0) {if (arg0) {Store( 0,i004)} else {Store( 0,i003)} mm00(1,i000,i001)} 365 Method(m001,1,Serialized, 1) {if (arg0) {Store( 1,i004)} else {Store( 1,i003)} mm00(1,i000,i001)} 366 Method(m002,1,Serialized, 2) {if (arg0) {Store( 2,i004)} else {Store( 2,i003)} mm00(1,i000,i001)} 367 Method(m003,1,Serialized, 3) {if (arg0) {Store( 3,i004)} else {Store( 3,i003)} mm00(1,i000,i001)} 368 Method(m004,1,Serialized, 4) {if (arg0) {Store( 4,i004)} else {Store( 4,i003)} mm00(1,i000,i001)} 369 Method(m005,1,Serialized, 5) {if (arg0) {Store( 5,i004)} else {Store( 5,i003)} mm00(1,i000,i001)} 370 Method(m006,1,Serialized, 6) {if (arg0) {Store( 6,i004)} else {Store( 6,i003)} mm00(1,i000,i001)} 371 Method(m007,1,Serialized, 7) {if (arg0) {Store( 7,i004)} else {Store( 7,i003)} mm00(1,i000,i001)} 372 Method(m008,1,Serialized, 8) {if (arg0) {Store( 8,i004)} else {Store( 8,i003)} mm00(1,i000,i001)} 373 Method(m009,1,Serialized, 9) {if (arg0) {Store( 9,i004)} else {Store( 9,i003)} mm00(1,i000,i001)} 374 Method(m010,1,Serialized,10) {if (arg0) {Store(10,i004)} else {Store(10,i003)} mm00(1,i000,i001)} 375 Method(m011,1,Serialized,11) {if (arg0) {Store(11,i004)} else {Store(11,i003)} mm00(1,i000,i001)} 376 Method(m012,1,Serialized,12) {if (arg0) {Store(12,i004)} else {Store(12,i003)} mm00(1,i000,i001)} 377 Method(m013,1,Serialized,13) {if (arg0) {Store(13,i004)} else {Store(13,i003)} mm00(1,i000,i001)} 378 Method(m014,1,Serialized,14) {if (arg0) {Store(14,i004)} else {Store(14,i003)} mm00(1,i000,i001)} 379 Method(m015,1,Serialized,15) {if (arg0) {Store(15,i004)} else {Store(15,i003)} mm00(1,i000,i001)} 380 381 382 Method(mm00, 3) 383 { 384 Store(i002, Local0) 385 Increment(i002) 386 387 if (LGreater(i002, 2)) { 388 Return 389 } 390 391 if (arg0) { 392 Store(arg2, Local1) 393 } else { 394 Store(arg1, Local1) 395 } 396 397 if (LEqual(Local1, 0)) { 398 m000(Local0) 399 } elseif (LEqual(Local1, 1)) { 400 m001(Local0) 401 } elseif (LEqual(Local1, 2)) { 402 m002(Local0) 403 } elseif (LEqual(Local1, 3)) { 404 m003(Local0) 405 } elseif (LEqual(Local1, 4)) { 406 m004(Local0) 407 } elseif (LEqual(Local1, 5)) { 408 m005(Local0) 409 } elseif (LEqual(Local1, 6)) { 410 m006(Local0) 411 } elseif (LEqual(Local1, 7)) { 412 m007(Local0) 413 } elseif (LEqual(Local1, 8)) { 414 m008(Local0) 415 } elseif (LEqual(Local1, 9)) { 416 m009(Local0) 417 } elseif (LEqual(Local1, 10)) { 418 m010(Local0) 419 } elseif (LEqual(Local1, 11)) { 420 m011(Local0) 421 } elseif (LEqual(Local1, 12)) { 422 m012(Local0) 423 } elseif (LEqual(Local1, 13)) { 424 m013(Local0) 425 } elseif (LEqual(Local1, 14)) { 426 m014(Local0) 427 } elseif (LEqual(Local1, 15)) { 428 m015(Local0) 429 } 430 } 431 432 CH03(ts, z173, 0x00f, 0, 0) 433 434 Store(arg0, i000) 435 Store(arg1, i001) 436 437 mm00(0, i000, i001) 438 439 if (LGreater(arg0, arg1)) { 440 CH04(ts, 0, 64, z173, 0x010, 0, 0) // AE_AML_MUTEX_ORDER 441 } else { 442 if (LNotEqual(i003, arg0)) { 443 err(ts, z173, 0x011, 0, 0, i003, arg0) 444 } 445 if (LNotEqual(i004, arg1)) { 446 err(ts, z173, 0x012, 0, 0, i004, arg1) 447 } 448 } 449 450 CH03(ts, z173, 0x013, 0, 0) 451} 452 453Method(m3b6,, Serialized) 454{ 455 Name(ts, "m3b6") 456 457 Name(lpN0, 0) 458 Name(lpC0, 0) 459 Name(lpN1, 0) 460 Name(lpC1, 0) 461 462 Store(16, lpN0) 463 Store(0, lpC0) 464 465 While (lpN0) { 466 Store(16, lpN1) 467 Store(0, lpC1) 468 While (lpN1) { 469 470 m3b5(lpC0, lpC1) 471 472 Decrement(lpN1) 473 Increment(lpC1) 474 } 475 Decrement(lpN0) 476 Increment(lpC0) 477 } 478} 479 480/* 481 * The same as m3b5 but 482 * between two Serialized calls non-Serialized calls are performed 483 * 484 * arg0 - level of first call 485 * arg1 - level of second call 486 * arg2 - how many calls to do 487 */ 488Method(m3b7, 3, Serialized) 489{ 490 Name(ts, "m3b5") 491 492 Name(i000, 0) 493 Name(i001, 0) 494 Name(i002, 0) 495 Name(i003, 0xabcd0003) 496 Name(i004, 0xabcd0004) 497 Name(i005, 0) 498 499 Method(m000,1,Serialized, 0) {if (arg0) {Store( 0,i004)} else {Store( 0,i003)} mm00(1,i000,i001)} 500 Method(m001,1,Serialized, 1) {if (arg0) {Store( 1,i004)} else {Store( 1,i003)} mm00(1,i000,i001)} 501 Method(m002,1,Serialized, 2) {if (arg0) {Store( 2,i004)} else {Store( 2,i003)} mm00(1,i000,i001)} 502 Method(m003,1,Serialized, 3) {if (arg0) {Store( 3,i004)} else {Store( 3,i003)} mm00(1,i000,i001)} 503 Method(m004,1,Serialized, 4) {if (arg0) {Store( 4,i004)} else {Store( 4,i003)} mm00(1,i000,i001)} 504 Method(m005,1,Serialized, 5) {if (arg0) {Store( 5,i004)} else {Store( 5,i003)} mm00(1,i000,i001)} 505 Method(m006,1,Serialized, 6) {if (arg0) {Store( 6,i004)} else {Store( 6,i003)} mm00(1,i000,i001)} 506 Method(m007,1,Serialized, 7) {if (arg0) {Store( 7,i004)} else {Store( 7,i003)} mm00(1,i000,i001)} 507 Method(m008,1,Serialized, 8) {if (arg0) {Store( 8,i004)} else {Store( 8,i003)} mm00(1,i000,i001)} 508 Method(m009,1,Serialized, 9) {if (arg0) {Store( 9,i004)} else {Store( 9,i003)} mm00(1,i000,i001)} 509 Method(m010,1,Serialized,10) {if (arg0) {Store(10,i004)} else {Store(10,i003)} mm00(1,i000,i001)} 510 Method(m011,1,Serialized,11) {if (arg0) {Store(11,i004)} else {Store(11,i003)} mm00(1,i000,i001)} 511 Method(m012,1,Serialized,12) {if (arg0) {Store(12,i004)} else {Store(12,i003)} mm00(1,i000,i001)} 512 Method(m013,1,Serialized,13) {if (arg0) {Store(13,i004)} else {Store(13,i003)} mm00(1,i000,i001)} 513 Method(m014,1,Serialized,14) {if (arg0) {Store(14,i004)} else {Store(14,i003)} mm00(1,i000,i001)} 514 Method(m015,1,Serialized,15) {if (arg0) {Store(15,i004)} else {Store(15,i003)} mm00(1,i000,i001)} 515 516 Method(mm01, 7) 517 { 518 Store(0, Local0) 519 } 520 521 522 Method(mm00, 3) 523 { 524 Store(i002, Local0) 525 Increment(i002) 526 527 if (LGreater(i002, i005)) { 528 Return 529 } 530 531 if (arg0) { 532 Store(arg2, Local1) 533 } else { 534 Store(arg1, Local1) 535 } 536 537 if (LEqual(Local1, 0)) { 538 mm01(0,1,2,3,4,5,6) 539 m000(Local0) 540 mm01(0,1,2,3,4,5,6) 541 } elseif (LEqual(Local1, 1)) { 542 mm01(0,1,2,3,4,5,6) 543 m001(Local0) 544 mm01(0,1,2,3,4,5,6) 545 } elseif (LEqual(Local1, 2)) { 546 mm01(0,1,2,3,4,5,6) 547 m002(Local0) 548 mm01(0,1,2,3,4,5,6) 549 } elseif (LEqual(Local1, 3)) { 550 mm01(0,1,2,3,4,5,6) 551 m003(Local0) 552 mm01(0,1,2,3,4,5,6) 553 } elseif (LEqual(Local1, 4)) { 554 mm01(0,1,2,3,4,5,6) 555 m004(Local0) 556 mm01(0,1,2,3,4,5,6) 557 } elseif (LEqual(Local1, 5)) { 558 mm01(0,1,2,3,4,5,6) 559 m005(Local0) 560 mm01(0,1,2,3,4,5,6) 561 } elseif (LEqual(Local1, 6)) { 562 mm01(0,1,2,3,4,5,6) 563 m006(Local0) 564 mm01(0,1,2,3,4,5,6) 565 } elseif (LEqual(Local1, 7)) { 566 mm01(0,1,2,3,4,5,6) 567 m007(Local0) 568 mm01(0,1,2,3,4,5,6) 569 } elseif (LEqual(Local1, 8)) { 570 mm01(0,1,2,3,4,5,6) 571 m008(Local0) 572 mm01(0,1,2,3,4,5,6) 573 } elseif (LEqual(Local1, 9)) { 574 mm01(0,1,2,3,4,5,6) 575 m009(Local0) 576 mm01(0,1,2,3,4,5,6) 577 } elseif (LEqual(Local1, 10)) { 578 mm01(0,1,2,3,4,5,6) 579 m010(Local0) 580 mm01(0,1,2,3,4,5,6) 581 } elseif (LEqual(Local1, 11)) { 582 mm01(0,1,2,3,4,5,6) 583 m011(Local0) 584 mm01(0,1,2,3,4,5,6) 585 } elseif (LEqual(Local1, 12)) { 586 mm01(0,1,2,3,4,5,6) 587 m012(Local0) 588 mm01(0,1,2,3,4,5,6) 589 } elseif (LEqual(Local1, 13)) { 590 mm01(0,1,2,3,4,5,6) 591 m013(Local0) 592 mm01(0,1,2,3,4,5,6) 593 } elseif (LEqual(Local1, 14)) { 594 mm01(0,1,2,3,4,5,6) 595 m014(Local0) 596 mm01(0,1,2,3,4,5,6) 597 } elseif (LEqual(Local1, 15)) { 598 mm01(0,1,2,3,4,5,6) 599 m015(Local0) 600 mm01(0,1,2,3,4,5,6) 601 } 602 } 603 604 CH03(ts, z173, 0x014, 0, 0) 605 606 Store(arg0, i000) 607 Store(arg1, i001) 608 Store(arg2, i005) 609 610 mm00(0, i000, i001) 611 612 if (LGreater(arg0, arg1)) { 613 CH04(ts, 0, 64, z173, 0x015, 0, 0) // AE_AML_MUTEX_ORDER 614 } else { 615 if (LNotEqual(i003, arg0)) { 616 err(ts, z173, 0x016, 0, 0, i003, arg0) 617 } 618 if (LNotEqual(i004, arg1)) { 619 err(ts, z173, 0x017, 0, 0, i004, arg1) 620 } 621 } 622 623 CH03(ts, z173, 0x018, 0, 0) 624} 625 626Method(m3b8,, Serialized) 627{ 628 Name(ts, "m3b6") 629 630 Name(lpN0, 0) 631 Name(lpC0, 0) 632 Name(lpN1, 0) 633 Name(lpC1, 0) 634 635 Store(16, lpN0) 636 Store(0, lpC0) 637 638 While (lpN0) { 639 Store(16, lpN1) 640 Store(0, lpC1) 641 While (lpN1) { 642 643 m3b7(lpC0, lpC1, 2) 644 645 Decrement(lpN1) 646 Increment(lpC1) 647 } 648 Decrement(lpN0) 649 Increment(lpC0) 650 } 651} 652 653/* 654 * Check that Serialized method can be invoked repeatedly 655 * 656 * (Serialized method without internal objects (including Methods) and Switches) 657 * 658 * Method is invoked 2 times, then 3 times, then 4 times,... 659 * Then do it for next Method. 660 */ 661Method(m3b9,, Serialized) 662{ 663 Name(ts, "m3b9") 664 665 Name(lpN0, 0) 666 Name(lpC0, 0) 667 Name(lpN1, 0) 668 Name(lpC1, 0) 669 670 Store(16, lpN0) 671 Store(0, lpC0) 672 673 While (lpN0) { 674 Store(16, lpN1) 675 Store(2, lpC1) 676 While (lpN1) { 677 678 m3b3(lpC0, lpC0, lpC1) 679 680 Decrement(lpN1) 681 Increment(lpC1) 682 } 683 Decrement(lpN0) 684 Increment(lpC0) 685 } 686} 687 688/* 689 * Check that Serialized method can be invoked repeatedly 690 * 691 * (Serialized method without internal objects (including Methods) and Switches) 692 * 693 * between two Serialized calls non-Serialized calls are performed 694 * 695 * Method is invoked 2 times, then 3 times, then 4 times,... 696 * Then do it for next Method. 697 */ 698Method(m3ba,, Serialized) 699{ 700 Name(ts, "m3ba") 701 702 Name(lpN0, 0) 703 Name(lpC0, 0) 704 Name(lpN1, 0) 705 Name(lpC1, 0) 706 707 Store(16, lpN0) 708 Store(0, lpC0) 709 710 While (lpN0) { 711 Store(16, lpN1) 712 Store(2, lpC1) 713 While (lpN1) { 714 715 m3b7(lpC0, lpC0, lpC1) 716 717 Decrement(lpN1) 718 Increment(lpC1) 719 } 720 Decrement(lpN0) 721 Increment(lpC0) 722 } 723} 724 725/* 726 * The level is set up by either call to Serialized method or Acquire mutex of that level 727 * 728 * Check pairs of calls to methods which provide exclusive access to critical sections 729 * either by 'Serialized method' technique or AML mutexes (Acquire/Release) framework. 730 * The second method is invoked from the first method. 731 * 732 * All the 1024 combinations are verified (32*32): 733 * 734 * The first call to method in pair is call to: 735 * - Serialized method with level in range from 0 up to 15 736 * - non-Serialized method Acquiring mutex with level in range from 0 up to 15 737 * 738 * Identically, the second call to method in pair is call to: 739 * - Serialized method with level in range from 0 up to 15 740 * - non-Serialized method Acquiring mutex with level in range from 0 up to 15 741 * 742 * So all the checkings are provided: 743 * 744 * - proper sequence of levels (from i-th level to all possible correct levels) 745 * - proper sequence of levels (from i-th level to i-th level (in particular)) 746 * - improper sequence of levels (from i-th level to all possible incorrect levels) 747 * 748 * arg0 - level of first call 749 * arg1 - level of second call 750 * arg2 - how many calls to do 751 */ 752Method(m3bb, 3, Serialized) 753{ 754 Name(ts, "m3bb") 755 756 Name(i000, 0) 757 Name(i001, 0) 758 Name(i002, 0) 759 Name(i003, 0xabcd0003) 760 Name(i004, 0xabcd0004) 761 Name(i005, 0) 762 763 Mutex(MT00, 0) 764 Mutex(MT10, 1) 765 Mutex(MT20, 2) 766 Mutex(MT30, 3) 767 Mutex(MT40, 4) 768 Mutex(MT50, 5) 769 Mutex(MT60, 6) 770 Mutex(MT70, 7) 771 Mutex(MT80, 8) 772 Mutex(MT90, 9) 773 Mutex(MTa0, 10) 774 Mutex(MTb0, 11) 775 Mutex(MTc0, 12) 776 Mutex(MTd0, 13) 777 Mutex(MTe0, 14) 778 Mutex(MTf0, 15) 779 780 Method(m000,1,Serialized, 0) {if (arg0) {Store( 0,i004)} else {Store( 0,i003)} mm00(1,i000,i001)} 781 Method(m001,1,Serialized, 1) {if (arg0) {Store( 1,i004)} else {Store( 1,i003)} mm00(1,i000,i001)} 782 Method(m002,1,Serialized, 2) {if (arg0) {Store( 2,i004)} else {Store( 2,i003)} mm00(1,i000,i001)} 783 Method(m003,1,Serialized, 3) {if (arg0) {Store( 3,i004)} else {Store( 3,i003)} mm00(1,i000,i001)} 784 Method(m004,1,Serialized, 4) {if (arg0) {Store( 4,i004)} else {Store( 4,i003)} mm00(1,i000,i001)} 785 Method(m005,1,Serialized, 5) {if (arg0) {Store( 5,i004)} else {Store( 5,i003)} mm00(1,i000,i001)} 786 Method(m006,1,Serialized, 6) {if (arg0) {Store( 6,i004)} else {Store( 6,i003)} mm00(1,i000,i001)} 787 Method(m007,1,Serialized, 7) {if (arg0) {Store( 7,i004)} else {Store( 7,i003)} mm00(1,i000,i001)} 788 Method(m008,1,Serialized, 8) {if (arg0) {Store( 8,i004)} else {Store( 8,i003)} mm00(1,i000,i001)} 789 Method(m009,1,Serialized, 9) {if (arg0) {Store( 9,i004)} else {Store( 9,i003)} mm00(1,i000,i001)} 790 Method(m010,1,Serialized,10) {if (arg0) {Store(10,i004)} else {Store(10,i003)} mm00(1,i000,i001)} 791 Method(m011,1,Serialized,11) {if (arg0) {Store(11,i004)} else {Store(11,i003)} mm00(1,i000,i001)} 792 Method(m012,1,Serialized,12) {if (arg0) {Store(12,i004)} else {Store(12,i003)} mm00(1,i000,i001)} 793 Method(m013,1,Serialized,13) {if (arg0) {Store(13,i004)} else {Store(13,i003)} mm00(1,i000,i001)} 794 Method(m014,1,Serialized,14) {if (arg0) {Store(14,i004)} else {Store(14,i003)} mm00(1,i000,i001)} 795 Method(m015,1,Serialized,15) {if (arg0) {Store(15,i004)} else {Store(15,i003)} mm00(1,i000,i001)} 796 797 Method(m100, 2) { 798 if (arg0) { 799 Store(16, i004) 800 } else { 801 Store(16, i003) 802 } 803 Store(Acquire(MT00, 0xffff), Local0) 804 mm00(1, i000, i001) 805 if (arg1) { 806 if (Local0) { 807 err(ts, z173, 0x019, 0, 0, 0, Local0) 808 } 809 } 810 if (LNot(Local0)) { 811 Release(MT00) 812 } 813 } 814 Method(m101, 2) { 815 if (arg0) { 816 Store(17, i004) 817 } else { 818 Store(17, i003) 819 } 820 Store(Acquire(MT10, 0xffff), Local0) 821 mm00(1, i000, i001) 822 if (arg1) { 823 if (Local0) { 824 err(ts, z173, 0x019, 0, 0, 0, Local0) 825 } 826 } 827 if (LNot(Local0)) { 828 Release(MT10) 829 } 830 } 831 Method(m102, 2) { 832 if (arg0) { 833 Store(18, i004) 834 } else { 835 Store(18, i003) 836 } 837 Store(Acquire(MT20, 0xffff), Local0) 838 mm00(1, i000, i001) 839 if (arg1) { 840 if (Local0) { 841 err(ts, z173, 0x019, 0, 0, 0, Local0) 842 } 843 } 844 if (LNot(Local0)) { 845 Release(MT20) 846 } 847 } 848 Method(m103, 2) { 849 if (arg0) { 850 Store(19, i004) 851 } else { 852 Store(19, i003) 853 } 854 Store(Acquire(MT30, 0xffff), Local0) 855 mm00(1, i000, i001) 856 if (arg1) { 857 if (Local0) { 858 err(ts, z173, 0x019, 0, 0, 0, Local0) 859 } 860 } 861 if (LNot(Local0)) { 862 Release(MT30) 863 } 864 } 865 Method(m104, 2) { 866 if (arg0) { 867 Store(20, i004) 868 } else { 869 Store(20, i003) 870 } 871 Store(Acquire(MT40, 0xffff), Local0) 872 mm00(1, i000, i001) 873 if (arg1) { 874 if (Local0) { 875 err(ts, z173, 0x019, 0, 0, 0, Local0) 876 } 877 } 878 if (LNot(Local0)) { 879 Release(MT40) 880 } 881 } 882 Method(m105, 2) { 883 if (arg0) { 884 Store(21, i004) 885 } else { 886 Store(21, i003) 887 } 888 Store(Acquire(MT50, 0xffff), Local0) 889 mm00(1, i000, i001) 890 if (arg1) { 891 if (Local0) { 892 err(ts, z173, 0x019, 0, 0, 0, Local0) 893 } 894 } 895 if (LNot(Local0)) { 896 Release(MT50) 897 } 898 } 899 Method(m106, 2) { 900 if (arg0) { 901 Store(22, i004) 902 } else { 903 Store(22, i003) 904 } 905 Store(Acquire(MT60, 0xffff), Local0) 906 mm00(1, i000, i001) 907 if (arg1) { 908 if (Local0) { 909 err(ts, z173, 0x019, 0, 0, 0, Local0) 910 } 911 } 912 if (LNot(Local0)) { 913 Release(MT60) 914 } 915 } 916 Method(m107, 2) { 917 if (arg0) { 918 Store(23, i004) 919 } else { 920 Store(23, i003) 921 } 922 Store(Acquire(MT70, 0xffff), Local0) 923 mm00(1, i000, i001) 924 if (arg1) { 925 if (Local0) { 926 err(ts, z173, 0x019, 0, 0, 0, Local0) 927 } 928 } 929 if (LNot(Local0)) { 930 Release(MT70) 931 } 932 } 933 Method(m108, 2) { 934 if (arg0) { 935 Store(24, i004) 936 } else { 937 Store(24, i003) 938 } 939 Store(Acquire(MT80, 0xffff), Local0) 940 mm00(1, i000, i001) 941 if (arg1) { 942 if (Local0) { 943 err(ts, z173, 0x019, 0, 0, 0, Local0) 944 } 945 } 946 if (LNot(Local0)) { 947 Release(MT80) 948 } 949 } 950 Method(m109, 2) { 951 if (arg0) { 952 Store(25, i004) 953 } else { 954 Store(25, i003) 955 } 956 Store(Acquire(MT90, 0xffff), Local0) 957 mm00(1, i000, i001) 958 if (arg1) { 959 if (Local0) { 960 err(ts, z173, 0x019, 0, 0, 0, Local0) 961 } 962 } 963 if (LNot(Local0)) { 964 Release(MT90) 965 } 966 } 967 Method(m110, 2) { 968 if (arg0) { 969 Store(26, i004) 970 } else { 971 Store(26, i003) 972 } 973 Store(Acquire(MTa0, 0xffff), Local0) 974 mm00(1, i000, i001) 975 if (arg1) { 976 if (Local0) { 977 err(ts, z173, 0x019, 0, 0, 0, Local0) 978 } 979 } 980 if (LNot(Local0)) { 981 Release(MTa0) 982 } 983 } 984 Method(m111, 2) { 985 if (arg0) { 986 Store(27, i004) 987 } else { 988 Store(27, i003) 989 } 990 Store(Acquire(MTb0, 0xffff), Local0) 991 mm00(1, i000, i001) 992 if (arg1) { 993 if (Local0) { 994 err(ts, z173, 0x019, 0, 0, 0, Local0) 995 } 996 } 997 if (LNot(Local0)) { 998 Release(MTb0) 999 } 1000 } 1001 Method(m112, 2) { 1002 if (arg0) { 1003 Store(28, i004) 1004 } else { 1005 Store(28, i003) 1006 } 1007 Store(Acquire(MTc0, 0xffff), Local0) 1008 mm00(1, i000, i001) 1009 if (arg1) { 1010 if (Local0) { 1011 err(ts, z173, 0x019, 0, 0, 0, Local0) 1012 } 1013 } 1014 if (LNot(Local0)) { 1015 Release(MTc0) 1016 } 1017 } 1018 Method(m113, 2) { 1019 if (arg0) { 1020 Store(29, i004) 1021 } else { 1022 Store(29, i003) 1023 } 1024 Store(Acquire(MTd0, 0xffff), Local0) 1025 mm00(1, i000, i001) 1026 if (arg1) { 1027 if (Local0) { 1028 err(ts, z173, 0x019, 0, 0, 0, Local0) 1029 } 1030 } 1031 if (LNot(Local0)) { 1032 Release(MTd0) 1033 } 1034 } 1035 Method(m114, 2) { 1036 if (arg0) { 1037 Store(30, i004) 1038 } else { 1039 Store(30, i003) 1040 } 1041 Store(Acquire(MTe0, 0xffff), Local0) 1042 mm00(1, i000, i001) 1043 if (arg1) { 1044 if (Local0) { 1045 err(ts, z173, 0x019, 0, 0, 0, Local0) 1046 } 1047 } 1048 if (LNot(Local0)) { 1049 Release(MTe0) 1050 } 1051 } 1052 Method(m115, 2) { 1053 if (arg0) { 1054 Store(31, i004) 1055 } else { 1056 Store(31, i003) 1057 } 1058 Store(Acquire(MTf0, 0xffff), Local0) 1059 mm00(1, i000, i001) 1060 if (arg1) { 1061 if (Local0) { 1062 err(ts, z173, 0x019, 0, 0, 0, Local0) 1063 } 1064 } 1065 if (LNot(Local0)) { 1066 Release(MTf0) 1067 } 1068 } 1069 1070 /* 1071 * arg0 - 0 - first call, otherwise - non-first call 1072 * arg1 - level of first call 1073 * arg2 - level of second call 1074 */ 1075 Method(mm00, 3, Serialized) 1076 { 1077 Store(i002, Local0) 1078 Increment(i002) 1079 1080 if (LGreater(i002, i005)) { 1081 Return 1082 } 1083 1084 if (arg0) { 1085 Store(arg2, Local1) 1086 } else { 1087 Store(arg1, Local1) 1088 } 1089 1090 if (arg0) { 1091 // non-first call 1092 if (LGreaterEqual(arg1, 16)) { 1093 Subtract(arg1, 16, Local2) 1094 } else { 1095 Store(arg1, Local2) 1096 } 1097 if (LGreaterEqual(arg2, 16)) { 1098 Subtract(arg2, 16, Local3) 1099 } else { 1100 Store(arg2, Local3) 1101 } 1102 if (LGreater(Local2, Local3)) { 1103 Store(0, Local4) 1104 } else { 1105 Store(1, Local4) // Check return of Acquire, success is expected 1106 } 1107 } else { 1108 // first call 1109 Store(1, Local4) // Check return of Acquire, success is expected 1110 } 1111 1112 Switch (ToInteger (Local1)) { 1113 Case (0) { 1114 m000(Local0) 1115 } 1116 Case (1) { 1117 m001(Local0) 1118 } 1119 Case (2) { 1120 m002(Local0) 1121 } 1122 Case (3) { 1123 m003(Local0) 1124 } 1125 Case (4) { 1126 m004(Local0) 1127 } 1128 Case (5) { 1129 m005(Local0) 1130 } 1131 Case (6) { 1132 m006(Local0) 1133 } 1134 Case (7) { 1135 m007(Local0) 1136 } 1137 Case (8) { 1138 m008(Local0) 1139 } 1140 Case (9) { 1141 m009(Local0) 1142 } 1143 Case (10) { 1144 m010(Local0) 1145 } 1146 Case (11) { 1147 m011(Local0) 1148 } 1149 Case (12) { 1150 m012(Local0) 1151 } 1152 Case (13) { 1153 m013(Local0) 1154 } 1155 Case (14) { 1156 m014(Local0) 1157 } 1158 Case (15) { 1159 m015(Local0) 1160 } 1161 1162 1163 Case (16) { 1164 m100(Local0, Local4) 1165 } 1166 Case (17) { 1167 m101(Local0, Local4) 1168 } 1169 Case (18) { 1170 m102(Local0, Local4) 1171 } 1172 Case (19) { 1173 m103(Local0, Local4) 1174 } 1175 Case (20) { 1176 m104(Local0, Local4) 1177 } 1178 Case (21) { 1179 m105(Local0, Local4) 1180 } 1181 Case (22) { 1182 m106(Local0, Local4) 1183 } 1184 Case (23) { 1185 m107(Local0, Local4) 1186 } 1187 Case (24) { 1188 m108(Local0, Local4) 1189 } 1190 Case (25) { 1191 m109(Local0, Local4) 1192 } 1193 Case (26) { 1194 m110(Local0, Local4) 1195 } 1196 Case (27) { 1197 m111(Local0, Local4) 1198 } 1199 Case (28) { 1200 m112(Local0, Local4) 1201 } 1202 Case (29) { 1203 m113(Local0, Local4) 1204 } 1205 Case (30) { 1206 m114(Local0, Local4) 1207 } 1208 Case (31) { 1209 m115(Local0, Local4) 1210 } 1211 } 1212 } 1213 1214 CH03(ts, z173, 0x00a, 0, 0) 1215 1216 Store(arg0, i000) 1217 Store(arg1, i001) 1218 Store(arg2, i005) 1219 1220 mm00(0, i000, i001) 1221 1222 if (LGreaterEqual(arg0, 16)) { 1223 Subtract(arg0, 16, Local2) 1224 } else { 1225 Store(arg0, Local2) 1226 } 1227 if (LGreaterEqual(arg1, 16)) { 1228 Subtract(arg1, 16, Local3) 1229 } else { 1230 Store(arg1, Local3) 1231 } 1232 if (LGreater(Local2, Local3)) { 1233 Store(0, Local4) 1234 } else { 1235 Store(1, Local4) // Success is expected, no exceptions 1236 } 1237 1238 if (LNot(Local4)) { 1239 CH04(ts, 1, 64, z173, 0x00b, 0, 0) // AE_AML_MUTEX_ORDER 1240 } else { 1241 if (LNotEqual(i003, arg0)) { 1242 err(ts, z173, 0x00c, 0, 0, i003, arg0) 1243 } 1244 if (LNotEqual(i004, arg1)) { 1245 err(ts, z173, 0x00d, 0, 0, i004, arg1) 1246 } 1247 } 1248 1249 CH03(ts, z173, 0x00e, 0, 0) 1250} 1251 1252Method(m3bc,, Serialized) 1253{ 1254 Name(ts, "m3bc") 1255 1256 Name(lpN0, 0) 1257 Name(lpC0, 0) 1258 Name(lpN1, 0) 1259 Name(lpC1, 0) 1260 1261 Store(32, lpN0) 1262 Store(0, lpC0) 1263 1264 While (lpN0) { 1265 Store(32, lpN1) 1266 Store(0, lpC1) 1267 While (lpN1) { 1268 1269 m3bb(lpC0, lpC1, 2) 1270 1271 Decrement(lpN1) 1272 Increment(lpC1) 1273 } 1274 Decrement(lpN0) 1275 Increment(lpC0) 1276 } 1277} 1278 1279Method(m3bd) 1280{ 1281 SRMT("m3b0") 1282 m3b0() 1283 1284 SRMT("m3b1") 1285 m3b1() 1286 1287 SRMT("m3b2") 1288 m3b2() 1289 1290 SRMT("m3b4") 1291 if (y300) { 1292 m3b4() 1293 } else { 1294 BLCK() 1295 } 1296 1297 SRMT("m3b6") 1298 m3b6() 1299 1300 SRMT("m3b8") 1301 m3b8() 1302 1303 SRMT("m3b9") 1304 if (y300) { 1305 m3b9() 1306 } else { 1307 BLCK() 1308 } 1309 1310 SRMT("m3ba") 1311 m3ba() 1312 1313 SRMT("m3bc") 1314 if (y300) { 1315 m3bc() 1316 } else { 1317 BLCK() 1318 } 1319} 1320 1321 1322