mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
acpi: define helper functions for working with opcode groups
This commit is contained in:
parent
b1e959ec4d
commit
ca1682c431
@ -130,3 +130,69 @@ const (
|
|||||||
// Sentinel value to indicate freed objects
|
// Sentinel value to indicate freed objects
|
||||||
pOpIntFreedObject = uint16(0xff + 0xff)
|
pOpIntFreedObject = uint16(0xff + 0xff)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// pOpIsLocalArg returns true if this opcode represents any of the supported local
|
||||||
|
// function args 0 to 7.
|
||||||
|
func pOpIsLocalArg(op uint16) bool {
|
||||||
|
return op >= pOpLocal0 && op <= pOpLocal7
|
||||||
|
}
|
||||||
|
|
||||||
|
// pOpIsMethodArg returns true if this opcode represents any of the supported
|
||||||
|
// input function args 0 to 6.
|
||||||
|
func pOpIsMethodArg(op uint16) bool {
|
||||||
|
return op >= pOpArg0 && op <= pOpArg6
|
||||||
|
}
|
||||||
|
|
||||||
|
// pOpIsArg returns true if this opcode is either a local or a method arg.
|
||||||
|
func pOpIsArg(op uint16) bool {
|
||||||
|
return pOpIsLocalArg(op) || pOpIsMethodArg(op)
|
||||||
|
}
|
||||||
|
|
||||||
|
// pOpIsType2 returns true if this is a Type2Opcode.
|
||||||
|
//
|
||||||
|
// Grammar:
|
||||||
|
// Type2Opcode := DefAcquire | DefAdd | DefAnd | DefBuffer | DefConcat |
|
||||||
|
// DefConcatRes | DefCondRefOf | DefCopyObject | DefDecrement |
|
||||||
|
// DefDerefOf | DefDivide | DefFindSetLeftBit | DefFindSetRightBit |
|
||||||
|
// DefFromBCD | DefIncrement | DefIndex | DefLAnd | DefLEqual |
|
||||||
|
// DefLGreater | DefLGreaterEqual | DefLLess | DefLLessEqual | DefMid |
|
||||||
|
// DefLNot | DefLNotEqual | DefLoadTable | DefLOr | DefMatch | DefMod |
|
||||||
|
// DefMultiply | DefNAnd | DefNOr | DefNot | DefObjectType | DefOr |
|
||||||
|
// DefPackage | DefVarPackage | DefRefOf | DefShiftLeft | DefShiftRight |
|
||||||
|
// DefSizeOf | DefStore | DefSubtract | DefTimer | DefToBCD | DefToBuffer |
|
||||||
|
// DefToDecimalString | DefToHexString | DefToInteger | DefToString |
|
||||||
|
// DefWait | DefXOr
|
||||||
|
func pOpIsType2(op uint16) bool {
|
||||||
|
switch op {
|
||||||
|
case pOpAcquire, pOpAdd, pOpAnd, pOpBuffer, pOpConcat,
|
||||||
|
pOpConcatRes, pOpCondRefOf, pOpCopyObject, pOpDecrement,
|
||||||
|
pOpDerefOf, pOpDivide, pOpFindSetLeftBit, pOpFindSetRightBit,
|
||||||
|
pOpFromBCD, pOpIncrement, pOpIndex, pOpLand, pOpLEqual,
|
||||||
|
pOpLGreater, pOpLLess, pOpMid,
|
||||||
|
pOpLnot, pOpLoadTable, pOpLor, pOpMatch, pOpMod,
|
||||||
|
pOpMultiply, pOpNand, pOpNor, pOpNot, pOpObjectType, pOpOr,
|
||||||
|
pOpPackage, pOpVarPackage, pOpRefOf, pOpShiftLeft, pOpShiftRight,
|
||||||
|
pOpSizeOf, pOpStore, pOpSubtract, pOpTimer, pOpToBCD, pOpToBuffer,
|
||||||
|
pOpToDecimalString, pOpToHexString, pOpToInteger, pOpToString,
|
||||||
|
pOpWait, pOpXor:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// pOpIsDataObject returns true if this opcode is part of a DataObject definition
|
||||||
|
//
|
||||||
|
// Grammar:
|
||||||
|
// DataObject := ComputationalData | DefPackage | DefVarPackage
|
||||||
|
// ComputationalData := ByteConst | WordConst | DWordConst | QWordConst | String | ConstObj | RevisionOp | DefBuffer
|
||||||
|
// ConstObj := ZeroOp | OneOp | OnesOp
|
||||||
|
func pOpIsDataObject(op uint16) bool {
|
||||||
|
switch op {
|
||||||
|
case pOpBytePrefix, pOpWordPrefix, pOpDwordPrefix, pOpQwordPrefix, pOpStringPrefix,
|
||||||
|
pOpZero, pOpOne, pOpOnes, pOpRevision, pOpBuffer, pOpPackage, pOpVarPackage:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
108
src/gopheros/device/acpi/aml/parser_opcode_table_test.go
Normal file
108
src/gopheros/device/acpi/aml/parser_opcode_table_test.go
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
package aml
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestOpcodeIsX(t *testing.T) {
|
||||||
|
specs := []struct {
|
||||||
|
op uint16
|
||||||
|
testFn func(uint16) bool
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
// OpIsLocalArg
|
||||||
|
{pOpLocal0, pOpIsLocalArg, true},
|
||||||
|
{pOpLocal1, pOpIsLocalArg, true},
|
||||||
|
{pOpLocal2, pOpIsLocalArg, true},
|
||||||
|
{pOpLocal3, pOpIsLocalArg, true},
|
||||||
|
{pOpLocal4, pOpIsLocalArg, true},
|
||||||
|
{pOpLocal5, pOpIsLocalArg, true},
|
||||||
|
{pOpLocal6, pOpIsLocalArg, true},
|
||||||
|
{pOpLocal7, pOpIsLocalArg, true},
|
||||||
|
{pOpArg0, pOpIsLocalArg, false},
|
||||||
|
{pOpDivide, pOpIsLocalArg, false},
|
||||||
|
// OpIsMethodArg
|
||||||
|
{pOpArg0, pOpIsMethodArg, true},
|
||||||
|
{pOpArg1, pOpIsMethodArg, true},
|
||||||
|
{pOpArg2, pOpIsMethodArg, true},
|
||||||
|
{pOpArg3, pOpIsMethodArg, true},
|
||||||
|
{pOpArg4, pOpIsMethodArg, true},
|
||||||
|
{pOpArg5, pOpIsMethodArg, true},
|
||||||
|
{pOpArg6, pOpIsMethodArg, true},
|
||||||
|
{pOpLocal7, pOpIsMethodArg, false},
|
||||||
|
{pOpIf, pOpIsMethodArg, false},
|
||||||
|
// OpIsArg
|
||||||
|
{pOpLocal5, pOpIsArg, true},
|
||||||
|
{pOpArg1, pOpIsArg, true},
|
||||||
|
{pOpDivide, pOpIsArg, false},
|
||||||
|
// OpIsType2
|
||||||
|
{pOpAcquire, pOpIsType2, true},
|
||||||
|
{pOpAdd, pOpIsType2, true},
|
||||||
|
{pOpAnd, pOpIsType2, true},
|
||||||
|
{pOpBuffer, pOpIsType2, true},
|
||||||
|
{pOpConcat, pOpIsType2, true},
|
||||||
|
{pOpConcatRes, pOpIsType2, true},
|
||||||
|
{pOpCondRefOf, pOpIsType2, true},
|
||||||
|
{pOpCopyObject, pOpIsType2, true},
|
||||||
|
{pOpDecrement, pOpIsType2, true},
|
||||||
|
{pOpDerefOf, pOpIsType2, true},
|
||||||
|
{pOpDivide, pOpIsType2, true},
|
||||||
|
{pOpFindSetLeftBit, pOpIsType2, true},
|
||||||
|
{pOpFindSetRightBit, pOpIsType2, true},
|
||||||
|
{pOpFromBCD, pOpIsType2, true},
|
||||||
|
{pOpIncrement, pOpIsType2, true},
|
||||||
|
{pOpIndex, pOpIsType2, true},
|
||||||
|
{pOpLand, pOpIsType2, true},
|
||||||
|
{pOpLEqual, pOpIsType2, true},
|
||||||
|
{pOpLGreater, pOpIsType2, true},
|
||||||
|
{pOpLLess, pOpIsType2, true},
|
||||||
|
{pOpMid, pOpIsType2, true},
|
||||||
|
{pOpLnot, pOpIsType2, true},
|
||||||
|
{pOpLoadTable, pOpIsType2, true},
|
||||||
|
{pOpLor, pOpIsType2, true},
|
||||||
|
{pOpMatch, pOpIsType2, true},
|
||||||
|
{pOpMod, pOpIsType2, true},
|
||||||
|
{pOpMultiply, pOpIsType2, true},
|
||||||
|
{pOpNand, pOpIsType2, true},
|
||||||
|
{pOpNor, pOpIsType2, true},
|
||||||
|
{pOpNot, pOpIsType2, true},
|
||||||
|
{pOpObjectType, pOpIsType2, true},
|
||||||
|
{pOpOr, pOpIsType2, true},
|
||||||
|
{pOpPackage, pOpIsType2, true},
|
||||||
|
{pOpVarPackage, pOpIsType2, true},
|
||||||
|
{pOpRefOf, pOpIsType2, true},
|
||||||
|
{pOpShiftLeft, pOpIsType2, true},
|
||||||
|
{pOpShiftRight, pOpIsType2, true},
|
||||||
|
{pOpSizeOf, pOpIsType2, true},
|
||||||
|
{pOpStore, pOpIsType2, true},
|
||||||
|
{pOpSubtract, pOpIsType2, true},
|
||||||
|
{pOpTimer, pOpIsType2, true},
|
||||||
|
{pOpToBCD, pOpIsType2, true},
|
||||||
|
{pOpToBuffer, pOpIsType2, true},
|
||||||
|
{pOpToDecimalString, pOpIsType2, true},
|
||||||
|
{pOpToHexString, pOpIsType2, true},
|
||||||
|
{pOpToInteger, pOpIsType2, true},
|
||||||
|
{pOpToString, pOpIsType2, true},
|
||||||
|
{pOpWait, pOpIsType2, true},
|
||||||
|
{pOpXor, pOpIsType2, true},
|
||||||
|
{pOpBytePrefix, pOpIsType2, false},
|
||||||
|
// OpIsDataObject
|
||||||
|
{pOpBytePrefix, pOpIsDataObject, true},
|
||||||
|
{pOpWordPrefix, pOpIsDataObject, true},
|
||||||
|
{pOpDwordPrefix, pOpIsDataObject, true},
|
||||||
|
{pOpQwordPrefix, pOpIsDataObject, true},
|
||||||
|
{pOpStringPrefix, pOpIsDataObject, true},
|
||||||
|
{pOpZero, pOpIsDataObject, true},
|
||||||
|
{pOpOne, pOpIsDataObject, true},
|
||||||
|
{pOpOnes, pOpIsDataObject, true},
|
||||||
|
{pOpRevision, pOpIsDataObject, true},
|
||||||
|
{pOpBuffer, pOpIsDataObject, true},
|
||||||
|
{pOpPackage, pOpIsDataObject, true},
|
||||||
|
{pOpVarPackage, pOpIsDataObject, true},
|
||||||
|
{pOpLor, pOpIsDataObject, false},
|
||||||
|
}
|
||||||
|
|
||||||
|
for specIndex, spec := range specs {
|
||||||
|
if got := spec.testFn(spec.op); got != spec.want {
|
||||||
|
t.Errorf("[spec %d] opcode %q: expected to get %t; got %t", specIndex, spec.op, spec.want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user