1#pragma once
2
3#include <uacpi/types.h>
4
5typedef uacpi_u16 uacpi_aml_op;
6
7#define UACPI_EXT_PREFIX 0x5B
8#define UACPI_EXT_OP(op) ((UACPI_EXT_PREFIX << 8) | (op))
9
10#define UACPI_DUAL_NAME_PREFIX 0x2E
11#define UACPI_MULTI_NAME_PREFIX 0x2F
12#define UACPI_NULL_NAME 0x00
13
14/*
15 * Opcodes that tell the parser VM how to take apart every AML instruction.
16 * Every AML opcode has a list of these that is executed by the parser.
17 */
18enum uacpi_parse_op {
19 UACPI_PARSE_OP_END = 0,
20
21 /*
22 * End the execution of the current instruction with a warning if the item
23 * at decode_ops[pc + 1] is NULL.
24 */
25 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL,
26
27 // Emit a warning as if the current opcode is being skipped
28 UACPI_PARSE_OP_EMIT_SKIP_WARN,
29
30 // SimpleName := NameString | ArgObj | LocalObj
31 UACPI_PARSE_OP_SIMPLE_NAME,
32
33 // SuperName := SimpleName | DebugObj | ReferenceTypeOpcode
34 UACPI_PARSE_OP_SUPERNAME,
35 // The resulting item will be set to null if name couldn't be resolved
36 UACPI_PARSE_OP_SUPERNAME_OR_UNRESOLVED,
37
38 // TermArg := ExpressionOpcode | DataObject | ArgObj | LocalObj
39 UACPI_PARSE_OP_TERM_ARG,
40 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL,
41
42 /*
43 * Same as TERM_ARG, but named references are passed as-is.
44 * This means methods are not invoked, fields are not read, etc.
45 */
46 UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT,
47
48 /*
49 * Same as UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT but allows unresolved
50 * name strings.
51 */
52 UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT_OR_UNRESOLVED,
53
54 // Operand := TermArg => Integer
55 UACPI_PARSE_OP_OPERAND,
56
57 // TermArg => String
58 UACPI_PARSE_OP_STRING,
59
60 /*
61 * ComputationalData := ByteConst | WordConst | DWordConst | QWordConst |
62 * String | ConstObj | RevisionOp | DefBuffer
63 */
64 UACPI_PARSE_OP_COMPUTATIONAL_DATA,
65
66 // Target := SuperName | NullName
67 UACPI_PARSE_OP_TARGET,
68
69 // Parses a pkglen
70 UACPI_PARSE_OP_PKGLEN,
71
72 /*
73 * Parses a pkglen and records it, the end of this pkglen is considered
74 * the end of the instruction. The PC is always set to the end of this
75 * package once parser reaches UACPI_PARSE_OP_END.
76 */
77 UACPI_PARSE_OP_TRACKED_PKGLEN,
78
79 /*
80 * Parse a NameString and create the last nameseg.
81 * Note that this errors out if last nameseg already exists.
82 */
83 UACPI_PARSE_OP_CREATE_NAMESTRING,
84
85 /*
86 * same as UACPI_PARSE_OP_CREATE_NAMESTRING, but attempting to create an
87 * already existing object is not fatal if currently loading a table.
88 */
89 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD,
90
91 /*
92 * Parse a NameString and put the node into the ready parts array.
93 * Note that this errors out if the referenced node doesn't exist.
94 */
95 UACPI_PARSE_OP_EXISTING_NAMESTRING,
96
97 /*
98 * Same as UACPI_PARSE_OP_EXISTING_NAMESTRING except the op doesn't error
99 * out if namestring couldn't be resolved.
100 */
101 UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL,
102
103 /*
104 * Same as UACPI_PARSE_OP_EXISTING_NAMESTRING, but undefined references
105 * are not fatal if currently loading a table.
106 */
107 UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD,
108
109 // Invoke a handler at op_handlers[spec->code]
110 UACPI_PARSE_OP_INVOKE_HANDLER,
111
112 // Allocate an object an put it at the front of the item list
113 UACPI_PARSE_OP_OBJECT_ALLOC,
114
115 UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC,
116
117 // Convert last item into a shallow/deep copy of itself
118 UACPI_PARSE_OP_OBJECT_CONVERT_TO_SHALLOW_COPY,
119 UACPI_PARSE_OP_OBJECT_CONVERT_TO_DEEP_COPY,
120
121 /*
122 * Same as UACPI_PARSE_OP_OBJECT_ALLOC except the type of the allocated
123 * object is specified at decode_ops[pc + 1]
124 */
125 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED,
126
127 // Record current AML program counter as a QWORD immediate
128 UACPI_PARSE_OP_RECORD_AML_PC,
129
130 // Load a QWORD immediate located at decode_ops[pc + 1]
131 UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT,
132
133 // Load a decode_ops[pc + 1] byte imm at decode_ops[pc + 2]
134 UACPI_PARSE_OP_LOAD_INLINE_IMM,
135
136 // Load a QWORD zero immediate
137 UACPI_PARSE_OP_LOAD_ZERO_IMM,
138
139 // Load a decode_ops[pc + 1] byte imm from the instructions stream
140 UACPI_PARSE_OP_LOAD_IMM,
141
142 // Same as UACPI_PARSE_OP_LOAD_IMM, expect the resulting value is an object
143 UACPI_PARSE_OP_LOAD_IMM_AS_OBJECT,
144
145 // Create & Load an integer constant representing either true or false
146 UACPI_PARSE_OP_LOAD_FALSE_OBJECT,
147 UACPI_PARSE_OP_LOAD_TRUE_OBJECT,
148
149 // Truncate the last item in the list if needed
150 UACPI_PARSE_OP_TRUNCATE_NUMBER,
151
152 // Ensure the type of item is decode_ops[pc + 1]
153 UACPI_PARSE_OP_TYPECHECK,
154
155 /*
156 * Ensure the type of item is one of decode_ops[pc + 1] items at
157 * decode_ops[pc + 2]...decode_ops[pc + N]
158 */
159 UACPI_PARSE_OP_TYPECHECK_ONE_OF,
160
161 // Install the namespace node specified in items[decode_ops[pc + 1]]
162 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE,
163
164 // Move item to the previous (preempted) op
165 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV,
166
167 /*
168 * Same as UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, but the object
169 * is copied instead. (Useful when dealing with multiple targets)
170 * TODO: optimize this so that we can optionally move the object
171 * if target was a null target.
172 */
173 UACPI_PARSE_OP_OBJECT_COPY_TO_PREV,
174
175 // Store the last item to the target at items[decode_ops[pc + 1]]
176 UACPI_PARSE_OP_STORE_TO_TARGET,
177
178 /*
179 * Store the item at items[decode_ops[pc + 2]] to target
180 * at items[decode_ops[pc + 1]]
181 */
182 UACPI_PARSE_OP_STORE_TO_TARGET_INDIRECT,
183
184 /*
185 * Error if reached. Should be used for opcodes that are supposed to be
186 * converted at op parse time, e.g. invoking a method or referring to
187 * a named object.
188 */
189 UACPI_PARSE_OP_UNREACHABLE,
190
191 // Invalid opcode, should never be encountered in the stream
192 UACPI_PARSE_OP_BAD_OPCODE,
193
194 // Decrement the current AML instruction pointer
195 UACPI_PARSE_OP_AML_PC_DECREMENT,
196
197 // Decrement the immediate at decode_ops[pc + 1]
198 UACPI_PARSE_OP_IMM_DECREMENT,
199
200 // Remove the last item off the item stack
201 UACPI_PARSE_OP_ITEM_POP,
202
203 // Dispatch the method call from items[0] and return from current op_exec
204 UACPI_PARSE_OP_DISPATCH_METHOD_CALL,
205
206 /*
207 * Dispatch a table load with scope node at items[0] and method at items[1].
208 * The last item is expected to be an integer object that is set to 0 in
209 * case load fails.
210 */
211 UACPI_PARSE_OP_DISPATCH_TABLE_LOAD,
212
213 /*
214 * Convert the current resolved namestring to either a method call
215 * or a named object reference.
216 */
217 UACPI_PARSE_OP_CONVERT_NAMESTRING,
218
219 /*
220 * Execute the next instruction only if currently tracked package still
221 * has data left, otherwise skip decode_ops[pc + 1] bytes.
222 */
223 UACPI_PARSE_OP_IF_HAS_DATA,
224
225 /*
226 * Execute the next instruction only if the handle at
227 * items[decode_ops[pc + 1]] is null. Otherwise skip
228 * decode_ops[pc + 2] bytes.
229 */
230 UACPI_PARSE_OP_IF_NULL,
231
232 /*
233 * Execute the next instruction only if the handle at
234 * items[-1] is null. Otherwise skip decode_ops[pc + 1] bytes.
235 */
236 UACPI_PARSE_OP_IF_LAST_NULL,
237
238 // The inverse of UACPI_PARSE_OP_IF_NULL
239 UACPI_PARSE_OP_IF_NOT_NULL,
240
241 // The inverse of UACPI_PARSE_OP_IF_LAST_NULL
242 UACPI_PARSE_OP_IF_LAST_NOT_NULL,
243
244 /*
245 * Execute the next instruction only if the last immediate is equal to
246 * decode_ops[pc + 1], otherwise skip decode_ops[pc + 2] bytes.
247 */
248 UACPI_PARSE_OP_IF_LAST_EQUALS,
249
250 /*
251 * Execute the next instruction only if the last object is a false value
252 * (has a value of 0), otherwise skip decode_ops[pc + 1] bytes.
253 */
254 UACPI_PARSE_OP_IF_LAST_FALSE,
255
256 // The inverse of UACPI_PARSE_OP_IF_LAST_FALSE
257 UACPI_PARSE_OP_IF_LAST_TRUE,
258
259 /*
260 * Switch to opcode at decode_ops[pc + 1] only if the next AML instruction
261 * in the stream is equal to it. Note that this looks ahead of the tracked
262 * package if one is active. Switching to the next op also applies the
263 * currently tracked package.
264 */
265 UACPI_PARSE_OP_SWITCH_TO_NEXT_IF_EQUALS,
266
267 /*
268 * Execute the next instruction only if this op was switched to from op at
269 * (decode_ops[pc + 1] | decode_ops[pc + 2] << 8), otherwise skip
270 * decode_ops[pc + 3] bytes.
271 */
272 UACPI_PARSE_OP_IF_SWITCHED_FROM,
273
274 /*
275 * pc = decode_ops[pc + 1]
276 */
277 UACPI_PARSE_OP_JMP,
278 UACPI_PARSE_OP_MAX = UACPI_PARSE_OP_JMP,
279};
280const uacpi_char *uacpi_parse_op_to_string(enum uacpi_parse_op op);
281
282/*
283 * A few notes about op properties:
284 * Technically the spec says that RefOfOp is considered a SuperName, but NT
285 * disagrees about this. For example Store(..., RefOf) fails with
286 * "Invalid SuperName". MethodInvocation could also technically be considered
287 * a SuperName, but NT doesn't allow that either: Store(..., MethodInvocation)
288 * fails with "Invalid Target Method, expected a DataObject" error.
289 */
290
291enum uacpi_op_property {
292 UACPI_OP_PROPERTY_TERM_ARG = 1,
293 UACPI_OP_PROPERTY_SUPERNAME = 2,
294 UACPI_OP_PROPERTY_SIMPLE_NAME = 4,
295 UACPI_OP_PROPERTY_TARGET = 8,
296
297 // The ops to execute are pointed to by indirect_decode_ops
298 UACPI_OP_PROPERTY_OUT_OF_LINE = 16,
299
300 // Error if encountered in the AML byte strem
301 UACPI_OP_PROPERTY_RESERVED = 128,
302};
303
304struct uacpi_op_spec {
305 uacpi_char *name;
306 union {
307 uacpi_u8 decode_ops[16];
308 uacpi_u8 *indirect_decode_ops;
309 };
310 uacpi_u8 properties;
311 uacpi_aml_op code;
312};
313
314const struct uacpi_op_spec *uacpi_get_op_spec(uacpi_aml_op);
315
316#define UACPI_INTERNAL_OP(code) \
317 UACPI_OP(Internal_##code, code, 0, { UACPI_PARSE_OP_UNREACHABLE })
318
319#define UACPI_BAD_OPCODE(code) \
320 UACPI_OP(Reserved_##code, code, 0, { UACPI_PARSE_OP_BAD_OPCODE })
321
322#define UACPI_METHOD_CALL_OPCODE(nargs) \
323 UACPI_OP( \
324 InternalOpMethodCall##nargs##Args, 0xF7 + nargs, \
325 UACPI_OP_PROPERTY_TERM_ARG | \
326 UACPI_OP_PROPERTY_RESERVED, \
327 { \
328 UACPI_PARSE_OP_LOAD_INLINE_IMM, 1, nargs, \
329 UACPI_PARSE_OP_IF_NOT_NULL, 1, 6, \
330 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
331 UACPI_PARSE_OP_OBJECT_CONVERT_TO_SHALLOW_COPY, \
332 UACPI_PARSE_OP_IMM_DECREMENT, 1, \
333 UACPI_PARSE_OP_JMP, 3, \
334 UACPI_PARSE_OP_OBJECT_ALLOC, \
335 UACPI_PARSE_OP_DISPATCH_METHOD_CALL, \
336 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
337 } \
338 )
339
340/*
341 * -------------------------------------------------------------
342 * RootChar := ‘\’
343 * ParentPrefixChar := ‘^’
344 * ‘\’ := 0x5C
345 * ‘^’ := 0x5E
346 * MultiNamePrefix := 0x2F
347 * DualNamePrefix := 0x2E
348 * ------------------------------------------------------------
349 * ‘A’-‘Z’ := 0x41 - 0x5A
350 * ‘_’ := 0x5F
351 * LeadNameChar := ‘A’-‘Z’ | ‘_’
352 * NameSeg := <leadnamechar namechar namechar namechar>
353 * NameString := <rootchar namepath> | <prefixpath namepath>
354 * PrefixPath := Nothing | <’^’ prefixpath>
355 * DualNamePath := DualNamePrefix NameSeg NameSeg
356 * MultiNamePath := MultiNamePrefix SegCount NameSeg(SegCount)
357 */
358#define UACPI_UNRESOLVED_NAME_STRING_OP(character, code) \
359 UACPI_OP( \
360 UACPI_InternalOpUnresolvedNameString_##character, code, \
361 UACPI_OP_PROPERTY_SIMPLE_NAME | \
362 UACPI_OP_PROPERTY_SUPERNAME | \
363 UACPI_OP_PROPERTY_TERM_ARG, \
364 { \
365 UACPI_PARSE_OP_AML_PC_DECREMENT, \
366 UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL, \
367 UACPI_PARSE_OP_CONVERT_NAMESTRING, \
368 } \
369 )
370
371#define UACPI_BUILD_LOCAL_OR_ARG_OP(prefix, base, offset) \
372UACPI_OP( \
373 prefix##offset##Op, base + offset, \
374 UACPI_OP_PROPERTY_SUPERNAME | \
375 UACPI_OP_PROPERTY_TERM_ARG | \
376 UACPI_OP_PROPERTY_SIMPLE_NAME, \
377 { \
378 UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC, \
379 UACPI_PARSE_OP_INVOKE_HANDLER, \
380 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
381 } \
382) \
383
384#define UACPI_LOCALX_OP(idx) UACPI_BUILD_LOCAL_OR_ARG_OP(Local, 0x60, idx)
385#define UACPI_ARGX_OP(idx) UACPI_BUILD_LOCAL_OR_ARG_OP(Arg, 0x68, idx)
386
387#define UACPI_BUILD_PACKAGE_OP(name, code, jmp_off, ...) \
388UACPI_OP( \
389 name##Op, code, \
390 UACPI_OP_PROPERTY_TERM_ARG, \
391 { \
392 UACPI_PARSE_OP_TRACKED_PKGLEN, \
393 ##__VA_ARGS__, \
394 UACPI_PARSE_OP_IF_HAS_DATA, 4, \
395 UACPI_PARSE_OP_RECORD_AML_PC, \
396 UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT_OR_UNRESOLVED, \
397 UACPI_PARSE_OP_JMP, jmp_off, \
398 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_PACKAGE, \
399 UACPI_PARSE_OP_INVOKE_HANDLER, \
400 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
401 } \
402)
403
404#define UACPI_BUILD_BINARY_MATH_OP(prefix, code) \
405UACPI_OP( \
406 prefix##Op, code, \
407 UACPI_OP_PROPERTY_TERM_ARG, \
408 { \
409 UACPI_PARSE_OP_OPERAND, \
410 UACPI_PARSE_OP_OPERAND, \
411 UACPI_PARSE_OP_TARGET, \
412 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
413 UACPI_PARSE_OP_INVOKE_HANDLER, \
414 UACPI_PARSE_OP_TRUNCATE_NUMBER, \
415 UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
416 UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
417 } \
418)
419
420#define UACPI_BUILD_UNARY_MATH_OP(type, code) \
421UACPI_OP( \
422 type##Op, code, \
423 UACPI_OP_PROPERTY_TERM_ARG, \
424 { \
425 UACPI_PARSE_OP_OPERAND, \
426 UACPI_PARSE_OP_TARGET, \
427 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
428 UACPI_PARSE_OP_INVOKE_HANDLER, \
429 UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
430 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
431 } \
432)
433
434#define UACPI_DO_BUILD_BUFFER_FIELD_OP(type, code, node_idx, ...) \
435UACPI_OP( \
436 type##FieldOp, code, 0, \
437 { \
438 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
439 UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
440 UACPI_PARSE_OP_OPERAND, \
441 ##__VA_ARGS__, \
442 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
443 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, node_idx, \
444 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER_FIELD, \
445 UACPI_PARSE_OP_INVOKE_HANDLER, \
446 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, node_idx, \
447 } \
448)
449
450#define UACPI_BUILD_BUFFER_FIELD_OP(type, code) \
451 UACPI_DO_BUILD_BUFFER_FIELD_OP(Create##type, code, 2)
452
453#define UACPI_INTEGER_LITERAL_OP(type, code, bytes) \
454UACPI_OP( \
455 type##Prefix, code, \
456 UACPI_OP_PROPERTY_TERM_ARG, \
457 { \
458 UACPI_PARSE_OP_LOAD_IMM_AS_OBJECT, bytes, \
459 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
460 } \
461) \
462
463#define UACPI_BUILD_BINARY_LOGIC_OP(type, code) \
464UACPI_OP( \
465 type##Op, code, \
466 UACPI_OP_PROPERTY_TERM_ARG, \
467 { \
468 UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
469 UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
470 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
471 UACPI_PARSE_OP_INVOKE_HANDLER, \
472 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
473 } \
474)
475
476#define UACPI_BUILD_TO_OP(kind, code, dst_type) \
477UACPI_OP( \
478 To##kind##Op, code, \
479 UACPI_OP_PROPERTY_TERM_ARG, \
480 { \
481 UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
482 UACPI_PARSE_OP_TARGET, \
483 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, dst_type, \
484 UACPI_PARSE_OP_INVOKE_HANDLER, \
485 UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
486 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
487 } \
488)
489
490#define UACPI_BUILD_INC_DEC_OP(prefix, code) \
491UACPI_OP( \
492 prefix##Op, code, \
493 UACPI_OP_PROPERTY_TERM_ARG, \
494 { \
495 UACPI_PARSE_OP_SUPERNAME, \
496 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
497 UACPI_PARSE_OP_INVOKE_HANDLER, \
498 UACPI_PARSE_OP_TRUNCATE_NUMBER, \
499 UACPI_PARSE_OP_STORE_TO_TARGET, 0, \
500 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
501 } \
502) \
503
504#define UACPI_ENUMERATE_OPCODES \
505UACPI_OP( \
506 ZeroOp, 0x00, \
507 UACPI_OP_PROPERTY_TARGET | \
508 UACPI_OP_PROPERTY_TERM_ARG, \
509 { \
510 UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
511 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
512 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
513 } \
514) \
515UACPI_OP( \
516 OneOp, 0x01, \
517 UACPI_OP_PROPERTY_TERM_ARG, \
518 { \
519 UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
520 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
521 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
522 } \
523) \
524UACPI_BAD_OPCODE(0x02) \
525UACPI_BAD_OPCODE(0x03) \
526UACPI_BAD_OPCODE(0x04) \
527UACPI_BAD_OPCODE(0x05) \
528UACPI_OP( \
529 AliasOp, 0x06, 0, \
530 { \
531 UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD, \
532 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
533 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
534 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
535 UACPI_PARSE_OP_INVOKE_HANDLER, \
536 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 1, \
537 } \
538) \
539UACPI_BAD_OPCODE(0x07) \
540UACPI_OP( \
541 NameOp, 0x08, 0, \
542 { \
543 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
544 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
545 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
546 UACPI_PARSE_OP_OBJECT_CONVERT_TO_DEEP_COPY, \
547 UACPI_PARSE_OP_INVOKE_HANDLER, \
548 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
549 } \
550) \
551UACPI_BAD_OPCODE(0x09) \
552UACPI_INTEGER_LITERAL_OP(Byte, 0x0A, 1) \
553UACPI_INTEGER_LITERAL_OP(Word, 0x0B, 2) \
554UACPI_INTEGER_LITERAL_OP(DWord, 0x0C, 4) \
555UACPI_OP( \
556 StringPrefix, 0x0D, \
557 UACPI_OP_PROPERTY_TERM_ARG, \
558 { \
559 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_STRING, \
560 UACPI_PARSE_OP_INVOKE_HANDLER, \
561 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
562 } \
563) \
564UACPI_INTEGER_LITERAL_OP(QWord, 0x0E, 8) \
565UACPI_BAD_OPCODE(0x0F) \
566UACPI_OP( \
567 ScopeOp, 0x10, 0, \
568 { \
569 UACPI_PARSE_OP_TRACKED_PKGLEN, \
570 UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD, \
571 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
572 UACPI_PARSE_OP_INVOKE_HANDLER, \
573 } \
574) \
575UACPI_OP( \
576 BufferOp, 0x11, \
577 UACPI_OP_PROPERTY_TERM_ARG, \
578 { \
579 UACPI_PARSE_OP_TRACKED_PKGLEN, \
580 UACPI_PARSE_OP_OPERAND, \
581 UACPI_PARSE_OP_RECORD_AML_PC, \
582 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
583 UACPI_PARSE_OP_INVOKE_HANDLER, \
584 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
585 } \
586) \
587UACPI_BUILD_PACKAGE_OP( \
588 Package, 0x12, 3, \
589 UACPI_PARSE_OP_LOAD_IMM, 1 \
590) \
591UACPI_BUILD_PACKAGE_OP( \
592 VarPackage, 0x13, 2, \
593 UACPI_PARSE_OP_OPERAND \
594) \
595UACPI_OP( \
596 MethodOp, 0x14, 0, \
597 { \
598 UACPI_PARSE_OP_TRACKED_PKGLEN, \
599 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
600 UACPI_PARSE_OP_LOAD_IMM, 1, \
601 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
602 UACPI_PARSE_OP_RECORD_AML_PC, \
603 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_METHOD, \
604 UACPI_PARSE_OP_INVOKE_HANDLER, \
605 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 1, \
606 } \
607) \
608UACPI_OP( \
609 ExternalOp, 0x15, 0, \
610 { \
611 UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL, \
612 UACPI_PARSE_OP_LOAD_IMM, 1, \
613 UACPI_PARSE_OP_LOAD_IMM, 1, \
614 } \
615) \
616UACPI_BAD_OPCODE(0x16) \
617UACPI_BAD_OPCODE(0x17) \
618UACPI_BAD_OPCODE(0x18) \
619UACPI_BAD_OPCODE(0x19) \
620UACPI_BAD_OPCODE(0x1A) \
621UACPI_BAD_OPCODE(0x1B) \
622UACPI_BAD_OPCODE(0x1C) \
623UACPI_BAD_OPCODE(0x1D) \
624UACPI_BAD_OPCODE(0x1E) \
625UACPI_BAD_OPCODE(0x1F) \
626UACPI_BAD_OPCODE(0x20) \
627UACPI_BAD_OPCODE(0x21) \
628UACPI_BAD_OPCODE(0x22) \
629UACPI_BAD_OPCODE(0x23) \
630UACPI_BAD_OPCODE(0x24) \
631UACPI_BAD_OPCODE(0x25) \
632UACPI_BAD_OPCODE(0x26) \
633UACPI_BAD_OPCODE(0x27) \
634UACPI_BAD_OPCODE(0x28) \
635UACPI_BAD_OPCODE(0x29) \
636UACPI_BAD_OPCODE(0x2A) \
637UACPI_BAD_OPCODE(0x2B) \
638UACPI_BAD_OPCODE(0x2C) \
639UACPI_BAD_OPCODE(0x2D) \
640UACPI_UNRESOLVED_NAME_STRING_OP(DualNamePrefix, 0x2E) \
641UACPI_UNRESOLVED_NAME_STRING_OP(MultiNamePrefix, 0x2F) \
642UACPI_INTERNAL_OP(0x30) \
643UACPI_INTERNAL_OP(0x31) \
644UACPI_INTERNAL_OP(0x32) \
645UACPI_INTERNAL_OP(0x33) \
646UACPI_INTERNAL_OP(0x34) \
647UACPI_INTERNAL_OP(0x35) \
648UACPI_INTERNAL_OP(0x36) \
649UACPI_INTERNAL_OP(0x37) \
650UACPI_INTERNAL_OP(0x38) \
651UACPI_INTERNAL_OP(0x39) \
652UACPI_BAD_OPCODE(0x3A) \
653UACPI_BAD_OPCODE(0x3B) \
654UACPI_BAD_OPCODE(0x3C) \
655UACPI_BAD_OPCODE(0x3D) \
656UACPI_BAD_OPCODE(0x3E) \
657UACPI_BAD_OPCODE(0x3F) \
658UACPI_BAD_OPCODE(0x40) \
659UACPI_UNRESOLVED_NAME_STRING_OP(A, 0x41) \
660UACPI_UNRESOLVED_NAME_STRING_OP(B, 0x42) \
661UACPI_UNRESOLVED_NAME_STRING_OP(C, 0x43) \
662UACPI_UNRESOLVED_NAME_STRING_OP(D, 0x44) \
663UACPI_UNRESOLVED_NAME_STRING_OP(E, 0x45) \
664UACPI_UNRESOLVED_NAME_STRING_OP(F, 0x46) \
665UACPI_UNRESOLVED_NAME_STRING_OP(G, 0x47) \
666UACPI_UNRESOLVED_NAME_STRING_OP(H, 0x48) \
667UACPI_UNRESOLVED_NAME_STRING_OP(I, 0x49) \
668UACPI_UNRESOLVED_NAME_STRING_OP(J, 0x4A) \
669UACPI_UNRESOLVED_NAME_STRING_OP(K, 0x4B) \
670UACPI_UNRESOLVED_NAME_STRING_OP(L, 0x4C) \
671UACPI_UNRESOLVED_NAME_STRING_OP(M, 0x4D) \
672UACPI_UNRESOLVED_NAME_STRING_OP(N, 0x4E) \
673UACPI_UNRESOLVED_NAME_STRING_OP(O, 0x4F) \
674UACPI_UNRESOLVED_NAME_STRING_OP(P, 0x50) \
675UACPI_UNRESOLVED_NAME_STRING_OP(Q, 0x51) \
676UACPI_UNRESOLVED_NAME_STRING_OP(R, 0x52) \
677UACPI_UNRESOLVED_NAME_STRING_OP(S, 0x53) \
678UACPI_UNRESOLVED_NAME_STRING_OP(T, 0x54) \
679UACPI_UNRESOLVED_NAME_STRING_OP(U, 0x55) \
680UACPI_UNRESOLVED_NAME_STRING_OP(V, 0x56) \
681UACPI_UNRESOLVED_NAME_STRING_OP(W, 0x57) \
682UACPI_UNRESOLVED_NAME_STRING_OP(X, 0x58) \
683UACPI_UNRESOLVED_NAME_STRING_OP(Y, 0x59) \
684UACPI_UNRESOLVED_NAME_STRING_OP(Z, 0x5A) \
685UACPI_INTERNAL_OP(0x5B) \
686UACPI_UNRESOLVED_NAME_STRING_OP(RootChar, 0x5C) \
687UACPI_BAD_OPCODE(0x5D) \
688UACPI_UNRESOLVED_NAME_STRING_OP(ParentPrefixChar, 0x5E) \
689UACPI_UNRESOLVED_NAME_STRING_OP(Underscore, 0x5F) \
690UACPI_LOCALX_OP(0) \
691UACPI_LOCALX_OP(1) \
692UACPI_LOCALX_OP(2) \
693UACPI_LOCALX_OP(3) \
694UACPI_LOCALX_OP(4) \
695UACPI_LOCALX_OP(5) \
696UACPI_LOCALX_OP(6) \
697UACPI_LOCALX_OP(7) \
698UACPI_ARGX_OP(0) \
699UACPI_ARGX_OP(1) \
700UACPI_ARGX_OP(2) \
701UACPI_ARGX_OP(3) \
702UACPI_ARGX_OP(4) \
703UACPI_ARGX_OP(5) \
704UACPI_ARGX_OP(6) \
705UACPI_BAD_OPCODE(0x6F) \
706UACPI_OP( \
707 StoreOp, 0x70, \
708 UACPI_OP_PROPERTY_TERM_ARG, \
709 { \
710 UACPI_PARSE_OP_TERM_ARG, \
711 UACPI_PARSE_OP_SUPERNAME, \
712 UACPI_PARSE_OP_INVOKE_HANDLER, \
713 UACPI_PARSE_OP_ITEM_POP, \
714 UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
715 } \
716) \
717UACPI_OP( \
718 RefOfOp, 0x71, \
719 UACPI_OP_PROPERTY_TERM_ARG, \
720 { \
721 UACPI_PARSE_OP_SUPERNAME, \
722 UACPI_PARSE_OP_OBJECT_ALLOC, \
723 UACPI_PARSE_OP_INVOKE_HANDLER, \
724 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
725 } \
726) \
727UACPI_BUILD_BINARY_MATH_OP(Add, 0x72) \
728UACPI_OP( \
729 ConcatOp, 0x73, \
730 UACPI_OP_PROPERTY_TERM_ARG, \
731 { \
732 UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
733 UACPI_PARSE_OP_COMPUTATIONAL_DATA, \
734 UACPI_PARSE_OP_TARGET, \
735 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
736 UACPI_PARSE_OP_INVOKE_HANDLER, \
737 UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
738 UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
739 } \
740) \
741UACPI_BUILD_BINARY_MATH_OP(Subtract, 0x74) \
742UACPI_BUILD_INC_DEC_OP(Increment, 0x75) \
743UACPI_BUILD_INC_DEC_OP(Decrement, 0x76) \
744UACPI_BUILD_BINARY_MATH_OP(Multiply, 0x77) \
745UACPI_OP( \
746 DivideOp, 0x78, \
747 UACPI_OP_PROPERTY_TERM_ARG, \
748 { \
749 UACPI_PARSE_OP_OPERAND, \
750 UACPI_PARSE_OP_OPERAND, \
751 UACPI_PARSE_OP_TARGET, \
752 UACPI_PARSE_OP_TARGET, \
753 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
754 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
755 UACPI_PARSE_OP_INVOKE_HANDLER, \
756 UACPI_PARSE_OP_STORE_TO_TARGET, 3, \
757 UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
758 UACPI_PARSE_OP_STORE_TO_TARGET_INDIRECT, 2, 4, \
759 } \
760) \
761UACPI_BUILD_BINARY_MATH_OP(ShiftLeft, 0x79) \
762UACPI_BUILD_BINARY_MATH_OP(ShiftRight, 0x7A) \
763UACPI_BUILD_BINARY_MATH_OP(And, 0x7B) \
764UACPI_BUILD_BINARY_MATH_OP(Nand, 0x7C) \
765UACPI_BUILD_BINARY_MATH_OP(Or, 0x7D) \
766UACPI_BUILD_BINARY_MATH_OP(Nor, 0x7E) \
767UACPI_BUILD_BINARY_MATH_OP(Xor, 0x7F) \
768UACPI_BUILD_UNARY_MATH_OP(Not, 0x80) \
769UACPI_BUILD_UNARY_MATH_OP(FindSetLeftBit, 0x81) \
770UACPI_BUILD_UNARY_MATH_OP(FindSetRightBit, 0x82) \
771UACPI_OP( \
772 DerefOfOp, 0x83, \
773 UACPI_OP_PROPERTY_TERM_ARG, \
774 { \
775 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
776 UACPI_PARSE_OP_TYPECHECK_ONE_OF, 2, \
777 UACPI_OBJECT_REFERENCE, UACPI_OBJECT_BUFFER_INDEX, \
778 UACPI_PARSE_OP_OBJECT_ALLOC, \
779 UACPI_PARSE_OP_INVOKE_HANDLER, \
780 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
781 } \
782) \
783UACPI_OP( \
784 ConcatResOp, 0x84, \
785 UACPI_OP_PROPERTY_TERM_ARG, \
786 { \
787 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
788 UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
789 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
790 UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
791 UACPI_PARSE_OP_TARGET, \
792 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
793 UACPI_PARSE_OP_INVOKE_HANDLER, \
794 UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
795 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
796 } \
797) \
798UACPI_BUILD_BINARY_MATH_OP(Mod, 0x85) \
799UACPI_OP( \
800 NotifyOp, 0x86, 0, \
801 { \
802 /* This is technically wrong according to spec but I was */ \
803 /* unable to find any examples of anything else after */ \
804 /* inspecting about 500 AML dumps. Spec says this is a */ \
805 /* SuperName that must evaluate to Device/ThermalZone or */ \
806 /* Processor, just ignore for now. */ \
807 UACPI_PARSE_OP_EXISTING_NAMESTRING_OR_NULL_IF_LOAD, \
808 UACPI_PARSE_OP_OPERAND, \
809 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
810 UACPI_PARSE_OP_INVOKE_HANDLER, \
811 } \
812) \
813UACPI_OP( \
814 SizeOfOp, 0x87, \
815 UACPI_OP_PROPERTY_TERM_ARG, \
816 { \
817 UACPI_PARSE_OP_SUPERNAME, \
818 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
819 UACPI_PARSE_OP_INVOKE_HANDLER, \
820 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
821 } \
822) \
823UACPI_OP( \
824 IndexOp, 0x88, \
825 UACPI_OP_PROPERTY_TERM_ARG | \
826 UACPI_OP_PROPERTY_SUPERNAME | \
827 UACPI_OP_PROPERTY_SIMPLE_NAME, \
828 { \
829 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
830 UACPI_PARSE_OP_OPERAND, \
831 UACPI_PARSE_OP_TARGET, \
832 UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC, \
833 UACPI_PARSE_OP_INVOKE_HANDLER, \
834 UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
835 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
836 } \
837) \
838UACPI_OP( \
839 MatchOp, 0x89, \
840 UACPI_OP_PROPERTY_TERM_ARG, \
841 { \
842 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
843 UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_PACKAGE, \
844 UACPI_PARSE_OP_LOAD_IMM, 1, \
845 UACPI_PARSE_OP_OPERAND, \
846 UACPI_PARSE_OP_LOAD_IMM, 1, \
847 UACPI_PARSE_OP_OPERAND, \
848 UACPI_PARSE_OP_OPERAND, \
849 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
850 UACPI_PARSE_OP_INVOKE_HANDLER, \
851 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
852 } \
853) \
854UACPI_BUILD_BUFFER_FIELD_OP(DWord, 0x8A) \
855UACPI_BUILD_BUFFER_FIELD_OP(Word, 0x8B) \
856UACPI_BUILD_BUFFER_FIELD_OP(Byte, 0x8C) \
857UACPI_BUILD_BUFFER_FIELD_OP(Bit, 0x8D) \
858UACPI_OP( \
859 ObjectTypeOp, 0x8E, \
860 UACPI_OP_PROPERTY_TERM_ARG, \
861 { \
862 UACPI_PARSE_OP_TERM_ARG_OR_NAMED_OBJECT, \
863 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
864 UACPI_PARSE_OP_INVOKE_HANDLER, \
865 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
866 } \
867) \
868UACPI_BUILD_BUFFER_FIELD_OP(QWord, 0x8F) \
869UACPI_BUILD_BINARY_LOGIC_OP(Land, 0x90) \
870UACPI_BUILD_BINARY_LOGIC_OP(Lor, 0x91) \
871UACPI_OP( \
872 LnotOp, 0x92, \
873 UACPI_OP_PROPERTY_TERM_ARG, \
874 { \
875 UACPI_PARSE_OP_OPERAND, \
876 UACPI_PARSE_OP_OBJECT_ALLOC, \
877 UACPI_PARSE_OP_INVOKE_HANDLER, \
878 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
879 } \
880) \
881UACPI_BUILD_BINARY_LOGIC_OP(LEqual, 0x93) \
882UACPI_BUILD_BINARY_LOGIC_OP(LGreater, 0x94) \
883UACPI_BUILD_BINARY_LOGIC_OP(LLess, 0x95) \
884UACPI_BUILD_TO_OP(Buffer, 0x96, UACPI_OBJECT_BUFFER) \
885UACPI_BUILD_TO_OP(DecimalString, 0x97, UACPI_OBJECT_STRING) \
886UACPI_BUILD_TO_OP(HexString, 0x98, UACPI_OBJECT_STRING) \
887UACPI_BUILD_TO_OP(Integer, 0x99, UACPI_OBJECT_INTEGER) \
888UACPI_BAD_OPCODE(0x9A) \
889UACPI_BAD_OPCODE(0x9B) \
890UACPI_OP( \
891 ToStringOp, 0x9C, \
892 UACPI_OP_PROPERTY_TERM_ARG, \
893 { \
894 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
895 UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
896 UACPI_PARSE_OP_OPERAND, \
897 UACPI_PARSE_OP_TARGET, \
898 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_STRING, \
899 UACPI_PARSE_OP_INVOKE_HANDLER, \
900 UACPI_PARSE_OP_STORE_TO_TARGET, 2, \
901 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
902 } \
903) \
904UACPI_OP( \
905 CopyObjectOp, 0x9D, \
906 UACPI_OP_PROPERTY_TERM_ARG, \
907 { \
908 UACPI_PARSE_OP_TERM_ARG, \
909 UACPI_PARSE_OP_OBJECT_COPY_TO_PREV, \
910 UACPI_PARSE_OP_SIMPLE_NAME, \
911 UACPI_PARSE_OP_INVOKE_HANDLER, \
912 } \
913) \
914UACPI_OP( \
915 MidOp, 0x9E, \
916 UACPI_OP_PROPERTY_TERM_ARG, \
917 { \
918 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
919 UACPI_PARSE_OP_OPERAND, \
920 UACPI_PARSE_OP_OPERAND, \
921 UACPI_PARSE_OP_TARGET, \
922 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
923 UACPI_PARSE_OP_INVOKE_HANDLER, \
924 UACPI_PARSE_OP_STORE_TO_TARGET, 3, \
925 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
926 } \
927) \
928UACPI_OP( \
929 ContinueOp, 0x9F, 0, \
930 { \
931 UACPI_PARSE_OP_INVOKE_HANDLER, \
932 } \
933) \
934UACPI_OP( \
935 IfOp, 0xA0, 0, \
936 { \
937 UACPI_PARSE_OP_TRACKED_PKGLEN, \
938 UACPI_PARSE_OP_OPERAND, \
939 UACPI_PARSE_OP_IF_LAST_NULL, 3, \
940 UACPI_PARSE_OP_EMIT_SKIP_WARN, \
941 UACPI_PARSE_OP_JMP, 9, \
942 UACPI_PARSE_OP_IF_LAST_FALSE, 4, \
943 UACPI_PARSE_OP_SWITCH_TO_NEXT_IF_EQUALS, 0xA1, 0x00, \
944 UACPI_PARSE_OP_END, \
945 UACPI_PARSE_OP_INVOKE_HANDLER, \
946 } \
947) \
948UACPI_OP( \
949 ElseOp, 0xA1, 0, \
950 { \
951 UACPI_PARSE_OP_IF_SWITCHED_FROM, 0xA0, 0x00, 10, \
952 UACPI_PARSE_OP_IF_LAST_NULL, 3, \
953 UACPI_PARSE_OP_TRACKED_PKGLEN, \
954 UACPI_PARSE_OP_EMIT_SKIP_WARN, \
955 UACPI_PARSE_OP_END, \
956 UACPI_PARSE_OP_ITEM_POP, \
957 UACPI_PARSE_OP_ITEM_POP, \
958 UACPI_PARSE_OP_PKGLEN, \
959 UACPI_PARSE_OP_INVOKE_HANDLER, \
960 UACPI_PARSE_OP_END, \
961 UACPI_PARSE_OP_TRACKED_PKGLEN, \
962 } \
963) \
964UACPI_OP( \
965 WhileOp, 0xA2, 0, \
966 { \
967 UACPI_PARSE_OP_TRACKED_PKGLEN, \
968 UACPI_PARSE_OP_OPERAND, \
969 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
970 UACPI_PARSE_OP_IF_LAST_TRUE, 1, \
971 UACPI_PARSE_OP_INVOKE_HANDLER, \
972 } \
973) \
974UACPI_OP( \
975 NoopOp, 0xA3, 0, \
976 { \
977 UACPI_PARSE_OP_END, \
978 } \
979) \
980UACPI_OP( \
981 ReturnOp, 0xA4, 0, \
982 { \
983 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
984 UACPI_PARSE_OP_INVOKE_HANDLER, \
985 } \
986) \
987UACPI_OP( \
988 BreakOp, 0xA5, 0, \
989 { \
990 UACPI_PARSE_OP_INVOKE_HANDLER, \
991 } \
992) \
993UACPI_BAD_OPCODE(0xA6) \
994UACPI_BAD_OPCODE(0xA7) \
995UACPI_BAD_OPCODE(0xA8) \
996UACPI_BAD_OPCODE(0xA9) \
997UACPI_BAD_OPCODE(0xAA) \
998UACPI_BAD_OPCODE(0xAB) \
999UACPI_BAD_OPCODE(0xAC) \
1000UACPI_BAD_OPCODE(0xAD) \
1001UACPI_BAD_OPCODE(0xAE) \
1002UACPI_BAD_OPCODE(0xAF) \
1003UACPI_BAD_OPCODE(0xB0) \
1004UACPI_BAD_OPCODE(0xB1) \
1005UACPI_BAD_OPCODE(0xB2) \
1006UACPI_BAD_OPCODE(0xB3) \
1007UACPI_BAD_OPCODE(0xB4) \
1008UACPI_BAD_OPCODE(0xB5) \
1009UACPI_BAD_OPCODE(0xB6) \
1010UACPI_BAD_OPCODE(0xB7) \
1011UACPI_BAD_OPCODE(0xB8) \
1012UACPI_BAD_OPCODE(0xB9) \
1013UACPI_BAD_OPCODE(0xBA) \
1014UACPI_BAD_OPCODE(0xBB) \
1015UACPI_BAD_OPCODE(0xBC) \
1016UACPI_BAD_OPCODE(0xBD) \
1017UACPI_BAD_OPCODE(0xBE) \
1018UACPI_BAD_OPCODE(0xBF) \
1019UACPI_BAD_OPCODE(0xC0) \
1020UACPI_BAD_OPCODE(0xC1) \
1021UACPI_BAD_OPCODE(0xC2) \
1022UACPI_BAD_OPCODE(0xC3) \
1023UACPI_BAD_OPCODE(0xC4) \
1024UACPI_BAD_OPCODE(0xC5) \
1025UACPI_BAD_OPCODE(0xC6) \
1026UACPI_BAD_OPCODE(0xC7) \
1027UACPI_BAD_OPCODE(0xC8) \
1028UACPI_BAD_OPCODE(0xC9) \
1029UACPI_BAD_OPCODE(0xCA) \
1030UACPI_BAD_OPCODE(0xCB) \
1031UACPI_OP( \
1032 BreakPointOp, 0xCC, 0, \
1033 { \
1034 UACPI_PARSE_OP_INVOKE_HANDLER, \
1035 } \
1036) \
1037UACPI_BAD_OPCODE(0xCD) \
1038UACPI_BAD_OPCODE(0xCE) \
1039UACPI_BAD_OPCODE(0xCF) \
1040UACPI_BAD_OPCODE(0xD0) \
1041UACPI_BAD_OPCODE(0xD1) \
1042UACPI_BAD_OPCODE(0xD2) \
1043UACPI_BAD_OPCODE(0xD3) \
1044UACPI_BAD_OPCODE(0xD4) \
1045UACPI_BAD_OPCODE(0xD5) \
1046UACPI_BAD_OPCODE(0xD6) \
1047UACPI_BAD_OPCODE(0xD7) \
1048UACPI_BAD_OPCODE(0xD8) \
1049UACPI_BAD_OPCODE(0xD9) \
1050UACPI_BAD_OPCODE(0xDA) \
1051UACPI_BAD_OPCODE(0xDB) \
1052UACPI_BAD_OPCODE(0xDC) \
1053UACPI_BAD_OPCODE(0xDD) \
1054UACPI_BAD_OPCODE(0xDE) \
1055UACPI_BAD_OPCODE(0xDF) \
1056UACPI_BAD_OPCODE(0xE0) \
1057UACPI_BAD_OPCODE(0xE1) \
1058UACPI_BAD_OPCODE(0xE2) \
1059UACPI_BAD_OPCODE(0xE3) \
1060UACPI_BAD_OPCODE(0xE4) \
1061UACPI_BAD_OPCODE(0xE5) \
1062UACPI_BAD_OPCODE(0xE6) \
1063UACPI_BAD_OPCODE(0xE7) \
1064UACPI_BAD_OPCODE(0xE8) \
1065UACPI_BAD_OPCODE(0xE9) \
1066UACPI_BAD_OPCODE(0xEA) \
1067UACPI_BAD_OPCODE(0xEB) \
1068UACPI_BAD_OPCODE(0xEC) \
1069UACPI_BAD_OPCODE(0xED) \
1070UACPI_BAD_OPCODE(0xEE) \
1071UACPI_BAD_OPCODE(0xEF) \
1072UACPI_BAD_OPCODE(0xF0) \
1073UACPI_BAD_OPCODE(0xF1) \
1074UACPI_BAD_OPCODE(0xF2) \
1075UACPI_BAD_OPCODE(0xF3) \
1076UACPI_OP( \
1077 InternalOpReadFieldAsBuffer, 0xF4, \
1078 UACPI_OP_PROPERTY_TERM_ARG | \
1079 UACPI_OP_PROPERTY_RESERVED, \
1080 { \
1081 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_BUFFER, \
1082 UACPI_PARSE_OP_INVOKE_HANDLER, \
1083 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1084 } \
1085) \
1086UACPI_OP( \
1087 InternalOpReadFieldAsInteger, 0xF5, \
1088 UACPI_OP_PROPERTY_TERM_ARG | \
1089 UACPI_OP_PROPERTY_RESERVED, \
1090 { \
1091 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_INTEGER, \
1092 UACPI_PARSE_OP_INVOKE_HANDLER, \
1093 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1094 } \
1095) \
1096UACPI_OP( \
1097 InternalOpNamedObject, 0xF6, \
1098 UACPI_OP_PROPERTY_SIMPLE_NAME | \
1099 UACPI_OP_PROPERTY_SUPERNAME | \
1100 UACPI_OP_PROPERTY_TERM_ARG | \
1101 UACPI_OP_PROPERTY_RESERVED, \
1102 { \
1103 UACPI_PARSE_OP_EMPTY_OBJECT_ALLOC, \
1104 UACPI_PARSE_OP_INVOKE_HANDLER, \
1105 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1106 } \
1107) \
1108UACPI_METHOD_CALL_OPCODE(0) \
1109UACPI_METHOD_CALL_OPCODE(1) \
1110UACPI_METHOD_CALL_OPCODE(2) \
1111UACPI_METHOD_CALL_OPCODE(3) \
1112UACPI_METHOD_CALL_OPCODE(4) \
1113UACPI_METHOD_CALL_OPCODE(5) \
1114UACPI_METHOD_CALL_OPCODE(6) \
1115UACPI_METHOD_CALL_OPCODE(7) \
1116UACPI_OP( \
1117 OnesOp, 0xFF, \
1118 UACPI_OP_PROPERTY_TERM_ARG, \
1119 { \
1120 UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
1121 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \
1122 UACPI_PARSE_OP_TRUNCATE_NUMBER, \
1123 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1124 } \
1125)
1126
1127extern uacpi_u8 uacpi_field_op_decode_ops[];
1128extern uacpi_u8 uacpi_index_field_op_decode_ops[];
1129extern uacpi_u8 uacpi_bank_field_op_decode_ops[];
1130extern uacpi_u8 uacpi_load_op_decode_ops[];
1131extern uacpi_u8 uacpi_load_table_op_decode_ops[];
1132
1133#define UACPI_BUILD_NAMED_SCOPE_OBJECT_OP(name, code, type, ...) \
1134UACPI_OP( \
1135 name##Op, UACPI_EXT_OP(code), 0, \
1136 { \
1137 UACPI_PARSE_OP_TRACKED_PKGLEN, \
1138 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
1139 ##__VA_ARGS__, \
1140 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 1, \
1141 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, type, \
1142 UACPI_PARSE_OP_INVOKE_HANDLER, \
1143 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 1, \
1144 } \
1145)
1146
1147#define UACPI_BUILD_TO_FROM_BCD(type, code) \
1148UACPI_OP( \
1149 type##BCDOp, UACPI_EXT_OP(code), \
1150 UACPI_OP_PROPERTY_TERM_ARG, \
1151 { \
1152 UACPI_PARSE_OP_OPERAND, \
1153 UACPI_PARSE_OP_TARGET, \
1154 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
1155 UACPI_OBJECT_INTEGER, \
1156 UACPI_PARSE_OP_INVOKE_HANDLER, \
1157 UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
1158 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1159 } \
1160)
1161
1162#define UACPI_ENUMERATE_EXT_OPCODES \
1163UACPI_OP( \
1164 ReservedExtOp, UACPI_EXT_OP(0x00), 0, \
1165 { \
1166 UACPI_PARSE_OP_BAD_OPCODE, \
1167 } \
1168) \
1169UACPI_OP( \
1170 MutexOp, UACPI_EXT_OP(0x01), 0, \
1171 { \
1172 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
1173 UACPI_PARSE_OP_LOAD_IMM, 1, \
1174 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
1175 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
1176 UACPI_OBJECT_MUTEX, \
1177 UACPI_PARSE_OP_INVOKE_HANDLER, \
1178 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
1179 } \
1180) \
1181UACPI_OP( \
1182 EventOp, UACPI_EXT_OP(0x02), 0, \
1183 { \
1184 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
1185 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
1186 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
1187 UACPI_OBJECT_EVENT, \
1188 UACPI_PARSE_OP_INVOKE_HANDLER, \
1189 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
1190 } \
1191) \
1192UACPI_OP( \
1193 CondRefOfOp, UACPI_EXT_OP(0x12), \
1194 UACPI_OP_PROPERTY_TERM_ARG, \
1195 { \
1196 UACPI_PARSE_OP_SUPERNAME_OR_UNRESOLVED, \
1197 UACPI_PARSE_OP_TARGET, \
1198 UACPI_PARSE_OP_IF_NULL, 0, 3, \
1199 UACPI_PARSE_OP_LOAD_FALSE_OBJECT, \
1200 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1201 UACPI_PARSE_OP_END, \
1202 UACPI_PARSE_OP_OBJECT_ALLOC, \
1203 UACPI_PARSE_OP_INVOKE_HANDLER, \
1204 UACPI_PARSE_OP_STORE_TO_TARGET, 1, \
1205 UACPI_PARSE_OP_LOAD_TRUE_OBJECT, \
1206 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1207 } \
1208) \
1209UACPI_DO_BUILD_BUFFER_FIELD_OP( \
1210 Create, UACPI_EXT_OP(0x13), 3, \
1211 UACPI_PARSE_OP_OPERAND \
1212) \
1213UACPI_OUT_OF_LINE_OP( \
1214 LoadTableOp, UACPI_EXT_OP(0x1F), \
1215 uacpi_load_table_op_decode_ops, \
1216 UACPI_OP_PROPERTY_TERM_ARG | \
1217 UACPI_OP_PROPERTY_OUT_OF_LINE \
1218) \
1219UACPI_OUT_OF_LINE_OP( \
1220 LoadOp, UACPI_EXT_OP(0x20), \
1221 uacpi_load_op_decode_ops, \
1222 UACPI_OP_PROPERTY_TERM_ARG | \
1223 UACPI_OP_PROPERTY_OUT_OF_LINE \
1224) \
1225UACPI_OP( \
1226 StallOp, UACPI_EXT_OP(0x21), 0, \
1227 { \
1228 UACPI_PARSE_OP_OPERAND, \
1229 UACPI_PARSE_OP_INVOKE_HANDLER, \
1230 } \
1231) \
1232UACPI_OP( \
1233 SleepOp, UACPI_EXT_OP(0x22), 0, \
1234 { \
1235 UACPI_PARSE_OP_OPERAND, \
1236 UACPI_PARSE_OP_INVOKE_HANDLER, \
1237 } \
1238) \
1239UACPI_OP( \
1240 AcquireOp, UACPI_EXT_OP(0x23), \
1241 UACPI_OP_PROPERTY_TERM_ARG, \
1242 { \
1243 UACPI_PARSE_OP_SUPERNAME, \
1244 UACPI_PARSE_OP_LOAD_IMM, 2, \
1245 UACPI_PARSE_OP_LOAD_TRUE_OBJECT, \
1246 UACPI_PARSE_OP_INVOKE_HANDLER, \
1247 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1248 } \
1249) \
1250UACPI_OP( \
1251 SignalOp, UACPI_EXT_OP(0x24), 0, \
1252 { \
1253 UACPI_PARSE_OP_SUPERNAME, \
1254 UACPI_PARSE_OP_INVOKE_HANDLER, \
1255 } \
1256) \
1257UACPI_OP( \
1258 WaitOp, UACPI_EXT_OP(0x25), \
1259 UACPI_OP_PROPERTY_TERM_ARG, \
1260 { \
1261 UACPI_PARSE_OP_SUPERNAME, \
1262 UACPI_PARSE_OP_OPERAND, \
1263 UACPI_PARSE_OP_LOAD_TRUE_OBJECT, \
1264 UACPI_PARSE_OP_INVOKE_HANDLER, \
1265 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1266 } \
1267) \
1268UACPI_OP( \
1269 ResetOp, UACPI_EXT_OP(0x26), 0, \
1270 { \
1271 UACPI_PARSE_OP_SUPERNAME, \
1272 UACPI_PARSE_OP_INVOKE_HANDLER, \
1273 } \
1274) \
1275UACPI_OP( \
1276 ReleaseOp, UACPI_EXT_OP(0x27), 0, \
1277 { \
1278 UACPI_PARSE_OP_SUPERNAME, \
1279 UACPI_PARSE_OP_INVOKE_HANDLER, \
1280 } \
1281) \
1282UACPI_BUILD_TO_FROM_BCD(From, 0x28) \
1283UACPI_BUILD_TO_FROM_BCD(To, 0x29) \
1284UACPI_OP( \
1285 UnloadOp, UACPI_EXT_OP(0x2A), 0, \
1286 { \
1287 UACPI_PARSE_OP_SUPERNAME, \
1288 UACPI_PARSE_OP_INVOKE_HANDLER, \
1289 } \
1290) \
1291UACPI_OP( \
1292 RevisionOp, UACPI_EXT_OP(0x30), \
1293 UACPI_OP_PROPERTY_TERM_ARG, \
1294 { \
1295 UACPI_PARSE_OP_LOAD_INLINE_IMM_AS_OBJECT, \
1296 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
1297 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1298 } \
1299) \
1300UACPI_OP( \
1301 DebugOp, UACPI_EXT_OP(0x31), \
1302 UACPI_OP_PROPERTY_TERM_ARG | \
1303 UACPI_OP_PROPERTY_SUPERNAME | \
1304 UACPI_OP_PROPERTY_TARGET, \
1305 { \
1306 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
1307 UACPI_OBJECT_DEBUG, \
1308 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1309 } \
1310) \
1311UACPI_OP( \
1312 FatalOp, UACPI_EXT_OP(0x32), 0, \
1313 { \
1314 UACPI_PARSE_OP_LOAD_IMM, 1, \
1315 UACPI_PARSE_OP_LOAD_IMM, 4, \
1316 UACPI_PARSE_OP_OPERAND, \
1317 UACPI_PARSE_OP_INVOKE_HANDLER, \
1318 } \
1319) \
1320UACPI_OP( \
1321 TimerOp, UACPI_EXT_OP(0x33), \
1322 UACPI_OP_PROPERTY_TERM_ARG, \
1323 { \
1324 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
1325 UACPI_OBJECT_INTEGER, \
1326 UACPI_PARSE_OP_INVOKE_HANDLER, \
1327 UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV, \
1328 } \
1329) \
1330UACPI_OP( \
1331 OpRegionOp, UACPI_EXT_OP(0x80), 0, \
1332 { \
1333 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
1334 UACPI_PARSE_OP_LOAD_IMM, 1, \
1335 UACPI_PARSE_OP_OPERAND, \
1336 UACPI_PARSE_OP_OPERAND, \
1337 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
1338 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
1339 UACPI_OBJECT_OPERATION_REGION, \
1340 UACPI_PARSE_OP_INVOKE_HANDLER, \
1341 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
1342 } \
1343) \
1344UACPI_OUT_OF_LINE_OP( \
1345 FieldOp, UACPI_EXT_OP(0x81), \
1346 uacpi_field_op_decode_ops, \
1347 UACPI_OP_PROPERTY_OUT_OF_LINE \
1348) \
1349UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
1350 Device, 0x82, UACPI_OBJECT_DEVICE \
1351) \
1352UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
1353 Processor, 0x83, UACPI_OBJECT_PROCESSOR, \
1354 UACPI_PARSE_OP_LOAD_IMM, 1, \
1355 UACPI_PARSE_OP_LOAD_IMM, 4, \
1356 UACPI_PARSE_OP_LOAD_IMM, 1 \
1357) \
1358UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
1359 PowerRes, 0x84, UACPI_OBJECT_POWER_RESOURCE, \
1360 UACPI_PARSE_OP_LOAD_IMM, 1, \
1361 UACPI_PARSE_OP_LOAD_IMM, 2 \
1362) \
1363UACPI_BUILD_NAMED_SCOPE_OBJECT_OP( \
1364 ThermalZone, 0x85, UACPI_OBJECT_THERMAL_ZONE \
1365) \
1366UACPI_OUT_OF_LINE_OP( \
1367 IndexFieldOp, UACPI_EXT_OP(0x86), \
1368 uacpi_index_field_op_decode_ops, \
1369 UACPI_OP_PROPERTY_OUT_OF_LINE \
1370) \
1371UACPI_OUT_OF_LINE_OP( \
1372 BankFieldOp, UACPI_EXT_OP(0x87), \
1373 uacpi_bank_field_op_decode_ops, \
1374 UACPI_OP_PROPERTY_OUT_OF_LINE \
1375) \
1376UACPI_OP( \
1377 DataRegionOp, UACPI_EXT_OP(0x88), 0, \
1378 { \
1379 UACPI_PARSE_OP_CREATE_NAMESTRING_OR_NULL_IF_LOAD, \
1380 UACPI_PARSE_OP_STRING, \
1381 UACPI_PARSE_OP_STRING, \
1382 UACPI_PARSE_OP_STRING, \
1383 UACPI_PARSE_OP_SKIP_WITH_WARN_IF_NULL, 0, \
1384 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, \
1385 UACPI_OBJECT_OPERATION_REGION, \
1386 UACPI_PARSE_OP_INVOKE_HANDLER, \
1387 UACPI_PARSE_OP_INSTALL_NAMESPACE_NODE, 0, \
1388 } \
1389)
1390
1391enum uacpi_aml_op {
1392#define UACPI_OP(name, code, ...) UACPI_AML_OP_##name = code,
1393#define UACPI_OUT_OF_LINE_OP(name, code, ...) UACPI_AML_OP_##name = code,
1394 UACPI_ENUMERATE_OPCODES
1395 UACPI_ENUMERATE_EXT_OPCODES
1396#undef UACPI_OP
1397#undef UACPI_OUT_OF_LINE_OP
1398};
1399