diff options
Diffstat (limited to 'tests/aslts/src/runtime/collections/functional/synchronization/mutex_proc.asl')
-rw-r--r-- | tests/aslts/src/runtime/collections/functional/synchronization/mutex_proc.asl | 1498 |
1 files changed, 749 insertions, 749 deletions
diff --git a/tests/aslts/src/runtime/collections/functional/synchronization/mutex_proc.asl b/tests/aslts/src/runtime/collections/functional/synchronization/mutex_proc.asl index 0b70b9ba7..d79a483d6 100644 --- a/tests/aslts/src/runtime/collections/functional/synchronization/mutex_proc.asl +++ b/tests/aslts/src/runtime/collections/functional/synchronization/mutex_proc.asl @@ -1,749 +1,749 @@ -/*
- * Some or all of this work - Copyright (c) 2006 - 2015, 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.
- */
-
-/*
- * Auxiliary routines to access mutexes
- */
-
-Name(z151, 151)
-
-/*
- * For debugging:
- *
- * FL02 - print out Acquire/Release
- * im00 - imitation of Acquire/Release (don't really run Acquire/Release)
- */
-Name(FL02, 0)
-Name(im00, 0)
-
-/*
- * Acquire interval of mutexes
- *
- * arg0 - number of mutexes to Acquire (use not less than 1)
- */
-Method(m36d, 1, Serialized)
-{
- Name(ts, "m36d")
-
- if (LEqual(arg0, 0)) {
- return
- }
- Store(Acquire(T000, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 1, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 1)) {
- return
- }
- Store(Acquire(\_GL, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 2, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 2)) {
- return
- }
- Store(Acquire(T100, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 3, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 3)) {
- return
- }
- Store(Acquire(T200, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 4, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 4)) {
- return
- }
- Store(Acquire(T300, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 5, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 5)) {
- return
- }
- Store(Acquire(T400, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 6, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 6)) {
- return
- }
- Store(Acquire(T500, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 7, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 7)) {
- return
- }
- Store(Acquire(T600, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 8, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 8)) {
- return
- }
- Store(Acquire(T700, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 9, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 9)) {
- return
- }
- Store(Acquire(T800, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x00a, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 10)) {
- return
- }
- Store(Acquire(T900, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x00b, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 11)) {
- return
- }
- Store(Acquire(Ta00, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x00c, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 12)) {
- return
- }
- Store(Acquire(Tb00, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x00d, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 13)) {
- return
- }
- Store(Acquire(Tc00, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x00e, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 14)) {
- return
- }
- Store(Acquire(Td00, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x00f, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 15)) {
- return
- }
- Store(Acquire(Te00, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x010, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 16)) {
- return
- }
- Store(Acquire(Tf00, 0xffff), Local0)
- if (Local0) {
- err(ts, z151, 0x011, 0, 0, 0, Local0)
- } else {
- if (LEqual(arg0, 17)) {
- return
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-/*
- * Release interval of mutexes
- *
- * arg0 - number of mutexes to Release (use not less than 1)
- */
-Method(m36e, 1)
-{
- if (LGreaterEqual(arg0, 17)) {
- Release(Tf00)
- }
- if (LGreaterEqual(arg0, 16)) {
- Release(Te00)
- }
- if (LGreaterEqual(arg0, 15)) {
- Release(Td00)
- }
- if (LGreaterEqual(arg0, 14)) {
- Release(Tc00)
- }
- if (LGreaterEqual(arg0, 13)) {
- Release(Tb00)
- }
- if (LGreaterEqual(arg0, 12)) {
- Release(Ta00)
- }
- if (LGreaterEqual(arg0, 11)) {
- Release(T900)
- }
- if (LGreaterEqual(arg0, 10)) {
- Release(T800)
- }
- if (LGreaterEqual(arg0, 9)) {
- Release(T700)
- }
- if (LGreaterEqual(arg0, 8)) {
- Release(T600)
- }
- if (LGreaterEqual(arg0, 7)) {
- Release(T500)
- }
- if (LGreaterEqual(arg0, 6)) {
- Release(T400)
- }
- if (LGreaterEqual(arg0, 5)) {
- Release(T300)
- }
- if (LGreaterEqual(arg0, 4)) {
- Release(T200)
- }
- if (LGreaterEqual(arg0, 3)) {
- Release(T100)
- }
- if (LGreaterEqual(arg0, 2)) {
- Release(\_GL)
- }
- if (LGreaterEqual(arg0, 1)) {
- Release(T000)
- }
-}
-
-/*
- * Acquire mutex
- *
- * arg0 - Level of mutex
- * arg1 - Index of mutex
- * arg2 - opcode of exception to be generated or zero
- * arg3 - opcode of TimeOutValue (see comment to ma00)
- */
-Method(m36f, 4, Serialized)
-{
- Store(1, Local0) // Init with FAIL
-
- if (FL02) {
- Store(m21e("Acquire mutex, ", arg0, arg1), Local1)
-
- if (im00) {
- Concatenate("IMITATION: ", Local1, Local1)
- }
-
- if (arg2) {
- Concatenate(Local1, ", Exception expected", Local1)
- } else {
- Switch (ToInteger (arg3)) {
- Case (5) { // TOV0
- Concatenate(Local1, ", tout 0", Local1)
- }
- Case (6) { // TOV1
- Concatenate(Local1, ", tout 1", Local1)
- }
- Default {
- Concatenate(Local1, ", tout 0xffff", Local1)
- }
- }
- }
- Store(Local1, Debug)
- }
-
- if (im00) {
- /* Just imitation */
- return (0)
- }
-
- Switch (ToInteger (arg0)) {
- Case (0) {
- Store(ma00(arg1, arg2, arg3), Local0)
- }
- Case (1) {
- Store(ma01(arg1, arg2, arg3), Local0)
- }
- Case (2) {
- Store(ma02(arg1, arg2, arg3), Local0)
- }
- Case (3) {
- Store(ma03(arg1, arg2, arg3), Local0)
- }
- Case (4) {
- Store(ma04(arg1, arg2, arg3), Local0)
- }
- Case (5) {
- Store(ma05(arg1, arg2, arg3), Local0)
- }
- Case (6) {
- Store(ma06(arg1, arg2, arg3), Local0)
- }
- Case (7) {
- Store(ma07(arg1, arg2, arg3), Local0)
- }
- Case (8) {
- Store(ma08(arg1, arg2, arg3), Local0)
- }
- Case (9) {
- Store(ma09(arg1, arg2, arg3), Local0)
- }
- Case (10) {
- Store(ma0a(arg1, arg2, arg3), Local0)
- }
- Case (11) {
- Store(ma0b(arg1, arg2, arg3), Local0)
- }
- Case (12) {
- Store(ma0c(arg1, arg2, arg3), Local0)
- }
- Case (13) {
- Store(ma0d(arg1, arg2, arg3), Local0)
- }
- Case (14) {
- Store(ma0e(arg1, arg2, arg3), Local0)
- }
- Case (15) {
- Store(ma0f(arg1, arg2, arg3), Local0)
- }
- }
-
- if (LNot(arg2)) {
- if (Local0) {
- err("m36f", z151, 0x002, 0, 0, Local0, 0)
- }
- }
-
- return (Local0)
-}
-
-/*
- * Release mutex
- *
- * arg0 - Level of mutex
- * arg1 - Index of mutex
- * arg2 - opcode of exception to be generated or zero
- */
-Method(m388, 3, Serialized)
-{
- if (FL02) {
- Store(m21e("Release mutex, ", arg0, arg1), Local1)
-
- if (im00) {
- Concatenate("IMITATION: ", Local1, Local1)
- }
-
- if (arg2) {
- Concatenate(Local1, ", Exception expected", Local1)
- }
- Store(Local1, Debug)
- }
-
- if (im00) {
- /* Just imitation */
- return
- }
-
- Switch (ToInteger (arg0)) {
- Case (0) {
- ma10(arg1)
- }
- Case (1) {
- ma11(arg1)
- }
- Case (2) {
- ma12(arg1)
- }
- Case (3) {
- ma13(arg1)
- }
- Case (4) {
- ma14(arg1)
- }
- Case (5) {
- ma15(arg1)
- }
- Case (6) {
- ma16(arg1)
- }
- Case (7) {
- ma17(arg1)
- }
- Case (8) {
- ma18(arg1)
- }
- Case (9) {
- ma19(arg1)
- }
- Case (10) {
- ma1a(arg1)
- }
- Case (11) {
- ma1b(arg1)
- }
- Case (12) {
- ma1c(arg1)
- }
- Case (13) {
- ma1d(arg1)
- }
- Case (14) {
- ma1e(arg1)
- }
- Case (15) {
- ma1f(arg1)
- }
- }
-}
-
-/*
- * Acquire the range of mutexes from lower to upper levels (index 0)
- * arg0 - start level of mutex
- * arg1 - number of levels
- * arg2 - if non-zero - Axquire GL too
- * arg3 - non-zero means that we generate exceptional
- * condition on each Acquire. The non-zero value
- * means the opcode of exception.
- */
-Method(m38b, 4, Serialized)
-{
- Name(lpN0, 0)
- Name(lpC0, 0)
-
- if (arg2) {
- if (arg3) {
- CH03("m38b", z151, 0x000, 0, 0)
- }
- m36f(GLLL, GLIX, arg3, 0) // Acquire GL
- if (arg3) {
- CH04("m38b", 0, arg3, z151, 0x001, 0, 0)
- }
- }
-
- Store(arg1, lpN0)
- Store(arg0, lpC0)
- While (lpN0) {
-
- if (arg3) {
- CH03("m38b", z151, 0x000, 0, 0)
- }
- m36f(lpC0, 0, arg3, 0) // Acquire
- if (arg3) {
- CH04("m38b", 0, arg3, z151, 0x001, 0, 0)
- }
-
- Decrement(lpN0)
- Increment(lpC0)
- }
-}
-
-/*
- * Release the range of mutexes from upper to lower levels (index 0)
- * arg0 - start level of mutex
- * arg1 - number of levels
- * arg2 - if non-zero - Release GL too
- * arg3 - non-zero means that we generate exceptional
- * condition on each Acquire. The non-zero value
- * means the opcode of exception.
- */
-Method(m38c, 4, Serialized)
-{
- Name(lpN0, 0)
- Name(lpC0, 0)
-
- Store(0, Local7)
-
- Store(arg1, lpN0)
- Store(arg0, lpC0)
- While (lpN0) {
-
- if (arg3) {
- Store(LOr(CH03("m38b", z151, 0x000, 0, 0), Local7), Local7)
- }
- m388(lpC0, 0, 0) // Release
- if (arg3) {
- Store(LOr(CH04("m38b", 0, arg3, z151, 0x001, 0, 0), Local7), Local7)
- }
-
- Decrement(lpN0)
- Decrement(lpC0)
- }
-
- if (arg2) {
- if (arg3) {
- Store(LOr(CH03("m38b", z151, 0x000, 0, 0), Local7), Local7)
- }
- m388(GLLL, GLIX, 0) // Release GL
- if (arg3) {
- Store(LOr(CH04("m38b", 0, arg3, z151, 0x001, 0, 0), Local7), Local7)
- }
- }
-
- return (Local7)
-}
-
-/*
- * Acquire the range of mutexes
- *
- * arg0 - start level of mutex
- * arg1 - number of levels
- * arg2 - start index of mutex on level
- * arg3 - number of mutexes on the same level
- * arg4 - opcode of exception to be generated or zero
- * arg5 - repetition number
- * arg6 - opcode of TimeOutValue (see comment to ma00)
- */
-Method(m088, 7, Serialized)
-{
- Name(lpN0, 0) // level
- Name(lpC0, 0)
- Name(lpN1, 0) // index
- Name(lpC1, 0)
- Name(lpN2, 0) // repetition
- Name(lpC2, 0)
- Name(rpt0, 1)
-
- Name(exc0, 0) // exception is expected - opcode to pass to (m36f & CH04)
- Name(exc1, 0) // exception is expected - run (CH03 & CH04)
-
- Store(arg4, exc0)
- if (im00) {
- Store(0, exc1)
- } elseif (arg4) {
- Store(arg4, exc1)
- }
-
- if (arg5) {
- Store(arg5, rpt0)
- }
-
- Store(arg1, lpN0)
- Store(arg0, lpC0)
- While (lpN0) {
- Store(arg3, lpN1)
- Store(arg2, lpC1)
- While (lpN1) {
- Store(rpt0, lpN2)
- Store(0, lpC2)
- While (lpN2) {
- if (exc1) {
- CH03("m088", z151, 0x000, 0, 0)
- }
- m36f(lpC0, lpC1, exc0, arg6) // Acquire
- if (exc1) {
- CH04("m088", 0, exc0, z151, 0x001, 0, 0)
- }
- Decrement(lpN2)
- Increment(lpC2)
- }
- Decrement(lpN1)
- Increment(lpC1)
- }
- Decrement(lpN0)
- Increment(lpC0)
- }
-}
-
-/*
- * Release the range of mutexes
- *
- * arg0 - start level of mutex
- * arg1 - number of levels
- * arg2 - start index of mutex on level
- * arg3 - number of mutexes on the same level
- * arg4 - opcode of exception to be generated or zero
- * arg5 - repetition number
- *
- * arg6 - order of Releasing bitmap,
- * determinates the order of Releasing mutexes of the same level:
- * [0] - 0 - derect order
- * 1 - inverse order
- * [1] - 0 - don't replace the last index
- * 1 - replace the last index
- * [15:8] - the index of mutex to be the last in case of non-zero [1]
- *
- * Note: the bit [1] technique was added while investigating the anomaly
- * reflected by bug 242 "Releasing the mutex the first Acquired on
- * the non-zero level makes Releasing the residuary mutexes of that
- * level impossible".
- *
- * Examples:
- *
- * Acquired on the same level are mutexes of 0,1,2,3 indexes
- * Releasing for arg6 equal to:
- * 0x00 - 0123 (direct - the same order the mutexes were Acquired)
- * 01 - 3210 (inverse to Acquiring)
- * 22 - 0132 (direct + replace the last index, it becomes index 2)
- * 23 - 3102 (inverse + replace the last index, it becomes index 2)
- */
-Method(m089, 7, Serialized)
-{
- Name(lpN0, 0) // level
- Name(lpC0, 0)
- Name(lpN1, 0) // index
- Name(lpC1, 0)
- Name(lpN2, 0) // repetition
- Name(lpC2, 0)
- Name(rpt0, 1)
-
- Name(bg00, 0)
- Name(en00, 0)
-
- Name(inv0, 0) // sign of the inverse order
- Name(rpl0, 0) // to do replacing
- Name(lix0, 0) // value to be the last index
-
- Name(exc0, 0) // exception is expected - opcode to pass to (m36f & CH04)
- Name(exc1, 0) // exception is expected - run (CH03 & CH04)
-
- Store(arg4, exc0)
- if (im00) {
- Store(0, exc1)
- } elseif (arg4) {
- Store(arg4, exc1)
- }
-
- if (arg5) {
- Store(arg5, rpt0)
- }
-
- And(arg6, 0x01, inv0)
- And(arg6, 0x02, rpl0)
- And(arg6, 0xff00, lix0)
- ShiftRight(lix0, 8, lix0)
-
- Store(arg2, bg00)
- Add(arg2, arg3, en00)
- Decrement(en00)
-
- /* Inverse order of levels */
-
- Store(arg1, lpN0)
- Add(arg0, arg1, lpC0)
- Decrement(lpC0)
- While (lpN0) {
-
- if (inv0) {
-
- /* inverse order */
-
- Store(arg3, lpN1)
- Add(arg2, arg3, lpC1)
- Decrement(lpC1)
- While (lpN1) {
-
- Store(lpC1, Local0)
- if (rpl0) {
- if (LEqual(lpN1, 1)) {
- Store(lix0, Local0)
- } elseif (LLessEqual(lpC1, lix0)) {
- Subtract(lpC1, 1, Local0)
- }
- }
-
- Store(rpt0, lpN2)
- Store(0, lpC2)
- While (lpN2) {
-
- if (exc1) {
- CH03("m088", z151, 0x000, 0, 0)
- }
- m388(lpC0, Local0, exc0) // Release
- if (exc1) {
- CH04("m088", 0, exc0, z151, 0x001, 0, 0)
- }
-
- Decrement(lpN2)
- Increment(lpC2)
- }
-
- Decrement(lpN1)
- Decrement(lpC1)
- }
- } else {
-
- /* direct order */
-
- Store(arg3, lpN1)
- Store(arg2, lpC1)
- While (lpN1) {
-
- Store(lpC1, Local0)
- if (rpl0) {
- if (LEqual(lpN1, 1)) {
- Store(lix0, Local0)
- } elseif (LGreaterEqual(lpC1, lix0)) {
- Add(lpC1, 1, Local0)
- }
- }
-
- Store(rpt0, lpN2)
- Store(0, lpC2)
- While (lpN2) {
-
- if (exc1) {
- CH03("m088", z151, 0x000, 0, 0)
- }
- m388(lpC0, Local0, exc0) // Release
- if (exc1) {
- CH04("m088", 0, exc0, z151, 0x001, 0, 0)
- }
-
- Decrement(lpN2)
- Increment(lpC2)
- }
-
- Decrement(lpN1)
- Increment(lpC1)
- }
- }
-
- Decrement(lpN0)
- Decrement(lpC0)
- }
-}
-
-/*
- * Check that all mutexes are Released (don't check T804..)
- */
-Method(m08a)
-{
- m089(0, max0, 0, min0, 65, 0, 0) // AE_AML_MUTEX_NOT_ACQUIRED
-}
-
+/* + * Some or all of this work - Copyright (c) 2006 - 2014, 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. + */ + +/* + * Auxiliary routines to access mutexes + */ + +Name(z151, 151) + +/* + * For debugging: + * + * FL02 - print out Acquire/Release + * im00 - imitation of Acquire/Release (don't really run Acquire/Release) + */ +Name(FL02, 0) +Name(im00, 0) + +/* + * Acquire interval of mutexes + * + * arg0 - number of mutexes to Acquire (use not less than 1) + */ +Method(m36d, 1, Serialized) +{ + Name(ts, "m36d") + + if (LEqual(arg0, 0)) { + return + } + Store(Acquire(T000, 0xffff), Local0) + if (Local0) { + err(ts, z151, 1, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 1)) { + return + } + Store(Acquire(\_GL, 0xffff), Local0) + if (Local0) { + err(ts, z151, 2, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 2)) { + return + } + Store(Acquire(T100, 0xffff), Local0) + if (Local0) { + err(ts, z151, 3, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 3)) { + return + } + Store(Acquire(T200, 0xffff), Local0) + if (Local0) { + err(ts, z151, 4, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 4)) { + return + } + Store(Acquire(T300, 0xffff), Local0) + if (Local0) { + err(ts, z151, 5, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 5)) { + return + } + Store(Acquire(T400, 0xffff), Local0) + if (Local0) { + err(ts, z151, 6, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 6)) { + return + } + Store(Acquire(T500, 0xffff), Local0) + if (Local0) { + err(ts, z151, 7, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 7)) { + return + } + Store(Acquire(T600, 0xffff), Local0) + if (Local0) { + err(ts, z151, 8, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 8)) { + return + } + Store(Acquire(T700, 0xffff), Local0) + if (Local0) { + err(ts, z151, 9, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 9)) { + return + } + Store(Acquire(T800, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x00a, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 10)) { + return + } + Store(Acquire(T900, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x00b, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 11)) { + return + } + Store(Acquire(Ta00, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x00c, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 12)) { + return + } + Store(Acquire(Tb00, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x00d, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 13)) { + return + } + Store(Acquire(Tc00, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x00e, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 14)) { + return + } + Store(Acquire(Td00, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x00f, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 15)) { + return + } + Store(Acquire(Te00, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x010, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 16)) { + return + } + Store(Acquire(Tf00, 0xffff), Local0) + if (Local0) { + err(ts, z151, 0x011, 0, 0, 0, Local0) + } else { + if (LEqual(arg0, 17)) { + return + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} + +/* + * Release interval of mutexes + * + * arg0 - number of mutexes to Release (use not less than 1) + */ +Method(m36e, 1) +{ + if (LGreaterEqual(arg0, 17)) { + Release(Tf00) + } + if (LGreaterEqual(arg0, 16)) { + Release(Te00) + } + if (LGreaterEqual(arg0, 15)) { + Release(Td00) + } + if (LGreaterEqual(arg0, 14)) { + Release(Tc00) + } + if (LGreaterEqual(arg0, 13)) { + Release(Tb00) + } + if (LGreaterEqual(arg0, 12)) { + Release(Ta00) + } + if (LGreaterEqual(arg0, 11)) { + Release(T900) + } + if (LGreaterEqual(arg0, 10)) { + Release(T800) + } + if (LGreaterEqual(arg0, 9)) { + Release(T700) + } + if (LGreaterEqual(arg0, 8)) { + Release(T600) + } + if (LGreaterEqual(arg0, 7)) { + Release(T500) + } + if (LGreaterEqual(arg0, 6)) { + Release(T400) + } + if (LGreaterEqual(arg0, 5)) { + Release(T300) + } + if (LGreaterEqual(arg0, 4)) { + Release(T200) + } + if (LGreaterEqual(arg0, 3)) { + Release(T100) + } + if (LGreaterEqual(arg0, 2)) { + Release(\_GL) + } + if (LGreaterEqual(arg0, 1)) { + Release(T000) + } +} + +/* + * Acquire mutex + * + * arg0 - Level of mutex + * arg1 - Index of mutex + * arg2 - opcode of exception to be generated or zero + * arg3 - opcode of TimeOutValue (see comment to ma00) + */ +Method(m36f, 4, Serialized) +{ + Store(1, Local0) // Init with FAIL + + if (FL02) { + Store(m21e("Acquire mutex, ", arg0, arg1), Local1) + + if (im00) { + Concatenate("IMITATION: ", Local1, Local1) + } + + if (arg2) { + Concatenate(Local1, ", Exception expected", Local1) + } else { + Switch (ToInteger (arg3)) { + Case (5) { // TOV0 + Concatenate(Local1, ", tout 0", Local1) + } + Case (6) { // TOV1 + Concatenate(Local1, ", tout 1", Local1) + } + Default { + Concatenate(Local1, ", tout 0xffff", Local1) + } + } + } + Store(Local1, Debug) + } + + if (im00) { + /* Just imitation */ + return (0) + } + + Switch (ToInteger (arg0)) { + Case (0) { + Store(ma00(arg1, arg2, arg3), Local0) + } + Case (1) { + Store(ma01(arg1, arg2, arg3), Local0) + } + Case (2) { + Store(ma02(arg1, arg2, arg3), Local0) + } + Case (3) { + Store(ma03(arg1, arg2, arg3), Local0) + } + Case (4) { + Store(ma04(arg1, arg2, arg3), Local0) + } + Case (5) { + Store(ma05(arg1, arg2, arg3), Local0) + } + Case (6) { + Store(ma06(arg1, arg2, arg3), Local0) + } + Case (7) { + Store(ma07(arg1, arg2, arg3), Local0) + } + Case (8) { + Store(ma08(arg1, arg2, arg3), Local0) + } + Case (9) { + Store(ma09(arg1, arg2, arg3), Local0) + } + Case (10) { + Store(ma0a(arg1, arg2, arg3), Local0) + } + Case (11) { + Store(ma0b(arg1, arg2, arg3), Local0) + } + Case (12) { + Store(ma0c(arg1, arg2, arg3), Local0) + } + Case (13) { + Store(ma0d(arg1, arg2, arg3), Local0) + } + Case (14) { + Store(ma0e(arg1, arg2, arg3), Local0) + } + Case (15) { + Store(ma0f(arg1, arg2, arg3), Local0) + } + } + + if (LNot(arg2)) { + if (Local0) { + err("m36f", z151, 0x002, 0, 0, Local0, 0) + } + } + + return (Local0) +} + +/* + * Release mutex + * + * arg0 - Level of mutex + * arg1 - Index of mutex + * arg2 - opcode of exception to be generated or zero + */ +Method(m388, 3, Serialized) +{ + if (FL02) { + Store(m21e("Release mutex, ", arg0, arg1), Local1) + + if (im00) { + Concatenate("IMITATION: ", Local1, Local1) + } + + if (arg2) { + Concatenate(Local1, ", Exception expected", Local1) + } + Store(Local1, Debug) + } + + if (im00) { + /* Just imitation */ + return + } + + Switch (ToInteger (arg0)) { + Case (0) { + ma10(arg1) + } + Case (1) { + ma11(arg1) + } + Case (2) { + ma12(arg1) + } + Case (3) { + ma13(arg1) + } + Case (4) { + ma14(arg1) + } + Case (5) { + ma15(arg1) + } + Case (6) { + ma16(arg1) + } + Case (7) { + ma17(arg1) + } + Case (8) { + ma18(arg1) + } + Case (9) { + ma19(arg1) + } + Case (10) { + ma1a(arg1) + } + Case (11) { + ma1b(arg1) + } + Case (12) { + ma1c(arg1) + } + Case (13) { + ma1d(arg1) + } + Case (14) { + ma1e(arg1) + } + Case (15) { + ma1f(arg1) + } + } +} + +/* + * Acquire the range of mutexes from lower to upper levels (index 0) + * arg0 - start level of mutex + * arg1 - number of levels + * arg2 - if non-zero - Axquire GL too + * arg3 - non-zero means that we generate exceptional + * condition on each Acquire. The non-zero value + * means the opcode of exception. + */ +Method(m38b, 4, Serialized) +{ + Name(lpN0, 0) + Name(lpC0, 0) + + if (arg2) { + if (arg3) { + CH03("m38b", z151, 0x000, 0, 0) + } + m36f(GLLL, GLIX, arg3, 0) // Acquire GL + if (arg3) { + CH04("m38b", 0, arg3, z151, 0x001, 0, 0) + } + } + + Store(arg1, lpN0) + Store(arg0, lpC0) + While (lpN0) { + + if (arg3) { + CH03("m38b", z151, 0x000, 0, 0) + } + m36f(lpC0, 0, arg3, 0) // Acquire + if (arg3) { + CH04("m38b", 0, arg3, z151, 0x001, 0, 0) + } + + Decrement(lpN0) + Increment(lpC0) + } +} + +/* + * Release the range of mutexes from upper to lower levels (index 0) + * arg0 - start level of mutex + * arg1 - number of levels + * arg2 - if non-zero - Release GL too + * arg3 - non-zero means that we generate exceptional + * condition on each Acquire. The non-zero value + * means the opcode of exception. + */ +Method(m38c, 4, Serialized) +{ + Name(lpN0, 0) + Name(lpC0, 0) + + Store(0, Local7) + + Store(arg1, lpN0) + Store(arg0, lpC0) + While (lpN0) { + + if (arg3) { + Store(LOr(CH03("m38b", z151, 0x000, 0, 0), Local7), Local7) + } + m388(lpC0, 0, 0) // Release + if (arg3) { + Store(LOr(CH04("m38b", 0, arg3, z151, 0x001, 0, 0), Local7), Local7) + } + + Decrement(lpN0) + Decrement(lpC0) + } + + if (arg2) { + if (arg3) { + Store(LOr(CH03("m38b", z151, 0x000, 0, 0), Local7), Local7) + } + m388(GLLL, GLIX, 0) // Release GL + if (arg3) { + Store(LOr(CH04("m38b", 0, arg3, z151, 0x001, 0, 0), Local7), Local7) + } + } + + return (Local7) +} + +/* + * Acquire the range of mutexes + * + * arg0 - start level of mutex + * arg1 - number of levels + * arg2 - start index of mutex on level + * arg3 - number of mutexes on the same level + * arg4 - opcode of exception to be generated or zero + * arg5 - repetition number + * arg6 - opcode of TimeOutValue (see comment to ma00) + */ +Method(m088, 7, Serialized) +{ + Name(lpN0, 0) // level + Name(lpC0, 0) + Name(lpN1, 0) // index + Name(lpC1, 0) + Name(lpN2, 0) // repetition + Name(lpC2, 0) + Name(rpt0, 1) + + Name(exc0, 0) // exception is expected - opcode to pass to (m36f & CH04) + Name(exc1, 0) // exception is expected - run (CH03 & CH04) + + Store(arg4, exc0) + if (im00) { + Store(0, exc1) + } elseif (arg4) { + Store(arg4, exc1) + } + + if (arg5) { + Store(arg5, rpt0) + } + + Store(arg1, lpN0) + Store(arg0, lpC0) + While (lpN0) { + Store(arg3, lpN1) + Store(arg2, lpC1) + While (lpN1) { + Store(rpt0, lpN2) + Store(0, lpC2) + While (lpN2) { + if (exc1) { + CH03("m088", z151, 0x000, 0, 0) + } + m36f(lpC0, lpC1, exc0, arg6) // Acquire + if (exc1) { + CH04("m088", 0, exc0, z151, 0x001, 0, 0) + } + Decrement(lpN2) + Increment(lpC2) + } + Decrement(lpN1) + Increment(lpC1) + } + Decrement(lpN0) + Increment(lpC0) + } +} + +/* + * Release the range of mutexes + * + * arg0 - start level of mutex + * arg1 - number of levels + * arg2 - start index of mutex on level + * arg3 - number of mutexes on the same level + * arg4 - opcode of exception to be generated or zero + * arg5 - repetition number + * + * arg6 - order of Releasing bitmap, + * determinates the order of Releasing mutexes of the same level: + * [0] - 0 - derect order + * 1 - inverse order + * [1] - 0 - don't replace the last index + * 1 - replace the last index + * [15:8] - the index of mutex to be the last in case of non-zero [1] + * + * Note: the bit [1] technique was added while investigating the anomaly + * reflected by bug 242 "Releasing the mutex the first Acquired on + * the non-zero level makes Releasing the residuary mutexes of that + * level impossible". + * + * Examples: + * + * Acquired on the same level are mutexes of 0,1,2,3 indexes + * Releasing for arg6 equal to: + * 0x00 - 0123 (direct - the same order the mutexes were Acquired) + * 01 - 3210 (inverse to Acquiring) + * 22 - 0132 (direct + replace the last index, it becomes index 2) + * 23 - 3102 (inverse + replace the last index, it becomes index 2) + */ +Method(m089, 7, Serialized) +{ + Name(lpN0, 0) // level + Name(lpC0, 0) + Name(lpN1, 0) // index + Name(lpC1, 0) + Name(lpN2, 0) // repetition + Name(lpC2, 0) + Name(rpt0, 1) + + Name(bg00, 0) + Name(en00, 0) + + Name(inv0, 0) // sign of the inverse order + Name(rpl0, 0) // to do replacing + Name(lix0, 0) // value to be the last index + + Name(exc0, 0) // exception is expected - opcode to pass to (m36f & CH04) + Name(exc1, 0) // exception is expected - run (CH03 & CH04) + + Store(arg4, exc0) + if (im00) { + Store(0, exc1) + } elseif (arg4) { + Store(arg4, exc1) + } + + if (arg5) { + Store(arg5, rpt0) + } + + And(arg6, 0x01, inv0) + And(arg6, 0x02, rpl0) + And(arg6, 0xff00, lix0) + ShiftRight(lix0, 8, lix0) + + Store(arg2, bg00) + Add(arg2, arg3, en00) + Decrement(en00) + + /* Inverse order of levels */ + + Store(arg1, lpN0) + Add(arg0, arg1, lpC0) + Decrement(lpC0) + While (lpN0) { + + if (inv0) { + + /* inverse order */ + + Store(arg3, lpN1) + Add(arg2, arg3, lpC1) + Decrement(lpC1) + While (lpN1) { + + Store(lpC1, Local0) + if (rpl0) { + if (LEqual(lpN1, 1)) { + Store(lix0, Local0) + } elseif (LLessEqual(lpC1, lix0)) { + Subtract(lpC1, 1, Local0) + } + } + + Store(rpt0, lpN2) + Store(0, lpC2) + While (lpN2) { + + if (exc1) { + CH03("m088", z151, 0x000, 0, 0) + } + m388(lpC0, Local0, exc0) // Release + if (exc1) { + CH04("m088", 0, exc0, z151, 0x001, 0, 0) + } + + Decrement(lpN2) + Increment(lpC2) + } + + Decrement(lpN1) + Decrement(lpC1) + } + } else { + + /* direct order */ + + Store(arg3, lpN1) + Store(arg2, lpC1) + While (lpN1) { + + Store(lpC1, Local0) + if (rpl0) { + if (LEqual(lpN1, 1)) { + Store(lix0, Local0) + } elseif (LGreaterEqual(lpC1, lix0)) { + Add(lpC1, 1, Local0) + } + } + + Store(rpt0, lpN2) + Store(0, lpC2) + While (lpN2) { + + if (exc1) { + CH03("m088", z151, 0x000, 0, 0) + } + m388(lpC0, Local0, exc0) // Release + if (exc1) { + CH04("m088", 0, exc0, z151, 0x001, 0, 0) + } + + Decrement(lpN2) + Increment(lpC2) + } + + Decrement(lpN1) + Increment(lpC1) + } + } + + Decrement(lpN0) + Decrement(lpC0) + } +} + +/* + * Check that all mutexes are Released (don't check T804..) + */ +Method(m08a) +{ + m089(0, max0, 0, min0, 65, 0, 0) // AE_AML_MUTEX_NOT_ACQUIRED +} + |