/*
* Some or all of this work - Copyright (c) 2006 - 2018, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Synchronization (mutexes)
*
* The test for ASL-Mutexes to be run on a single invocation only
*/
/*
* Mutex + Acquire + Release
*
* The test actions exercise the (Mutex + Acquire + Release)
* operators adhering to the following ACPI-specified rules
* (some of them are verified):
*
* - creates a data mutex synchronization object,
* with level from 0 to 15 specified by SyncLevel,
* - a Mutex is not owned by a different invocation so it is owned
* immediately,
* - acquiring ownership of a Mutex can be nested,
* - a Mutex can be acquired more than once by the same invocation,
* - Acquire returns False if a timeout not occurred and the mutex
* ownership was successfully acquired,
* - to prevent deadlocks, wherever more than one synchronization
* object must be owned, the synchronization objects must always
* be released in the order opposite the order in which they were
* acquired,
* - all Acquire terms must refer to a synchronization object with
* an equal or greater SyncLevel to current level,
* - all Release terms must refer to a synchronization object with
* equal or lower SyncLevel to the current level,
* - after all the acquired mutexes of the current level are released
* the top occupied levels declines to the nearest occupied level,
* - Acquire increases the counter of mutex by one,
* - Release decreases the counter of mutex by one.
*/
/* Acquire methods */
/* m01X(<method name>, <mux0>, <mux1>, <mux2>, <mux3>) */
/* Release methods */
/* m02X(<method name>, <mux0>, <mux1>, <mux2>, <mux3>) */
/* ================================================= Acquire methods */
Method (M010, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x00, 0x00, Acquire (T000, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x00, 0x01, Acquire (T001, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x00, 0x02, Acquire (T002, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x00, 0x03, Acquire (T003, 0x1000))
}
}
Method (M011, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x01, 0x00, Acquire (T100, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x01, 0x01, Acquire (T101, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x01, 0x02, Acquire (T102, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x01, 0x03, Acquire (T103, 0x1000))
}
}
Method (M012, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x02, 0x00, Acquire (T200, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x02, 0x01, Acquire (T201, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x02, 0x02, Acquire (T202, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x02, 0x03, Acquire (T203, 0x1000))
}
}
Method (M013, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x03, 0x00, Acquire (T300, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x03, 0x01, Acquire (T301, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x03, 0x02, Acquire (T302, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x03, 0x03, Acquire (T303, 0x1000))
}
}
Method (M014, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x04, 0x00, Acquire (T400, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x04, 0x01, Acquire (T401, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x04, 0x02, Acquire (T402, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x04, 0x03, Acquire (T403, 0x1000))
}
}
Method (M015, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x05, 0x00, Acquire (T500, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x05, 0x01, Acquire (T501, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x05, 0x02, Acquire (T502, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x05, 0x03, Acquire (T503, 0x1000))
}
}
Method (M016, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x06, 0x00, Acquire (T600, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x06, 0x01, Acquire (T601, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x06, 0x02, Acquire (T602, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x06, 0x03, Acquire (T603, 0x1000))
}
}
Method (M017, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x07, 0x00, Acquire (T700, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x07, 0x01, Acquire (T701, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x07, 0x02, Acquire (T702, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x07, 0x03, Acquire (T703, 0x1000))
}
}
Method (M018, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x08, 0x00, Acquire (T800, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x08, 0x01, Acquire (T801, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x08, 0x02, Acquire (T802, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x08, 0x03, Acquire (T803, 0x1000))
}
}
Method (M019, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x09, 0x00, Acquire (T900, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x09, 0x01, Acquire (T901, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x09, 0x02, Acquire (T902, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x09, 0x03, Acquire (T903, 0x1000))
}
}
Method (M01A, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x0A, 0x00, Acquire (TA00, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x0A, 0x01, Acquire (TA01, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x0A, 0x02, Acquire (TA02, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x0A, 0x03, Acquire (TA03, 0x1000))
}
}
Method (M01B, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x0B, 0x00, Acquire (TB00, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x0B, 0x01, Acquire (TB01, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x0B, 0x02, Acquire (TB02, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x0B, 0x03, Acquire (TB03, 0x1000))
}
}
Method (M01C, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x0C, 0x00, Acquire (TC00, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x0C, 0x01, Acquire (TC01, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x0C, 0x02, Acquire (TC02, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x0C, 0x03, Acquire (TC03, 0x1000))
}
}
Method (M01D, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x0D, 0x00, Acquire (TD00, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x0D, 0x01, Acquire (TD01, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x0D, 0x02, Acquire (TD02, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x0D, 0x03, Acquire (TD03, 0x1000))
}
}
Method (M01E, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x0E, 0x00, Acquire (TE00, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x0E, 0x01, Acquire (TE01, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x0E, 0x02, Acquire (TE02, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x0E, 0x03, Acquire (TE03, 0x1000))
}
}
Method (M01F, 5, NotSerialized)
{
If (Arg1)
{
CH00 (Arg0, 0x0F, 0x00, Acquire (TF00, 0x0000))
}
If (Arg2)
{
CH00 (Arg0, 0x0F, 0x01, Acquire (TF01, 0xFFFF))
}
If (Arg3)
{
CH00 (Arg0, 0x0F, 0x02, Acquire (TF02, 0x8000))
}
If (Arg4)
{
CH00 (Arg0, 0x0F, 0x03, Acquire (TF03, 0x1000))
}
}
/* ================================================= Release methods */
Method (M020, 5, NotSerialized)
{
If (Arg4)
{
Release (T003)
}
If (Arg3)
{
Release (T002)
}
If (Arg2)
{
Release (T001)
}
If (Arg1)
{
Release (T000)
}
}
Method (M021, 5, NotSerialized)
{
If (Arg4)
{
Release (T103)
}
If (Arg3)
{
Release (T102)
}
If (Arg2)
{
Release (T101)
}
If (Arg1)
{
Release (T100)
}
}
Method (M022, 5, NotSerialized)
{
If (Arg4)
{
Release (T203)
}
If (Arg3)
{
Release (T202)
}
If (Arg2)
{
Release (T201)
}
If (Arg1)
{
Release (T200)
}
}
Method (M023, 5, NotSerialized)
{
If (Arg4)
{
Release (T303)
}
If (Arg3)
{
Release (T302)
}
If (Arg2)
{
Release (T301)
}
If (Arg1)
{
Release (T300)
}
}
Method (M024, 5, NotSerialized)
{
If (Arg4)
{
Release (T403)
}
If (Arg3)
{
Release (T402)
}
If (Arg2)
{
Release (T401)
}
If (Arg1)
{
Release (T400)
}
}
Method (M025, 5, NotSerialized)
{
If (Arg4)
{
Release (T503)
}
If (Arg3)
{
Release (T502)
}
If (Arg2)
{
Release (T501)
}
If (Arg1)
{
Release (T500)
}
}
Method (M026, 5, NotSerialized)
{
If (Arg4)
{
Release (T603)
}
If (Arg3)
{
Release (T602)
}
If (Arg2)
{
Release (T601)
}
If (Arg1)
{
Release (T600)
}
}
Method (M027, 5, NotSerialized)
{
If (Arg4)
{
Release (T703)
}
If (Arg3)
{
Release (T702)
}
If (Arg2)
{
Release (T701)
}
If (Arg1)
{
Release (T700)
}
}
Method (M028, 5, NotSerialized)
{
If (Arg4)
{
Release (T803)
}
If (Arg3)
{
Release (T802)
}
If (Arg2)
{
Release (T801)
}
If (Arg1)
{
Release (T800)
}
}
Method (M029, 5, NotSerialized)
{
If (Arg4)
{
Release (T903)
}
If (Arg3)
{
Release (T902)
}
If (Arg2)
{
Release (T901)
}
If (Arg1)
{
Release (T900)
}
}
Method (M02A, 5, NotSerialized)
{
If (Arg4)
{
Release (TA03)
}
If (Arg3)
{
Release (TA02)
}
If (Arg2)
{
Release (TA01)
}
If (Arg1)
{
Release (TA00)
}
}
Method (M02B, 5, NotSerialized)
{
If (Arg4)
{
Release (TB03)
}
If (Arg3)
{
Release (TB02)
}
If (Arg2)
{
Release (TB01)
}
If (Arg1)
{
Release (TB00)
}
}
Method (M02C, 5, NotSerialized)
{
If (Arg4)
{
Release (TC03)
}
If (Arg3)
{
Release (TC02)
}
If (Arg2)
{
Release (TC01)
}
If (Arg1)
{
Release (TC00)
}
}
Method (M02D, 5, NotSerialized)
{
If (Arg4)
{
Release (TD03)
}
If (Arg3)
{
Release (TD02)
}
If (Arg2)
{
Release (TD01)
}
If (Arg1)
{
Release (TD00)
}
}
Method (M02E, 5, NotSerialized)
{
If (Arg4)
{
Release (TE03)
}
If (Arg3)
{
Release (TE02)
}
If (Arg2)
{
Release (TE01)
}
If (Arg1)
{
Release (TE00)
}
}
Method (M02F, 5, NotSerialized)
{
If (Arg4)
{
Release (TF03)
}
If (Arg3)
{
Release (TF02)
}
If (Arg2)
{
Release (TF01)
}
If (Arg1)
{
Release (TF00)
}
}
/* ================================================= Run Acquire/Release */
/*
* Acquire
* arg0 - name of method to be reported
* arg1 - synclevel (0-15)
* arg2 - start mutex inside the first processed synclevel
* (0 for other levels)
* 0 - starting with the # (arg3)
* 1 - 0-th
* 2 - 1-th
* 3 - 2-th
* 4 - 3-th
* arg3 - # operations to be performed for current synclevel
*/
Method (M030, 4, NotSerialized)
{
If ((Arg3 == 0x00))
{
Return (0x00)
}
Local1 = 0x00
Local2 = 0x00
Local3 = 0x00
Local4 = 0x00
/* Local5 - index of highest */
Store ((Arg2 + Arg3), Local5)
Local5--
Local6 = 0x00
Local7 = 0x00
If ((Arg2 <= 0x00))
{
Local6 = 0x01
}
If ((Local5 >= 0x00))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local1 = 0x01
}
Local6 = 0x00
Local7 = 0x00
If ((Arg2 <= 0x01))
{
Local6 = 0x01
}
If ((Local5 >= 0x01))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local2 = 0x01
}
Local6 = 0x00
Local7 = 0x00
If ((Arg2 <= 0x02))
{
Local6 = 0x01
}
If ((Local5 >= 0x02))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local3 = 0x01
}
Local6 = 0x00
Local7 = 0x00
If ((Arg2 <= 0x03))
{
Local6 = 0x01
}
If ((Local5 >= 0x03))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local4 = 0x01
}
If (0x00)
{
Debug = Local1
Debug = Local2
Debug = Local3
Debug = Local4
Return (0x00)
}
If ((Arg1 == 0x00))
{
M010 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x01))
{
M011 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x02))
{
M012 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x03))
{
M013 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x04))
{
M014 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x05))
{
M015 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x06))
{
M016 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x07))
{
M017 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x08))
{
M018 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x09))
{
M019 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0A))
{
M01A (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0B))
{
M01B (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0C))
{
M01C (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0D))
{
M01D (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0E))
{
M01E (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0F))
{
M01F (Arg0, Local1, Local2, Local3, Local4)
}
Return (0x00)
}
/*
* Release
* arg0 - name of method to be reported
* arg1 - synclevel (0-15)
* arg2 - start mutex inside the first processed synclevel
* (0 for other levels)
* 0 - starting with the # (arg3)
* 4 - 3-th
* 3 - 2-th
* 2 - 1-th
* 1 - 0-th
* arg3 - # operations to be performed for current synclevel
*/
Method (M031, 4, NotSerialized)
{
If ((Arg3 == 0x00))
{
Return (0x00)
}
Local1 = 0x00
Local2 = 0x00
Local3 = 0x00
Local4 = 0x00
/* arg2 - index of highest */
If ((Arg2 == 0x00))
{
Arg2 = Arg3
}
Arg2--
/* Local5 - index of lowest */
Store ((Arg2 - Arg3), Local5)
Local5++
Local6 = 0x00
Local7 = 0x00
If ((Local5 <= 0x00))
{
Local6 = 0x01
}
If ((Arg2 >= 0x00))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local1 = 0x01
}
Local6 = 0x00
Local7 = 0x00
If ((Local5 <= 0x01))
{
Local6 = 0x01
}
If ((Arg2 >= 0x01))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local2 = 0x01
}
Local6 = 0x00
Local7 = 0x00
If ((Local5 <= 0x02))
{
Local6 = 0x01
}
If ((Arg2 >= 0x02))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local3 = 0x01
}
Local6 = 0x00
Local7 = 0x00
If ((Local5 <= 0x03))
{
Local6 = 0x01
}
If ((Arg2 >= 0x03))
{
Local7 = 0x01
}
If ((Local6 && Local7))
{
Local4 = 0x01
}
If (0x00)
{
Debug = Local1
Debug = Local2
Debug = Local3
Debug = Local4
Return (0x00)
}
If ((Arg1 == 0x00))
{
M020 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x01))
{
M021 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x02))
{
M022 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x03))
{
M023 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x04))
{
M024 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x05))
{
M025 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x06))
{
M026 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x07))
{
M027 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x08))
{
M028 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x09))
{
M029 (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0A))
{
M02A (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0B))
{
M02B (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0C))
{
M02C (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0D))
{
M02D (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0E))
{
M02E (Arg0, Local1, Local2, Local3, Local4)
}
If ((Arg1 == 0x0F))
{
M02F (Arg0, Local1, Local2, Local3, Local4)
}
Return (0x00)
}
/* ================================================= Tests */
/* How many times run Acquire/Release for the particular level mutexes */
/* 0 - Acquire */
/* 1 - Release */
/*
* Name(p010, Buffer() {
* 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
* 1, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
* 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
* 1, 0, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
* }
* )
*/
Name (P010, Buffer (0x03F0)
{
/* 0000 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0008 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0010 */ 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, // ........
/* 0018 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0020 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, // ........
/* 0028 */ 0x02, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, // ........
/* 0030 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // ........
/* 0038 */ 0x04, 0x03, 0x02, 0x01, 0x04, 0x03, 0x02, 0x01, // ........
/* 0040 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0048 */ 0x00, 0x00, 0x04, 0x03, 0x02, 0x01, 0x04, 0x03, // ........
/* 0050 */ 0x02, 0x01, 0x04, 0x03, 0x02, 0x01, 0x04, 0x03, // ........
/* 0058 */ 0x02, 0x00, 0x01, 0x00, 0x04, 0x03, 0x02, 0x01, // ........
/* 0060 */ 0x04, 0x03, 0x02, 0x01, 0x04, 0x03, 0x02, 0x01, // ........
/* 0068 */ 0x04, 0x03, 0x02, 0x00, 0x00, 0x00, 0x04, 0x04, // ........
/* 0070 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0078 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x00, // ........
/* 0080 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0088 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0090 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0098 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00A0 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, // ........
/* 00A8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00B0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, // ........
/* 00B8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00C0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // ........
/* 00C8 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00D0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00D8 */ 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00E0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00E8 */ 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, // ........
/* 00F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 00F8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, // ........
/* 0100 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, // ........
/* 0108 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0110 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0118 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0128 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0130 */ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0138 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, // ........
/* 0140 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ........
/* 0148 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, // ........
/* 0150 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // ........
/* 0158 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0160 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0168 */ 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0170 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0178 */ 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0180 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0188 */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, // ........
/* 0190 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0198 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, // ........
/* 01A0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 01A8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // ........
/* 01B0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 01B8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 01C0 */ 0x00, 0x04, 0x01, 0x00, 0x04, 0x04, 0x04, 0x04, // ........
/* 01C8 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 01D0 */ 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, // ........
/* 01D8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 01E0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, // ........
/* 01E8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 01F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // ........
/* 01F8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0200 */ 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0208 */ 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0210 */ 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0218 */ 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, // ........
/* 0220 */ 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, // ........
/* 0228 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0x00, // ........
/* 0230 */ 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ........
/* 0238 */ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, // ........
/* 0240 */ 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0248 */ 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0250 */ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0258 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, // ........
/* 0260 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0268 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, // ........
/* 0270 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // ........
/* 0278 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0280 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0288 */ 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 0290 */ 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0298 */ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 02A0 */ 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, // ........
/* 02A8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 02B0 */ 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, // ........
/* 02B8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // ........
/* 02C0 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 02C8 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 02D0 */ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 02D8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 02E0 */ 0x00, 0x00, 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, // ........
/* 02E8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 02F0 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, // ........
/* 02F8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0300 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, // ........
/* 0308 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0310 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0318 */ 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0320 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0328 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, // ........
/* 0330 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, // ........
/* 0338 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ........
/* 0340 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, // ........
/* 0348 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, // ........
/* 0350 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, // ........
/* 0358 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0360 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0368 */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0370 */ 0x00, 0x00, 0x01, 0x00, 0x04, 0x04, 0x04, 0x04, // ........
/* 0378 */ 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 0380 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, // ........
/* 0388 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, // ........
/* 0390 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // ........
/* 0398 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, // ........
/* 03A0 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 03A8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // ........
/* 03B0 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, // ........
/* 03B8 */ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 03C0 */ 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 03C8 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
/* 03D0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, // ........
/* 03D8 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x00, // ........
/* 03E0 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // ........
/* 03E8 */ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 // ........
})
/*
* Run Acquire/Release for all level mutexes
*
* Buffer:={N lines}
* Line:= consists of 18 bytes:
* 0: operation: 0-Acquire, 1-Release
* 1: The start mutex inside the first processed synclevel
* (start mux and synclevels are ordered: Acquire: left->r,
* Release: r->l)
* 0: to start according to the given number (bytes 2-17)
* 1-4: Acquire (left->right) (1-0th,2-1th,3-2th,4-3th)
* Release (right->left) (4-3th,3-2th,2-1th,1-0th)
* 2-17: per-synclevel numbers of operations to be performed:
* how many operations (from 0 up to 4) to be performed
* (at most one per mutex) on the mutexes of the relevant
* level (2th - synclevel 0, 3th - synclevel 1, etc.)
* Variables:
* arg0 - name of method to be reported
* arg1 - lines total number
* arg2 - buffer of lines
* arg3 - name of buffer
* Local7 - index of line
* Local6 - synclevel (0-15)
* Local5 - operation (0-Acquire,1-Release)
* Local4 - abs index corresponding to synclevel inside the buffer
* Local3 - auxiliary = (Local6 + 1)
* Local2 - # operations to be performed for current synclevel
* Local1 - start mutex inside the first processed synclevel
* (0 for other levels)
*/
Method (M032, 4, NotSerialized)
{
Local7 = 0x00
While (Arg1)
{
Local6 = (Local7 * 0x12)
Local5 = DerefOf (Arg2 [Local6])
Local6++
Local1 = DerefOf (Arg2 [Local6])
If ((Local5 == 0x00))
{
If (0x00)
{
Debug = "============= Acq"
}
Store ((Local6 + 0x01), Local4)
Local6 = 0x00
While ((Local6 < 0x10))
{
Local2 = DerefOf (Arg2 [Local4])
If (0x00)
{
Debug = Local6
Debug = Local4
Debug = Local2
}
If (Local2)
{
M030 (Arg0, Local6, Local1, Local2)
Local1 = 0x00
}
Local6++
Local4++
}
}
Else
{
If (0x00)
{
Debug = "============= Rel"
}
Store ((Local6 + 0x10), Local4)
Local3 = 0x10
While (Local3)
{
Store ((Local3 - 0x01), Local6)
Local2 = DerefOf (Arg2 [Local4])
If (0x00)
{
Debug = Local6
Debug = Local4
Debug = Local2
}
If (Local2)
{
M031 (Arg0, Local6, Local1, Local2)
Local1 = 0x00
}
Local3--
Local4--
}
}
Local7++
Arg1--
}
CH03 ("MUX0", Z150, __LINE__, 0x00, 0x00)
}
Method (M033, 0, Serialized)
{
Mutex (MTX0, 0x00)
Local0 = Acquire (MTX0, 0x0000)
If (Local0)
{
Debug = "M033: Could not acquire mutex"
Return (Zero)
}
Release (MTX0)
}
Method (M034, 0, NotSerialized)
{
Local0 = 0xC8
While (Local0)
{
M033 ()
Local0--
}
}
/* Run-method */
Method (MUX0, 0, Serialized)
{
Debug = "TEST: MUX0, Acquire/Release Mutex"
SRMT ("m032")
M032 (__METHOD__, 0x38, P010, "p010")
SRMT ("m034")
M034 ()
}