• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /barrelfish-2018-10-04/lib/acpica/tests/aslts/src/runtime/collections/functional/synchronization/
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