1/*
2 * Access to elements of combined objects (Device)
3 */
4Name(z167, 167)
5
6/*
7 * Named Integer i000
8 */
9
10/*
11 * Simple, 3-level
12 */
13
14Method(dv00)
15{
16	Name(ts, "dv00")
17	Device(d000) {
18		Name(i000, 0x00000001)
19	}
20
21	Method(m001, 1)
22	{
23		Method(m002, 1)
24		{
25			Method(m003, 1)
26			{
27				Return (0xabcd0000)
28			}
29			Return (Add(arg0, m003(arg0)))
30		}
31		Return (Add(arg0, m002(arg0)))
32	}
33	Store(Add(d000.i000, m001(d000.i000)), Local0)
34	if (LNotEqual(Local0, 0xabcd0003)) {
35		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0003)
36	}
37}
38
39Method(dvf0)
40{
41	Name(ts, "dvf0")
42	Device(d000) {
43		Name(i000, 0x00000001)
44	}
45
46	Method(m001)
47	{
48		Method(m002)
49		{
50			Method(m003)
51			{
52				Return (0xabcd0000)
53			}
54			Return (Add(^^d000.i000, m003()))
55		}
56		Return (Add(^d000.i000, m002()))
57	}
58
59	Store(Add(d000.i000, m001()), Local0)
60	if (LNotEqual(Local0, 0xabcd0003)) {
61		err(ts, z163, __LINE__, 0, 0, Local0, 0xabcd0003)
62	}
63}
64
65Method(dvf1)
66{
67	Name(ts, "dvf1")
68	Device(d000) {
69		Name(i000, 0x00000001)
70	}
71
72	Method(m001)
73	{
74		Method(m002)
75		{
76			Method(m003)
77			{
78				Return (0xabcd0000)
79			}
80			Return (Add(^^^dvf1.d000.i000, m003()))
81		}
82		Return (Add(^^dvf1.d000.i000, m002()))
83	}
84
85	Store(Add(^dvf1.d000.i000, m001()), Local0)
86	if (LNotEqual(Local0, 0xabcd0003)) {
87		err(ts, z163, __LINE__, 0, 0, Local0, 0xabcd0003)
88	}
89}
90
91/*
92 * 8-level
93 * added writing into i000:
94 *    Store(0x00040000, i000)
95 */
96Method(dv01, 1)
97{
98	Name(ts, "dv01")
99	Name(i000, 0x00000001)
100	Name(i001, 0)
101	Name(p000, Package() {1,2,3,4})
102
103	Store(arg0, i001)
104
105	Method(m001)
106	{
107		Method(m002)
108		{
109			Method(m003)
110			{
111				Method(m004)
112				{
113					Method(m005)
114					{
115						Method(m006)
116						{
117							Method(m007)
118							{
119								Method(m008)
120								{
121									if (i001)
122									{
123										CopyObject(p000, i000)
124									}
125									Return (0)
126								}
127								Store(0x80000000, i000)
128								Return (Add(i000, m008()))
129							}
130							Store(0x07000000, i000)
131							Return (Add(i000, m007()))
132						}
133						Store(0x00600000, i000)
134						Return (Add(i000, m006()))
135					}
136					Store(0x00050000, i000)
137					Return (Add(i000, m005()))
138				}
139				Store(0x00004000, i000)
140				Return (Add(i000, m004()))
141			}
142			Store(0x00000300, i000)
143			Return (Add(i000, m003()))
144		}
145		Store(0x00000020, i000)
146		Return (Add(i000, m002()))
147	}
148	Store(Add(i000, m001()), Local0)
149
150	if (LNotEqual(Local0, 0x87654321)) {
151		err(ts, z167, __LINE__, 0, 0, Local0, 0x87654321)
152	}
153
154	if (LNotEqual(i000, 0x80000000)) {
155		err(ts, z167, __LINE__, 0, 0, i000, 0x80000000)
156	}
157}
158
159/*
160 * Recurcive execution of m001:
161 *   Add(i000, m001(), Local0)
162 */
163Method(dv02)
164{
165	Name(ts, "dv02")
166	Name(i000, 0x00100000)
167	Name(i001, 0)
168
169	Method(m001)
170	{
171		/*
172		 * Because of the stack overflow issues on MS the number
173		 * of repetitions was changed from 100 to 11 here.
174		 */
175		if (LLess(i001, 11)) {
176			Increment(i000)
177			Increment(i001)
178			Add(i000, m001(), Local0)
179			Return (Local0)
180		}
181		Return (0)
182	}
183	Store(Add(i000, m001()), Local0)
184
185	if (LNotEqual(Local0, 0x00c00042)) {
186		err(ts, z167, __LINE__, 0, 0, Local0, 0x00c00042)
187	}
188
189	if (LNotEqual(i000, 0x0010000b)) {
190		err(ts, z167, __LINE__, 0, 0, i000, 0x0010000b)
191	}
192}
193
194/*
195 * Local instead of i000 (in in01)
196 */
197Method(dv03, 1)
198{
199	Name(ts, "dv03")
200	Name(i001, 0)
201	Name(p000, Package() {1,2,3,4})
202
203	Store(arg0, i001)
204
205	Store(0x00000001, Local7)
206
207	Method(m001)
208	{
209		Method(m002)
210		{
211			Method(m003)
212			{
213				Method(m004)
214				{
215					Method(m005)
216					{
217						Method(m006)
218						{
219							Method(m007)
220							{
221								Method(m008)
222								{
223									if (i001)
224									{
225										CopyObject(p000, Local7)
226									}
227									Return (0)
228								}
229								Store(0x80000000, Local7)
230								Return (Add(Local7, m008()))
231							}
232							Store(0x07000000, Local7)
233							Return (Add(Local7, m007()))
234						}
235						Store(0x00600000, Local7)
236						Return (Add(Local7, m006()))
237					}
238					Store(0x00050000, Local7)
239					Return (Add(Local7, m005()))
240				}
241				Store(0x00004000, Local7)
242				Return (Add(Local7, m004()))
243			}
244			Store(0x00000300, Local7)
245			Return (Add(Local7, m003()))
246		}
247		Store(0x00000020, Local7)
248		Return (Add(Local7, m002()))
249	}
250	Store(Add(Local7, m001()), Local0)
251
252	if (LNotEqual(Local0, 0x87654321)) {
253		err(ts, z167, __LINE__, 0, 0, Local0, 0x87654321)
254	}
255
256	if (LNotEqual(Local7, 1)) {
257		err(ts, z167, __LINE__, 0, 0, Local7, 1)
258	}
259}
260
261/*
262 * Arg instead of i000 (in in01)
263 *
264 * see ns_0100.asl
265 */
266
267/*
268 * 8-level
269 * added writing into i000:
270 *    Store(0x00040000, i000)
271 *
272 * dv01 +:
273 *    m00X are passed with i000
274 *    argX inside m00X is rewritten
275 */
276Method(dv04)
277{
278	Name(ts, "dv04")
279	Name(i000, 0x00000001)
280	Name(i001, 0)
281	Name(p000, Package() {1,2,3,4})
282
283	Method(m001, 2)
284	{
285		Method(m002, 2)
286		{
287			Method(m003, 2)
288			{
289				Method(m004, 2)
290				{
291					Method(m005, 2)
292					{
293						Method(m006, 2)
294						{
295							Method(m007, 2)
296							{
297								/*
298								 * ====================== >>>>>>>>
299								 * Sometimes, after I added a big group of
300								 * 'If' operators, this fragment of code causes
301								 * break of execution on MS. But, namely --
302								 * sometimes! To investigate the reason I
303								 * commented part by part of it to find
304								 * workable code, then un-commented it
305								 * part by part too.
306								 * It entire initial code
307								 * started working on MS again!
308								 */
309								/*
310								Method(m008, 2)
311								{
312									if (i001)
313									{
314										CopyObject(p000, i000)
315									}
316									Store(0x10000008, arg0)
317									Return (0)
318								}
319								Store(0x80000000, i000)
320								Store(0x10000007, arg0)
321								Return (Add(i000, m008(i000, arg0)))
322								 */
323								/*
324								 * ====================== <<<<<<<<
325								 */
326
327								Store(0x80000000, i000)
328								Store(0x10000007, arg0)
329								Add(i000, 0, Local0)
330
331								Return (Local0)
332							}
333							Store(0x07000000, i000)
334							Store(0x10000006, arg0)
335							Return (Add(i000, m007(i000, arg0)))
336						}
337						Store(0x00600000, i000)
338						Store(0x10000005, arg0)
339						Return (Add(i000, m006(i000, arg0)))
340					}
341					Store(0x00050000, i000)
342					Store(0x10000004, arg0)
343					Return (Add(i000, m005(i000, arg0)))
344				}
345				if (LNotEqual(arg0, 0x00000300)) {
346					err(ts, z167, __LINE__, 0, 0, arg0, 0x00000300)
347				}
348				if (LNotEqual(arg1, 0x10000001)) {
349					err(ts, z167, __LINE__, 0, 0, arg1, 0x10000001)
350				}
351				Store(0x00004000, i000)
352				Store(0x10000003, arg0)
353				Return (Add(i000, m004(i000, arg0)))
354			}
355			if (LNotEqual(arg0, 0x00000020)) {
356				err(ts, z167, __LINE__, 0, 0, arg0, 0x00000020)
357			}
358			if (LNotEqual(i000, 0x00000020)) {
359				err(ts, z167, __LINE__, 0, 0, i000, 0x00000020)
360			}
361			Store(0x10000002, arg0)
362			if (LNotEqual(i000, 0x00000020)) {
363				err(ts, z167, __LINE__, 0, 0, i000, 0x00000020)
364			}
365			if (LNotEqual(arg0, 0x10000002)) {
366				err(ts, z167, __LINE__, 0, 0, arg0, 0x10000002)
367			}
368			Store(0x00000300, i000)
369			if (LNotEqual(i000, 0x00000300)) {
370				err(ts, z167, __LINE__, 0, 0, i000, 0x00000300)
371			}
372			if (LNotEqual(arg0, 0x10000002)) {
373				err(ts, z167, __LINE__, 0, 0, arg0, 0x10000002)
374			}
375			if (LNotEqual(arg1, 0x10000001)) {
376				err(ts, z167, __LINE__, 0, 0, arg1, 0x10000001)
377			}
378			Store(0x10000002, arg0)
379			Store(0x00000300, i000)
380			Return (Add(i000, m003(i000, arg1)))
381		}
382		if (LNotEqual(arg0, 0x00000001)) {
383			err(ts, z167, __LINE__, 0, 0, arg0, 0x00000001)
384		}
385		if (LNotEqual(i000, 0x00000001)) {
386			err(ts, z167, __LINE__, 0, 0, i000, 0x00000001)
387		}
388		Store(0x10000001, arg0)
389		if (LNotEqual(i000, 0x00000001)) {
390			err(ts, z167, __LINE__, 0, 0, i000, 0x00000001)
391		}
392		if (LNotEqual(arg0, 0x10000001)) {
393			err(ts, z167, __LINE__, 0, 0, arg0, 0x10000001)
394		}
395		Store(0x00000020, i000)
396		if (LNotEqual(i000, 0x00000020)) {
397			err(ts, z167, __LINE__, 0, 0, i000, 0x00000020)
398		}
399		if (LNotEqual(arg0, 0x10000001)) {
400			err(ts, z167, __LINE__, 0, 0, arg0, 0x10000001)
401		}
402		if (LNotEqual(arg1, 0x10000000)) {
403			err(ts, z167, __LINE__, 0, 0, arg1, 0x10000000)
404		}
405		Store(0x10000001, arg0)
406		Store(0x00000020, i000)
407		Return (Add(i000, m002(i000, arg0)))
408	}
409	Store(Add(i000, m001(i000, 0x10000000)), Local0)
410
411	if (LNotEqual(Local0, 0x87654321)) {
412		err(ts, z167, __LINE__, 0, 0, Local0, 0x87654321)
413	}
414
415	if (LNotEqual(i000, 0x80000000)) {
416		err(ts, z167, __LINE__, 0, 0, i000, 0x80000000)
417	}
418}
419
420/*
421 * Note: now the checkings are so that dv05 succeeds on MS.
422 */
423Method(dv05)
424{
425	Name(ts, "dv05")
426
427	Name(i000, 0xabcd0000)
428	Name(s000, "qwrtyu0003")
429	Name(b000, Buffer() {0xb0,0xb1,0xb2,0xb3,0xb4})
430	Name(p000, Package() {0xabcd0001, 0xabcd0002, 0xabcd0003})
431	Event(e000)
432	Mutex(mx00, 0)
433	Method(mmm0) {
434		Name(im00, 0xabcd0004)
435		Name(sm00, "qwertyui")
436		// Return ( "qwertyui" )
437	}
438	Method(mmm1) {
439		Name(im00, 0xabcd0004)
440		Name(sm00, "qwertyui")
441		// Return ( 0xabcd0004 )
442		Return ( "qwertyui" )
443	}
444	Device(d000) { Name(id00, 0xabcd0005) }
445	ThermalZone(tz00) { Name(itz0, 0xabcd0006) }
446	Processor(pr00, 0, 0xFFFFFFFF, 0) { Name(ipr0, 0xabcd0007) }
447	PowerResource(pw00, 1, 0) { Name(ipw0, 0xabcd0008) }
448	OperationRegion(r000, SystemMemory, 0x100, 0x100)
449
450	Name(b001, Buffer() {0xa0,0xa1,0xa2,0xa3,0xa4})
451	CreateField(b001, 0, 8, bf00)
452
453	OperationRegion(r001, SystemMemory, 0x100, 0x100)
454	Field(r001, ByteAcc, NoLock, Preserve) {f000,32, f001,32, f002,32, f003,32}
455	BankField(r001, f001, 0, ByteAcc, NoLock, Preserve) {bnk0,32}
456	IndexField(f002, f003, ByteAcc, NoLock, Preserve) {if00,32, if01,32}
457
458	Method(m001, 2)
459	{
460		Store(ObjectType(arg0), Local0)
461		if (LNotEqual(Local0, arg1)) {
462			err(ts, z167, __LINE__, 0, 0, Local0, arg1)
463		}
464		Return (5)
465	}
466
467	CH03(ts, z167, 0x000, __LINE__, 0)
468
469	Store(Add(DerefOf(Index(p000, 0)), m001(i000, c009)), Local0)
470	if (LNotEqual(Local0, 0xabcd0006)) {
471		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
472	}
473	Store(Add(DerefOf(Index(p000, 0)), m001(s000, c00a)), Local0)
474	if (LNotEqual(Local0, 0xabcd0006)) {
475		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
476	}
477	Store(Add(DerefOf(Index(p000, 0)), m001(b000, c00b)), Local0)
478	if (LNotEqual(Local0, 0xabcd0006)) {
479		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
480	}
481	Store(Add(DerefOf(Index(p000, 0)), m001(p000, c00c)), Local0)
482	if (LNotEqual(Local0, 0xabcd0006)) {
483		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
484	}
485	Store(Add(DerefOf(Index(p000, 0)), m001(e000, c00f)), Local0)
486	if (LNotEqual(Local0, 0xabcd0006)) {
487		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
488	}
489	Store(Add(DerefOf(Index(p000, 0)), m001(mx00, c011)), Local0)
490	if (LNotEqual(Local0, 0xabcd0006)) {
491		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
492	}
493	Store(Add(DerefOf(Index(p000, 0)), m001(mmm0, c008)), Local0)
494	if (LNotEqual(Local0, 0xabcd0006)) {
495		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
496	}
497	Store(Add(DerefOf(Index(p000, 0)), m001(mmm1, c00a)), Local0)
498	if (LNotEqual(Local0, 0xabcd0006)) {
499		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
500	}
501	Store(Add(DerefOf(Index(p000, 0)), m001(d000, c00e)), Local0)
502	if (LNotEqual(Local0, 0xabcd0006)) {
503		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
504	}
505	Store(Add(DerefOf(Index(p000, 0)), m001(tz00, c015)), Local0)
506	if (LNotEqual(Local0, 0xabcd0006)) {
507		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
508	}
509	Store(Add(DerefOf(Index(p000, 0)), m001(pr00, c014)), Local0)
510	if (LNotEqual(Local0, 0xabcd0006)) {
511		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
512	}
513	Store(Add(DerefOf(Index(p000, 0)), m001(pw00, c013)), Local0)
514	if (LNotEqual(Local0, 0xabcd0006)) {
515		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
516	}
517	Store(Add(DerefOf(Index(p000, 0)), m001(r000, c012)), Local0)
518	if (LNotEqual(Local0, 0xabcd0006)) {
519		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
520	}
521	Store(Add(DerefOf(Index(p000, 0)), m001(bf00, c00b)), Local0)
522	if (LNotEqual(Local0, 0xabcd0006)) {
523		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
524	}
525	Store(Add(DerefOf(Index(p000, 0)), m001(f000, c009)), Local0)
526	if (LNotEqual(Local0, 0xabcd0006)) {
527		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
528	}
529	Store(Add(DerefOf(Index(p000, 0)), m001(bnk0, c009)), Local0)
530	if (LNotEqual(Local0, 0xabcd0006)) {
531		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
532	}
533	Store(Add(DerefOf(Index(p000, 0)), m001(if00, c009)), Local0)
534	if (LNotEqual(Local0, 0xabcd0006)) {
535		err(ts, z167, __LINE__, 0, 0, Local0, 0xabcd0006)
536	}
537
538	CH03(ts, z167, 0x000, __LINE__, 0)
539}
540
541Method(dv06)
542{
543	Name(ts, "dv06")
544	Name(i000, 0xabcd0000)
545
546	Store(ObjectType(i000), Local0)
547	if (LNotEqual(Local0, c009)) {
548		err(ts, z167, __LINE__, 0, 0, Local0, c009)
549	}
550}
551
552Method(dev0)
553{
554	SRMT("dv00")
555	dv00()
556
557	SRMT("dvf0")
558	dvf0()
559	SRMT("dvf1")
560	dvf1()
561
562	SRMT("dv01-0")
563	dv01(0)
564	SRMT("dv02")
565	dv02()
566	SRMT("dv03-0")
567	dv03(0)
568	SRMT("dv04")
569	dv04()
570	SRMT("dv05")
571	if (LAnd(fix1, chk3)) {
572		/*
573		 * It breaks MS while re-booting,
574		 * for ACPICA it causes exception
575		 * and breaks path.
576		 */
577		dv05()
578	} else {
579		BLCK()
580	}
581	SRMT("dv06")
582	dv06()
583}
584