1    /*
2     * Some or all of this work - Copyright (c) 2006 - 2021, 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     * Common use Methods
30     */
31    /*
32     * Verification of Package
33     *
34     * arg0 - Package
35     * arg1 - size of Package
36     * arg2 - size of pre-initialized area
37     * arg3 - index of area to be written
38     * arg4 - size of area to be written
39     * arg5 - maximal number of pre-initialized elements to be verified
40     * arg6 - maximal number of written elements to be verified
41     */
42    Method (MD6A, 7, Serialized)
43    {
44        Name (LPN0, 0x00)
45        Name (LPC0, 0x00)
46        /* Writing */
47
48        If (Arg4)
49        {
50            LPN0 = Arg4
51            LPC0 = Arg3
52            While (LPN0)
53            {
54                TRC0 (Arg0, LPC0, LPC0)
55                Arg0 [LPC0] = LPC0 /* \MD6A.LPC0 */
56                LPN0--
57                LPC0++
58            }
59        }
60
61        /* Verifying pre-initialized area */
62
63        If ((Arg2 && Arg5))
64        {
65            If ((Arg2 < Arg5))
66            {
67                Arg5 = Arg2
68            }
69
70            LPN0 = Arg5
71            LPC0 = 0x00
72            While (LPN0)
73            {
74                Local0 = DerefOf (Arg0 [LPC0])
75                TRC1 (Arg0, LPC0, Local0)
76                If ((Local0 != LPC0))
77                {
78                    ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local0, LPC0)
79                }
80
81                LPN0--
82                LPC0++
83            }
84        }
85
86        If (Arg2)
87        {
88            /* First pre-initialized element */
89
90            Local0 = DerefOf (Arg0 [0x00])
91            TRC1 (Arg0, 0x00, Local0)
92            If ((Local0 != 0x00))
93            {
94                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local0, 0x00)
95            }
96
97            /* Last pre-initialized element */
98
99            Local0 = (Arg2 - 0x01)
100            Local1 = DerefOf (Arg0 [Local0])
101            TRC1 (Arg0, Local0, Local1)
102            If ((Local1 != Local0))
103            {
104                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local1, Local0)
105            }
106
107            /* Middle pre-initialized element */
108
109            Divide (Arg2, 0x02, Local1, Local0)
110            Local1 = DerefOf (Arg0 [Local0])
111            TRC1 (Arg0, Local0, Local1)
112            If ((Local1 != Local0))
113            {
114                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local1, Local0)
115            }
116        }
117
118        /* Verifying written area */
119
120        If ((Arg4 && Arg6))
121        {
122            If ((Arg4 < Arg6))
123            {
124                Arg6 = Arg4
125            }
126
127            LPN0 = Arg6
128            LPC0 = Arg3
129            While (LPN0)
130            {
131                Local0 = DerefOf (Arg0 [LPC0])
132                TRC1 (Arg0, LPC0, Local0)
133                If ((Local0 != LPC0))
134                {
135                    ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local0, LPC0)
136                }
137
138                LPN0--
139                LPC0++
140            }
141        }
142
143        If (Arg4)
144        {
145            /* First written element */
146
147            Local0 = DerefOf (Arg0 [Arg3])
148            TRC1 (Arg0, Arg3, Local0)
149            If ((Local0 != Arg3))
150            {
151                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local0, Arg3)
152            }
153
154            /* Last written element */
155
156            Local0 = (Arg3 + Arg4)
157            Local0--
158            Local1 = DerefOf (Arg0 [Local0])
159            TRC1 (Arg0, Local0, Local1)
160            If ((Local1 != Local0))
161            {
162                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local1, Local0)
163            }
164
165            /* Middle written element */
166
167            Divide (Arg4, 0x02, Local0, Local1)
168            Local0 = (Arg3 + Local1)
169            Local1 = DerefOf (Arg0 [Local0])
170            TRC1 (Arg0, Local0, Local1)
171            If ((Local1 != Local0))
172            {
173                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local1, Local0)
174            }
175        }
176
177        /* Check exception on access to the uninitialized element */
178
179        If ((Arg2 < Arg1))
180        {
181            If (Arg4)
182            {
183                If ((Arg3 > Arg2))
184                {
185                    /* Just after pre-initialized area */
186
187                    TRC1 (Arg0, Arg2, 0xF0F0F0F0)
188                    Store (Arg0 [Arg2], Local0)
189                    CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
190                    Local1 = DerefOf (Local0)
191                    CH04 (__METHOD__, 0x01, 0x33, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_UNINITIALIZED_ELEMENT */
192                    /* Just before written area */
193
194                    Local1 = (Arg3 - 0x01)
195                    TRC1 (Arg0, Local1, 0xF0F0F0F0)
196                    Store (Arg0 [Local1], Local0)
197                    CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
198                    Local1 = DerefOf (Local0)
199                    CH04 (__METHOD__, 0x01, 0x33, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_UNINITIALIZED_ELEMENT */
200                }
201
202                /* Just after pre-initialized and written areas */
203
204                Local7 = (Arg3 + Arg4)
205                If ((Arg2 > Local7))
206                {
207                    Local7 = Arg2
208                }
209
210                If ((Local7 < Arg1))
211                {
212                    TRC1 (Arg0, Local7, 0xF0F0F0F0)
213                    Store (Arg0 [Local7], Local0)
214                    CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
215                    Local1 = DerefOf (Local0)
216                    CH04 (__METHOD__, 0x01, 0x33, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_UNINITIALIZED_ELEMENT */
217                    /* Last element of Package */
218
219                    Local1 = (Arg1 - 0x01)
220                    TRC1 (Arg0, Local1, 0xF0F0F0F0)
221                    Store (Arg0 [Local1], Local0)
222                    CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
223                    Local1 = DerefOf (Local0)
224                    CH04 (__METHOD__, 0x01, 0x33, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_UNINITIALIZED_ELEMENT */
225                }
226            }
227            Else
228            {
229                /* Just after pre-initialized area */
230
231                TRC1 (Arg0, Arg2, 0xF0F0F0F0)
232                Store (Arg0 [Arg2], Local0)
233                CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
234                Local1 = DerefOf (Local0)
235                CH04 (__METHOD__, 0x01, 0x33, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_UNINITIALIZED_ELEMENT */
236                /* Last element of Package */
237
238                Local1 = (Arg1 - 0x01)
239                TRC1 (Arg0, Local1, 0xF0F0F0F0)
240                Store (Arg0 [Local1], Local0)
241                CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
242                Local1 = DerefOf (Local0)
243                CH04 (__METHOD__, 0x01, 0x33, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_UNINITIALIZED_ELEMENT */
244            }
245        }
246
247        /* Check exception on out of Package access */
248
249        TRC1 (Arg0, Arg1, 0xF0F0F0F0)
250        CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
251        Local0 = Arg0 [Arg1]
252        CH04 (__METHOD__, 0x00, 0x37, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_PACKAGE_LIMIT */
253        Local7 = (Arg1 + 0x01)
254        If ((Local7 >= Arg1))
255        {
256            TRC1 (Arg0, Local7, 0xF0F0F0F0)
257            CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
258            Local0 = Arg0 [Local7]
259            CH04 (__METHOD__, 0x00, 0x37, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_PACKAGE_LIMIT */
260        }
261
262        If ((0xFFFFFFFFFFFFFFFF >= Arg1))
263        {
264            TRC1 (Arg0, 0xFFFFFFFFFFFFFFFF, 0xF0F0F0F0)
265            CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
266            Local0 = Arg0 [0xFFFFFFFFFFFFFFFF]
267            CH04 (__METHOD__, 0x00, 0x37, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_PACKAGE_LIMIT */
268        }
269
270        /* Check near the maximal bound of a simple Package */
271        /* (not VarPackage) - 254, 255, 256, 257 elements: */
272        MD6B (Arg0, Arg1, Arg2, Arg3, Arg4, 0xFE)
273        MD6B (Arg0, Arg1, Arg2, Arg3, Arg4, 0xFF)
274        MD6B (Arg0, Arg1, Arg2, Arg3, Arg4, 0x0100)
275        MD6B (Arg0, Arg1, Arg2, Arg3, Arg4, 0x0101)
276        TRC2 ("The test run up to the end")
277    }
278
279    /*
280     * Verification of Package
281     *
282     * arg0 - Package
283     * arg1 - size of Package
284     * arg2 - size of pre-initialized area
285     * arg3 - index of area to be written
286     * arg4 - size of area to be written
287     * arg5 - index of element of Package to be verified
288     */
289    Method (MD6B, 6, NotSerialized)
290    {
291        Local7 = 0x00
292        If ((Arg5 < Arg2))
293        {
294            Local7 = 0x01
295        }
296        ElseIf ((Arg5 >= Arg3))
297        {
298            Local0 = (Arg3 + Arg4)
299            If ((Arg5 < Local0))
300            {
301                Local7 = 0x01
302            }
303        }
304
305        If (Local7)
306        {
307            /* Was initialized */
308
309            CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
310            Local0 = DerefOf (Arg0 [Arg5])
311            TRC1 (Arg0, Arg5, Local0)
312            If ((Local0 != Arg5))
313            {
314                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local0, Arg5)
315            }
316
317            CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
318        }
319        ElseIf ((Arg5 < Arg1))
320        {
321            /* Check exception on access to the uninitialized element */
322
323            TRC1 (Arg0, Arg5, 0xF0F0F0F0)
324            Store (Arg0 [Arg5], Local0)
325            CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
326            Local1 = DerefOf (Local0)
327            CH04 (__METHOD__, 0x01, 0x33, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_UNINITIALIZED_ELEMENT */
328        }
329        Else
330        {
331            /* Check exception on out of Package access */
332
333            TRC1 (Arg0, Arg5, 0xF0F0F0F0)
334            CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
335            Local0 = Arg0 [Arg5]
336            CH04 (__METHOD__, 0x00, 0x37, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_PACKAGE_LIMIT */
337        }
338    }
339
340    /*
341     * Check, register errors and reset the global level
342     * execution exception AE_AML_DIVIDE_BY_ZERO caused in
343     * demo-test of bug 162.
344     */
345    Method (MD7D, 0, NotSerialized)
346    {
347        ID01 = 0x00
348        Local0 = ERRS /* \ERRS */
349        /*
350         * Slacken expectations:
351         *
352         * - check opcode of the FIRST exception
353         * - number of exceptions NOT GREATER than two
354         */
355        /* Check opcode of the first exception */
356        CH04 (__METHOD__, 0x01, 0x38, 0x00, __LINE__, 0x00, 0x00) /* AE_AML_DIVIDE_BY_ZERO */
357        /* Number of exceptions not greater than two */
358
359        If ((EXC1 > 0x02))
360        {
361            ID01 = 0x01
362        }
363
364        /* Reset the number of exceptions */
365
366        EXC1 = 0x00
367        If ((ERRS != Local0))
368        {
369            ID01 = 0x01
370        }
371
372        CH03 (__METHOD__, 0x00, __LINE__, 0x00, 0x00)
373        Return (0x01)
374    }
375
376    /*
377     * Check result
378     * arg0 - result
379     * arg1 - expected type of result
380     * arg2 - expected result
381     * arg3 - index of checking
382     * arg4 - index of checking
383     * arg5 - tag, to check the value of object
384     */
385    Method (MF88, 6, NotSerialized)
386    {
387        Local0 = ObjectType (Arg0)
388        If ((Local0 != Arg1))
389        {
390            ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Local0, Arg1)
391        }
392
393        If (Arg5)
394        {
395            If ((Arg0 != Arg2))
396            {
397                ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, Arg0, Arg2)
398            }
399        }
400    }
401
402    Method (M02A, 0, NotSerialized)
403    {
404        Debug = "Check the error manually and remove call to m02a() when the bug is fixed."
405        ERR (__METHOD__, ZFFF, __LINE__, 0x00, 0x00, 0x00, 0x00)
406    }
407