summaryrefslogtreecommitdiff
path: root/tests/aslts/src/runtime/common/TCI/tcicmd.asl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/aslts/src/runtime/common/TCI/tcicmd.asl')
-rw-r--r--tests/aslts/src/runtime/common/TCI/tcicmd.asl905
1 files changed, 905 insertions, 0 deletions
diff --git a/tests/aslts/src/runtime/common/TCI/tcicmd.asl b/tests/aslts/src/runtime/common/TCI/tcicmd.asl
new file mode 100644
index 000000000..822f74b0a
--- /dev/null
+++ b/tests/aslts/src/runtime/common/TCI/tcicmd.asl
@@ -0,0 +1,905 @@
+/*
+ * Copyright (c) 2006, Intel Corp.
+ * Copyright (C) 2006, Valery Podrezov <valery.a.podrezov@intel.com>
+ * Copyright (C) 2006, Fiodor Suietov <fiodor.f.suietov@intel.com>
+ * 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.
+ */
+
+/*
+ * The Test Command Interface with the ACPICA (_TCI)
+ *
+ * Note: _TCI and TCI mean the same in comments below.
+ * But, actually the name of the relevant predefined
+ * Method is _TCI.
+ */
+
+Name(z128, 128)
+
+Name(DE00, 0) // Disable reporting errors from m3a4, needed in m3aa (not enough params)
+Name(FOPT, 0) // Flag of optimization
+
+
+/*
+ * Constants
+ */
+
+// Opcodes of the Test Commands provided by _TCI
+
+Name(c200, 0xcd0000) // _TCI-end statistics
+Name(c201, 0xcd0001) // _TCI-begin statistics
+Name(c202, 0xcd0002) // TCI_CMD_CHECK_SUPPORTED
+Name(c203, 0xcd0003) // TCI_CMD_GET_ID_OF_THREADS
+
+// Tags of commands (to be filled into TCI Package by aslts)
+
+Name(c208, 0xeeee0596) // TCI_TAG_GET_MC_STAT_AFTER_TCI_TERM
+Name(c209, 0xbbbb063a) // TCI_TAG_GET_MC_STAT_BEFORE_TCI_RUN
+Name(c20a, 0xcccc07b9) // TCI_TAG_CHECK_SUPPORTED
+Name(c20b, 0xdddd01f5) // TCI_TAG_GET_ID_OF_THREADS
+
+/*
+ * The layout of the Package for Memory Consumption Statistics
+ * applied for TCI commands:
+ * _TCI-end statistics (command TCI_CMD_GET_MC_STAT_AFTER_TCI_TERM)
+ * _TCI-begin statistics (command TCI_CMD_GET_MC_STAT_BEFORE_TCI_RUN)
+ */
+Name(c210, 0) // Tittle
+Name(c211, 4) // acq0
+Name(c212, 9) // acq1 (-)
+Name(c213, 14) // acq2 (-)
+Name(c214, 19) // acq3
+Name(c215, 24) // acq4 (-)
+Name(c216, 29) // acq5
+Name(c217, 34) // rel0
+Name(c218, 39) // rel1
+Name(c219, 44) // rel2 (-)
+Name(c21a, 49) // rel3
+Name(c21b, 54) // Created Objects
+Name(c21c, 84) // Deleted Objects
+Name(c21d, 114) // Miscellaneous Stat
+
+Name(c220, 121) // the length of the Package for
+ // Memory Consumption Statistics.
+
+// The layout of header of the common _TCI Package
+
+// Input, data of header passed to ACPICA
+Name(c222, 0) // Tag of command (to be set up by aslts)
+
+// Output, data of header returned to aslts from ACPICA
+Name(c223, 1) // Size (number of elements actually packed into TCI package,
+ // to be filled by ACPICA)
+Name(c224, 2) // Cmd (command has been executed, to be filled by ACPICA)
+Name(c225, 3) // CACHE_ENABLED (object cache is enabled info flag,
+ // to be filled by ACPICA)
+Name(c22b, 4) // length of the common _TCI Package header
+
+
+// The layout of header of TCI_CMD_GET_ID_OF_THREADS command
+// (returned to aslts from ACPICA)
+Name(c22c, 4) // TCI_PACKAGE_THR_NUM
+Name(c22d, 5) // TCI_PACKAGE_THR_NUM_REAL
+Name(c22e, 6) // TCI_PACKAGE_THR_ID
+Name(c22f, 7) // length TCI_PACKAGE_THR_HEADER_SIZE
+
+
+Name(c221, 5) // CACHE_LISTS_NUMBER (Object Caches):
+ // CLIST_ID_NAMESPACE 0 /* Acpi-Namespace */
+ // CLIST_ID_STATE 1 /* Acpi-State */
+ // CLIST_ID_OPERAND 2 /* Acpi-Operand */
+ // CLIST_ID_PSNODE 3 /* Acpi-Parse */
+ // CLIST_ID_PSNODE_EXT 4 /* Acpi-ParseExt */
+
+Name(c226, 0) // CLIST_ID_NAMESPACE
+Name(c227, 1) // CLIST_ID_STATE
+Name(c228, 2) // CLIST_ID_OPERAND
+Name(c229, 3) // CLIST_ID_PSNODE
+Name(c22a, 4) // CLIST_ID_PSNODE_EXT
+
+
+/*
+ * The main Test Command interface with the ACPICA
+ *
+ * arg0 - opcode of the Test Command
+ * arg1 - Package for different needs depending on the command.
+ * So, in case of the Memory Consumption Statistics commands it
+ * is filled by ACPICA with the Memory Consumption Statistics.
+ * The length of package in this case should be not less than c220,
+ * otherwise, no any failure arises but not all data are returned
+ * by Package just only the relevant part of it. It is true for all
+ * commands.
+ * Note: use m3a0 or m165 to prepare the arg1-package.
+ */
+Method(_TCI, 2)
+{
+ /*
+ * Before to run this method reset location
+ * of Command which is to be filled by ACPICA
+ * to acknowledge the interconnection.
+ * It is performed in m3a0 and m3a4.
+ */
+ return (arg1)
+}
+
+/*
+ * Create and initialize the Package for _TCI
+ *
+ * arg0 - opcode of the Test Command.
+ * Use 0 for allocation without initialization.
+ * arg1 - number of element of Package (for some of commands)
+ *
+ * Return the resulting Package:
+ *
+ * - if arg0 is zero - the Package of c220 length
+ * - otherwise - the Package of length depending on
+ * the command is additionally initialized
+ */
+Method(m165, 2)
+{
+ Name(num, 0)
+ Name(tag, 0)
+
+ if (arg0) {
+
+ Switch (arg0) {
+ Case (0xcd0000) {
+ // _TCI-end statistics
+ Store(c208, tag)
+ Store(c220, num)
+ }
+ Case (0xcd0001) {
+ // _TCI-begin statistics
+ Store(c209, tag)
+ Store(c220, num)
+ }
+ Case (0xcd0002) {
+ // TCI_CMD_CHECK_SUPPORTED
+ Store(c20a, tag)
+ Store(c22b, num)
+ }
+ Case (0xcd0003) {
+ // TCI_CMD_GET_ID_OF_THREADS
+ Store(c20b, tag)
+ Store(arg1, num)
+ }
+ Default {
+ err("m165", z128, 0, 0, 0, arg0, 0)
+ }
+ }
+
+ if (LLess(num, c22b)) {
+ err("m165", z128, 0, 0, 0, num, c22b)
+ } else {
+ Name(p000, Package(num) {})
+ Name(lpN0, 0)
+ Name(lpC0, 0)
+ Store(num, lpN0)
+ Store(0, lpC0)
+ While (lpN0) {
+ Store(0, Index(p000, lpC0))
+ Decrement(lpN0)
+ Increment(lpC0)
+ }
+ Store(tag, Index(p000, 0))
+ Return (p000)
+ }
+ } else {
+ Name(p001, Package(c220) {})
+ Return (p001)
+ }
+
+ Return (0)
+}
+
+/*
+ * Create and initialize the Package for simple cases
+ * entirely specified by the opcode of command.
+ *
+ * a. for Memory Consumption Statistics
+ * (_TCI-begin or _TCI-end statistics).
+ *
+ * b. TCI_CMD_CHECK_SUPPORTED
+ *
+ * arg0 - opcode of the Test Command.
+ * Use 0 for allocation without initialization.
+ *
+ * Returns the TCI Package
+ */
+Method(m3a0, 1)
+{
+ Store(m165(arg0, 0), Local0)
+
+ Return (Local0)
+}
+
+Method(m3a1, 2)
+{
+ Store(DeRefOf(Index(NMTP, arg1)), Local0)
+ Concatenate("", arg0, Local2)
+ Concatenate(Local2, " ", Local1)
+ Concatenate(Local1, Local0, Debug)
+}
+
+/*
+ * Print out the Memory Consumption Statistics Package
+ *
+ * arg0 - Memory Consumption Statistics Package
+ * arg1 - opcode of the tittle message
+ */
+Method(m3a2, 2)
+{
+ if (LEqual(arg1, 0)) {
+ Store("==== _TCI-end statistics", Debug)
+ } elseif (LEqual(arg1, 1)) {
+ Store("==== _TCI-begin statistics", Debug)
+ } elseif (LEqual(arg1, 2)) {
+ Store("==== _TCI-end-begin difference", Debug)
+ } else {
+ Store("???", Debug)
+ }
+
+ Name(lpN0, 0)
+ Name(lpC0, 0)
+
+ Store(c220, lpN0)
+ Store(0, lpC0)
+
+ Store(0, Local1)
+ Store(0, Local2)
+
+ While (lpN0) {
+
+ if (LEqual(lpC0, c210)) {
+ Store("Tittle:", Debug)
+ } elseif (LEqual(lpC0, c211)) {
+ Store("acq0: all calls to AcpiUtAcquireFromCache", Debug)
+ } elseif (LEqual(lpC0, c212)) {
+ Store("acq1: +AcpiUtAcquireMutex", Debug)
+ } elseif (LEqual(lpC0, c213)) {
+ Store("acq2: +there is a cache object available", Debug)
+ } elseif (LEqual(lpC0, c214)) {
+ Store("acq3: +AcpiUtReleaseMutex", Debug)
+ } elseif (LEqual(lpC0, c215)) {
+ Store("acq4: +otherwise, the cache is empty, create a new object", Debug)
+ } elseif (LEqual(lpC0, c216)) {
+ Store("acq5: +AcpiUtReleaseMutex", Debug)
+ } elseif (LEqual(lpC0, c217)) {
+ Store("rel0: all calls to AcpiUtReleaseToCache", Debug)
+ } elseif (LEqual(lpC0, c218)) {
+ Store("rel1: +walk cache is full, just free this object", Debug)
+ } elseif (LEqual(lpC0, c219)) {
+ Store("rel2: +otherwise, put this object back into the cache", Debug)
+ } elseif (LEqual(lpC0, c21a)) {
+ Store("rel3: +AcpiUtAcquireMutex", Debug)
+ } elseif (LEqual(lpC0, c21b)) {
+ Store("Created Objects:", Debug)
+ } elseif (LEqual(lpC0, c21c)) {
+ Store("Deleted Objects:", Debug)
+ } elseif (LEqual(lpC0, c21d)) {
+ Store("Miscellaneous Stat:", Debug)
+ }
+
+ if (LGreaterEqual(lpC0, c21d)) {
+ Store(DerefOf(Index(arg0, lpC0)), Debug)
+ } elseif (LGreaterEqual(lpC0, c21c)) {
+ Store(DerefOf(Index(arg0, lpC0)), Local0)
+ m3a1(Local0, Local1)
+ Increment(Local1)
+ } elseif (LGreaterEqual(lpC0, c21b)) {
+ Store(DerefOf(Index(arg0, lpC0)), Local0)
+ m3a1(Local0, Local2)
+ Increment(Local2)
+ } else {
+ Store(DerefOf(Index(arg0, lpC0)), Debug)
+ }
+
+ Decrement(lpN0)
+ Increment(lpC0)
+ }
+}
+
+/*
+ * Calculate the difference between the two
+ * Memory Consumption Statistics Packages.
+ *
+ * arg0 - Package of _TCI-end statistics
+ * arg1 - Package of _TCI-begin statistics
+ * arg2 - Package for _TCI-end-begin difference
+ */
+Method(m3a3, 3)
+{
+ Name(lpN0, 0)
+ Name(lpC0, 0)
+
+ Store(c220, lpN0)
+ Store(0, lpC0)
+
+ While (lpN0) {
+ Store(DerefOf(Index(arg0, lpC0)), Local0)
+ Store(DerefOf(Index(arg1, lpC0)), Local1)
+ Subtract(Local1, Local0, Local2)
+ Store(Local2, Index(arg2, lpC0))
+
+ Decrement(lpN0)
+ Increment(lpC0)
+ }
+}
+
+/*
+ * Verify difference of Memory Consumption Statistics between
+ * two points: _TCI-end statistics and _TCI-begin statistics
+ * (and reset locations of Command of arg0 and arg1 Packages
+ * for the following run).
+ *
+ * Check that the Memory Consumption Statistics measured at the first point
+ * as '_TCI-end statistics' was then changed as expected to the second point
+ * where statistics was measured as '_TCI-begin statistics'. Between these
+ * two points we initiate some AML activity which involves the memory
+ * consumption acquire/release to be then analyzed and verified.
+ *
+ *
+ * arg0 - Package of _TCI-end statistics
+ * arg1 - Package of _TCI-begin statistics
+ * arg2 - Package for _TCI-end-begin difference
+ * arg3 - Package with the benchmark information on Created Objects
+ * arg4 - Package with the benchmark information on Deleted Objects
+ * (if non-Package, then arg3 is used)
+ * arg5 - Package with the benchmark information on memory acq0 and rel0
+ * (if non-Package, then compare acq0 and rel0 of arg2,
+ * otherwise, arg5 is a Package with the expected per-memory
+ * type differencies, expected: acq0[i] - rel0[i] = arg5[i])
+ * arg6 - index of checking (inside the file)
+ *
+ * Return:
+ * 0 - success
+ * 1 - incorrect Memory Consumption Statistics encountered
+ * otherwise - failed to determine the Memory Consumption Statistics
+ *
+ * See: the time of execution can be reduced (design and use additional flags):
+ * - exclude initialization before each operation
+ * (ACPICA writes all elements, benchmarks for the
+ * following sub-test mostly differ previous ones)
+ * - restrict checkings (use flag) by the acq0 & rel0,
+ * and add & del.
+ */
+Method(m3a4, 7)
+{
+
+ // Flag of printing
+ Name(pr1, 0)
+ Name(pr2, 0)
+
+ Name(lpN0, 0)
+ Name(lpC0, 0)
+
+ if (pr1) {
+ m3a2(arg0, 0)
+ m3a2(arg1, 1)
+ }
+
+ if (pr2) {
+ m3a2(arg2, 2)
+ }
+
+ Store(0, Local7)
+
+
+ // Check headers of Packages
+
+
+ if (m3a6(arg0, 0, arg6)) {
+ Store(2, Local7)
+ }
+
+ if (m3a6(arg1, 1, arg6)) {
+ Store(2, Local7)
+ }
+
+
+ // Check statistics specified by index
+
+
+ if (m3a7(arg0, 0, arg6)) {
+ Store(2, Local7)
+ }
+
+ if (m3a7(arg1, 0, arg6)) {
+ Store(2, Local7)
+ }
+
+ if (m3a7(arg2, 1, arg6)) {
+ Store(2, Local7)
+ }
+
+
+ /*
+ * acq0 and rel0 of arg2-difference
+ * are to be equal each to another
+ * (or correspond to arg5):
+ */
+
+
+ if (LEqual(ObjectType(arg5), c00c)) {
+ Store(c211, Local0)
+ Store(c217, Local1)
+ Store(0, Local4)
+
+ Store(c221, lpN0)
+ Store(0, lpC0)
+ While (lpN0) {
+ Store(DerefOf(Index(arg2, Local0)), Local2)
+ Store(DerefOf(Index(arg2, Local1)), Local3)
+ Store(DerefOf(Index(arg5, Local4)), Local5)
+
+ Subtract(Local2, Local3, Local6)
+
+ if (LNotEqual(Local6, Local5)) {
+ if (LNot(DE00)) {
+ err("m3a4", z128, 1, 0, arg6, Local6, Local5)
+ Store(lpC0, Debug)
+ Store(Local0, Debug)
+ Store(Local1, Debug)
+ Store(Local4, Debug)
+ Store(Local2, Debug)
+ Store(Local3, Debug)
+ Store(Local5, Debug)
+ Store(Local6, Debug)
+ }
+ Store(1, Local7)
+ }
+
+ Increment(Local0)
+ Increment(Local1)
+ Increment(Local4)
+
+ Decrement(lpN0)
+ Increment(lpC0)
+ }
+ } else {
+ Store(c211, Local0)
+ Store(c217, Local1)
+ Store(c221, lpN0)
+ Store(0, lpC0)
+ While (lpN0) {
+ Store(DerefOf(Index(arg2, Local0)), Local2)
+ Store(DerefOf(Index(arg2, Local1)), Local3)
+ if (LNotEqual(Local2, Local3)) {
+ if (LNot(DE00)) {
+ err("m3a4", z128, 2, 0, arg6, Local2, Local3)
+ }
+ Store(1, Local7)
+ }
+ Increment(Local0)
+ Increment(Local1)
+ Decrement(lpN0)
+ Increment(lpC0)
+ }
+ }
+
+
+ // arg2-difference: acq0 == acq3 + acq5
+
+
+ Store(c211, Local0)
+ Store(c214, Local1)
+ Store(c216, Local2)
+
+ Store(c221, lpN0)
+ Store(0, lpC0)
+
+ While (lpN0) {
+ Store(DerefOf(Index(arg2, Local0)), Local3)
+ Store(DerefOf(Index(arg2, Local1)), Local4)
+ Store(DerefOf(Index(arg2, Local2)), Local5)
+ Add(Local4, Local5, Local6)
+ if (LNotEqual(Local3, Local6)) {
+ if (LNot(DE00)) {
+ err("m3a4", z128, 3, 0, arg6, Local3, Local6)
+ }
+ Store(1, Local7)
+ }
+ Increment(Local0)
+ Increment(Local1)
+ Increment(Local2)
+
+ Decrement(lpN0)
+ Increment(lpC0)
+ }
+
+
+ // arg2-difference: rel0 == rel1 + rel3
+
+
+ Store(c217, Local0)
+ Store(c218, Local1)
+ Store(c21a, Local2)
+
+ Store(c221, lpN0)
+ Store(0, lpC0)
+
+ While (lpN0) {
+ Store(DerefOf(Index(arg2, Local0)), Local3)
+ Store(DerefOf(Index(arg2, Local1)), Local4)
+ Store(DerefOf(Index(arg2, Local2)), Local5)
+ Add(Local4, Local5, Local6)
+ if (LNotEqual(Local3, Local6)) {
+ if (LNot(DE00)) {
+ err("m3a4", z128, 4, 0, arg6, Local3, Local6)
+ }
+ Store(1, Local7)
+ }
+ Increment(Local0)
+ Increment(Local1)
+ Increment(Local2)
+
+ Decrement(lpN0)
+ Increment(lpC0)
+ }
+
+
+ // Check, created Objects are identical to the benchmark ones
+
+
+ if (LEqual(ObjectType(arg3), c00c)) {
+
+ Store(c027, lpN0)
+ Store(c21b, Local0)
+ Store(0, Local1)
+ While (lpN0) {
+ Store(DerefOf(Index(arg2, Local0)), Local2)
+ Store(DerefOf(Index(arg3, Local1)), Local3)
+ if (LNotEqual(Local2, Local3)) {
+ if (LNot(DE00)) {
+ err("m3a4", z128, 5, 0, arg6, Local2, Local3)
+ }
+ Store(1, Local7)
+ }
+
+ Increment(Local0)
+ Increment(Local1)
+
+ Decrement(lpN0)
+ }
+ }
+
+
+ // Check, deleted Objects are identical to the benchmark ones
+
+
+ Store(c027, lpN0)
+
+ Store(c21c, Local0)
+ Store(0, Local1)
+ Store(0, Local4)
+
+ if (Lequal(ObjectType(arg4), c00c)) {
+ Store(arg4, Local4)
+ } elseif (Lequal(ObjectType(arg3), c00c)) {
+ Store(arg3, Local4)
+ }
+
+ if (Lequal(ObjectType(Local4), c00c)) {
+ While (lpN0) {
+ Store(DerefOf(Index(arg2, Local0)), Local2)
+ Store(DerefOf(Index(Local4, Local1)), Local3)
+ if (LNotEqual(Local2, Local3)) {
+ if (LNot(DE00)) {
+ err("m3a4", z128, 6, 0, arg6, Local2, Local3)
+ }
+ Store(1, Local7)
+ }
+
+ Increment(Local0)
+ Increment(Local1)
+
+ Decrement(lpN0)
+ }
+ }
+
+ /*
+ * Reset locations of Command of arg0 and arg1
+ * Packages for the following run.
+ * Store(0, Index(arg0, c224))
+ * Store(0, Index(arg1, c224))
+ */
+
+ return (Local7)
+}
+
+/*
+ * Return non-zero in case the Test Command interface
+ * with the ACPICA (_TCI) is supported.
+ */
+Method(m3a5)
+{
+ Store(m3a0(c202), Local0) // TCI_CMD_CHECK_SUPPORTED
+
+ _TCI(c202, Local0)
+
+ Store(DerefOf(Index(Local0, c224)), Local1)
+
+ if (LNotEqual(Local1, c202)) {
+ return (0)
+ }
+
+ return (1)
+}
+
+/*
+ * Check header of Memory Consumption Statistics Package
+ * arg0 - Memory Consumption Statistics Package
+ * arg1 - Means:
+ * 0 - _TCI-end statistics
+ * otherwise - _TCI-begin statistics
+ * arg2 - index of checking (inside the file)
+ */
+Method(m3a6, 3)
+{
+ Store(0, Local7)
+
+ // Tag of command
+
+ if (arg1) {
+ Store(c209, Local0)
+ } else {
+ Store(c208, Local0)
+ }
+
+ Store(DerefOf(Index(arg0, 0)), Local1)
+ if (LNotEqual(Local1, Local0)) {
+ err("m3a6", z128, 7, 0, arg2, Local1, Local0)
+ Store(1, Local7)
+ }
+
+ // Number of elements actually packed
+
+ Store(DerefOf(Index(arg0, 1)), Local1)
+ if (LNotEqual(Local1, c220)) {
+ err("m3a6", z128, 8, 0, arg2, Local1, c220)
+ Store(1, Local7)
+ }
+
+ // Command has been executed
+
+ if (arg1) {
+ Store(c201, Local0)
+ } else {
+ Store(c200, Local0)
+ }
+
+ Store(DerefOf(Index(arg0, 2)), Local1)
+ if (LNotEqual(Local1, Local0)) {
+ err("m3a6", z128, 9, 0, arg2, Local1, Local0)
+ Store(1, Local7)
+ }
+
+ // Object cache is enabled
+
+ Store(DerefOf(Index(arg0, 3)), Local1)
+ if (LNot(Local1)) {
+ err("m3a6", z128, 10, 0, arg2, Local1, 1)
+ Store(1, Local7)
+ }
+
+ return (Local7)
+}
+
+/*
+ * Check statistics specified by index
+ *
+ * arg0 - Memory Consumption Statistics Package
+ * arg1 - Means:
+ * non-zero - _TCI-end-begin difference Package
+ * otherwise - usual Memory Consumption Statistics Package
+ * arg2 - index of checking (inside the file)
+ */
+Method(m3a7, 3)
+{
+ Store(0, Local7)
+
+ if (arg1) {
+
+/*
+ // ACPI_STAT_SUCCESS_FREE == ACPI_STAT_SUCCESS_ALLOC
+
+ Add(c21d, 5, Local0)
+ Store(DerefOf(Index(arg0, Local0)), Local1)
+ Increment(Local0)
+ Store(DerefOf(Index(arg0, Local0)), Local2)
+
+ if (LNotEqual(Local2, Local1)) {
+ err("m3a7", z128, 11, 0, arg2, Local2, Local1)
+ Store(1, Local7)
+ }
+*/
+
+ } else {
+
+ // ACPI_STAT_INVALID_EXBUF
+
+ Store(c21d, Local0)
+ Store(DerefOf(Index(arg0, Local0)), Local1)
+ if (Local1) {
+ err("m3a7", z128, 12, 0, arg2, Local1, 0)
+ Store(1, Local7)
+ }
+
+ // ACPI_STAT_ZONE0_CORRUPTED
+
+ Increment(Local0)
+ Store(DerefOf(Index(arg0, Local0)), Local1)
+ if (Local1) {
+ err("m3a7", z128, 13, 0, arg2, Local1, 0)
+ Store(1, Local7)
+ }
+
+ // ACPI_STAT_ZONE1_CORRUPTED
+
+ Increment(Local0)
+ Store(DerefOf(Index(arg0, Local0)), Local1)
+ if (Local1) {
+ err("m3a7", z128, 14, 0, arg2, Local1, 0)
+ Store(1, Local7)
+ }
+
+ // ACPI_STAT_FAILED_ALLOC
+
+ Increment(Local0)
+ Store(DerefOf(Index(arg0, Local0)), Local1)
+ if (Local1) {
+ err("m3a7", z128, 15, 0, arg2, Local1, 0)
+ Store(1, Local7)
+ }
+
+ // ACPI_STAT_NULL_FREE
+
+ Increment(Local0)
+ Store(DerefOf(Index(arg0, Local0)), Local1)
+ if (Local1) {
+ err("m3a7", z128, 16, 0, arg2, Local1, 0)
+ Store(1, Local7)
+ }
+ }
+
+ return (Local7)
+}
+
+/*
+ * Create and initialize the sample Package for the
+ * per-object type benchmark Memory Consumption Statistics
+ */
+Method(m3a8)
+{
+ Name(p000, Package() {
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,
+ 0,0})
+
+ return (p000)
+}
+
+/*
+ * Create and initialize the sample Package for the
+ * per-memory type benchmark Memory Consumption Statistics
+ */
+Method(m3a9)
+{
+ Name(p000, Package() {0,0,0,0,0,0,0})
+
+ return (p000)
+}
+
+/*
+ * Determine the flag of optimization: check that
+ * processing of the Add operation corresponds to
+ * the expectation: optimized/non-optimized.
+ *
+ * Mode of run, optimized/non-optimized, is essential
+ * for this kind tests (memory consumption).
+ *
+ * arg0 - Means:
+ * 0 - check for Optimization is tuned off
+ * otherwise - check for Optimization is tuned on
+ */
+Method(m3aa)
+{
+ Name(i000, 0)
+ Name(p000, Package(1) {})
+ Name(p00b, Package(1) {})
+
+ Store(0xff, FOPT)
+
+ Store(m3a0(c200), Local0) // _TCI-end statistics
+ Store(m3a0(c201), p00b) // _TCI-begin statistics
+ Store(m3a0(0), Local1) // difference
+
+ _TCI(c200, Local0)
+ Store(Add(3, 4), i000)
+ _TCI(c201, p00b)
+
+ m3a3(Local0, p00b, Local1)
+
+ // Statistics expected in case Optimization is tuned off
+ Store(m3a8(), p000)
+ Store(4, Index(p000, c009)) // Integer
+
+ Store(1, DE00)
+ Store(m3a4(Local0, p00b, Local1, p000, 0, 0, 0), Local6)
+ Store(0, DE00)
+
+ if (LEqual(Local6, 2)) {
+ Store("Failed to determine the flag of optimization", Debug)
+ return
+ } else {
+ // Statistics expected in case Optimization is tuned on
+ Store(m3a8(), p000)
+ Store(1, Index(p000, c009)) // Integer
+
+ Store(1, DE00)
+ Store(m3a4(Local0, p00b, Local1, p000, 0, 0, 1), Local7)
+ Store(0, DE00)
+
+ if (LEqual(Local7, 2)) {
+ Store("Failed to determine the flag of optimization", Debug)
+ return
+ }
+ }
+
+ if (LEqual(Local6, Local7)) {
+ Store("Internal error 0", Debug)
+ err("m3aa", z128, 17, 0, 0, Local6, Local7)
+ } elseif (Local6) {
+ Store(1, FOPT)
+ } else {
+ Store(0, FOPT)
+ }
+}
+
+/*
+ * Return Package with the array of thread indexes
+ * otherwise Integer 0.
+ *
+ * arg0 - number of threads
+ */
+Method(m163, 1)
+{
+ Name(size, 0)
+
+ Add(c22f, arg0, size)
+
+ Store(m165(c203, size), Local0) // TCI_CMD_GET_ID_OF_THREADS
+
+ _TCI(c203, Local0)
+
+ Store(DerefOf(Index(Local0, c224)), Local1)
+
+ if (LNotEqual(Local1, c203)) {
+ return (0)
+ }
+
+ return (Local0)
+}