ACPI AML decompiler w/ CFG recovery and structured pseudocode
1#include "op.h"
2
3#include <stddef.h>
4
5static const tobi_op ops[] = {
6 {0x00, "ZeroOp", TOBI_OP_SIMPLE, 0},
7 {0x01, "OneOp", TOBI_OP_SIMPLE, 0},
8 {0x06, "AliasOp", TOBI_OP_NAMED, 0},
9 {0x08, "NameOp", TOBI_OP_NAMED, 0},
10 {0x0a, "ByteConst", TOBI_OP_SIMPLE, 0},
11 {0x0b, "WordConst", TOBI_OP_SIMPLE, 0},
12 {0x0c, "DWordConst", TOBI_OP_SIMPLE, 0},
13 {0x0d, "StringConst", TOBI_OP_SIMPLE, 0},
14 {0x0e, "QWordConst", TOBI_OP_SIMPLE, 0},
15 {0x10, "ScopeOp", TOBI_OP_PKG, 1},
16 {0x11, "BufferOp", TOBI_OP_PKG, 1},
17 {0x12, "PackageOp", TOBI_OP_PKG, 1},
18 {0x13, "VarPackageOp", TOBI_OP_PKG, 1},
19 {0x14, "MethodOp", TOBI_OP_PKG, 1},
20 {0x15, "ExternalOp", TOBI_OP_NAMED, 0},
21 {0x2e, "DualNamePrefix", TOBI_OP_NAMED, 0},
22 {0x2f, "MultiNamePrefix", TOBI_OP_NAMED, 0},
23 {0x5b, "ExtOpPrefix", TOBI_OP_EXT, 0},
24 {0x60, "Local0", TOBI_OP_SIMPLE, 0},
25 {0x61, "Local1", TOBI_OP_SIMPLE, 0},
26 {0x62, "Local2", TOBI_OP_SIMPLE, 0},
27 {0x63, "Local3", TOBI_OP_SIMPLE, 0},
28 {0x64, "Local4", TOBI_OP_SIMPLE, 0},
29 {0x65, "Local5", TOBI_OP_SIMPLE, 0},
30 {0x66, "Local6", TOBI_OP_SIMPLE, 0},
31 {0x67, "Local7", TOBI_OP_SIMPLE, 0},
32 {0x68, "Arg0", TOBI_OP_SIMPLE, 0},
33 {0x69, "Arg1", TOBI_OP_SIMPLE, 0},
34 {0x6a, "Arg2", TOBI_OP_SIMPLE, 0},
35 {0x6b, "Arg3", TOBI_OP_SIMPLE, 0},
36 {0x6c, "Arg4", TOBI_OP_SIMPLE, 0},
37 {0x6d, "Arg5", TOBI_OP_SIMPLE, 0},
38 {0x6e, "Arg6", TOBI_OP_SIMPLE, 0},
39 {0x70, "StoreOp", TOBI_OP_EXPR, 0},
40 {0x71, "RefOfOp", TOBI_OP_EXPR, 0},
41 {0x72, "AddOp", TOBI_OP_EXPR, 0},
42 {0x73, "ConcatOp", TOBI_OP_EXPR, 0},
43 {0x74, "SubtractOp", TOBI_OP_EXPR, 0},
44 {0x75, "IncrementOp", TOBI_OP_EXPR, 0},
45 {0x76, "DecrementOp", TOBI_OP_EXPR, 0},
46 {0x77, "MultiplyOp", TOBI_OP_EXPR, 0},
47 {0x78, "DivideOp", TOBI_OP_EXPR, 0},
48 {0x79, "ShiftLeftOp", TOBI_OP_EXPR, 0},
49 {0x7a, "ShiftRightOp", TOBI_OP_EXPR, 0},
50 {0x7b, "AndOp", TOBI_OP_EXPR, 0},
51 {0x7c, "NAndOp", TOBI_OP_EXPR, 0},
52 {0x7d, "OrOp", TOBI_OP_EXPR, 0},
53 {0x7e, "NOrOp", TOBI_OP_EXPR, 0},
54 {0x7f, "XorOp", TOBI_OP_EXPR, 0},
55 {0x80, "NotOp", TOBI_OP_EXPR, 0},
56 {0x81, "FindSetLeftBitOp", TOBI_OP_EXPR, 0},
57 {0x82, "FindSetRightBitOp", TOBI_OP_EXPR, 0},
58 {0x83, "DerefOfOp", TOBI_OP_EXPR, 0},
59 {0x84, "ConcatResOp", TOBI_OP_EXPR, 0},
60 {0x85, "ModOp", TOBI_OP_EXPR, 0},
61 {0x86, "NotifyOp", TOBI_OP_EXPR, 0},
62 {0x87, "SizeOfOp", TOBI_OP_EXPR, 0},
63 {0x88, "IndexOp", TOBI_OP_EXPR, 0},
64 {0x89, "MatchOp", TOBI_OP_EXPR, 0},
65 {0x8a, "CreateDWordFieldOp", TOBI_OP_EXPR, 0},
66 {0x8b, "CreateWordFieldOp", TOBI_OP_EXPR, 0},
67 {0x8c, "CreateByteFieldOp", TOBI_OP_EXPR, 0},
68 {0x8d, "CreateBitFieldOp", TOBI_OP_EXPR, 0},
69 {0x8e, "ObjectTypeOp", TOBI_OP_EXPR, 0},
70 {0x8f, "CreateQWordFieldOp", TOBI_OP_EXPR, 0},
71 {0x90, "LAndOp", TOBI_OP_EXPR, 0},
72 {0x91, "LOrOp", TOBI_OP_EXPR, 0},
73 {0x92, "LNotOp", TOBI_OP_EXPR, 0},
74 {0x93, "LEqualOp", TOBI_OP_EXPR, 0},
75 {0x94, "LGreaterOp", TOBI_OP_EXPR, 0},
76 {0x95, "LLessOp", TOBI_OP_EXPR, 0},
77 {0x96, "ToBufferOp", TOBI_OP_EXPR, 0},
78 {0x97, "ToDecimalStringOp", TOBI_OP_EXPR, 0},
79 {0x98, "ToHexStringOp", TOBI_OP_EXPR, 0},
80 {0x99, "ToIntegerOp", TOBI_OP_EXPR, 0},
81 {0x9c, "ToStringOp", TOBI_OP_EXPR, 0},
82 {0x9d, "CopyObjectOp", TOBI_OP_EXPR, 0},
83 {0x9e, "MidOp", TOBI_OP_EXPR, 0},
84 {0x9f, "ContinueOp", TOBI_OP_CONTROL, 0},
85 {0xa0, "IfOp", TOBI_OP_CONTROL, 1},
86 {0xa1, "ElseOp", TOBI_OP_CONTROL, 1},
87 {0xa2, "WhileOp", TOBI_OP_CONTROL, 1},
88 {0xa3, "NoopOp", TOBI_OP_CONTROL, 0},
89 {0xa4, "ReturnOp", TOBI_OP_CONTROL, 0},
90 {0xa5, "BreakOp", TOBI_OP_CONTROL, 0},
91 {0xcc, "BreakPointOp", TOBI_OP_CONTROL, 0},
92 {0xff, "OnesOp", TOBI_OP_SIMPLE, 0},
93};
94
95static const tobi_op ext_ops[] = {
96 {0x5b01, "MutexOp", TOBI_OP_EXT, 0},
97 {0x5b02, "EventOp", TOBI_OP_EXT, 0},
98 {0x5b12, "CondRefOfOp", TOBI_OP_EXT, 0},
99 {0x5b13, "CreateFieldOp", TOBI_OP_EXT, 0},
100 {0x5b1f, "LoadTableOp", TOBI_OP_EXT, 0},
101 {0x5b20, "LoadOp", TOBI_OP_EXT, 0},
102 {0x5b21, "StallOp", TOBI_OP_EXT, 0},
103 {0x5b22, "SleepOp", TOBI_OP_EXT, 0},
104 {0x5b23, "AcquireOp", TOBI_OP_EXT, 0},
105 {0x5b24, "SignalOp", TOBI_OP_EXT, 0},
106 {0x5b25, "WaitOp", TOBI_OP_EXT, 0},
107 {0x5b26, "ResetOp", TOBI_OP_EXT, 0},
108 {0x5b27, "ReleaseOp", TOBI_OP_EXT, 0},
109 {0x5b28, "FromBCDOp", TOBI_OP_EXT, 0},
110 {0x5b29, "ToBCDOp", TOBI_OP_EXT, 0},
111 {0x5b2a, "UnloadOp", TOBI_OP_EXT, 0},
112 {0x5b30, "RevisionOp", TOBI_OP_EXT, 0},
113 {0x5b31, "DebugOp", TOBI_OP_EXT, 0},
114 {0x5b32, "FatalOp", TOBI_OP_EXT, 0},
115 {0x5b33, "TimerOp", TOBI_OP_EXT, 0},
116 {0x5b80, "OpRegionOp", TOBI_OP_EXT, 0},
117 {0x5b81, "FieldOp", TOBI_OP_EXT, 1},
118 {0x5b82, "DeviceOp", TOBI_OP_EXT, 1},
119 {0x5b83, "ProcessorOp", TOBI_OP_EXT, 1},
120 {0x5b84, "PowerResOp", TOBI_OP_EXT, 1},
121 {0x5b85, "ThermalZoneOp", TOBI_OP_EXT, 1},
122 {0x5b86, "IndexFieldOp", TOBI_OP_EXT, 1},
123 {0x5b87, "BankFieldOp", TOBI_OP_EXT, 1},
124 {0x5b88, "DataRegionOp", TOBI_OP_EXT, 0},
125};
126
127static const tobi_op_desc descs[] = {
128 {0x06, "NameString NameString"},
129 {0x08, "NameString DataRef"},
130 {0x0a, "ByteData"},
131 {0x0b, "WordData"},
132 {0x0c, "DWordData"},
133 {0x0d, "StringData"},
134 {0x0e, "QWordData"},
135 {0x10, "PkgLength NameString TermList"},
136 {0x11, "PkgLength BufferSize ByteList"},
137 {0x12, "PkgLength NumElements PackageElements"},
138 {0x13, "PkgLength VarNumElements PackageElements"},
139 {0x14, "PkgLength NameString MethodFlags TermList"},
140 {0x15, "NameString ObjectType ArgumentCount"},
141 {0x70, "TermArg SuperName"},
142 {0x71, "SuperName"},
143 {0x72, "TermArg TermArg Target"},
144 {0x73, "Data TermArg Target"},
145 {0x74, "TermArg TermArg Target"},
146 {0x75, "SuperName"},
147 {0x76, "SuperName"},
148 {0x77, "TermArg TermArg Target"},
149 {0x78, "TermArg TermArg Target RemainderTarget"},
150 {0x79, "TermArg TermArg Target"},
151 {0x7a, "TermArg TermArg Target"},
152 {0x7b, "TermArg TermArg Target"},
153 {0x7c, "TermArg TermArg Target"},
154 {0x7d, "TermArg TermArg Target"},
155 {0x7e, "TermArg TermArg Target"},
156 {0x7f, "TermArg TermArg Target"},
157 {0x80, "TermArg Target"},
158 {0x81, "TermArg Target"},
159 {0x82, "TermArg Target"},
160 {0x83, "TermArg"},
161 {0x84, "Data Buffer Target"},
162 {0x85, "TermArg TermArg Target"},
163 {0x86, "SuperName TermArg"},
164 {0x87, "SuperName"},
165 {0x88, "SuperName TermArg Target"},
166 {0x89, "SearchPkg MatchOp1 MatchObj1 MatchOp2 MatchObj2 StartIndex"},
167 {0x8a, "SourceBuff BitIndex NameString"},
168 {0x8b, "SourceBuff BitIndex NameString"},
169 {0x8c, "SourceBuff ByteIndex NameString"},
170 {0x8d, "SourceBuff BitIndex NameString"},
171 {0x8e, "SuperName"},
172 {0x8f, "SourceBuff BitIndex NameString"},
173 {0x90, "TermArg TermArg"},
174 {0x91, "TermArg TermArg"},
175 {0x92, "TermArg"},
176 {0x93, "TermArg TermArg"},
177 {0x94, "TermArg TermArg"},
178 {0x95, "TermArg TermArg"},
179 {0x96, "TermArg Target"},
180 {0x97, "TermArg Target"},
181 {0x98, "TermArg Target"},
182 {0x99, "TermArg Target"},
183 {0x9c, "TermArg LengthArg Target"},
184 {0x9d, "SimpleName Target"},
185 {0x9e, "TermArg TermArg TermArg Target"},
186 {0x9f, ""},
187 {0xa0, "PkgLength Predicate TermList"},
188 {0xa1, "PkgLength TermList"},
189 {0xa2, "PkgLength Predicate TermList"},
190 {0xa4, "TermArg"},
191 {0xa5, ""},
192 {0x5b01, "NameString SyncFlags"},
193 {0x5b02, "NameString"},
194 {0x5b12, "SuperName Target"},
195 {0x5b13, "SourceBuff BitIndex NumBits NameString"},
196 {0x5b1f, "Signature OemId OemTableId RootPath ParameterPath Target"},
197 {0x5b20, "NameString Target"},
198 {0x5b21, "TermArg"},
199 {0x5b22, "TermArg"},
200 {0x5b23, "MutexObject Timeout"},
201 {0x5b24, "EventObject"},
202 {0x5b25, "EventObject Timeout"},
203 {0x5b26, "EventObject"},
204 {0x5b27, "MutexObject"},
205 {0x5b28, "TermArg Target"},
206 {0x5b29, "TermArg Target"},
207 {0x5b2a, "Handle"},
208 {0x5b30, ""},
209 {0x5b31, ""},
210 {0x5b32, "FatalType FatalCode FatalArg"},
211 {0x5b33, ""},
212 {0x5b80, "NameString RegionSpace RegionOffset RegionLen"},
213 {0x5b81, "PkgLength NameString FieldFlags FieldList"},
214 {0x5b82, "PkgLength NameString TermList"},
215 {0x5b83, "PkgLength NameString ProcId PblkAddr PblkLen TermList"},
216 {0x5b84, "PkgLength NameString SystemLevel ResourceOrder TermList"},
217 {0x5b85, "PkgLength NameString TermList"},
218 {0x5b86, "PkgLength IndexName DataName FieldFlags FieldList"},
219 {0x5b87, "PkgLength RegionName BankName BankValue FieldFlags FieldList"},
220 {0x5b88, "NameString SignatureString OemIdString OemTableIdString"},
221};
222
223const tobi_op *tobi_op_find(uint8_t op) {
224 for (size_t i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) {
225 if (ops[i].code == op) {
226 return &ops[i];
227 }
228 }
229 return NULL;
230}
231
232const tobi_op *tobi_op_find_ext(uint8_t ext) {
233 uint16_t code = (uint16_t)(0x5b00u | ext);
234 return tobi_op_find_code(code);
235}
236
237const tobi_op *tobi_op_find_code(uint16_t code) {
238 if ((code & 0xff00u) == 0x5b00u) {
239 for (size_t i = 0; i < sizeof(ext_ops) / sizeof(ext_ops[0]); i++) {
240 if (ext_ops[i].code == code) {
241 return &ext_ops[i];
242 }
243 }
244 return NULL;
245 }
246 return tobi_op_find((uint8_t)code);
247}
248
249const char *tobi_op_operands(uint16_t code) {
250 for (size_t i = 0; i < sizeof(descs) / sizeof(descs[0]); i++) {
251 if (descs[i].code == code) {
252 return descs[i].operands;
253 }
254 }
255 return NULL;
256}