Files
my-os-project2/kernel/hal/x86_64/uACPI/include/uacpi/internal/opcodes.h
2025-08-17 18:37:57 +02:00

1391 lines
76 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <uacpi/types.h>
typedef uacpi_u16 uacpi_aml_op;
#define UACPI_EXT_PREFIX 0x5B
#define UACPI_EXT_OP(op) ((UACPI_EXT_PREFIX << 8) | (op))
#define UACPI_DUAL_NAME_PREFIX 0x2E
#define UACPI_MULTI_NAME_PREFIX 0x2F
#define UACPI_NULL_NAME 0x00
/*
* Opcodes that tell the parser VM how to take apart every AML instruction.
* Every AML opcode has a list of these that is executed by the parser.
*/
enum uacpi_parse_op {
UACPI_PARSE_OP_END = 0,
/*
* End the execution of the current instruction with a warning if the item
* at decode_ops[pc + 1] is NULL.
*/
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL,
// Emit a warning as if the current opcode is being skipped
UACPI_PARSE_OP_EMIT_SKIP_WARN,
// SimpleName := NameString | ArgObj | LocalObj
UACPI_PARSE_OP_SIMPLE_NAME,
// SuperName := SimpleName | DebugObj | ReferenceTypeOpcode
UACPI_PARSE_OP_SUPERNAME,
// The resulting item will be set to null if name couldn't be resolved
UACPI_PARSE_OP_SUPERNAME_OR_UNRESOLVED,
// TermArg := ExpressionOpcode | DataObject | ArgObj | LocalObj
UACPI_PARSE_OP_TERM_ARG,
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL,
/*
* Same as TERM_ARG, but named references are passed as-is.
* This means methods are not invoked, fields are not read, etc.
*/
UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT,
/*
* Same as UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT but allows unresolved
* name strings.
*/
UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT_OR_UNRESOLVED,
// Operand := TermArg => Integer
UACPI_PARSE_OP_OPERAND,
// TermArg => String
UACPI_PARSE_OP_STRING,
/*
* ComputationalData := ByteConst | WordConst | DWordConst | QWordConst |
* String | ConstObj | RevisionOp | DefBuffer
*/
UACPI_PARSE_OP_COMPUTATIONAL_DATA,
// Target := SuperName | NullName
UACPI_PARSE_OP_TARGET,
// Parses a pkglen
UACPI_PARSE_OP_PKGLEN,
/*
* Parses a pkglen and records it, the end of this pkglen is considered
* the end of the instruction. The PC is always set to the end of this
* package once parser reaches UACPI_PARSE_OP_END.
*/
UACPI_PARSE_OP_TRACKED_PKGLEN,
/*
* Parse a NameString and create the last nameseg.
* Note that this errors out if last nameseg already exists.
*/
UACPI_PARSE_OP_CREATE_NAMESTRING,
/*
* same as UACPI_PARSE_OP_CREATE_NAMESTRING, but attempting to create an
* already existing object is not fatal if currently loading a table.
*/
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD,
/*
* Parse a NameString and put the node into the ready parts array.
* Note that this errors out if the referenced node doesn't exist.
*/
UACPI_PARSE_OP_EXISTING_NAMESTRING,
/*
* Same as UACPI_PARSE_OP_EXISTING_NAMESTRING except the op doesn't error
* out if namestring couldn't be resolved.
*/
UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL,
/*
* Same as UACPI_PARSE_OP_EXISTING_NAMESTRING, but undefined references
* are not fatal if currently loading a table.
*/
UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD,
// Invoke a handler at op_handlers[spec->code]
UACPI_PARSE_OP_INVOKE_HANDLER,
// Allocate an object an put it at the front of the item list
UACPI_PARSE_OP_OBJECT_ALLOC,
UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC,
// Convert last item into a shallow/deep copy of itself
UACPI_PARSE_OP_OBJECT_CONVERT_TO_SHALLOW_COPY,
UACPI_PARSE_OP_OBJECT_CONVERT_TO_DEEP_COPY,
/*
* Same as UACPI_PARSE_OP_OBJECT_ALLOC except the type of the allocated
* object is specified at decode_ops[pc + 1]
*/
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED,
// Record current AML program counter as a QWORD immediate
UACPI_PARSE_OP_RECORD_AML_PC,
// Load a QWORD immediate located at decode_ops[pc + 1]
UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT,
// Load a decode_ops[pc + 1] byte imm at decode_ops[pc + 2]
UACPI_PARSE_OP_LOAD_INLINE_IMM,
// Load a QWORD zero immediate
UACPI_PARSE_OP_LOAD_ZERO_IMM,
// Load a decode_ops[pc + 1] byte imm from the instructions stream
UACPI_PARSE_OP_LOAD_IMM,
// Same as UACPI_PARSE_OP_LOAD_IMM, expect the resulting value is an object
UACPI_PARSE_OP_LOAD_IMM_AS_OBJECT,
// Create & Load an integer constant representing either true or false
UACPI_PARSE_OP_LOAD_FALSE_OBJECT,
UACPI_PARSE_OP_LOAD_TRUE_OBJECT,
// Truncate the last item in the list if needed
UACPI_PARSE_OP_TRUNCATE_NUMBER,
// Ensure the type of item is decode_ops[pc + 1]
UACPI_PARSE_OP_TYPECHECK,
// Install the namespace node specified in items[decode_ops[pc + 1]]
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE,
// Move item to the previous (preempted) op
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV,
/*
* Same as UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, but the object
* is copied instead. (Useful when dealing with multiple targets)
* TODO: optimize this so that we can optionally move the object
* if target was a null target.
*/
UACPI_PARSE_OP_OBJECT_COPY_TO_PREV,
// Store the last item to the target at items[decode_ops[pc + 1]]
UACPI_PARSE_OP_STORE_TO_TARGET,
/*
* Store the item at items[decode_ops[pc + 2]] to target
* at items[decode_ops[pc + 1]]
*/
UACPI_PARSE_OP_STORE_TO_TARGET_INDIRECT,
/*
* Error if reached. Should be used for opcodes that are supposed to be
* converted at op parse time, e.g. invoking a method or referring to
* a named object.
*/
UACPI_PARSE_OP_UNREACHABLE,
// Invalid opcode, should never be encountered in the stream
UACPI_PARSE_OP_BAD_OPCODE,
// Decrement the current AML instruction pointer
UACPI_PARSE_OP_AML_PC_DECREMENT,
// Decrement the immediate at decode_ops[pc + 1]
UACPI_PARSE_OP_IMM_DECREMENT,
// Remove the last item off the item stack
UACPI_PARSE_OP_ITEM_POP,
// Dispatch the method call from items[0] and return from current op_exec
UACPI_PARSE_OP_DISPATCH_METHOD_CALL,
/*
* Dispatch a table load with scope node at items[0] and method at items[1].
* The last item is expected to be an integer object that is set to 0 in
* case load fails.
*/
UACPI_PARSE_OP_DISPATCH_TABLE_LOAD,
/*
* Convert the current resolved namestring to either a method call
* or a named object reference.
*/
UACPI_PARSE_OP_CONVERT_NAMESTRING,
/*
* Execute the next instruction only if currently tracked package still
* has data left, otherwise skip decode_ops[pc + 1] bytes.
*/
UACPI_PARSE_OP_IF_HAS_DATA,
/*
* Execute the next instruction only if the handle at
* items[decode_ops[pc + 1]] is null. Otherwise skip
* decode_ops[pc + 2] bytes.
*/
UACPI_PARSE_OP_IF_NULL,
/*
* Execute the next instruction only if the handle at
* items[-1] is null. Otherwise skip decode_ops[pc + 1] bytes.
*/
UACPI_PARSE_OP_IF_LAST_NULL,
// The inverse of UACPI_PARSE_OP_IF_NULL
UACPI_PARSE_OP_IF_NOT_NULL,
// The inverse of UACPI_PARSE_OP_IF_LAST_NULL
UACPI_PARSE_OP_IF_LAST_NOT_NULL,
/*
* Execute the next instruction only if the last immediate is equal to
* decode_ops[pc + 1], otherwise skip decode_ops[pc + 2] bytes.
*/
UACPI_PARSE_OP_IF_LAST_EQUALS,
/*
* Execute the next instruction only if the last object is a false value
* (has a value of 0), otherwise skip decode_ops[pc + 1] bytes.
*/
UACPI_PARSE_OP_IF_LAST_FALSE,
// The inverse of UACPI_PARSE_OP_IF_LAST_FALSE
UACPI_PARSE_OP_IF_LAST_TRUE,
/*
* Switch to opcode at decode_ops[pc + 1] only if the next AML instruction
* in the stream is equal to it. Note that this looks ahead of the tracked
* package if one is active. Switching to the next op also applies the
* currently tracked package.
*/
UACPI_PARSE_OP_SWITCH_TO_NEXT_IF_EQUALS,
/*
* Execute the next instruction only if this op was switched to from op at
* (decode_ops[pc + 1] | decode_ops[pc + 2] << 8), otherwise skip
* decode_ops[pc + 3] bytes.
*/
UACPI_PARSE_OP_IF_SWITCHED_FROM,
/*
* pc = decode_ops[pc + 1]
*/
UACPI_PARSE_OP_JMP,
UACPI_PARSE_OP_MAX = UACPI_PARSE_OP_JMP,
};
const uacpi_char *uacpi_parse_op_to_string(enum uacpi_parse_op op);
/*
* A few notes about op properties:
* Technically the spec says that RefOfOp is considered a SuperName, but NT
* disagrees about this. For example Store(..., RefOf) fails with
* "Invalid SuperName". MethodInvocation could also technically be considered
* a SuperName, but NT doesn't allow that either: Store(..., MethodInvocation)
* fails with "Invalid Target Method, expected a DataObject" error.
*/
enum uacpi_op_property {
UACPI_OP_PROPERTY_TERM_ARG = 1,
UACPI_OP_PROPERTY_SUPERNAME = 2,
UACPI_OP_PROPERTY_SIMPLE_NAME = 4,
UACPI_OP_PROPERTY_TARGET = 8,
// The ops to execute are pointed to by indirect_decode_ops
UACPI_OP_PROPERTY_OUT_OF_LINE = 16,
// Error if encountered in the AML byte strem
UACPI_OP_PROPERTY_RESERVED = 128,
};
struct uacpi_op_spec {
uacpi_char *name;
union {
uacpi_u8 decode_ops[16];
uacpi_u8 *indirect_decode_ops;
};
uacpi_u8 properties;
uacpi_aml_op code;
};
const struct uacpi_op_spec *uacpi_get_op_spec(uacpi_aml_op);
#define UACPI_INTERNAL_OP(code) \
UACPI_OP(Internal_##code, code, 0, { UACPI_PARSE_OP_UNREACHABLE })
#define UACPI_BAD_OPCODE(code) \
UACPI_OP(Reserved_##code, code, 0, { UACPI_PARSE_OP_BAD_OPCODE })
#define UACPI_METHOD_CALL_OPCODE(nargs) \
UACPI_OP( \
InternalOpMethodCall##nargs##Args, 0xF7 + nargs, \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_RESERVED, \
{ \
UACPI_PARSE_OP_LOAD_INLINE_IMM, 1, nargs, \
UACPI_PARSE_OP_IF_NOT_NULL, 1, 6, \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_OBJECT_CONVERT_TO_SHALLOW_COPY, \
UACPI_PARSE_OP_IMM_DECREMENT, 1, \
UACPI_PARSE_OP_JMP, 3, \
UACPI_PARSE_OP_OBJECT_ALLOC, \
UACPI_PARSE_OP_DISPATCH_METHOD_CALL, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
)
/*
* -------------------------------------------------------------
* RootChar := \
* ParentPrefixChar := ^
* \ := 0x5C
* ^ := 0x5E
* MultiNamePrefix := 0x2F
* DualNamePrefix := 0x2E
* ------------------------------------------------------------
* A-Z := 0x41 - 0x5A
* _ := 0x5F
* LeadNameChar := A-Z | _
* NameSeg := <leadnamechar namechar namechar namechar>
* NameString := <rootchar namepath> | <prefixpath namepath>
* PrefixPath := Nothing | <^ prefixpath>
* DualNamePath := DualNamePrefix NameSeg NameSeg
* MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount)
*/
#define UACPI_UNRESOLVED_NAME_STRING_OP(character, code) \
UACPI_OP( \
UACPI_InternalOpUnresolvedNameString_##character, code, \
UACPI_OP_PROPERTY_SIMPLE_NAME | \
UACPI_OP_PROPERTY_SUPERNAME | \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_AML_PC_DECREMENT, \
UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL, \
UACPI_PARSE_OP_CONVERT_NAMESTRING, \
} \
)
#define UACPI_BUILD_LOCAL_OR_ARG_OP(prefix, base, offset) \
UACPI_OP( \
prefix##offset##Op, base + offset, \
UACPI_OP_PROPERTY_SUPERNAME | \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_SIMPLE_NAME, \
{ \
UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
#define UACPI_LOCALX_OP(idx) UACPI_BUILD_LOCAL_OR_ARG_OP(Local, 0x60, idx)
#define UACPI_ARGX_OP(idx) UACPI_BUILD_LOCAL_OR_ARG_OP(Arg, 0x68, idx)
#define UACPI_BUILD_PACKAGE_OP(name, code, jmp_off, ...) \
UACPI_OP( \
name##Op, code, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
##__VA_ARGS__, \
UACPI_PARSE_OP_IF_HAS_DATA, 4, \
UACPI_PARSE_OP_RECORD_AML_PC, \
UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT_OR_UNRESOLVED, \
UACPI_PARSE_OP_JMP, jmp_off, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_PACKAGE, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
)
#define UACPI_BUILD_BINARY_MATH_OP(prefix, code) \
UACPI_OP( \
prefix##Op, code, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_TRUNCATE_NUMBER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
} \
)
#define UACPI_BUILD_UNARY_MATH_OP(type, code) \
UACPI_OP( \
type##Op, code, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
)
#define UACPI_DO_BUILD_BUFFER_FIELD_OP(type, code, node_idx, ...) \
UACPI_OP( \
type##FieldOp, code, 0, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_OPERAND, \
##__VA_ARGS__, \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, node_idx, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER_FIELD, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, node_idx, \
} \
)
#define UACPI_BUILD_BUFFER_FIELD_OP(type, code) \
UACPI_DO_BUILD_BUFFER_FIELD_OP(Create##type, code, 2)
#define UACPI_INTEGER_LITERAL_OP(type, code, bytes) \
UACPI_OP( \
type##Prefix, code, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_LOAD_IMM_AS_OBJECT, bytes, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
#define UACPI_BUILD_BINARY_LOGIC_OP(type, code) \
UACPI_OP( \
type##Op, code, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
)
#define UACPI_BUILD_TO_OP(kind, code, dst_type) \
UACPI_OP( \
To##kind##Op, code, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, dst_type, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
)
#define UACPI_BUILD_INC_DEC_OP(prefix, code) \
UACPI_OP( \
prefix##Op, code, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_TRUNCATE_NUMBER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 0, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
#define UACPI_ENUMERATE_OPCODES \
UACPI_OP( \
ZeroOp, 0x00, \
UACPI_OP_PROPERTY_TARGET | \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
OneOp, 0x01, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_BAD_OPCODE(0x02) \
UACPI_BAD_OPCODE(0x03) \
UACPI_BAD_OPCODE(0x04) \
UACPI_BAD_OPCODE(0x05) \
UACPI_OP( \
AliasOp, 0x06, 0, \
{ \
UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 1, \
} \
) \
UACPI_BAD_OPCODE(0x07) \
UACPI_OP( \
NameOp, 0x08, 0, \
{ \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
UACPI_PARSE_OP_OBJECT_CONVERT_TO_DEEP_COPY, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
} \
) \
UACPI_BAD_OPCODE(0x09) \
UACPI_INTEGER_LITERAL_OP(Byte, 0x0A, 1) \
UACPI_INTEGER_LITERAL_OP(Word, 0x0B, 2) \
UACPI_INTEGER_LITERAL_OP(DWord, 0x0C, 4) \
UACPI_OP( \
StringPrefix, 0x0D, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_STRING, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_INTEGER_LITERAL_OP(QWord, 0x0E, 8) \
UACPI_BAD_OPCODE(0x0F) \
UACPI_OP( \
ScopeOp, 0x10, 0, \
{ \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
BufferOp, 0x11, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_RECORD_AML_PC, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_BUILD_PACKAGE_OP( \
Package, 0x12, 3, \
UACPI_PARSE_OP_LOAD_IMM, 1 \
) \
UACPI_BUILD_PACKAGE_OP( \
VarPackage, 0x13, 2, \
UACPI_PARSE_OP_OPERAND \
) \
UACPI_OP( \
MethodOp, 0x14, 0, \
{ \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
UACPI_PARSE_OP_RECORD_AML_PC, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_METHOD, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 1, \
} \
) \
UACPI_OP( \
ExternalOp, 0x15, 0, \
{ \
UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
} \
) \
UACPI_BAD_OPCODE(0x16) \
UACPI_BAD_OPCODE(0x17) \
UACPI_BAD_OPCODE(0x18) \
UACPI_BAD_OPCODE(0x19) \
UACPI_BAD_OPCODE(0x1A) \
UACPI_BAD_OPCODE(0x1B) \
UACPI_BAD_OPCODE(0x1C) \
UACPI_BAD_OPCODE(0x1D) \
UACPI_BAD_OPCODE(0x1E) \
UACPI_BAD_OPCODE(0x1F) \
UACPI_BAD_OPCODE(0x20) \
UACPI_BAD_OPCODE(0x21) \
UACPI_BAD_OPCODE(0x22) \
UACPI_BAD_OPCODE(0x23) \
UACPI_BAD_OPCODE(0x24) \
UACPI_BAD_OPCODE(0x25) \
UACPI_BAD_OPCODE(0x26) \
UACPI_BAD_OPCODE(0x27) \
UACPI_BAD_OPCODE(0x28) \
UACPI_BAD_OPCODE(0x29) \
UACPI_BAD_OPCODE(0x2A) \
UACPI_BAD_OPCODE(0x2B) \
UACPI_BAD_OPCODE(0x2C) \
UACPI_BAD_OPCODE(0x2D) \
UACPI_UNRESOLVED_NAME_STRING_OP(DualNamePrefix, 0x2E) \
UACPI_UNRESOLVED_NAME_STRING_OP(MultiNamePrefix, 0x2F) \
UACPI_INTERNAL_OP(0x30) \
UACPI_INTERNAL_OP(0x31) \
UACPI_INTERNAL_OP(0x32) \
UACPI_INTERNAL_OP(0x33) \
UACPI_INTERNAL_OP(0x34) \
UACPI_INTERNAL_OP(0x35) \
UACPI_INTERNAL_OP(0x36) \
UACPI_INTERNAL_OP(0x37) \
UACPI_INTERNAL_OP(0x38) \
UACPI_INTERNAL_OP(0x39) \
UACPI_BAD_OPCODE(0x3A) \
UACPI_BAD_OPCODE(0x3B) \
UACPI_BAD_OPCODE(0x3C) \
UACPI_BAD_OPCODE(0x3D) \
UACPI_BAD_OPCODE(0x3E) \
UACPI_BAD_OPCODE(0x3F) \
UACPI_BAD_OPCODE(0x40) \
UACPI_UNRESOLVED_NAME_STRING_OP(A, 0x41) \
UACPI_UNRESOLVED_NAME_STRING_OP(B, 0x42) \
UACPI_UNRESOLVED_NAME_STRING_OP(C, 0x43) \
UACPI_UNRESOLVED_NAME_STRING_OP(D, 0x44) \
UACPI_UNRESOLVED_NAME_STRING_OP(E, 0x45) \
UACPI_UNRESOLVED_NAME_STRING_OP(F, 0x46) \
UACPI_UNRESOLVED_NAME_STRING_OP(G, 0x47) \
UACPI_UNRESOLVED_NAME_STRING_OP(H, 0x48) \
UACPI_UNRESOLVED_NAME_STRING_OP(I, 0x49) \
UACPI_UNRESOLVED_NAME_STRING_OP(J, 0x4A) \
UACPI_UNRESOLVED_NAME_STRING_OP(K, 0x4B) \
UACPI_UNRESOLVED_NAME_STRING_OP(L, 0x4C) \
UACPI_UNRESOLVED_NAME_STRING_OP(M, 0x4D) \
UACPI_UNRESOLVED_NAME_STRING_OP(N, 0x4E) \
UACPI_UNRESOLVED_NAME_STRING_OP(O, 0x4F) \
UACPI_UNRESOLVED_NAME_STRING_OP(P, 0x50) \
UACPI_UNRESOLVED_NAME_STRING_OP(Q, 0x51) \
UACPI_UNRESOLVED_NAME_STRING_OP(R, 0x52) \
UACPI_UNRESOLVED_NAME_STRING_OP(S, 0x53) \
UACPI_UNRESOLVED_NAME_STRING_OP(T, 0x54) \
UACPI_UNRESOLVED_NAME_STRING_OP(U, 0x55) \
UACPI_UNRESOLVED_NAME_STRING_OP(V, 0x56) \
UACPI_UNRESOLVED_NAME_STRING_OP(W, 0x57) \
UACPI_UNRESOLVED_NAME_STRING_OP(X, 0x58) \
UACPI_UNRESOLVED_NAME_STRING_OP(Y, 0x59) \
UACPI_UNRESOLVED_NAME_STRING_OP(Z, 0x5A) \
UACPI_INTERNAL_OP(0x5B) \
UACPI_UNRESOLVED_NAME_STRING_OP(RootChar, 0x5C) \
UACPI_BAD_OPCODE(0x5D) \
UACPI_UNRESOLVED_NAME_STRING_OP(ParentPrefixChar, 0x5E) \
UACPI_UNRESOLVED_NAME_STRING_OP(Underscore, 0x5F) \
UACPI_LOCALX_OP(0) \
UACPI_LOCALX_OP(1) \
UACPI_LOCALX_OP(2) \
UACPI_LOCALX_OP(3) \
UACPI_LOCALX_OP(4) \
UACPI_LOCALX_OP(5) \
UACPI_LOCALX_OP(6) \
UACPI_LOCALX_OP(7) \
UACPI_ARGX_OP(0) \
UACPI_ARGX_OP(1) \
UACPI_ARGX_OP(2) \
UACPI_ARGX_OP(3) \
UACPI_ARGX_OP(4) \
UACPI_ARGX_OP(5) \
UACPI_ARGX_OP(6) \
UACPI_BAD_OPCODE(0x6F) \
UACPI_OP( \
StoreOp, 0x70, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG, \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_ITEM_POP, \
UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
} \
) \
UACPI_OP( \
RefOfOp, 0x71, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_OBJECT_ALLOC, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_BUILD_BINARY_MATH_OP(Add, 0x72) \
UACPI_OP( \
ConcatOp, 0x73, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
} \
) \
UACPI_BUILD_BINARY_MATH_OP(Subtract, 0x74) \
UACPI_BUILD_INC_DEC_OP(Increment, 0x75) \
UACPI_BUILD_INC_DEC_OP(Decrement, 0x76) \
UACPI_BUILD_BINARY_MATH_OP(Multiply, 0x77) \
UACPI_OP( \
DivideOp, 0x78, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 3, \
UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
UACPI_PARSE_OP_STORE_TO_TARGET_INDIRECT, 2, 4, \
} \
) \
UACPI_BUILD_BINARY_MATH_OP(ShiftLeft, 0x79) \
UACPI_BUILD_BINARY_MATH_OP(ShiftRight, 0x7A) \
UACPI_BUILD_BINARY_MATH_OP(And, 0x7B) \
UACPI_BUILD_BINARY_MATH_OP(Nand, 0x7C) \
UACPI_BUILD_BINARY_MATH_OP(Or, 0x7D) \
UACPI_BUILD_BINARY_MATH_OP(Nor, 0x7E) \
UACPI_BUILD_BINARY_MATH_OP(Xor, 0x7F) \
UACPI_BUILD_UNARY_MATH_OP(Not, 0x80) \
UACPI_BUILD_UNARY_MATH_OP(FindSetLeftBit, 0x81) \
UACPI_BUILD_UNARY_MATH_OP(FindSetRightBit, 0x82) \
UACPI_OP( \
DerefOfOp, 0x83, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_OBJECT_ALLOC, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
ConcatResOp, 0x84, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_BUILD_BINARY_MATH_OP(Mod, 0x85) \
UACPI_OP( \
NotifyOp, 0x86, 0, \
{ \
/* This is technically wrong according to spec but I was */ \
/* unable to find any examples of anything else after */ \
/* inspecting about 500 AML dumps. Spec says this is a */ \
/* SuperName that must evaluate to Device/ThermalZone or */ \
/* Processor, just ignore for now. */ \
UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
SizeOfOp, 0x87, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
IndexOp, 0x88, \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_SUPERNAME | \
UACPI_OP_PROPERTY_SIMPLE_NAME, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
MatchOp, 0x89, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_PACKAGE, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_BUILD_BUFFER_FIELD_OP(DWord, 0x8A) \
UACPI_BUILD_BUFFER_FIELD_OP(Word, 0x8B) \
UACPI_BUILD_BUFFER_FIELD_OP(Byte, 0x8C) \
UACPI_BUILD_BUFFER_FIELD_OP(Bit, 0x8D) \
UACPI_OP( \
ObjectTypeOp, 0x8E, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_BUILD_BUFFER_FIELD_OP(QWord, 0x8F) \
UACPI_BUILD_BINARY_LOGIC_OP(Land, 0x90) \
UACPI_BUILD_BINARY_LOGIC_OP(Lor, 0x91) \
UACPI_OP( \
LnotOp, 0x92, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_OBJECT_ALLOC, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_BUILD_BINARY_LOGIC_OP(LEqual, 0x93) \
UACPI_BUILD_BINARY_LOGIC_OP(LGreater, 0x94) \
UACPI_BUILD_BINARY_LOGIC_OP(LLess, 0x95) \
UACPI_BUILD_TO_OP(Buffer, 0x96, UACPI_OBJECT_BUFFER) \
UACPI_BUILD_TO_OP(DecimalString, 0x97, UACPI_OBJECT_STRING) \
UACPI_BUILD_TO_OP(HexString, 0x98, UACPI_OBJECT_STRING) \
UACPI_BUILD_TO_OP(Integer, 0x99, UACPI_OBJECT_INTEGER) \
UACPI_BAD_OPCODE(0x9A) \
UACPI_BAD_OPCODE(0x9B) \
UACPI_OP( \
ToStringOp, 0x9C, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_STRING, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
CopyObjectOp, 0x9D, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG, \
UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
UACPI_PARSE_OP_SIMPLE_NAME, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
MidOp, 0x9E, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 3, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
ContinueOp, 0x9F, 0, \
{ \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
IfOp, 0xA0, 0, \
{ \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_IF_LAST_NULL, 3, \
UACPI_PARSE_OP_EMIT_SKIP_WARN, \
UACPI_PARSE_OP_JMP, 9, \
UACPI_PARSE_OP_IF_LAST_FALSE, 4, \
UACPI_PARSE_OP_SWITCH_TO_NEXT_IF_EQUALS, 0xA1, 0x00, \
UACPI_PARSE_OP_END, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
ElseOp, 0xA1, 0, \
{ \
UACPI_PARSE_OP_IF_SWITCHED_FROM, 0xA0, 0x00, 10, \
UACPI_PARSE_OP_IF_LAST_NULL, 3, \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
UACPI_PARSE_OP_EMIT_SKIP_WARN, \
UACPI_PARSE_OP_END, \
UACPI_PARSE_OP_ITEM_POP, \
UACPI_PARSE_OP_ITEM_POP, \
UACPI_PARSE_OP_PKGLEN, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_END, \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
} \
) \
UACPI_OP( \
WhileOp, 0xA2, 0, \
{ \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
UACPI_PARSE_OP_IF_LAST_TRUE, 1, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
NoopOp, 0xA3, 0, \
{ \
UACPI_PARSE_OP_END, \
} \
) \
UACPI_OP( \
ReturnOp, 0xA4, 0, \
{ \
UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
BreakOp, 0xA5, 0, \
{ \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_BAD_OPCODE(0xA6) \
UACPI_BAD_OPCODE(0xA7) \
UACPI_BAD_OPCODE(0xA8) \
UACPI_BAD_OPCODE(0xA9) \
UACPI_BAD_OPCODE(0xAA) \
UACPI_BAD_OPCODE(0xAB) \
UACPI_BAD_OPCODE(0xAC) \
UACPI_BAD_OPCODE(0xAD) \
UACPI_BAD_OPCODE(0xAE) \
UACPI_BAD_OPCODE(0xAF) \
UACPI_BAD_OPCODE(0xB0) \
UACPI_BAD_OPCODE(0xB1) \
UACPI_BAD_OPCODE(0xB2) \
UACPI_BAD_OPCODE(0xB3) \
UACPI_BAD_OPCODE(0xB4) \
UACPI_BAD_OPCODE(0xB5) \
UACPI_BAD_OPCODE(0xB6) \
UACPI_BAD_OPCODE(0xB7) \
UACPI_BAD_OPCODE(0xB8) \
UACPI_BAD_OPCODE(0xB9) \
UACPI_BAD_OPCODE(0xBA) \
UACPI_BAD_OPCODE(0xBB) \
UACPI_BAD_OPCODE(0xBC) \
UACPI_BAD_OPCODE(0xBD) \
UACPI_BAD_OPCODE(0xBE) \
UACPI_BAD_OPCODE(0xBF) \
UACPI_BAD_OPCODE(0xC0) \
UACPI_BAD_OPCODE(0xC1) \
UACPI_BAD_OPCODE(0xC2) \
UACPI_BAD_OPCODE(0xC3) \
UACPI_BAD_OPCODE(0xC4) \
UACPI_BAD_OPCODE(0xC5) \
UACPI_BAD_OPCODE(0xC6) \
UACPI_BAD_OPCODE(0xC7) \
UACPI_BAD_OPCODE(0xC8) \
UACPI_BAD_OPCODE(0xC9) \
UACPI_BAD_OPCODE(0xCA) \
UACPI_BAD_OPCODE(0xCB) \
UACPI_OP( \
BreakPointOp, 0xCC, 0, \
{ \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_BAD_OPCODE(0xCD) \
UACPI_BAD_OPCODE(0xCE) \
UACPI_BAD_OPCODE(0xCF) \
UACPI_BAD_OPCODE(0xD0) \
UACPI_BAD_OPCODE(0xD1) \
UACPI_BAD_OPCODE(0xD2) \
UACPI_BAD_OPCODE(0xD3) \
UACPI_BAD_OPCODE(0xD4) \
UACPI_BAD_OPCODE(0xD5) \
UACPI_BAD_OPCODE(0xD6) \
UACPI_BAD_OPCODE(0xD7) \
UACPI_BAD_OPCODE(0xD8) \
UACPI_BAD_OPCODE(0xD9) \
UACPI_BAD_OPCODE(0xDA) \
UACPI_BAD_OPCODE(0xDB) \
UACPI_BAD_OPCODE(0xDC) \
UACPI_BAD_OPCODE(0xDD) \
UACPI_BAD_OPCODE(0xDE) \
UACPI_BAD_OPCODE(0xDF) \
UACPI_BAD_OPCODE(0xE0) \
UACPI_BAD_OPCODE(0xE1) \
UACPI_BAD_OPCODE(0xE2) \
UACPI_BAD_OPCODE(0xE3) \
UACPI_BAD_OPCODE(0xE4) \
UACPI_BAD_OPCODE(0xE5) \
UACPI_BAD_OPCODE(0xE6) \
UACPI_BAD_OPCODE(0xE7) \
UACPI_BAD_OPCODE(0xE8) \
UACPI_BAD_OPCODE(0xE9) \
UACPI_BAD_OPCODE(0xEA) \
UACPI_BAD_OPCODE(0xEB) \
UACPI_BAD_OPCODE(0xEC) \
UACPI_BAD_OPCODE(0xED) \
UACPI_BAD_OPCODE(0xEE) \
UACPI_BAD_OPCODE(0xEF) \
UACPI_BAD_OPCODE(0xF0) \
UACPI_BAD_OPCODE(0xF1) \
UACPI_BAD_OPCODE(0xF2) \
UACPI_BAD_OPCODE(0xF3) \
UACPI_OP( \
InternalOpReadFieldAsBuffer, 0xF4, \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_RESERVED, \
{ \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
InternalOpReadFieldAsInteger, 0xF5, \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_RESERVED, \
{ \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
InternalOpNamedObject, 0xF6, \
UACPI_OP_PROPERTY_SIMPLE_NAME | \
UACPI_OP_PROPERTY_SUPERNAME | \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_RESERVED, \
{ \
UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_METHOD_CALL_OPCODE(0) \
UACPI_METHOD_CALL_OPCODE(1) \
UACPI_METHOD_CALL_OPCODE(2) \
UACPI_METHOD_CALL_OPCODE(3) \
UACPI_METHOD_CALL_OPCODE(4) \
UACPI_METHOD_CALL_OPCODE(5) \
UACPI_METHOD_CALL_OPCODE(6) \
UACPI_METHOD_CALL_OPCODE(7) \
UACPI_OP( \
OnesOp, 0xFF, \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \
UACPI_PARSE_OP_TRUNCATE_NUMBER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
)
extern uacpi_u8 uacpi_field_op_decode_ops[];
extern uacpi_u8 uacpi_index_field_op_decode_ops[];
extern uacpi_u8 uacpi_bank_field_op_decode_ops[];
extern uacpi_u8 uacpi_load_op_decode_ops[];
extern uacpi_u8 uacpi_load_table_op_decode_ops[];
#define UACPI_BUILD_NAMED_SCOPE_OBJECT_OP(name, code, type, ...) \
UACPI_OP( \
name##Op, UACPI_EXT_OP(code), 0, \
{ \
UACPI_PARSE_OP_TRACKED_PKGLEN, \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
##__VA_ARGS__, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, type, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 1, \
} \
)
#define UACPI_BUILD_TO_FROM_BCD(type, code) \
UACPI_OP( \
type##BCDOp, UACPI_EXT_OP(code), \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
)
#define UACPI_ENUMERATE_EXT_OPCODES \
UACPI_OP( \
ReservedExtOp, UACPI_EXT_OP(0x00), 0, \
{ \
UACPI_PARSE_OP_BAD_OPCODE, \
} \
) \
UACPI_OP( \
MutexOp, UACPI_EXT_OP(0x01), 0, \
{ \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
UACPI_OBJECT_MUTEX, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
} \
) \
UACPI_OP( \
EventOp, UACPI_EXT_OP(0x02), 0, \
{ \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
UACPI_OBJECT_EVENT, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
} \
) \
UACPI_OP( \
CondRefOfOp, UACPI_EXT_OP(0x12), \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_SUPERNAME_OR_UNRESOLVED, \
UACPI_PARSE_OP_TARGET, \
UACPI_PARSE_OP_IF_NULL, 0, 3, \
UACPI_PARSE_OP_LOAD_FALSE_OBJECT, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
UACPI_PARSE_OP_END, \
UACPI_PARSE_OP_OBJECT_ALLOC, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
UACPI_PARSE_OP_LOAD_TRUE_OBJECT, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_DO_BUILD_BUFFER_FIELD_OP( \
Create, UACPI_EXT_OP(0x13), 3, \
UACPI_PARSE_OP_OPERAND \
) \
UACPI_OUT_OF_LINE_OP( \
LoadTableOp, UACPI_EXT_OP(0x1F), \
uacpi_load_table_op_decode_ops, \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_OUT_OF_LINE \
) \
UACPI_OUT_OF_LINE_OP( \
LoadOp, UACPI_EXT_OP(0x20), \
uacpi_load_op_decode_ops, \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_OUT_OF_LINE \
) \
UACPI_OP( \
StallOp, UACPI_EXT_OP(0x21), 0, \
{ \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
SleepOp, UACPI_EXT_OP(0x22), 0, \
{ \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
AcquireOp, UACPI_EXT_OP(0x23), \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_LOAD_IMM, 2, \
UACPI_PARSE_OP_LOAD_TRUE_OBJECT, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
SignalOp, UACPI_EXT_OP(0x24), 0, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
WaitOp, UACPI_EXT_OP(0x25), \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_LOAD_TRUE_OBJECT, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
ResetOp, UACPI_EXT_OP(0x26), 0, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
ReleaseOp, UACPI_EXT_OP(0x27), 0, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_BUILD_TO_FROM_BCD(From, 0x28) \
UACPI_BUILD_TO_FROM_BCD(To, 0x29) \
UACPI_OP( \
UnloadOp, UACPI_EXT_OP(0x2A), 0, \
{ \
UACPI_PARSE_OP_SUPERNAME, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
RevisionOp, UACPI_EXT_OP(0x30), \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
DebugOp, UACPI_EXT_OP(0x31), \
UACPI_OP_PROPERTY_TERM_ARG | \
UACPI_OP_PROPERTY_SUPERNAME | \
UACPI_OP_PROPERTY_TARGET, \
{ \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
UACPI_OBJECT_DEBUG, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
FatalOp, UACPI_EXT_OP(0x32), 0, \
{ \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_LOAD_IMM, 4, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
} \
) \
UACPI_OP( \
TimerOp, UACPI_EXT_OP(0x33), \
UACPI_OP_PROPERTY_TERM_ARG, \
{ \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
UACPI_OBJECT_INTEGER, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
} \
) \
UACPI_OP( \
OpRegionOp, UACPI_EXT_OP(0x80), 0, \
{ \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_OPERAND, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
UACPI_OBJECT_OPERATION_REGION, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
} \
) \
UACPI_OUT_OF_LINE_OP( \
FieldOp, UACPI_EXT_OP(0x81), \
uacpi_field_op_decode_ops, \
UACPI_OP_PROPERTY_OUT_OF_LINE \
) \
UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
Device, 0x82, UACPI_OBJECT_DEVICE \
) \
UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
Processor, 0x83, UACPI_OBJECT_PROCESSOR, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_LOAD_IMM, 4, \
UACPI_PARSE_OP_LOAD_IMM, 1 \
) \
UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
PowerRes, 0x84, UACPI_OBJECT_POWER_RESOURCE, \
UACPI_PARSE_OP_LOAD_IMM, 1, \
UACPI_PARSE_OP_LOAD_IMM, 2 \
) \
UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
ThermalZone, 0x85, UACPI_OBJECT_THERMAL_ZONE \
) \
UACPI_OUT_OF_LINE_OP( \
IndexFieldOp, UACPI_EXT_OP(0x86), \
uacpi_index_field_op_decode_ops, \
UACPI_OP_PROPERTY_OUT_OF_LINE \
) \
UACPI_OUT_OF_LINE_OP( \
BankFieldOp, UACPI_EXT_OP(0x87), \
uacpi_bank_field_op_decode_ops, \
UACPI_OP_PROPERTY_OUT_OF_LINE \
) \
UACPI_OP( \
DataRegionOp, UACPI_EXT_OP(0x88), 0, \
{ \
UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
UACPI_PARSE_OP_STRING, \
UACPI_PARSE_OP_STRING, \
UACPI_PARSE_OP_STRING, \
UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
UACPI_OBJECT_OPERATION_REGION, \
UACPI_PARSE_OP_INVOKE_HANDLER, \
UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
} \
)
enum uacpi_aml_op {
#define UACPI_OP(name, code, ...) UACPI_AML_OP_##name = code,
#define UACPI_OUT_OF_LINE_OP(name, code, ...) UACPI_AML_OP_##name = code,
UACPI_ENUMERATE_OPCODES
UACPI_ENUMERATE_EXT_OPCODES
#undef UACPI_OP
#undef UACPI_OUT_OF_LINE_OP
};