/*
* Some or all of this work - Copyright (c) 2006 - 2018, Intel Corp.
* 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.
*/
// Miscellaneous not systematized tests
Name(z054, 54)
// Looks like Default is at all not implemented
Method(mZ00, 1)
{
Store(0, Local0)
Store(0, Local1)
// Bug XXX. This Switch code below causes ASL-compiler to fail
// for full.asl file with the diagnostics like this:
// nssearch-0397: *** Error: NsSearchAndEnter:
// Bad character in ACPI Name: 5B5F545F
// and fall into recursion:
// Remark 3040 - Recursive method call ^ (ERR_)
// Note: (0x5B5F545F is equal to "[_T_")
Switch (Local1) {
Case (5) {
Store(5, Local0)
}
Default {
Store(1, Local0)
}
}
if (LNotEqual(Local0, 1)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 0)
}
}
// Concatenate operator affects the object passed as Source2 parameter
Method(mZ01, 1) {
Concatenate("qwertyuiop", arg0)
}
Method(mZ02, 1)
{
Store(0, Local0)
mZ01(Local0)
if (LNotequal(Local0, 0)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 0)
}
Store(0, Local0)
Concatenate("qwertyuiop", Local0)
if (LNotequal(Local0, 0)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 0)
}
}
// Unexpected value returned by ObjectType for Field Unit objects
// The field passed as explicit reference (RefOf)
Method(mZ05, 1)
{
OperationRegion(r000, SystemMemory, 0x100, 0x100)
Field (r000, ByteAcc, NoLock, Preserve) {
f000, 32
}
Store(ObjectType(RefOf(f000)), Local0)
if (LNotEqual(Local0, 5)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 0)
}
}
// The BankField corrupts the contents of OperationRegion
Method(mZ06, 1)
{
OperationRegion(r000, SystemMemory, 0x100, 0x100)
Field (r000, ByteAcc, NoLock, Preserve) {
bnk0, 8
}
BankField (r000, bnk0, 0, ByteAcc, NoLock, Preserve) {
Offset(16),
bf00, 8,
}
BankField (r000, bnk0, 1, ByteAcc, NoLock, Preserve) {
Offset(17),
bf01, 8,
}
Store(1, bnk0)
if (LNotEqual(bnk0, 1)) {
err(arg0, z054, __LINE__, 0, 0, bnk0, 0)
}
Store(0x96, bf01)
if (LNotEqual(bnk0, 1)) {
err(arg0, z054, __LINE__, 0, 0, bnk0, 0)
}
Store(0x87, bf00)
if (LNotEqual(bnk0, 1)) {
err(arg0, z054, __LINE__, 0, 0, bnk0, 0)
}
if (LNotEqual(bf00, 0x87)) {
err(arg0, z054, __LINE__, 0, 0, bf00, 0)
}
if (LNotEqual(bf01, 0x96)) {
err(arg0, z054, __LINE__, 0, 0, bf01, 0)
}
}
// ToBuffer caused destroying of source buffer passed by Data parameter
Method(mZ07, 1)
{
Store(Buffer(4){10, 11, 12, 13}, Local0)
Store(ObjectType(Local0), Local1)
if (LNotEqual(Local1, c00b)) {
err(arg0, z054, __LINE__, 0, 0, Local1, 0)
}
ToBuffer(Local0, Local2)
Store(0xaa, Local3)
Store(ObjectType(Local0), Local3)
if (LNotEqual(Local3, c00b)) {
err(arg0, z054, __LINE__, 0, 0, Local3, 0)
}
}
// ObjectType() operator should be allowed to deal with the
// uninitialized objects.
// Uncomment this when the problem will be fixed and compile
// will not fail in this case like it do now: "Method local
// variable is not initialized (Local0)".
Method(mZ08, 1)
{
Store(ObjectType(Local0), Local1)
}
// Now, this cause exception but should not
Method(mZ09, 2)
{
if (arg1) {
Store(0, Local0)
}
CH03("", 0, 0, __LINE__, 0)
Store(ObjectType(Local0), Local1)
if (LNotEqual(Local1, 0)) {
err(arg0, z054, __LINE__, 0, 0, Local1, 0)
}
CH03("", 0, 0, __LINE__, 0)
}
Method(mZ0a, 1)
{
mZ09(arg0, 0)
}
// DerefOf. If the Source evaluates to a string, the string is evaluated
// as an ASL name (relative to the current scope) and the contents of that
// object are returned.
Method(mZ0b, 1)
{
Name(b000, Buffer(){ 1, 2, 3, 4, 5, 6, 7, 8 })
Store("b000", Local0)
Store("================ 0:", Debug)
Store(DerefOf(Local0), Local1)
Store("================ 1:", Debug)
Store(ObjectType(Local1), Local2)
if (LNotEqual(Local2, 3)) {
err(arg0, z054, __LINE__, 0, 0, Local2, 0)
}
Store("================ 2:", Debug)
Store(Local1, Debug)
Store(Local2, Debug)
return (0)
}
/*
// Currently, incorrect test
// The size of Strings in Package is determined incorrectly
Method(mZ0c, 1)
{
Name(p000, Package() {
"012",
"0123456789abcdef",
Buffer() {17,28,69,11,22,34,35,56,67,11},
"012345",
})
Store(DeRefOf(Index(p000, 1)), Local0)
Store(0, Index(Local0, 5))
Store(0, Index(p000, 1))
Store(DeRefOf(Index(p000, 1)), Local0)
// Store(0, Index(Local0, 5))
Store("=================:", Debug)
Store(Local0, Debug)
// 0
Store(DeRefOf(Index(p000, 0)), Local2)
Store(SizeOf(Local2), Local3)
Store(Local3, Debug)
if (LNotEqual(Local3, 3)) {
err(arg0, z054, __LINE__, 0, 0, Local3, 3)
}
// 1
Store(DeRefOf(Index(p000, 1)), Local2)
Store(SizeOf(Local2), Local3)
Store(Local3, Debug)
if (LNotEqual(Local3, 9)) {
err(arg0, z054, __LINE__, 0, 0, Local3, 9)
}
// 2
Store(DeRefOf(Index(p000, 2)), Local2)
Store(SizeOf(Local2), Local3)
Store(Local3, Debug)
if (LNotEqual(Local3, 6)) {
err(arg0, z054, __LINE__, 0, 0, Local3, 6)
}
Store(SizeOf(p000), Local0)
Store(Local0, Debug)
if (LNotEqual(Local0, 3)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 3)
}
}
*/
/*
// ATTENTION: such type tests have to be added and extended
Method(mZ0d, 1)
{
Name(p000, Package() {
0x12345678, 0x90abcdef,
})
Name(b000, Buffer() {0x78,0x56,0x34,0x12, 0xef,0xcd,0xab,0x90})
Store(DeRefOf(Index(p000, 0)), Local7)
if (LEqual(b000, Local7)) {
err(arg0, z054, __LINE__, 0, 0, b000, Local7)
}
if (LEqual(Local7, b000)) {
err(arg0, z054, __LINE__, 0, 0, Local7, b000)
}
return (0)
}
*/
// Bug 54: All the ASL Operators which deal with at least two Buffer type
// objects cause unexpected exceptions in cases when both Buffer type objects
// are passed immediately
Method(mZ0e, 1)
{
CH03("", 0, 0, __LINE__, 0)
Add( Buffer() {0x79}, Buffer() {0x79} )
CH03("", 0, 0, __LINE__, 0)
}
// Bug 57: The empty Return operator (without specifying the returning value)
// is processed incorrectly
Method(mZ0f, 1) {
Method(mZ10, 2) {
if (arg1) {
return (0x1234)
// ASL-compiler report Warning in this case
// Store("ERROR 0: mZ13, after Return !!!", Debug)
}
err(arg0, z054, __LINE__, 0, 0, 0, 0)
return (0x5678)
}
Method(mZ11, 2) {
if (arg1) {
return
// ASL-compiler DOESN'T report Warning in this case!!!
// And the Store operator below is actually processed!!!
err(arg0, z054, __LINE__, 0, 0, 0, 0)
}
err(arg0, z054, __LINE__, 0, 0, 0, 0)
return
}
Store(mZ10(arg0, 1), Local7)
mZ11(arg0, 1)
return (0)
}
// Bug 59: The String to Buffer Rule from the Table 17-8 "Object Conversion
// Rules" says "If the string is shorter than the buffer, the buffer size is
// reduced".
Method(mZ10, 1) {
Name(str0, "\x01\x02")
Name(buf0, Buffer(){0x03, 0x04, 0x05})
Store(str0, buf0)
if (LNotEqual(Sizeof(buf0), 2)) {
// Error: length of the buffer not reduced to the stored string
err(arg0, z054, __LINE__, 0, 0, 0, 0)
}
return (0)
}
// Bug 65: The Buffer Field type objects should be passed
// to Methods without any conversion, but instead
// they are converted to Buffers or Integers depending
// on the size of the Buffer Field object and the
// run mode (32-bit or 64/bit mode).
Method(mZ11, 1) {
Name(b000, Buffer(200) {})
CreateField(b000, 0, 8, bf00)
Method(m000, 2)
{
Store(ObjectType(arg1), Local0)
if (LNotEqual(Local0, 14)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 14)
}
}
Method(m001, 1)
{
Store(ObjectType(bf00), Local0)
if (LNotEqual(Local0, 14)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 14)
} else {
m000(arg0, bf00)
}
}
m001(arg0)
}
// Bug 66: The Field Unit type objects should be passed
// to Methods without any conversion, but instead
// they are converted to Buffers or Integers depending
// on the size of the Buffer Field object and the
// run mode (32-bit or 64/bit mode).
Method(mZ12, 1) {
OperationRegion(r000, SystemMemory, 0x100, 0x100)
Field(r000, ByteAcc, NoLock, Preserve) { f000, 8 }
Method(m000, 2)
{
Store(ObjectType(arg1), Local0)
if (LNotEqual(Local0, 5)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 5)
}
}
Method(m001, 1)
{
Store(ObjectType(f000), Local0)
if (LNotEqual(Local0, 5)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 5)
} else {
m000(arg0, f000)
}
}
m001(arg0)
}
// Bug 67: The Buffer Field type objects should be RETURNED
// by Methods without any conversion, but instead
// they are converted to Buffers or Integers depending
// on the size of the Buffer Field object and the
// run mode (32-bit or 64/bit mode).
Method(mZ13, 1) {
Name(b000, Buffer(200) {})
CreateField(b000, 0, 8, bf00)
Method(m000)
{
return (bf00)
}
Method(m001, 1)
{
Store(ObjectType(bf00), Local0)
if (LNotEqual(Local0, 14)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 14)
} else {
Store(m000(), Local7)
Store(ObjectType(Local7), Local0)
if (LNotEqual(Local0, 14)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 14)
}
}
}
m001(arg0)
}
// Bug 68: The Field Unit type objects should be RETURNED
// by Methods without any conversion, but instead
// they are converted to Buffers or Integers depending
// on the size of the Buffer Field object and the
// run mode (32-bit or 64/bit mode).
Method(mZ14, 1) {
OperationRegion(r000, SystemMemory, 0x100, 0x100)
Field(r000, ByteAcc, NoLock, Preserve) { f000, 8 }
Method(m000)
{
return (f000)
}
Method(m001, 1)
{
Store(ObjectType(f000), Local0)
if (LNotEqual(Local0, 5)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 5)
} else {
Store(m000(), Local7)
Store(ObjectType(Local7), Local0)
if (LNotEqual(Local0, 5)) {
err(arg0, z054, __LINE__, 0, 0, Local0, 5)
}
}
}
m001(arg0)
}
// Bug 30. This test may be removed there after
// the Field relative tests will be implemented.
// Caused crash.
Method(mZ15, 1)
{
Method(m000)
{
// Field Unit
OperationRegion(r000, SystemMemory, 0x100, 0x100)
Field(r000, ByteAcc, NoLock, Preserve) {
f000, 8,
f001, 16,
f002, 32,
f003, 33,
f004, 1,
f005, 64,
}
Store("------------ Fields:", Debug)
Store(f000, Debug)
Store(f001, Debug)
Store(f002, Debug)
Store(f003, Debug)
Store(f004, Debug)
Store(f005, Debug)
Store("------------.", Debug)
return (0)
}
Method(m001)
{
// Field Unit
OperationRegion(r000, SystemMemory, 0x100, 0x100)
Field(r000, ByteAcc, NoLock, Preserve) {
f000, 8,
f001, 16,
f002, 32,
f003, 33,
f004, 7,
f005, 64,
}
Store("------------ Fields:", Debug)
Store(f000, Debug)
Store(f001, Debug)
Store(f002, Debug)
Store(f003, Debug)
Store(f004, Debug)
Store(f005, Debug)
Store("------------.", Debug)
return (0)
}
m000()
m001()
return (0)
}
Method(mZ16, 1)
{
Method(m000)
{
return (0x12345678)
}
Method(m001, 1)
{
return (0x12345678)
}
Store(ObjectType(m000), Local0)
if (LNotEqual(Local0, c010)) {
err(arg0, z054, __LINE__, 0, 0, Local0, c010)
}
/* Nov. 2012: Method invocation as arg to ObjectType is now illegal */
//
// Store(ObjectType(m000()), Local0)
// if (LNotEqual(Local0, c009)) {
// err(arg0, z054, __LINE__, 0, 0, Local0, c009)
// }
//
// Store(ObjectType(m001(123)), Local1)
// if (LNotEqual(Local1, c009)) {
// err(arg0, z054, __LINE__, 0, 0, Local1, c009)
// }
}
// Run-method
Method(MSC0)
{
Name(ts, "MSC0")
mZ00(ts)
mZ02(ts)
mZ05(ts)
mZ06(ts)
mZ07(ts)
mZ08(ts)
mZ0a(ts)
mZ0b(ts)
mZ0e(ts)
mZ0f(ts)
mZ10(ts)
mZ11(ts)
mZ12(ts)
mZ13(ts)
mZ14(ts)
mZ15(ts)
mZ16(ts)
}