mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
acpi: move AML opcode definitions into the entity pkg
This commit is contained in:
parent
61597cff56
commit
89923eb481
202
src/gopheros/device/acpi/aml/entity/opcode.go
Normal file
202
src/gopheros/device/acpi/aml/entity/opcode.go
Normal file
@ -0,0 +1,202 @@
|
||||
package entity
|
||||
|
||||
// AMLOpcode describes an AML opcode. While AML supports 256 opcodes, some of
|
||||
// them are specified using a combination of an extension prefix and a code. To
|
||||
// map each opcode into a single unique value the parser uses an uint16
|
||||
// representation of the opcode values.
|
||||
type AMLOpcode uint16
|
||||
|
||||
const (
|
||||
// Regular opcode list
|
||||
OpZero = AMLOpcode(0x00)
|
||||
OpOne = AMLOpcode(0x01)
|
||||
OpAlias = AMLOpcode(0x06)
|
||||
OpName = AMLOpcode(0x08)
|
||||
OpBytePrefix = AMLOpcode(0x0a)
|
||||
OpWordPrefix = AMLOpcode(0x0b)
|
||||
OpDwordPrefix = AMLOpcode(0x0c)
|
||||
OpStringPrefix = AMLOpcode(0x0d)
|
||||
OpQwordPrefix = AMLOpcode(0x0e)
|
||||
OpScope = AMLOpcode(0x10)
|
||||
OpBuffer = AMLOpcode(0x11)
|
||||
OpPackage = AMLOpcode(0x12)
|
||||
OpVarPackage = AMLOpcode(0x13)
|
||||
OpMethod = AMLOpcode(0x14)
|
||||
OpExternal = AMLOpcode(0x15)
|
||||
OpLocal0 = AMLOpcode(0x60)
|
||||
OpLocal1 = AMLOpcode(0x61)
|
||||
OpLocal2 = AMLOpcode(0x62)
|
||||
OpLocal3 = AMLOpcode(0x63)
|
||||
OpLocal4 = AMLOpcode(0x64)
|
||||
OpLocal5 = AMLOpcode(0x65)
|
||||
OpLocal6 = AMLOpcode(0x66)
|
||||
OpLocal7 = AMLOpcode(0x67)
|
||||
OpArg0 = AMLOpcode(0x68)
|
||||
OpArg1 = AMLOpcode(0x69)
|
||||
OpArg2 = AMLOpcode(0x6a)
|
||||
OpArg3 = AMLOpcode(0x6b)
|
||||
OpArg4 = AMLOpcode(0x6c)
|
||||
OpArg5 = AMLOpcode(0x6d)
|
||||
OpArg6 = AMLOpcode(0x6e)
|
||||
OpStore = AMLOpcode(0x70)
|
||||
OpRefOf = AMLOpcode(0x71)
|
||||
OpAdd = AMLOpcode(0x72)
|
||||
OpConcat = AMLOpcode(0x73)
|
||||
OpSubtract = AMLOpcode(0x74)
|
||||
OpIncrement = AMLOpcode(0x75)
|
||||
OpDecrement = AMLOpcode(0x76)
|
||||
OpMultiply = AMLOpcode(0x77)
|
||||
OpDivide = AMLOpcode(0x78)
|
||||
OpShiftLeft = AMLOpcode(0x79)
|
||||
OpShiftRight = AMLOpcode(0x7a)
|
||||
OpAnd = AMLOpcode(0x7b)
|
||||
OpNand = AMLOpcode(0x7c)
|
||||
OpOr = AMLOpcode(0x7d)
|
||||
OpNor = AMLOpcode(0x7e)
|
||||
OpXor = AMLOpcode(0x7f)
|
||||
OpNot = AMLOpcode(0x80)
|
||||
OpFindSetLeftBit = AMLOpcode(0x81)
|
||||
OpFindSetRightBit = AMLOpcode(0x82)
|
||||
OpDerefOf = AMLOpcode(0x83)
|
||||
OpConcatRes = AMLOpcode(0x84)
|
||||
OpMod = AMLOpcode(0x85)
|
||||
OpNotify = AMLOpcode(0x86)
|
||||
OpSizeOf = AMLOpcode(0x87)
|
||||
OpIndex = AMLOpcode(0x88)
|
||||
OpMatch = AMLOpcode(0x89)
|
||||
OpCreateDWordField = AMLOpcode(0x8a)
|
||||
OpCreateWordField = AMLOpcode(0x8b)
|
||||
OpCreateByteField = AMLOpcode(0x8c)
|
||||
OpCreateBitField = AMLOpcode(0x8d)
|
||||
OpObjectType = AMLOpcode(0x8e)
|
||||
OpCreateQWordField = AMLOpcode(0x8f)
|
||||
OpLand = AMLOpcode(0x90)
|
||||
OpLor = AMLOpcode(0x91)
|
||||
OpLnot = AMLOpcode(0x92)
|
||||
OpLEqual = AMLOpcode(0x93)
|
||||
OpLGreater = AMLOpcode(0x94)
|
||||
OpLLess = AMLOpcode(0x95)
|
||||
OpToBuffer = AMLOpcode(0x96)
|
||||
OpToDecimalString = AMLOpcode(0x97)
|
||||
OpToHexString = AMLOpcode(0x98)
|
||||
OpToInteger = AMLOpcode(0x99)
|
||||
OpToString = AMLOpcode(0x9c)
|
||||
OpCopyObject = AMLOpcode(0x9d)
|
||||
OpMid = AMLOpcode(0x9e)
|
||||
OpContinue = AMLOpcode(0x9f)
|
||||
OpIf = AMLOpcode(0xa0)
|
||||
OpElse = AMLOpcode(0xa1)
|
||||
OpWhile = AMLOpcode(0xa2)
|
||||
OpNoop = AMLOpcode(0xa3)
|
||||
OpReturn = AMLOpcode(0xa4)
|
||||
OpBreak = AMLOpcode(0xa5)
|
||||
OpBreakPoint = AMLOpcode(0xcc)
|
||||
OpOnes = AMLOpcode(0xff)
|
||||
// Extended opcodes
|
||||
OpMutex = AMLOpcode(0xff + 0x01)
|
||||
OpEvent = AMLOpcode(0xff + 0x02)
|
||||
OpCondRefOf = AMLOpcode(0xff + 0x12)
|
||||
OpCreateField = AMLOpcode(0xff + 0x13)
|
||||
OpLoadTable = AMLOpcode(0xff + 0x1f)
|
||||
OpLoad = AMLOpcode(0xff + 0x20)
|
||||
OpStall = AMLOpcode(0xff + 0x21)
|
||||
OpSleep = AMLOpcode(0xff + 0x22)
|
||||
OpAcquire = AMLOpcode(0xff + 0x23)
|
||||
OpSignal = AMLOpcode(0xff + 0x24)
|
||||
OpWait = AMLOpcode(0xff + 0x25)
|
||||
OpReset = AMLOpcode(0xff + 0x26)
|
||||
OpRelease = AMLOpcode(0xff + 0x27)
|
||||
OpFromBCD = AMLOpcode(0xff + 0x28)
|
||||
OpToBCD = AMLOpcode(0xff + 0x29)
|
||||
OpUnload = AMLOpcode(0xff + 0x2a)
|
||||
OpRevision = AMLOpcode(0xff + 0x30)
|
||||
OpDebug = AMLOpcode(0xff + 0x31)
|
||||
OpFatal = AMLOpcode(0xff + 0x32)
|
||||
OpTimer = AMLOpcode(0xff + 0x33)
|
||||
OpOpRegion = AMLOpcode(0xff + 0x80)
|
||||
OpField = AMLOpcode(0xff + 0x81)
|
||||
OpDevice = AMLOpcode(0xff + 0x82)
|
||||
OpProcessor = AMLOpcode(0xff + 0x83)
|
||||
OpPowerRes = AMLOpcode(0xff + 0x84)
|
||||
OpThermalZone = AMLOpcode(0xff + 0x85)
|
||||
OpIndexField = AMLOpcode(0xff + 0x86)
|
||||
OpBankField = AMLOpcode(0xff + 0x87)
|
||||
OpDataRegion = AMLOpcode(0xff + 0x88)
|
||||
)
|
||||
|
||||
// OpIsLocalArg returns true if this opcode represents any of the supported local
|
||||
// function args 0 to 7.
|
||||
func OpIsLocalArg(op AMLOpcode) bool {
|
||||
return op >= OpLocal0 && op <= OpLocal7
|
||||
}
|
||||
|
||||
// OpIsMethodArg returns true if this opcode represents any of the supported
|
||||
// input function args 0 to 6.
|
||||
func OpIsMethodArg(op AMLOpcode) bool {
|
||||
return op >= OpArg0 && op <= OpArg6
|
||||
}
|
||||
|
||||
// OpIsArg returns true if this opcode is either a local or a method arg.
|
||||
func OpIsArg(op AMLOpcode) bool {
|
||||
return OpIsLocalArg(op) || OpIsMethodArg(op)
|
||||
}
|
||||
|
||||
// OpIsDataObject 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 OpIsDataObject(op AMLOpcode) bool {
|
||||
switch op {
|
||||
case OpBytePrefix, OpWordPrefix, OpDwordPrefix, OpQwordPrefix, OpStringPrefix,
|
||||
OpZero, OpOne, OpOnes, OpRevision, OpBuffer, OpPackage, OpVarPackage:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// OpIsType2 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 OpIsType2(op AMLOpcode) bool {
|
||||
switch op {
|
||||
case OpAcquire, OpAdd, OpAnd, OpBuffer, OpConcat,
|
||||
OpConcatRes, OpCondRefOf, OpCopyObject, OpDecrement,
|
||||
OpDerefOf, OpDivide, OpFindSetLeftBit, OpFindSetRightBit,
|
||||
OpFromBCD, OpIncrement, OpIndex, OpLand, OpLEqual,
|
||||
OpLGreater, OpLLess, OpMid,
|
||||
OpLnot, OpLoadTable, OpLor, OpMatch, OpMod,
|
||||
OpMultiply, OpNand, OpNor, OpNot, OpObjectType, OpOr,
|
||||
OpPackage, OpVarPackage, OpRefOf, OpShiftLeft, OpShiftRight,
|
||||
OpSizeOf, OpStore, OpSubtract, OpTimer, OpToBCD, OpToBuffer,
|
||||
OpToDecimalString, OpToHexString, OpToInteger, OpToString,
|
||||
OpWait, OpXor:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// OpIsBufferField returens true if this opcode describes a
|
||||
// buffer field creation operation.
|
||||
func OpIsBufferField(op AMLOpcode) bool {
|
||||
switch op {
|
||||
case OpCreateField, OpCreateBitField, OpCreateByteField, OpCreateWordField, OpCreateDWordField, OpCreateQWordField:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
116
src/gopheros/device/acpi/aml/entity/opcode_test.go
Normal file
116
src/gopheros/device/acpi/aml/entity/opcode_test.go
Normal file
@ -0,0 +1,116 @@
|
||||
package entity
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestOpcodeIsX(t *testing.T) {
|
||||
specs := []struct {
|
||||
op AMLOpcode
|
||||
testFn func(AMLOpcode) bool
|
||||
want bool
|
||||
}{
|
||||
// OpIsLocalArg
|
||||
{OpLocal0, OpIsLocalArg, true},
|
||||
{OpLocal1, OpIsLocalArg, true},
|
||||
{OpLocal2, OpIsLocalArg, true},
|
||||
{OpLocal3, OpIsLocalArg, true},
|
||||
{OpLocal4, OpIsLocalArg, true},
|
||||
{OpLocal5, OpIsLocalArg, true},
|
||||
{OpLocal6, OpIsLocalArg, true},
|
||||
{OpLocal7, OpIsLocalArg, true},
|
||||
{OpArg0, OpIsLocalArg, false},
|
||||
{OpDivide, OpIsLocalArg, false},
|
||||
// OpIsMethodArg
|
||||
{OpArg0, OpIsMethodArg, true},
|
||||
{OpArg1, OpIsMethodArg, true},
|
||||
{OpArg2, OpIsMethodArg, true},
|
||||
{OpArg3, OpIsMethodArg, true},
|
||||
{OpArg4, OpIsMethodArg, true},
|
||||
{OpArg5, OpIsMethodArg, true},
|
||||
{OpArg6, OpIsMethodArg, true},
|
||||
{OpLocal7, OpIsMethodArg, false},
|
||||
{OpIf, OpIsMethodArg, false},
|
||||
// OpIsArg
|
||||
{OpLocal5, OpIsArg, true},
|
||||
{OpArg1, OpIsArg, true},
|
||||
{OpDivide, OpIsArg, false},
|
||||
// OpIsType2
|
||||
{OpAcquire, OpIsType2, true},
|
||||
{OpAdd, OpIsType2, true},
|
||||
{OpAnd, OpIsType2, true},
|
||||
{OpBuffer, OpIsType2, true},
|
||||
{OpConcat, OpIsType2, true},
|
||||
{OpConcatRes, OpIsType2, true},
|
||||
{OpCondRefOf, OpIsType2, true},
|
||||
{OpCopyObject, OpIsType2, true},
|
||||
{OpDecrement, OpIsType2, true},
|
||||
{OpDerefOf, OpIsType2, true},
|
||||
{OpDivide, OpIsType2, true},
|
||||
{OpFindSetLeftBit, OpIsType2, true},
|
||||
{OpFindSetRightBit, OpIsType2, true},
|
||||
{OpFromBCD, OpIsType2, true},
|
||||
{OpIncrement, OpIsType2, true},
|
||||
{OpIndex, OpIsType2, true},
|
||||
{OpLand, OpIsType2, true},
|
||||
{OpLEqual, OpIsType2, true},
|
||||
{OpLGreater, OpIsType2, true},
|
||||
{OpLLess, OpIsType2, true},
|
||||
{OpMid, OpIsType2, true},
|
||||
{OpLnot, OpIsType2, true},
|
||||
{OpLoadTable, OpIsType2, true},
|
||||
{OpLor, OpIsType2, true},
|
||||
{OpMatch, OpIsType2, true},
|
||||
{OpMod, OpIsType2, true},
|
||||
{OpMultiply, OpIsType2, true},
|
||||
{OpNand, OpIsType2, true},
|
||||
{OpNor, OpIsType2, true},
|
||||
{OpNot, OpIsType2, true},
|
||||
{OpObjectType, OpIsType2, true},
|
||||
{OpOr, OpIsType2, true},
|
||||
{OpPackage, OpIsType2, true},
|
||||
{OpVarPackage, OpIsType2, true},
|
||||
{OpRefOf, OpIsType2, true},
|
||||
{OpShiftLeft, OpIsType2, true},
|
||||
{OpShiftRight, OpIsType2, true},
|
||||
{OpSizeOf, OpIsType2, true},
|
||||
{OpStore, OpIsType2, true},
|
||||
{OpSubtract, OpIsType2, true},
|
||||
{OpTimer, OpIsType2, true},
|
||||
{OpToBCD, OpIsType2, true},
|
||||
{OpToBuffer, OpIsType2, true},
|
||||
{OpToDecimalString, OpIsType2, true},
|
||||
{OpToHexString, OpIsType2, true},
|
||||
{OpToInteger, OpIsType2, true},
|
||||
{OpToString, OpIsType2, true},
|
||||
{OpWait, OpIsType2, true},
|
||||
{OpXor, OpIsType2, true},
|
||||
{OpBytePrefix, OpIsType2, false},
|
||||
// OpIsDataObject
|
||||
{OpBytePrefix, OpIsDataObject, true},
|
||||
{OpWordPrefix, OpIsDataObject, true},
|
||||
{OpDwordPrefix, OpIsDataObject, true},
|
||||
{OpQwordPrefix, OpIsDataObject, true},
|
||||
{OpStringPrefix, OpIsDataObject, true},
|
||||
{OpZero, OpIsDataObject, true},
|
||||
{OpOne, OpIsDataObject, true},
|
||||
{OpOnes, OpIsDataObject, true},
|
||||
{OpRevision, OpIsDataObject, true},
|
||||
{OpBuffer, OpIsDataObject, true},
|
||||
{OpPackage, OpIsDataObject, true},
|
||||
{OpVarPackage, OpIsDataObject, true},
|
||||
{OpLor, OpIsDataObject, false},
|
||||
// OpIsBufferField
|
||||
{OpCreateField, OpIsBufferField, true},
|
||||
{OpCreateBitField, OpIsBufferField, true},
|
||||
{OpCreateByteField, OpIsBufferField, true},
|
||||
{OpCreateWordField, OpIsBufferField, true},
|
||||
{OpCreateDWordField, OpIsBufferField, true},
|
||||
{OpCreateQWordField, OpIsBufferField, true},
|
||||
{OpRevision, OpIsBufferField, 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