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// Miscellaneous not systematized tests
30
31Name(z054, 54)
32
33// Looks like Default is at all not implemented
34
35Method(mZ00, 1)
36{
37	Store(0, Local0)
38	Store(0, Local1)
39
40	// Bug XXX. This Switch code below causes ASL-compiler to fail
41	// for full.asl file with the diagnostics like this:
42	// nssearch-0397: *** Error: NsSearchAndEnter:
43	//                    Bad character in ACPI Name: 5B5F545F
44	// and fall into recursion:
45	// Remark   3040 -     Recursive method call ^  (ERR_)
46	// Note: (0x5B5F545F is equal to "[_T_")
47
48	Switch (Local1) {
49		Case (5) {
50			Store(5, Local0)
51		}
52		Default {
53			Store(1, Local0)
54		}
55	}
56
57	if (LNotEqual(Local0, 1)) {
58		err(arg0, z054, __LINE__, 0, 0, Local0, 0)
59	}
60}
61
62// Concatenate operator affects the object passed as Source2 parameter
63
64Method(mZ01, 1) {
65	Concatenate("qwertyuiop", arg0)
66}
67
68Method(mZ02, 1)
69{
70	Store(0, Local0)
71	mZ01(Local0)
72	if (LNotequal(Local0, 0)) {
73		err(arg0, z054, __LINE__, 0, 0, Local0, 0)
74	}
75
76	Store(0, Local0)
77	Concatenate("qwertyuiop", Local0)
78	if (LNotequal(Local0, 0)) {
79		err(arg0, z054, __LINE__, 0, 0, Local0, 0)
80	}
81}
82
83// Unexpected value returned by ObjectType for Field Unit objects
84
85// The field passed as explicit reference (RefOf)
86Method(mZ05, 1)
87{
88	OperationRegion(r000, SystemMemory, 0x100, 0x100)
89	Field (r000, ByteAcc, NoLock, Preserve) {
90		f000, 32
91	}
92
93	Store(ObjectType(RefOf(f000)), Local0)
94	if (LNotEqual(Local0, 5)) {
95		err(arg0, z054, __LINE__, 0, 0, Local0, 0)
96	}
97}
98
99// The BankField corrupts the contents of OperationRegion
100
101Method(mZ06, 1)
102{
103	OperationRegion(r000, SystemMemory, 0x100, 0x100)
104	Field (r000, ByteAcc, NoLock, Preserve) {
105		bnk0, 8
106	}
107
108	BankField (r000, bnk0, 0, ByteAcc, NoLock, Preserve) {
109		Offset(16),
110		bf00, 8,
111	}
112
113	BankField (r000, bnk0, 1, ByteAcc, NoLock, Preserve) {
114		Offset(17),
115		bf01, 8,
116	}
117
118	Store(1, bnk0)
119	if (LNotEqual(bnk0, 1)) {
120		err(arg0, z054, __LINE__, 0, 0, bnk0, 0)
121	}
122
123	Store(0x96, bf01)
124	if (LNotEqual(bnk0, 1)) {
125		err(arg0, z054, __LINE__, 0, 0, bnk0, 0)
126	}
127
128	Store(0x87, bf00)
129	if (LNotEqual(bnk0, 1)) {
130		err(arg0, z054, __LINE__, 0, 0, bnk0, 0)
131	}
132
133	if (LNotEqual(bf00, 0x87)) {
134		err(arg0, z054, __LINE__, 0, 0, bf00, 0)
135	}
136
137	if (LNotEqual(bf01, 0x96)) {
138		err(arg0, z054, __LINE__, 0, 0, bf01, 0)
139	}
140}
141
142// ToBuffer caused destroying of source buffer passed by Data parameter
143Method(mZ07, 1)
144{
145	Store(Buffer(4){10, 11, 12, 13}, Local0)
146	Store(ObjectType(Local0), Local1)
147
148	if (LNotEqual(Local1, c00b)) {
149		err(arg0, z054, __LINE__, 0, 0, Local1, 0)
150	}
151
152	ToBuffer(Local0, Local2)
153
154	Store(0xaa, Local3)
155
156	Store(ObjectType(Local0), Local3)
157
158	if (LNotEqual(Local3, c00b)) {
159		err(arg0, z054, __LINE__, 0, 0, Local3, 0)
160	}
161}
162
163// ObjectType() operator should be allowed to deal with the
164// uninitialized objects.
165
166// Uncomment this when the problem will be fixed and compile
167// will not fail in this case like it do now: "Method local
168// variable is not initialized (Local0)".
169Method(mZ08, 1)
170{
171	Store(ObjectType(Local0), Local1)
172}
173
174// Now, this cause exception but should not
175Method(mZ09, 2)
176{
177	if (arg1) {
178		Store(0, Local0)
179	}
180
181	CH03("", 0, 0, __LINE__, 0)
182
183	Store(ObjectType(Local0), Local1)
184
185	if (LNotEqual(Local1, 0)) {
186		err(arg0, z054, __LINE__, 0, 0, Local1, 0)
187	}
188
189	CH03("", 0, 0, __LINE__, 0)
190}
191
192Method(mZ0a, 1)
193{
194	mZ09(arg0, 0)
195}
196
197// DerefOf. If the Source evaluates to a string, the string is evaluated
198// as an ASL name (relative to the current scope) and the contents of that
199// object are returned.
200Method(mZ0b, 1)
201{
202	Name(b000, Buffer(){ 1, 2, 3, 4, 5, 6, 7, 8 })
203
204	Store("b000", Local0)
205
206	Store("================ 0:", Debug)
207
208	Store(DerefOf(Local0), Local1)
209
210	Store("================ 1:", Debug)
211
212	Store(ObjectType(Local1), Local2)
213
214	if (LNotEqual(Local2, 3)) {
215		err(arg0, z054, __LINE__, 0, 0, Local2, 0)
216	}
217
218	Store("================ 2:", Debug)
219
220	Store(Local1, Debug)
221	Store(Local2, Debug)
222
223	return (0)
224}
225
226/*
227// Currently, incorrect test
228// The size of Strings in Package is determined incorrectly
229Method(mZ0c, 1)
230{
231	Name(p000, Package() {
232		"012",
233		"0123456789abcdef",
234		Buffer() {17,28,69,11,22,34,35,56,67,11},
235		"012345",
236	})
237
238	Store(DeRefOf(Index(p000, 1)), Local0)
239	Store(0, Index(Local0, 5))
240
241	Store(0, Index(p000, 1))
242
243	Store(DeRefOf(Index(p000, 1)), Local0)
244//	Store(0, Index(Local0, 5))
245
246	Store("=================:", Debug)
247	Store(Local0, Debug)
248
249	// 0
250	Store(DeRefOf(Index(p000, 0)), Local2)
251	Store(SizeOf(Local2), Local3)
252
253	Store(Local3, Debug)
254
255	if (LNotEqual(Local3, 3)) {
256		err(arg0, z054, __LINE__, 0, 0, Local3, 3)
257	}
258
259	// 1
260	Store(DeRefOf(Index(p000, 1)), Local2)
261	Store(SizeOf(Local2), Local3)
262
263	Store(Local3, Debug)
264
265	if (LNotEqual(Local3, 9)) {
266		err(arg0, z054, __LINE__, 0, 0, Local3, 9)
267	}
268
269	// 2
270	Store(DeRefOf(Index(p000, 2)), Local2)
271	Store(SizeOf(Local2), Local3)
272
273	Store(Local3, Debug)
274
275	if (LNotEqual(Local3, 6)) {
276		err(arg0, z054, __LINE__, 0, 0, Local3, 6)
277	}
278
279	Store(SizeOf(p000), Local0)
280
281	Store(Local0, Debug)
282
283	if (LNotEqual(Local0, 3)) {
284		err(arg0, z054, __LINE__, 0, 0, Local0, 3)
285	}
286}
287*/
288
289/*
290// ATTENTION: such type tests have to be added and extended
291Method(mZ0d, 1)
292{
293	Name(p000, Package() {
294		0x12345678, 0x90abcdef,
295	})
296	Name(b000, Buffer() {0x78,0x56,0x34,0x12, 0xef,0xcd,0xab,0x90})
297
298	Store(DeRefOf(Index(p000, 0)), Local7)
299
300	if (LEqual(b000, Local7)) {
301		err(arg0, z054, __LINE__, 0, 0, b000, Local7)
302	}
303
304	if (LEqual(Local7, b000)) {
305		err(arg0, z054, __LINE__, 0, 0, Local7, b000)
306	}
307
308	return (0)
309}
310*/
311
312
313// Bug 54: All the ASL Operators which deal with at least two Buffer type
314// objects cause unexpected exceptions in cases when both Buffer type objects
315// are passed immediately
316Method(mZ0e, 1)
317{
318	CH03("", 0, 0, __LINE__, 0)
319
320	Add( Buffer() {0x79}, Buffer() {0x79} )
321
322	CH03("", 0, 0, __LINE__, 0)
323}
324
325// Bug 57: The empty Return operator (without specifying the returning value)
326// is processed incorrectly
327Method(mZ0f, 1) {
328
329	Method(mZ10, 2) {
330
331		if (arg1) {
332			return (0x1234)
333
334			// ASL-compiler report Warning in this case
335			// Store("ERROR 0: mZ13, after Return !!!", Debug)
336		}
337		err(arg0, z054, __LINE__, 0, 0, 0, 0)
338
339		return (0x5678)
340	}
341
342	Method(mZ11, 2) {
343
344		if (arg1) {
345
346			return
347
348			// ASL-compiler DOESN'T report Warning in this case!!!
349			// And the Store operator below is actually processed!!!
350
351			err(arg0, z054, __LINE__, 0, 0, 0, 0)
352		}
353
354		err(arg0, z054, __LINE__, 0, 0, 0, 0)
355
356		return
357	}
358
359	Store(mZ10(arg0, 1), Local7)
360
361	mZ11(arg0, 1)
362
363	return (0)
364}
365
366// Bug 59: The String to Buffer Rule from the Table 17-8 "Object Conversion
367// Rules" says "If the string is shorter than the buffer, the buffer size is
368// reduced".
369Method(mZ10, 1) {
370	Name(str0, "\x01\x02")
371	Name(buf0, Buffer(){0x03, 0x04, 0x05})
372
373	Store(str0, buf0)
374
375	if (LNotEqual(Sizeof(buf0), 2)) {
376		// Error: length of the buffer not reduced to the stored string
377		err(arg0, z054, __LINE__, 0, 0, 0, 0)
378	}
379	return (0)
380}
381
382// Bug 65: The Buffer Field type objects should be passed
383// to Methods without any conversion, but instead
384// they are converted to Buffers or Integers depending
385// on the size of the Buffer Field object and the
386// run mode (32-bit or 64/bit mode).
387Method(mZ11, 1) {
388	Name(b000, Buffer(200) {})
389	CreateField(b000, 0, 8, bf00)
390
391	Method(m000, 2)
392	{
393		Store(ObjectType(arg1), Local0)
394		if (LNotEqual(Local0, 14)) {
395			err(arg0, z054, __LINE__, 0, 0, Local0, 14)
396		}
397	}
398
399	Method(m001, 1)
400	{
401		Store(ObjectType(bf00), Local0)
402		if (LNotEqual(Local0, 14)) {
403			err(arg0, z054, __LINE__, 0, 0, Local0, 14)
404		} else {
405			m000(arg0, bf00)
406		}
407	}
408
409	m001(arg0)
410}
411
412// Bug 66: The Field Unit type objects should be passed
413// to Methods without any conversion, but instead
414// they are converted to Buffers or Integers depending
415// on the size of the Buffer Field object and the
416// run mode (32-bit or 64/bit mode).
417Method(mZ12, 1) {
418	OperationRegion(r000, SystemMemory, 0x100, 0x100)
419	Field(r000, ByteAcc, NoLock, Preserve) { f000, 8 }
420
421	Method(m000, 2)
422	{
423		Store(ObjectType(arg1), Local0)
424		if (LNotEqual(Local0, 5)) {
425			err(arg0, z054, __LINE__, 0, 0, Local0, 5)
426		}
427	}
428
429	Method(m001, 1)
430	{
431		Store(ObjectType(f000), Local0)
432		if (LNotEqual(Local0, 5)) {
433			err(arg0, z054, __LINE__, 0, 0, Local0, 5)
434		} else {
435			m000(arg0, f000)
436		}
437	}
438
439	m001(arg0)
440}
441
442// Bug 67: The Buffer Field type objects should be RETURNED
443// by Methods without any conversion, but instead
444// they are converted to Buffers or Integers depending
445// on the size of the Buffer Field object and the
446// run mode (32-bit or 64/bit mode).
447Method(mZ13, 1) {
448	Name(b000, Buffer(200) {})
449	CreateField(b000, 0, 8, bf00)
450
451	Method(m000)
452	{
453		return (bf00)
454	}
455
456	Method(m001, 1)
457	{
458		Store(ObjectType(bf00), Local0)
459		if (LNotEqual(Local0, 14)) {
460			err(arg0, z054, __LINE__, 0, 0, Local0, 14)
461		} else {
462			Store(m000(), Local7)
463			Store(ObjectType(Local7), Local0)
464			if (LNotEqual(Local0, 14)) {
465				err(arg0, z054, __LINE__, 0, 0, Local0, 14)
466			}
467		}
468	}
469
470	m001(arg0)
471}
472
473// Bug 68: The Field Unit type objects should be RETURNED
474// by Methods without any conversion, but instead
475// they are converted to Buffers or Integers depending
476// on the size of the Buffer Field object and the
477// run mode (32-bit or 64/bit mode).
478Method(mZ14, 1) {
479	OperationRegion(r000, SystemMemory, 0x100, 0x100)
480	Field(r000, ByteAcc, NoLock, Preserve) { f000, 8 }
481
482	Method(m000)
483	{
484		return (f000)
485	}
486
487	Method(m001, 1)
488	{
489		Store(ObjectType(f000), Local0)
490		if (LNotEqual(Local0, 5)) {
491			err(arg0, z054, __LINE__, 0, 0, Local0, 5)
492		} else {
493			Store(m000(), Local7)
494			Store(ObjectType(Local7), Local0)
495			if (LNotEqual(Local0, 5)) {
496				err(arg0, z054, __LINE__, 0, 0, Local0, 5)
497			}
498		}
499	}
500
501	m001(arg0)
502}
503
504// Bug 30. This test may be removed there after
505// the Field relative tests will be implemented.
506// Caused crash.
507Method(mZ15, 1)
508{
509	Method(m000)
510	{
511		// Field Unit
512		OperationRegion(r000, SystemMemory, 0x100, 0x100)
513		Field(r000, ByteAcc, NoLock, Preserve) {
514			f000, 8,
515			f001, 16,
516			f002, 32,
517			f003, 33,
518			f004, 1,
519			f005, 64,
520		}
521
522		Store("------------ Fields:", Debug)
523		Store(f000, Debug)
524		Store(f001, Debug)
525		Store(f002, Debug)
526		Store(f003, Debug)
527		Store(f004, Debug)
528		Store(f005, Debug)
529		Store("------------.", Debug)
530
531		return (0)
532	}
533
534	Method(m001)
535	{
536		// Field Unit
537		OperationRegion(r000, SystemMemory, 0x100, 0x100)
538		Field(r000, ByteAcc, NoLock, Preserve) {
539			f000, 8,
540			f001, 16,
541			f002, 32,
542			f003, 33,
543			f004, 7,
544			f005, 64,
545		}
546
547		Store("------------ Fields:", Debug)
548		Store(f000, Debug)
549		Store(f001, Debug)
550		Store(f002, Debug)
551		Store(f003, Debug)
552		Store(f004, Debug)
553		Store(f005, Debug)
554		Store("------------.", Debug)
555
556		return (0)
557	}
558
559	m000()
560	m001()
561	return (0)
562}
563
564Method(mZ16, 1)
565{
566	Method(m000)
567	{
568		return (0x12345678)
569	}
570
571	Method(m001, 1)
572	{
573		return (0x12345678)
574	}
575
576	Store(ObjectType(m000), Local0)
577	if (LNotEqual(Local0, c010)) {
578		err(arg0, z054, __LINE__, 0, 0, Local0, c010)
579	}
580
581    /* Nov. 2012: Method invocation as arg to ObjectType is now illegal */
582//
583//	Store(ObjectType(m000()), Local0)
584//	if (LNotEqual(Local0, c009)) {
585//		err(arg0, z054, __LINE__, 0, 0, Local0, c009)
586//	}
587//
588//	Store(ObjectType(m001(123)), Local1)
589//	if (LNotEqual(Local1, c009)) {
590//		err(arg0, z054, __LINE__, 0, 0, Local1, c009)
591//	}
592}
593
594// Run-method
595Method(MSC0)
596{
597	Name(ts, "MSC0")
598
599	mZ00(ts)
600	mZ02(ts)
601	mZ05(ts)
602	mZ06(ts)
603	mZ07(ts)
604	mZ08(ts)
605	mZ0a(ts)
606	mZ0b(ts)
607	mZ0e(ts)
608	mZ0f(ts)
609	mZ10(ts)
610	mZ11(ts)
611	mZ12(ts)
612	mZ13(ts)
613	mZ14(ts)
614	mZ15(ts)
615	mZ16(ts)
616}
617