ReactOS 0.4.16-dev-1494-gd054f63
opcodes.c
Go to the documentation of this file.
2
3#ifndef UACPI_BAREBONES_MODE
4
5#define UACPI_OP(opname, opcode, ...) \
6 { #opname, .decode_ops = __VA_ARGS__, .code = opcode },
7
8#define UACPI_OUT_OF_LINE_OP(opname, opcode, out_of_line_buf, props) \
9 { \
10 .name = #opname, \
11 .indirect_decode_ops = out_of_line_buf, \
12 .properties = props, \
13 .code = opcode, \
14 },
15
16static const struct uacpi_op_spec opcode_table[0x100] = {
18};
19
20static const struct uacpi_op_spec ext_opcode_table[] = {
22};
23
24#define _(op) (op & 0x00FF)
25
26static const uacpi_u8 ext_op_to_idx[0x100] = {
27 [_(UACPI_AML_OP_MutexOp)] = 1, [_(UACPI_AML_OP_EventOp)] = 2,
28 [_(UACPI_AML_OP_CondRefOfOp)] = 3, [_(UACPI_AML_OP_CreateFieldOp)] = 4,
29 [_(UACPI_AML_OP_LoadTableOp)] = 5, [_(UACPI_AML_OP_LoadOp)] = 6,
30 [_(UACPI_AML_OP_StallOp)] = 7, [_(UACPI_AML_OP_SleepOp)] = 8,
31 [_(UACPI_AML_OP_AcquireOp)] = 9, [_(UACPI_AML_OP_SignalOp)] = 10,
32 [_(UACPI_AML_OP_WaitOp)] = 11, [_(UACPI_AML_OP_ResetOp)] = 12,
33 [_(UACPI_AML_OP_ReleaseOp)] = 13, [_(UACPI_AML_OP_FromBCDOp)] = 14,
34 [_(UACPI_AML_OP_ToBCDOp)] = 15, [_(UACPI_AML_OP_UnloadOp)] = 16,
35 [_(UACPI_AML_OP_RevisionOp)] = 17, [_(UACPI_AML_OP_DebugOp)] = 18,
36 [_(UACPI_AML_OP_FatalOp)] = 19, [_(UACPI_AML_OP_TimerOp)] = 20,
37 [_(UACPI_AML_OP_OpRegionOp)] = 21, [_(UACPI_AML_OP_FieldOp)] = 22,
38 [_(UACPI_AML_OP_DeviceOp)] = 23, [_(UACPI_AML_OP_ProcessorOp)] = 24,
39 [_(UACPI_AML_OP_PowerResOp)] = 25, [_(UACPI_AML_OP_ThermalZoneOp)] = 26,
40 [_(UACPI_AML_OP_IndexFieldOp)] = 27, [_(UACPI_AML_OP_BankFieldOp)] = 28,
41 [_(UACPI_AML_OP_DataRegionOp)] = 29,
42};
43
45{
46 if (op > 0xFF)
48
49 return &opcode_table[op];
50}
51
52#define PARSE_FIELD_ELEMENTS(parse_loop_pc) \
53 /* Parse every field element found inside */ \
54 UACPI_PARSE_OP_IF_HAS_DATA, 44, \
55 /* Look at the first byte */ \
56 UACPI_PARSE_OP_LOAD_IMM, 1, \
57 \
58 /* ReservedField := 0x00 PkgLength */ \
59 UACPI_PARSE_OP_IF_LAST_EQUALS, 0x00, 3, \
60 UACPI_PARSE_OP_PKGLEN, \
61 UACPI_PARSE_OP_JMP, parse_loop_pc, \
62 \
63 /* AccessField := 0x01 AccessType AccessAttrib */ \
64 UACPI_PARSE_OP_IF_LAST_EQUALS, 0x01, 6, \
65 UACPI_PARSE_OP_LOAD_IMM, 1, \
66 UACPI_PARSE_OP_LOAD_IMM, 1, \
67 UACPI_PARSE_OP_JMP, parse_loop_pc, \
68 \
69 /* ConnectField := <0x02 NameString> | <0x02 BufferData> */ \
70 UACPI_PARSE_OP_IF_LAST_EQUALS, 0x02, 5, \
71 UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL, \
72 UACPI_PARSE_OP_TYPECHECK, UACPI_OBJECT_BUFFER, \
73 UACPI_PARSE_OP_JMP, parse_loop_pc, \
74 \
75 /* ExtendedAccessField := 0x03 AccessType ExtendedAccessAttrib \
76 * AccessLength */ \
77 UACPI_PARSE_OP_IF_LAST_EQUALS, 0x03, 8, \
78 UACPI_PARSE_OP_LOAD_IMM, 1, \
79 UACPI_PARSE_OP_LOAD_IMM, 1, \
80 UACPI_PARSE_OP_LOAD_IMM, 1, \
81 UACPI_PARSE_OP_JMP, parse_loop_pc, \
82 \
83 /* NamedField := NameSeg PkgLength */ \
84 \
85 /* \
86 * Discard the immediate, as it's the first byte of the \
87 * nameseg. We don't need it. \
88 */ \
89 UACPI_PARSE_OP_ITEM_POP, \
90 UACPI_PARSE_OP_AML_PC_DECREMENT, \
91 UACPI_PARSE_OP_CREATE_NAMESTRING, \
92 UACPI_PARSE_OP_PKGLEN, \
93 UACPI_PARSE_OP_OBJECT_ALLOC_TYPED, UACPI_OBJECT_FIELD_UNIT, \
94 UACPI_PARSE_OP_JMP, parse_loop_pc, \
95 \
96 UACPI_PARSE_OP_INVOKE_HANDLER, \
97 UACPI_PARSE_OP_END
98
104};
105
113};
114
121};
122
124 // Storage for the scope pointer, this is left as 0 in case of errors
129
130 /*
131 * Invoke the handler here to initialize the table. If this fails, it's
132 * expected to keep the item 0 as NULL, which is checked below to return
133 * false to the caller of Load.
134 */
139
142
143 /*
144 * Invoke the handler a second time to initialize any AML GPE handlers that
145 * might've been loaded from this table.
146 */
151};
152
154 // Storage for the scope pointer, this is left as 0 in case of errors
157 // Index of the table we are going to be loaded to unref it later
159 // Storage for the target pointer, this is left as 0 if none was requested
161
168
169 /*
170 * Invoke the handler here to initialize the table. If this fails, it's
171 * expected to keep the item 0 as NULL, which is checked below to return
172 * false to the caller of Load.
173 */
179
182
183 /*
184 * Invoke the handler a second time to block the store to target in case
185 * the load above failed, as well as do any AML GPE handler initialization.
186 */
188
189 // If we were given a target to store to, do the store
192
195};
197#define POP(x) UACPI_PARSE_OP_##x
198
199static
200const uacpi_char *const pop_names[UACPI_PARSE_OP_MAX + 1] = {
201 [POP(END)] = "<END-OF-OP>",
202 [POP(SKIP_WITH_WARN_IF_NULL)] = "SKIP_WITH_WARN_IF_NULL",
203 [POP(EMIT_SKIP_WARN)] = "EMIT_SKIP_WARN",
204 [POP(SIMPLE_NAME)] = "SIMPLE_NAME",
205 [POP(SUPERNAME)] = "SUPERNAME",
206 [POP(SUPERNAME_OR_UNRESOLVED)] = "SUPERNAME_OR_UNRESOLVED",
207 [POP(TERM_ARG)] = "TERM_ARG",
208 [POP(TERM_ARG_UNWRAP_INTERNAL)] = "TERM_ARG_UNWRAP_INTERNAL",
209 [POP(TERM_ARG_OR_NAMED_OBJECT)] = "TERM_ARG_OR_NAMED_OBJECT",
210 [POP(TERM_ARG_OR_NAMED_OBJECT_OR_UNRESOLVED)] = "TERM_ARG_OR_NAMED_OBJECT_OR_UNRESOLVED",
211 [POP(OPERAND)] = "OPERAND",
212 [POP(STRING)] = "STRING",
213 [POP(COMPUTATIONAL_DATA)] = "COMPUTATIONAL_DATA",
214 [POP(TARGET)] = "TARGET",
215 [POP(PKGLEN)] = "PKGLEN",
216 [POP(TRACKED_PKGLEN)] = "TRACKED_PKGLEN",
217 [POP(CREATE_NAMESTRING)] = "CREATE_NAMESTRING",
218 [POP(CREATE_NAMESTRING_OR_NULL_IF_LOAD)] = "CREATE_NAMESTRING_OR_NULL_IF_LOAD",
219 [POP(EXISTING_NAMESTRING)] = "EXISTING_NAMESTRING",
220 [POP(EXISTING_NAMESTRING_OR_NULL)] = "EXISTING_NAMESTRING_OR_NULL",
221 [POP(EXISTING_NAMESTRING_OR_NULL_IF_LOAD)] = "EXISTING_NAMESTRING_OR_NULL_IF_LOAD",
222 [POP(INVOKE_HANDLER)] = "INVOKE_HANDLER",
223 [POP(OBJECT_ALLOC)] = "OBJECT_ALLOC",
224 [POP(EMPTY_OBJECT_ALLOC)] = "EMPTY_OBJECT_ALLOC",
225 [POP(OBJECT_CONVERT_TO_SHALLOW_COPY)] = "OBJECT_CONVERT_TO_SHALLOW_COPY",
226 [POP(OBJECT_CONVERT_TO_DEEP_COPY)] = "OBJECT_CONVERT_TO_DEEP_COPY",
227 [POP(OBJECT_ALLOC_TYPED)] = "OBJECT_ALLOC_TYPED",
228 [POP(RECORD_AML_PC)] = "RECORD_AML_PC",
229 [POP(LOAD_INLINE_IMM_AS_OBJECT)] = "LOAD_INLINE_IMM_AS_OBJECT",
230 [POP(LOAD_INLINE_IMM)] = "LOAD_INLINE_IMM",
231 [POP(LOAD_ZERO_IMM)] = "LOAD_ZERO_IMM",
232 [POP(LOAD_IMM)] = "LOAD_IMM",
233 [POP(LOAD_IMM_AS_OBJECT)] = "LOAD_IMM_AS_OBJECT",
234 [POP(LOAD_FALSE_OBJECT)] = "LOAD_FALSE_OBJECT",
235 [POP(LOAD_TRUE_OBJECT)] = "LOAD_TRUE_OBJECT",
236 [POP(TRUNCATE_NUMBER)] = "TRUNCATE_NUMBER",
237 [POP(TYPECHECK)] = "TYPECHECK",
238 [POP(INSTALL_NAMESPACE_NODE)] = "INSTALL_NAMESPACE_NODE",
239 [POP(OBJECT_TRANSFER_TO_PREV)] = "OBJECT_TRANSFER_TO_PREV",
240 [POP(OBJECT_COPY_TO_PREV)] = "OBJECT_COPY_TO_PREV",
241 [POP(STORE_TO_TARGET)] = "STORE_TO_TARGET",
242 [POP(STORE_TO_TARGET_INDIRECT)] = "STORE_TO_TARGET_INDIRECT",
243 [POP(UNREACHABLE)] = "UNREACHABLE",
244 [POP(BAD_OPCODE)] = "BAD_OPCODE",
245 [POP(AML_PC_DECREMENT)] = "AML_PC_DECREMENT",
246 [POP(IMM_DECREMENT)] = "IMM_DECREMENT",
247 [POP(ITEM_POP)] = "ITEM_POP",
248 [POP(DISPATCH_METHOD_CALL)] = "DISPATCH_METHOD_CALL",
249 [POP(DISPATCH_TABLE_LOAD)] = "DISPATCH_TABLE_LOAD",
250 [POP(CONVERT_NAMESTRING)] = "CONVERT_NAMESTRING",
251 [POP(IF_HAS_DATA)] = "IF_HAS_DATA",
252 [POP(IF_NULL)] = "IF_NULL",
253 [POP(IF_LAST_NULL)] = "IF_LAST_NULL",
254 [POP(IF_NOT_NULL)] = "IF_NOT_NULL",
255 [POP(IF_LAST_NOT_NULL)] = "IF_NOT_NULL",
256 [POP(IF_LAST_EQUALS)] = "IF_LAST_EQUALS",
257 [POP(IF_LAST_FALSE)] = "IF_LAST_FALSE",
258 [POP(IF_LAST_TRUE)] = "IF_LAST_TRUE",
259 [POP(SWITCH_TO_NEXT_IF_EQUALS)] = "SWITCH_TO_NEXT_IF_EQUALS",
260 [POP(IF_SWITCHED_FROM)] = "IF_SWITCHED_FROM",
261 [POP(JMP)] = "JMP",
262};
263
265{
267 return "<INVALID-OP>";
268
269 return pop_names[op];
270}
271
272#endif // !UACPI_BAREBONES_MODE
UINT op
Definition: effect.c:236
uacpi_parse_op
Definition: opcodes.h:18
@ UACPI_PARSE_OP_OPERAND
Definition: opcodes.h:55
@ UACPI_PARSE_OP_END
Definition: opcodes.h:19
@ UACPI_PARSE_OP_STORE_TO_TARGET_INDIRECT
Definition: opcodes.h:176
@ UACPI_PARSE_OP_TRACKED_PKGLEN
Definition: opcodes.h:77
@ UACPI_PARSE_OP_LOAD_TRUE_OBJECT
Definition: opcodes.h:147
@ UACPI_PARSE_OP_EXISTING_NAMESTRING
Definition: opcodes.h:95
@ UACPI_PARSE_OP_INVOKE_HANDLER
Definition: opcodes.h:110
@ UACPI_PARSE_OP_DISPATCH_TABLE_LOAD
Definition: opcodes.h:205
@ UACPI_PARSE_OP_TERM_ARG_UNWRAP_INTERNAL
Definition: opcodes.h:40
@ UACPI_PARSE_OP_JMP
Definition: opcodes.h:271
@ UACPI_PARSE_OP_MAX
Definition: opcodes.h:272
@ UACPI_PARSE_OP_OBJECT_TRANSFER_TO_PREV
Definition: opcodes.h:159
@ UACPI_PARSE_OP_IF_NULL
Definition: opcodes.h:224
@ UACPI_PARSE_OP_STRING
Definition: opcodes.h:58
@ UACPI_PARSE_OP_LOAD_IMM
Definition: opcodes.h:140
@ UACPI_PARSE_OP_STORE_TO_TARGET
Definition: opcodes.h:170
@ UACPI_PARSE_OP_TARGET
Definition: opcodes.h:67
@ UACPI_PARSE_OP_IF_NOT_NULL
Definition: opcodes.h:233
@ UACPI_PARSE_OP_LOAD_FALSE_OBJECT
Definition: opcodes.h:146
@ UACPI_PARSE_OP_OBJECT_ALLOC_TYPED
Definition: opcodes.h:125
@ UACPI_PARSE_OP_LOAD_ZERO_IMM
Definition: opcodes.h:137
@ UACPI_PARSE_OP_IMM_DECREMENT
Definition: opcodes.h:192
@ UACPI_PARSE_OP_LOAD_INLINE_IMM
Definition: opcodes.h:134
#define UACPI_ENUMERATE_EXT_OPCODES
Definition: opcodes.h:1154
uacpi_aml_op
Definition: opcodes.h:1383
#define UACPI_ENUMERATE_OPCODES
Definition: opcodes.h:498
#define uacpi_unlikely(expr)
Definition: compiler.h:58
char uacpi_char
Definition: types.h:44
uint8_t uacpi_u8
Definition: types.h:19
@ UACPI_OBJECT_METHOD
Definition: types.h:113
static const uacpi_char *const pop_names[UACPI_PARSE_OP_MAX+1]
Definition: opcodes.c:196
uacpi_u8 uacpi_load_table_op_decode_ops[]
Definition: opcodes.c:149
const uacpi_char * uacpi_parse_op_to_string(enum uacpi_parse_op op)
Definition: opcodes.c:260
static const uacpi_u8 ext_op_to_idx[0x100]
Definition: opcodes.c:26
uacpi_u8 uacpi_load_op_decode_ops[]
Definition: opcodes.c:119
static const struct uacpi_op_spec ext_opcode_table[]
Definition: opcodes.c:20
#define _(op)
Definition: opcodes.c:24
uacpi_u8 uacpi_bank_field_op_decode_ops[]
Definition: opcodes.c:102
uacpi_u8 uacpi_field_op_decode_ops[]
Definition: opcodes.c:95
#define PARSE_FIELD_ELEMENTS(parse_loop_pc)
Definition: opcodes.c:52
static const struct uacpi_op_spec opcode_table[0x100]
Definition: opcodes.c:16
const struct uacpi_op_spec * uacpi_get_op_spec(uacpi_aml_op op)
Definition: opcodes.c:44
uacpi_u8 uacpi_index_field_op_decode_ops[]
Definition: opcodes.c:111
#define POP(x)
Definition: opcodes.c:193
#define END()
Definition: resources.c:584
std::wstring STRING
Definition: fontsub.cpp:33
#define TARGET
Definition: loadlib.c:36
#define UNREACHABLE