• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /barrelfish-2018-10-04/lib/acpica/tests/aslts/src/runtime/collections/Identity2MS/abbu/recursion/
1/*
2 * Some or all of this work - Copyright (c) 2006 - 2016, Intel Corp.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * Neither the name of Intel Corporation nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/*
30 * Tests to check recursive calls of methods for different structure of
31 * sub-trees containig the point from where the call is made and the point
32 * which is just the invoked method, and different relative disposition of
33 * those sub-trees containig the points.
34 */
35
36Name(z172, 172)
37
38Name(IG00, 0)
39Name(IG01, 0)
40Name(IG02, 0)
41Name(IG03, 0) // Do anything once only
42
43Name(RC00, 5)
44Name(RCFF, 1)
45
46Name(ts, "mr00")
47
48Processor(pr00, 0, 0x000, 0x008)
49{
50	Name(i000, 0xabcd0000)
51}
52
53// Initialize sub-test
54Method(mrfd)
55{
56    Store(0, IG00)
57    Store(0, IG01)
58    Store(0, IG02)
59    Store(0, IG03)
60}
61
62// Printing
63Method(mrfe, 1)
64{
65    if (RCFF) {
66		Store(arg0, Debug)
67    }
68}
69
70/*
71 * 0-th level method M0 is recursively invoked from
72 * the same M0 method.
73 */
74Method(mr00)
75{
76    Store("mr00", ts)
77    mrfe(ts)
78
79    Store(IG00, Local0)
80    Increment(IG00)
81    Increment(IG02)
82    if (LLess(IG00, RC00)) {
83        mr00()
84    }
85
86    Decrement(IG00)
87    if (LNotEqual(Local0, IG00)) {
88        err(ts, z172, 0x000, 0, 0, Local0, IG00)
89    }
90
91    if (LNotEqual(IG02, RC00)) {
92        if (LNot(IG03)) {
93            Store(1, IG03)
94            err(ts, z172, 0x000, 0, 0, IG02, RC00)
95        }
96    }
97}
98
99/*
100 * 0-th level method M0 invokes recursively 0-th level method M1
101 * which, in its turn, invokes recursively M0
102 * M0 and M1 are respectively the preceding and the following peers each to other
103 */
104Method(mr01, 1)
105{
106    Store("mr01", ts)
107
108    mrfe(ts)
109
110    Store(IG00, Local1)
111    Store(arg0, Local2)
112    Increment(IG00)
113    Increment(IG02)
114    if (LLess(IG00, RC00)) {
115        mr02(IG00)
116    }
117
118    Decrement(IG00)
119    if (LNotEqual(Local1, IG00)) {
120        err(ts, z172, 0x000, 0, 0, Local1, IG00)
121    }
122    if (LNotEqual(Local2, arg0)) {
123        err(ts, z172, 0x000, 0, 0, Local2, arg0)
124    }
125
126    Multiply(RC00, 2, Local0)
127    Decrement(Local0)
128    if (LNotEqual(IG02, Local0)) {
129        if (LNot(IG03)) {
130            Store(1, IG03)
131            err(ts, z172, 0x000, 0, 0, IG02, Local0)
132        }
133    }
134}
135
136Method(mr02, 1)
137{
138    Store("mr02", ts)
139
140    mrfe(ts)
141
142    Store(IG01, Local1)
143    Store(arg0, Local2)
144    Increment(IG01)
145    Increment(IG02)
146    if (LLess(IG01, RC00)) {
147        mr01(IG01)
148    }
149
150    Decrement(IG01)
151    if (LNotEqual(Local1, IG01)) {
152        err(ts, z172, 0x000, 0, 0, Local1, IG01)
153    }
154    if (LNotEqual(Local2, arg0)) {
155        err(ts, z172, 0x000, 0, 0, Local2, arg0)
156    }
157
158    Multiply(RC00, 2, Local0)
159    Decrement(Local0)
160    if (LNotEqual(IG02, Local0)) {
161        if (LNot(IG03)) {
162            Store(1, IG03)
163            err(ts, z172, 0x000, 0, 0, IG02, Local0)
164        }
165    }
166}
167
168/*
169 * 2-th level method M0 is recursively invoked from
170 * the same M0 method.
171 */
172Method(mr03,, Serialized)
173{
174    Store("mr03", ts)
175
176    Device(d100)
177    {
178        Name(i200, 0xabcd0200)
179        Name(i201, 0xabcd0201)
180    }
181
182    Device(d101)
183    {
184        Name(i202, 0xabcd0202)
185        Method(m203)
186        {
187            mrfe("m203")
188
189            Store(IG00, Local0)
190            Increment(IG00)
191            Increment(IG02)
192            if (LLess(IG00, RC00)) {
193                m203()
194            }
195
196            Decrement(IG00)
197            if (LNotEqual(Local0, IG00)) {
198                err(ts, z172, 0x000, 0, 0, Local0, IG00)
199            }
200
201        }
202        Name(i204, 0xabcd0204)
203    }
204    Device(d102)
205    {
206        Name(i205, 0xabcd0205)
207        Name(i206, 0xabcd0206)
208    }
209
210    d101.m203()
211
212    if (LNotEqual(IG02, RC00)) {
213        if (LNot(IG03)) {
214            Store(1, IG03)
215            err(ts, z172, 0x000, 0, 0, IG02, RC00)
216        }
217    }
218}
219
220/*
221 * 2-th level method M0 invokes recursively 0-th level method M1,
222 * which is not on a path of M0-sub-tree, M1, in its turn, invokes
223 * recursively M0. It is capable because the sub-tree of M0 has been
224 * created at the moment when M1 is invoked.
225 * Note: we can't run M1 in the first turn by that same reason --
226 * sub-tree of M0 would be not created in that case and we fall to
227 * AE_NOT_FOUND exception.
228 */
229Method(mr04,, Serialized)
230{
231    Store("mr04", ts)
232
233    Device(d100)
234    {
235        Name(i200, 0xabcd0200)
236        Name(i201, 0xabcd0201)
237    }
238
239    Device(d101)
240    {
241        Name(i202, 0xabcd0202)
242        Method(m203, 1)
243        {
244            mrfe("m203")
245
246            Store(IG00, Local0)
247            Increment(IG00)
248            Increment(IG02)
249            if (LLess(IG00, RC00)) {
250                mr05(IG00)
251            }
252
253            Decrement(IG00)
254            if (LNotEqual(Local0, IG00)) {
255                err(ts, z172, 0x000, 0, 0, Local0, IG00)
256            }
257
258        }
259        Name(i204, 0xabcd0204)
260    }
261    Device(d102)
262    {
263        Name(i205, 0xabcd0205)
264        Name(i206, 0xabcd0206)
265    }
266
267    d101.m203(0)
268
269    Multiply(RC00, 2, Local0)
270    Decrement(Local0)
271    if (LNotEqual(IG02, Local0)) {
272        if (LNot(IG03)) {
273            Store(1, IG03)
274            err(ts, z172, 0x000, 0, 0, IG02, Local0)
275        }
276    }
277}
278
279Method(mr05, 1)
280{
281    Store("mr05", ts)
282
283    mrfe(ts)
284
285    Store(IG01, Local1)
286    Store(arg0, Local2)
287    Increment(IG01)
288    Increment(IG02)
289    if (LLess(IG01, RC00)) {
290        ^mr04.d101.m203(IG01)
291    }
292
293    Decrement(IG01)
294    if (LNotEqual(Local1, IG01)) {
295        err(ts, z172, 0x000, 0, 0, Local1, IG01)
296    }
297    if (LNotEqual(Local2, arg0)) {
298        err(ts, z172, 0x000, 0, 0, Local2, arg0)
299    }
300
301    Multiply(RC00, 2, Local0)
302    Decrement(Local0)
303    if (LNotEqual(IG02, Local0)) {
304        if (LNot(IG03)) {
305            Store(1, IG03)
306            err(ts, z172, 0x000, 0, 0, IG02, Local0)
307        }
308    }
309}
310
311
312Method(mrff,, Serialized)
313{
314    Name(ts, "mrff")
315    Name(run0, 1)
316
317    CH03(ts, z172, 0x000, 0, 0)
318
319    SRMT("mr00")
320    mrfd()
321    mr00()
322
323    SRMT("mr01")
324    mrfd()
325    mr01(0)
326
327    SRMT("mr02")
328    mrfd()
329    mr02(0)
330
331    SRMT("mr03")
332    mrfd()
333    mr03()
334
335    SRMT("mr04")
336    mrfd()
337    mr04()
338
339/*
340test --- run mr05 and expect exception
341*/
342
343
344    CH03(ts, z172, 0x000, 0, 0)
345}
346