]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbDisasm.c
MdeModulePkg/EbcDxe: Add comments for functions
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbDisasm.c
CommitLineData
e8a5ac7c 1/** @file\r
748edcd5 2\r
e8a5ac7c
DB
3Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials\r
748edcd5
PB
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
748edcd5 12\r
e8a5ac7c 13**/\r
748edcd5
PB
14\r
15#include "Edb.h"\r
16\r
17//\r
18// Debugger Disasm definition\r
19//\r
20#define EDB_DISASM_DEFINE(func) \\r
21UINTN \\r
22func ( \\r
23 IN EFI_PHYSICAL_ADDRESS InstructionAddress, \\r
24 IN EFI_SYSTEM_CONTEXT SystemContext, \\r
25 OUT CHAR16 **DisasmString \\r
26 )\r
27\r
28EDB_DISASM_DEFINE (EdbDisasmBREAK);\r
29EDB_DISASM_DEFINE (EdbDisasmJMP);\r
30EDB_DISASM_DEFINE (EdbDisasmJMP8);\r
31EDB_DISASM_DEFINE (EdbDisasmCALL);\r
32EDB_DISASM_DEFINE (EdbDisasmRET);\r
33EDB_DISASM_DEFINE (EdbDisasmCMP);\r
34EDB_DISASM_DEFINE (EdbDisasmUnsignedDataManip);\r
35EDB_DISASM_DEFINE (EdbDisasmSignedDataManip);\r
36EDB_DISASM_DEFINE (EdbDisasmMOVxx);\r
37EDB_DISASM_DEFINE (EdbDisasmMOVsnw);\r
38EDB_DISASM_DEFINE (EdbDisasmMOVsnd);\r
39EDB_DISASM_DEFINE (EdbDisasmLOADSP);\r
40EDB_DISASM_DEFINE (EdbDisasmSTORESP);\r
41EDB_DISASM_DEFINE (EdbDisasmPUSH);\r
42EDB_DISASM_DEFINE (EdbDisasmPOP);\r
43EDB_DISASM_DEFINE (EdbDisasmCMPI);\r
44EDB_DISASM_DEFINE (EdbDisasmPUSHn);\r
45EDB_DISASM_DEFINE (EdbDisasmPOPn);\r
46EDB_DISASM_DEFINE (EdbDisasmMOVI);\r
47EDB_DISASM_DEFINE (EdbDisasmMOVIn);\r
48EDB_DISASM_DEFINE (EdbDisasmMOVREL);\r
49\r
50//\r
51// Debugger Disasm Table\r
52//\r
53EDB_DISASM_INSTRUCTION mEdbDisasmInstructionTable[] = {\r
54 EdbDisasmBREAK, // opcode 0x00 BREAK\r
55 EdbDisasmJMP, // opcode 0x01 JMP\r
56 EdbDisasmJMP8, // opcode 0x02 JMP8\r
57 EdbDisasmCALL, // opcode 0x03 CALL\r
58 EdbDisasmRET, // opcode 0x04 RET\r
59 EdbDisasmCMP, // opcode 0x05 CMPEQ\r
60 EdbDisasmCMP, // opcode 0x06 CMPLTE\r
61 EdbDisasmCMP, // opcode 0x07 CMPGTE\r
62 EdbDisasmCMP, // opcode 0x08 CMPULTE\r
63 EdbDisasmCMP, // opcode 0x09 CMPUGTE\r
64 EdbDisasmUnsignedDataManip, // opcode 0x0A NOT\r
65 EdbDisasmSignedDataManip, // opcode 0x0B NEG\r
66 EdbDisasmSignedDataManip, // opcode 0x0C ADD\r
67 EdbDisasmSignedDataManip, // opcode 0x0D SUB\r
68 EdbDisasmSignedDataManip, // opcode 0x0E MUL\r
69 EdbDisasmUnsignedDataManip, // opcode 0x0F MULU\r
70 EdbDisasmSignedDataManip, // opcode 0x10 DIV\r
71 EdbDisasmUnsignedDataManip, // opcode 0x11 DIVU\r
72 EdbDisasmSignedDataManip, // opcode 0x12 MOD\r
73 EdbDisasmUnsignedDataManip, // opcode 0x13 MODU\r
74 EdbDisasmUnsignedDataManip, // opcode 0x14 AND\r
75 EdbDisasmUnsignedDataManip, // opcode 0x15 OR\r
76 EdbDisasmUnsignedDataManip, // opcode 0x16 XOR\r
77 EdbDisasmUnsignedDataManip, // opcode 0x17 SHL\r
78 EdbDisasmUnsignedDataManip, // opcode 0x18 SHR\r
79 EdbDisasmSignedDataManip, // opcode 0x19 ASHR\r
80 EdbDisasmUnsignedDataManip, // opcode 0x1A EXTNDB\r
81 EdbDisasmUnsignedDataManip, // opcode 0x1B EXTNDW\r
82 EdbDisasmUnsignedDataManip, // opcode 0x1C EXTNDD\r
83 EdbDisasmMOVxx, // opcode 0x1D MOVBW\r
84 EdbDisasmMOVxx, // opcode 0x1E MOVWW\r
85 EdbDisasmMOVxx, // opcode 0x1F MOVDW\r
86 EdbDisasmMOVxx, // opcode 0x20 MOVQW\r
87 EdbDisasmMOVxx, // opcode 0x21 MOVBD\r
88 EdbDisasmMOVxx, // opcode 0x22 MOVWD\r
89 EdbDisasmMOVxx, // opcode 0x23 MOVDD\r
90 EdbDisasmMOVxx, // opcode 0x24 MOVQD\r
91 EdbDisasmMOVsnw, // opcode 0x25 MOVSNW\r
92 EdbDisasmMOVsnd, // opcode 0x26 MOVSND\r
93 NULL, // opcode 0x27\r
94 EdbDisasmMOVxx, // opcode 0x28 MOVQQ\r
95 EdbDisasmLOADSP, // opcode 0x29 LOADSP\r
96 EdbDisasmSTORESP, // opcode 0x2A STORESP\r
97 EdbDisasmPUSH, // opcode 0x2B PUSH\r
98 EdbDisasmPOP, // opcode 0x2C POP\r
99 EdbDisasmCMPI, // opcode 0x2D CMPIEQ\r
100 EdbDisasmCMPI, // opcode 0x2E CMPILTE\r
101 EdbDisasmCMPI, // opcode 0x2F CMPIGTE\r
102 EdbDisasmCMPI, // opcode 0x30 CMPIULTE\r
103 EdbDisasmCMPI, // opcode 0x31 CMPIUGTE\r
104 EdbDisasmMOVxx, // opcode 0x32 MOVNW\r
105 EdbDisasmMOVxx, // opcode 0x33 MOVND\r
106 NULL, // opcode 0x34\r
107 EdbDisasmPUSHn, // opcode 0x35 PUSHN\r
108 EdbDisasmPOPn, // opcode 0x36 POPN\r
109 EdbDisasmMOVI, // opcode 0x37 MOVI\r
110 EdbDisasmMOVIn, // opcode 0x38 MOVIN\r
111 EdbDisasmMOVREL, // opcode 0x39 MOVREL\r
112};\r
113\r
e8a5ac7c
DB
114/**\r
115\r
116 Disasm instruction - BREAK.\r
117\r
118 @param InstructionAddress - The instruction address\r
119 @param SystemContext - EBC system context.\r
120 @param DisasmString - The instruction string\r
121\r
122 @return Instruction length\r
123\r
124**/\r
748edcd5
PB
125UINTN\r
126EdbDisasmBREAK (\r
127 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
128 IN EFI_SYSTEM_CONTEXT SystemContext,\r
129 OUT CHAR16 **DisasmString\r
130 )\r
748edcd5
PB
131{\r
132 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_BREAK);\r
133\r
134 if (*(UINT8 *)(UINTN)(InstructionAddress + 1) > 6) {\r
135 return 0;\r
136 }\r
137\r
138 //\r
139 // Construct Disasm String\r
140 //\r
141 if (DisasmString != NULL) {\r
142 *DisasmString = EdbPreInstructionString ();\r
143\r
144 EdbPrintInstructionName (L"BREAK");\r
145 EdbPrintDatan (*(UINT8 *)(UINTN)(InstructionAddress + 1));\r
146\r
147 EdbPostInstructionString ();\r
148 }\r
149\r
150 return 2;\r
151}\r
152\r
153extern CONST UINT8 mJMPLen[];\r
154\r
e8a5ac7c
DB
155/**\r
156\r
157 Disasm instruction - JMP.\r
158\r
159 @param InstructionAddress - The instruction address\r
160 @param SystemContext - EBC system context.\r
161 @param DisasmString - The instruction string\r
162\r
163 @return Instruction length\r
164\r
165**/\r
748edcd5
PB
166UINTN\r
167EdbDisasmJMP (\r
168 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
169 IN EFI_SYSTEM_CONTEXT SystemContext,\r
170 OUT CHAR16 **DisasmString\r
171 )\r
748edcd5
PB
172{\r
173 UINT8 Modifiers;\r
174 UINT8 Operands;\r
175 UINTN Size;\r
176 UINT32 Data32;\r
177 UINT64 Data64;\r
178\r
179 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_JMP);\r
180\r
181 Modifiers = GET_MODIFIERS (InstructionAddress);\r
182 Operands = GET_OPERANDS (InstructionAddress);\r
183 Size = (UINTN)mJMPLen[(Modifiers >> 6) & 0x03];\r
184\r
185 //\r
186 // Construct Disasm String\r
187 //\r
188 if (DisasmString != NULL) {\r
189 *DisasmString = EdbPreInstructionString ();\r
190\r
191 EdbPrintInstructionName (L"JMP");\r
192// if (Modifiers & OPCODE_M_IMMDATA64) {\r
193// EdbPrintInstructionName (L"64");\r
194// } else {\r
195// EdbPrintInstructionName (L"32");\r
196// }\r
532daaed
DB
197 if ((Modifiers & CONDITION_M_CONDITIONAL) != 0) {\r
198 if ((Modifiers & JMP_M_CS) != 0) {\r
748edcd5
PB
199 EdbPrintInstructionName (L"cs");\r
200 } else {\r
201 EdbPrintInstructionName (L"cc");\r
202 }\r
203 }\r
204\r
205 InstructionAddress += 2;\r
532daaed 206 if ((Modifiers & OPCODE_M_IMMDATA64) != 0) {\r
748edcd5 207 CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
532daaed 208 if ((Modifiers & OPCODE_M_IMMDATA) != 0) {\r
748edcd5
PB
209 EdbPrintData64 (Data64);\r
210 } else {\r
211 return 0;\r
212 }\r
213 } else {\r
214 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
215 EdbPrintRegister1 (Operands);\r
216\r
217 if ((Operands & OPERAND_M_INDIRECT1) == 0) {\r
218 if ((Modifiers & OPCODE_M_IMMDATA) == 0) {\r
219 Data32 = 0;\r
220 }\r
221 EdbPrintImmDatan (Data32);\r
222 } else {\r
223 EdbPrintRawIndexData32 (Data32);\r
224 }\r
225 }\r
226\r
227 EdbPostInstructionString ();\r
228 }\r
229\r
230 return Size;\r
231}\r
232\r
e8a5ac7c
DB
233/**\r
234\r
235 Disasm instruction - JMP8.\r
236\r
237 @param InstructionAddress - The instruction address\r
238 @param SystemContext - EBC system context.\r
239 @param DisasmString - The instruction string\r
240\r
241 @return Instruction length\r
242\r
243**/\r
748edcd5
PB
244UINTN\r
245EdbDisasmJMP8 (\r
246 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
247 IN EFI_SYSTEM_CONTEXT SystemContext,\r
248 OUT CHAR16 **DisasmString\r
249 )\r
748edcd5
PB
250{\r
251 UINT8 Modifiers;\r
252\r
253 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_JMP8);\r
254 Modifiers = GET_MODIFIERS (InstructionAddress);\r
255\r
256 //\r
257 // Construct Disasm String\r
258 //\r
259 if (DisasmString != NULL) {\r
260 *DisasmString = EdbPreInstructionString ();\r
261\r
262 EdbPrintInstructionName (L"JMP8");\r
532daaed
DB
263 if ((Modifiers & CONDITION_M_CONDITIONAL) != 0) {\r
264 if ((Modifiers & JMP_M_CS) != 0) {\r
748edcd5
PB
265 EdbPrintInstructionName (L"cs");\r
266 } else {\r
267 EdbPrintInstructionName (L"cc");\r
268 }\r
269 }\r
270\r
271 EdbPrintData8 (*(UINT8 *)(UINTN)(InstructionAddress + 1));\r
272\r
273 EdbPostInstructionString ();\r
274 }\r
275\r
276 return 2;\r
277}\r
278\r
e8a5ac7c
DB
279/**\r
280\r
281 Disasm instruction - CALL.\r
282\r
283 @param InstructionAddress - The instruction address\r
284 @param SystemContext - EBC system context.\r
285 @param DisasmString - The instruction string\r
286\r
287 @return Instruction length\r
288\r
289**/\r
748edcd5
PB
290UINTN\r
291EdbDisasmCALL (\r
292 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
293 IN EFI_SYSTEM_CONTEXT SystemContext,\r
294 OUT CHAR16 **DisasmString\r
295 )\r
748edcd5
PB
296{\r
297 UINT8 Modifiers;\r
298 UINT8 Operands;\r
299 UINTN Size;\r
300 UINT32 Data32;\r
301 UINT64 Data64;\r
302 UINT64 Ip;\r
303 UINTN Result;\r
304 EFI_PHYSICAL_ADDRESS SavedInstructionAddress;\r
305\r
306 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_CALL);\r
307 SavedInstructionAddress = InstructionAddress;\r
308\r
309 Modifiers = GET_MODIFIERS (InstructionAddress);\r
310 Operands = GET_OPERANDS (InstructionAddress);\r
311 Size = (UINTN)mJMPLen[(Modifiers >> 6) & 0x03];\r
312\r
313 //\r
314 // Construct Disasm String\r
315 //\r
316 if (DisasmString != NULL) {\r
317 *DisasmString = EdbPreInstructionString ();\r
318\r
319 EdbPrintInstructionName (L"CALL");\r
320// if (Modifiers & OPCODE_M_IMMDATA64) {\r
321// EdbPrintInstructionName (L"64");\r
322// } else {\r
323// EdbPrintInstructionName (L"32");\r
324// }\r
532daaed 325 if ((Operands & OPERAND_M_NATIVE_CALL) != 0) {\r
748edcd5
PB
326 EdbPrintInstructionName (L"EX");\r
327 }\r
328// if ((Operands & OPERAND_M_RELATIVE_ADDR) == 0) {\r
329// EdbPrintInstructionName (L"a");\r
330// }\r
331\r
332 InstructionAddress += 2;\r
532daaed 333 if ((Modifiers & OPCODE_M_IMMDATA64) != 0) {\r
748edcd5
PB
334 CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
335 Ip = Data64;\r
532daaed 336 if ((Modifiers & OPCODE_M_IMMDATA) != 0) {\r
748edcd5
PB
337 Result = EdbFindAndPrintSymbol ((UINTN)Ip);\r
338 if (Result == 0) {\r
339 EdbPrintData64 (Data64);\r
340 }\r
341 } else {\r
342 return 0;\r
343 }\r
344 } else {\r
532daaed 345 if ((Modifiers & OPCODE_M_IMMDATA) != 0) {\r
748edcd5
PB
346 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
347 } else {\r
348 Data32 = 0;\r
349 }\r
350\r
351 if ((Operands & OPERAND_M_OP1) == 0) {\r
352 Ip = (UINT64)Data32;\r
353 } else {\r
354 Ip = GetRegisterValue (SystemContext, (Operands & OPERAND_M_OP1));\r
355 }\r
356\r
357 if ((Operands & OPERAND_M_INDIRECT1) == 0) {\r
532daaed 358 if ((Operands & OPERAND_M_RELATIVE_ADDR) != 0) {\r
748edcd5
PB
359 Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Ip + Size));\r
360 } else {\r
361 Result = EdbFindAndPrintSymbol ((UINTN)Ip);\r
362 }\r
363 if (Result == 0) {\r
364 EdbPrintRegister1 (Operands);\r
532daaed 365 if ((Modifiers & OPCODE_M_IMMDATA) != 0) {\r
748edcd5
PB
366 EdbPrintImmData32 (Data32);\r
367 }\r
368 }\r
369 } else {\r
370 EdbPrintRegister1 (Operands);\r
532daaed 371 if ((Modifiers & OPCODE_M_IMMDATA) != 0) {\r
748edcd5
PB
372 EdbPrintRawIndexData32 (Data32);\r
373 }\r
374 }\r
375 }\r
376\r
377 EdbPostInstructionString ();\r
378 }\r
379\r
380 return Size;\r
381}\r
382\r
e8a5ac7c
DB
383/**\r
384\r
385 Disasm instruction - RET.\r
386\r
387 @param InstructionAddress - The instruction address\r
388 @param SystemContext - EBC system context.\r
389 @param DisasmString - The instruction string\r
390\r
391 @return Instruction length\r
392\r
393**/\r
748edcd5
PB
394UINTN\r
395EdbDisasmRET (\r
396 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
397 IN EFI_SYSTEM_CONTEXT SystemContext,\r
398 OUT CHAR16 **DisasmString\r
399 )\r
748edcd5
PB
400{\r
401 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_RET);\r
402\r
403 if (*(UINT8 *)(UINTN)(InstructionAddress + 1) != 0) {\r
404 return 0;\r
405 }\r
406\r
407 //\r
408 // Construct Disasm String\r
409 //\r
410 if (DisasmString != NULL) {\r
411 *DisasmString = EdbPreInstructionString ();\r
412\r
413 EdbPrintInstructionName (L"RET");\r
414\r
415 EdbPostInstructionString ();\r
416 }\r
417\r
418 return 2;\r
419}\r
420\r
e8a5ac7c
DB
421/**\r
422\r
423 Disasm instruction - CMP.\r
424\r
425 @param InstructionAddress - The instruction address\r
426 @param SystemContext - EBC system context.\r
427 @param DisasmString - The instruction string\r
428\r
429 @return Instruction length\r
430\r
431**/\r
748edcd5
PB
432UINTN\r
433EdbDisasmCMP (\r
434 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
435 IN EFI_SYSTEM_CONTEXT SystemContext,\r
436 OUT CHAR16 **DisasmString\r
437 )\r
748edcd5
PB
438{\r
439 UINT8 Opcode;\r
440 UINT8 Modifiers;\r
441 UINT8 Operands;\r
442 UINT16 Data16;\r
443 UINTN Size;\r
444\r
445 ASSERT (\r
446 (GET_OPCODE(InstructionAddress) == OPCODE_CMPEQ) ||\r
447 (GET_OPCODE(InstructionAddress) == OPCODE_CMPLTE) ||\r
448 (GET_OPCODE(InstructionAddress) == OPCODE_CMPGTE) ||\r
449 (GET_OPCODE(InstructionAddress) == OPCODE_CMPULTE) ||\r
450 (GET_OPCODE(InstructionAddress) == OPCODE_CMPUGTE)\r
451 );\r
452\r
453 Opcode = GET_OPCODE (InstructionAddress);\r
454 Modifiers = GET_MODIFIERS (InstructionAddress);\r
455 Operands = GET_OPERANDS (InstructionAddress);\r
532daaed 456 if ((Modifiers & OPCODE_M_IMMDATA) != 0) {\r
748edcd5
PB
457 Size = 4;\r
458 } else {\r
459 Size = 2;\r
460 }\r
461\r
462 //\r
463 // Construct Disasm String\r
464 //\r
465 if (DisasmString != NULL) {\r
466 *DisasmString = EdbPreInstructionString ();\r
467\r
468 EdbPrintInstructionName (L"CMP");\r
469// if (Modifiers & OPCODE_M_64BIT) {\r
470// EdbPrintInstructionName (L"64");\r
471// } else {\r
472// EdbPrintInstructionName (L"32");\r
473// }\r
474 switch (Opcode) {\r
475 case OPCODE_CMPEQ:\r
476 EdbPrintInstructionName (L"eq");\r
477 break;\r
478 case OPCODE_CMPLTE:\r
479 EdbPrintInstructionName (L"lte");\r
480 break;\r
481 case OPCODE_CMPGTE:\r
482 EdbPrintInstructionName (L"gte");\r
483 break;\r
484 case OPCODE_CMPULTE:\r
485 EdbPrintInstructionName (L"ulte");\r
486 break;\r
487 case OPCODE_CMPUGTE:\r
488 EdbPrintInstructionName (L"ugte");\r
489 break;\r
490 }\r
491\r
492 EdbPrintRegister1 (Operands);\r
493 InstructionAddress += 2;\r
494\r
495 EdbPrintComma ();\r
496 EdbPrintRegister2 (Operands);\r
497\r
532daaed 498 if ((Modifiers & OPCODE_M_IMMDATA) != 0) {\r
748edcd5 499 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 500 if ((Operands & OPERAND_M_INDIRECT2) != 0) {\r
748edcd5
PB
501 EdbPrintRawIndexData16 (Data16);\r
502 } else {\r
503 EdbPrintImmDatan (Data16);\r
504 }\r
505 }\r
506\r
507 EdbPostInstructionString ();\r
508 }\r
509\r
510 return Size;\r
511}\r
512\r
e8a5ac7c
DB
513/**\r
514\r
515 Disasm instruction - Unsigned Data Manipulate.\r
516\r
517 @param InstructionAddress - The instruction address\r
518 @param SystemContext - EBC system context.\r
519 @param DisasmString - The instruction string\r
520\r
521 @return Instruction length\r
522\r
523**/\r
748edcd5
PB
524UINTN\r
525EdbDisasmUnsignedDataManip (\r
526 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
527 IN EFI_SYSTEM_CONTEXT SystemContext,\r
528 OUT CHAR16 **DisasmString\r
529 )\r
748edcd5
PB
530{\r
531 UINT8 Modifiers;\r
532 UINT8 Opcode;\r
533 UINT8 Operands;\r
534 UINTN Size;\r
535 UINT16 Data16;\r
536\r
537 ASSERT (\r
538 (GET_OPCODE(InstructionAddress) == OPCODE_NOT) ||\r
539 (GET_OPCODE(InstructionAddress) == OPCODE_MULU) ||\r
540 (GET_OPCODE(InstructionAddress) == OPCODE_DIVU) ||\r
541 (GET_OPCODE(InstructionAddress) == OPCODE_MODU) ||\r
542 (GET_OPCODE(InstructionAddress) == OPCODE_AND) ||\r
543 (GET_OPCODE(InstructionAddress) == OPCODE_OR) ||\r
544 (GET_OPCODE(InstructionAddress) == OPCODE_XOR) ||\r
545 (GET_OPCODE(InstructionAddress) == OPCODE_SHL) ||\r
546 (GET_OPCODE(InstructionAddress) == OPCODE_SHR) ||\r
547 (GET_OPCODE(InstructionAddress) == OPCODE_EXTNDB) ||\r
548 (GET_OPCODE(InstructionAddress) == OPCODE_EXTNDW) ||\r
549 (GET_OPCODE(InstructionAddress) == OPCODE_EXTNDD)\r
550 );\r
551\r
552 Opcode = GET_OPCODE (InstructionAddress);\r
553 Operands = GET_OPERANDS (InstructionAddress);\r
554 Modifiers = GET_MODIFIERS (InstructionAddress);\r
532daaed 555 if ((Modifiers & DATAMANIP_M_IMMDATA) != 0) {\r
748edcd5
PB
556 Size = 4;\r
557 } else {\r
558 Size = 2;\r
559 }\r
560\r
561 //\r
562 // Construct Disasm String\r
563 //\r
564 if (DisasmString != NULL) {\r
565 *DisasmString = EdbPreInstructionString ();\r
566\r
567 switch (Opcode) {\r
568 case OPCODE_NOT:\r
569 EdbPrintInstructionName (L"NOT");\r
570 break;\r
571 case OPCODE_MULU:\r
572 EdbPrintInstructionName (L"MULU");\r
573 break;\r
574 case OPCODE_DIVU:\r
575 EdbPrintInstructionName (L"DIVU");\r
576 break;\r
577 case OPCODE_MODU:\r
578 EdbPrintInstructionName (L"MODU");\r
579 break;\r
580 case OPCODE_AND:\r
581 EdbPrintInstructionName (L"AND");\r
582 break;\r
583 case OPCODE_OR:\r
584 EdbPrintInstructionName (L"OR");\r
585 break;\r
586 case OPCODE_XOR:\r
587 EdbPrintInstructionName (L"XOR");\r
588 break;\r
589 case OPCODE_SHL:\r
590 EdbPrintInstructionName (L"SHL");\r
591 break;\r
592 case OPCODE_SHR:\r
593 EdbPrintInstructionName (L"SHR");\r
594 break;\r
595 case OPCODE_EXTNDB:\r
596 EdbPrintInstructionName (L"EXTNDB");\r
597 break;\r
598 case OPCODE_EXTNDW:\r
599 EdbPrintInstructionName (L"EXTNDW");\r
600 break;\r
601 case OPCODE_EXTNDD:\r
602 EdbPrintInstructionName (L"EXTNDD");\r
603 break;\r
604 }\r
605// if (Modifiers & DATAMANIP_M_64) {\r
606// EdbPrintInstructionName (L"64");\r
607// } else {\r
608// EdbPrintInstructionName (L"32");\r
609// }\r
610\r
611 EdbPrintRegister1 (Operands);\r
612 EdbPrintComma ();\r
613 EdbPrintRegister2 (Operands);\r
614\r
615 InstructionAddress += 2;\r
532daaed 616 if ((Modifiers & DATAMANIP_M_IMMDATA) != 0) {\r
748edcd5 617 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 618 if ((Operands & OPERAND_M_INDIRECT2) != 0) {\r
748edcd5
PB
619 EdbPrintRawIndexData16 (Data16);\r
620 } else {\r
621 EdbPrintImmDatan (Data16);\r
622 }\r
623 }\r
624\r
625 EdbPostInstructionString ();\r
626 }\r
627\r
628 return Size;\r
629}\r
630\r
e8a5ac7c
DB
631/**\r
632\r
633 Disasm instruction - Signed Data Manipulate,\r
634\r
635 @param InstructionAddress - The instruction address\r
636 @param SystemContext - EBC system context.\r
637 @param DisasmString - The instruction string\r
638\r
639 @return Instruction length\r
640\r
641**/\r
748edcd5
PB
642UINTN\r
643EdbDisasmSignedDataManip (\r
644 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
645 IN EFI_SYSTEM_CONTEXT SystemContext,\r
646 OUT CHAR16 **DisasmString\r
647 )\r
748edcd5
PB
648{\r
649 UINT8 Modifiers;\r
650 UINT8 Opcode;\r
651 UINT8 Operands;\r
652 UINTN Size;\r
653 UINT16 Data16;\r
654\r
655 ASSERT (\r
656 (GET_OPCODE(InstructionAddress) == OPCODE_NEG) ||\r
657 (GET_OPCODE(InstructionAddress) == OPCODE_ADD) ||\r
658 (GET_OPCODE(InstructionAddress) == OPCODE_SUB) ||\r
659 (GET_OPCODE(InstructionAddress) == OPCODE_MUL) ||\r
660 (GET_OPCODE(InstructionAddress) == OPCODE_DIV) ||\r
661 (GET_OPCODE(InstructionAddress) == OPCODE_MOD) ||\r
662 (GET_OPCODE(InstructionAddress) == OPCODE_ASHR)\r
663 );\r
664\r
665 Opcode = GET_OPCODE (InstructionAddress);\r
666 Operands = GET_OPERANDS (InstructionAddress);\r
667 Modifiers = GET_MODIFIERS (InstructionAddress);\r
532daaed 668 if ((Modifiers & DATAMANIP_M_IMMDATA) != 0) {\r
748edcd5
PB
669 Size = 4;\r
670 } else {\r
671 Size = 2;\r
672 }\r
673\r
674 //\r
675 // Construct Disasm String\r
676 //\r
677 if (DisasmString != NULL) {\r
678 *DisasmString = EdbPreInstructionString ();\r
679\r
680 switch (Opcode) {\r
681 case OPCODE_NEG:\r
682 EdbPrintInstructionName (L"NEG");\r
683 break;\r
684 case OPCODE_ADD:\r
685 EdbPrintInstructionName (L"ADD");\r
686 break;\r
687 case OPCODE_SUB:\r
688 EdbPrintInstructionName (L"SUB");\r
689 break;\r
690 case OPCODE_MUL:\r
691 EdbPrintInstructionName (L"MUL");\r
692 break;\r
693 case OPCODE_DIV:\r
694 EdbPrintInstructionName (L"DIV");\r
695 break;\r
696 case OPCODE_MOD:\r
697 EdbPrintInstructionName (L"MOD");\r
698 break;\r
699 case OPCODE_ASHR:\r
700 EdbPrintInstructionName (L"ASHR");\r
701 break;\r
702 }\r
703// if (Modifiers & DATAMANIP_M_64) {\r
704// EdbPrintInstructionName (L"64");\r
705// } else {\r
706// EdbPrintInstructionName (L"32");\r
707// }\r
708\r
709 EdbPrintRegister1 (Operands);\r
710 EdbPrintComma ();\r
711 EdbPrintRegister2 (Operands);\r
712\r
713 InstructionAddress += 2;\r
532daaed 714 if ((Modifiers & DATAMANIP_M_IMMDATA) != 0) {\r
748edcd5 715 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 716 if ((Operands & OPERAND_M_INDIRECT2) != 0) {\r
748edcd5
PB
717 EdbPrintRawIndexData16 (Data16);\r
718 } else {\r
719 EdbPrintImmDatan (Data16);\r
720 }\r
721 }\r
722\r
723 EdbPostInstructionString ();\r
724 }\r
725\r
726 return Size;\r
727}\r
728\r
e8a5ac7c
DB
729/**\r
730\r
731 Disasm instruction - MOVxx.\r
732\r
733 @param InstructionAddress - The instruction address\r
734 @param SystemContext - EBC system context.\r
735 @param DisasmString - The instruction string\r
736\r
737 @return Instruction length\r
738\r
739**/\r
748edcd5
PB
740UINTN\r
741EdbDisasmMOVxx (\r
742 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
743 IN EFI_SYSTEM_CONTEXT SystemContext,\r
744 OUT CHAR16 **DisasmString\r
745 )\r
748edcd5
PB
746{\r
747 UINT8 Modifiers;\r
748 UINT8 Opcode;\r
749 UINT8 Operands;\r
750 UINTN Size;\r
751 UINT16 Data16;\r
752 UINT32 Data32;\r
753 UINT64 Data64;\r
754\r
755 ASSERT (\r
756 (GET_OPCODE(InstructionAddress) == OPCODE_MOVBW) ||\r
757 (GET_OPCODE(InstructionAddress) == OPCODE_MOVWW) ||\r
758 (GET_OPCODE(InstructionAddress) == OPCODE_MOVDW) ||\r
759 (GET_OPCODE(InstructionAddress) == OPCODE_MOVQW) ||\r
760 (GET_OPCODE(InstructionAddress) == OPCODE_MOVBD) ||\r
761 (GET_OPCODE(InstructionAddress) == OPCODE_MOVWD) ||\r
762 (GET_OPCODE(InstructionAddress) == OPCODE_MOVDD) ||\r
763 (GET_OPCODE(InstructionAddress) == OPCODE_MOVQD) ||\r
764 (GET_OPCODE(InstructionAddress) == OPCODE_MOVQQ) ||\r
765 (GET_OPCODE(InstructionAddress) == OPCODE_MOVNW) ||\r
766 (GET_OPCODE(InstructionAddress) == OPCODE_MOVND)\r
767 );\r
768\r
769 Opcode = GET_OPCODE (InstructionAddress);\r
770 Modifiers = GET_MODIFIERS (InstructionAddress);\r
771 Operands = GET_OPERANDS (InstructionAddress);\r
772 Size = 2;\r
532daaed 773 if ((Modifiers & (OPCODE_M_IMMED_OP1 | OPCODE_M_IMMED_OP2)) != 0) {\r
748edcd5 774 if ((Opcode <= OPCODE_MOVQW) || (Opcode == OPCODE_MOVNW)) {\r
532daaed 775 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
776 Size += 2;\r
777 }\r
532daaed 778 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5
PB
779 Size += 2;\r
780 }\r
532daaed
DB
781 } else if (((Opcode <= OPCODE_MOVQD) || (Opcode == OPCODE_MOVND)) != 0) {\r
782 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
783 Size += 4;\r
784 }\r
532daaed 785 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5
PB
786 Size += 4;\r
787 }\r
788 } else if (Opcode == OPCODE_MOVQQ) {\r
532daaed 789 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
790 Size += 8;\r
791 }\r
532daaed 792 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5
PB
793 Size += 8;\r
794 }\r
795 }\r
796 }\r
797\r
798 //\r
799 // Construct Disasm String\r
800 //\r
801 if (DisasmString != NULL) {\r
802 *DisasmString = EdbPreInstructionString ();\r
803\r
804 EdbPrintInstructionName (L"MOV");\r
805 switch (Opcode) {\r
806 case OPCODE_MOVBW:\r
807 EdbPrintInstructionName (L"bw");\r
808 break;\r
809 case OPCODE_MOVWW:\r
810 EdbPrintInstructionName (L"ww");\r
811 break;\r
812 case OPCODE_MOVDW:\r
813 EdbPrintInstructionName (L"dw");\r
814 break;\r
815 case OPCODE_MOVQW:\r
816 EdbPrintInstructionName (L"qw");\r
817 break;\r
818 case OPCODE_MOVBD:\r
819 EdbPrintInstructionName (L"bd");\r
820 break;\r
821 case OPCODE_MOVWD:\r
822 EdbPrintInstructionName (L"wd");\r
823 break;\r
824 case OPCODE_MOVDD:\r
825 EdbPrintInstructionName (L"dd");\r
826 break;\r
827 case OPCODE_MOVQD:\r
828 EdbPrintInstructionName (L"qd");\r
829 break;\r
830 case OPCODE_MOVQQ:\r
831 EdbPrintInstructionName (L"qq");\r
832 break;\r
833 case OPCODE_MOVNW:\r
834 EdbPrintInstructionName (L"nw");\r
835 break;\r
836 case OPCODE_MOVND:\r
837 EdbPrintInstructionName (L"nd");\r
838 break;\r
839 }\r
840\r
841 EdbPrintRegister1 (Operands);\r
842\r
843 InstructionAddress += 2;\r
532daaed 844 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
845 if ((Opcode <= OPCODE_MOVQW) || (Opcode == OPCODE_MOVNW)) {\r
846 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
847 InstructionAddress += 2;\r
848 EdbPrintRawIndexData16 (Data16);\r
849 } else if ((Opcode <= OPCODE_MOVQD) || (Opcode == OPCODE_MOVND)) {\r
850 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
851 InstructionAddress += 4;\r
852 EdbPrintRawIndexData32 (Data32);\r
853 } else if (Opcode == OPCODE_MOVQQ) {\r
854 CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
855 InstructionAddress += 8;\r
856 EdbPrintRawIndexData64 (Data64);\r
857 }\r
858 }\r
859\r
860 EdbPrintComma ();\r
861 EdbPrintRegister2 (Operands);\r
862\r
532daaed 863 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5
PB
864 if ((Opcode <= OPCODE_MOVQW) || (Opcode == OPCODE_MOVNW)) {\r
865 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
866 EdbPrintRawIndexData16 (Data16);\r
867 } else if ((Opcode <= OPCODE_MOVQD) || (Opcode == OPCODE_MOVND)) {\r
868 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
869 EdbPrintRawIndexData32 (Data32);\r
870 } else if (Opcode == OPCODE_MOVQQ) {\r
871 CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
872 EdbPrintRawIndexData64 (Data64);\r
873 }\r
874 }\r
875\r
876 EdbPostInstructionString ();\r
877 }\r
878\r
879 return Size;\r
880}\r
881\r
e8a5ac7c
DB
882/**\r
883\r
884 Disasm instruction - MOVsnw.\r
885\r
886 @param InstructionAddress - The instruction address\r
887 @param SystemContext - EBC system context.\r
888 @param DisasmString - The instruction string\r
889\r
890 @return Instruction length\r
891\r
892**/\r
748edcd5
PB
893UINTN\r
894EdbDisasmMOVsnw (\r
895 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
896 IN EFI_SYSTEM_CONTEXT SystemContext,\r
897 OUT CHAR16 **DisasmString\r
898 )\r
748edcd5
PB
899{\r
900 UINT8 Modifiers;\r
901 UINT8 Operands;\r
902 UINTN Size;\r
903 UINT16 Data16;\r
904\r
905 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVSNW);\r
906\r
907 Modifiers = GET_MODIFIERS (InstructionAddress);\r
908 Operands = GET_OPERANDS (InstructionAddress);\r
909 Size = 2;\r
532daaed 910 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
911 Size += 2;\r
912 }\r
532daaed 913 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5
PB
914 Size += 2;\r
915 }\r
916\r
917 //\r
918 // Construct Disasm String\r
919 //\r
920 if (DisasmString != NULL) {\r
921 *DisasmString = EdbPreInstructionString ();\r
922\r
923 EdbPrintInstructionName (L"MOVsnw");\r
924\r
925 EdbPrintRegister1 (Operands);\r
926\r
927 InstructionAddress += 2;\r
532daaed 928 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
929 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
930 InstructionAddress += 2;\r
931 EdbPrintRawIndexData16 (Data16);\r
932 }\r
933\r
934 EdbPrintComma ();\r
935 EdbPrintRegister2 (Operands);\r
936\r
532daaed 937 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5 938 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 939 if ((Operands & OPERAND_M_INDIRECT2) != 0) {\r
748edcd5
PB
940 EdbPrintRawIndexData16 (Data16);\r
941 } else {\r
942 EdbPrintImmDatan (Data16);\r
943 }\r
944 }\r
945\r
946 EdbPostInstructionString ();\r
947 }\r
948\r
949 return Size;\r
950}\r
951\r
e8a5ac7c
DB
952/**\r
953\r
954 Disasm instruction - MOVsnd.\r
955\r
956 @param InstructionAddress - The instruction address\r
957 @param SystemContext - EBC system context.\r
958 @param DisasmString - The instruction string\r
959\r
960 @return Instruction length\r
961\r
962**/\r
748edcd5
PB
963UINTN\r
964EdbDisasmMOVsnd (\r
965 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
966 IN EFI_SYSTEM_CONTEXT SystemContext,\r
967 OUT CHAR16 **DisasmString\r
968 )\r
748edcd5
PB
969{\r
970 UINT8 Modifiers;\r
971 UINT8 Operands;\r
972 UINTN Size;\r
973 UINT32 Data32;\r
974\r
975 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVSND);\r
976\r
977 Modifiers = GET_MODIFIERS (InstructionAddress);\r
978 Operands = GET_OPERANDS (InstructionAddress);\r
979 Size = 2;\r
532daaed 980 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
981 Size += 4;\r
982 }\r
532daaed 983 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5
PB
984 Size += 4;\r
985 }\r
986\r
987 //\r
988 // Construct Disasm String\r
989 //\r
990 if (DisasmString != NULL) {\r
991 *DisasmString = EdbPreInstructionString ();\r
992\r
993 EdbPrintInstructionName (L"MOVsnd");\r
994\r
995 EdbPrintRegister1 (Operands);\r
996\r
997 InstructionAddress += 2;\r
532daaed 998 if ((Modifiers & OPCODE_M_IMMED_OP1) != 0) {\r
748edcd5
PB
999 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
1000 InstructionAddress += 4;\r
1001 EdbPrintRawIndexData32 (Data32);\r
1002 }\r
1003\r
1004 EdbPrintComma ();\r
1005 EdbPrintRegister2 (Operands);\r
1006\r
532daaed 1007 if ((Modifiers & OPCODE_M_IMMED_OP2) != 0) {\r
748edcd5 1008 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
532daaed 1009 if ((Operands & OPERAND_M_INDIRECT2) != 0) {\r
748edcd5
PB
1010 EdbPrintRawIndexData32 (Data32);\r
1011 } else {\r
1012 EdbPrintImmDatan (Data32);\r
1013 }\r
1014 }\r
1015\r
1016 EdbPostInstructionString ();\r
1017 }\r
1018\r
1019 return Size;\r
1020}\r
1021\r
e8a5ac7c
DB
1022/**\r
1023\r
1024 Disasm instruction - LOADSP.\r
1025\r
1026 @param InstructionAddress - The instruction address\r
1027 @param SystemContext - EBC system context.\r
1028 @param DisasmString - The instruction string\r
1029\r
1030 @return Instruction length\r
1031\r
1032**/\r
748edcd5
PB
1033UINTN\r
1034EdbDisasmLOADSP (\r
1035 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1036 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1037 OUT CHAR16 **DisasmString\r
1038 )\r
748edcd5
PB
1039{\r
1040 UINT8 Operands;\r
1041\r
1042 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_LOADSP);\r
1043\r
1044 Operands = GET_OPERANDS (InstructionAddress);\r
1045\r
1046 //\r
1047 // Construct Disasm String\r
1048 //\r
1049 if (DisasmString != NULL) {\r
1050 *DisasmString = EdbPreInstructionString ();\r
1051\r
1052 EdbPrintInstructionName (L"LOADSP");\r
1053\r
1054 EdbPrintDedicatedRegister1 (Operands);\r
1055\r
1056 EdbPrintRegister2 (Operands);\r
1057\r
1058 EdbPostInstructionString ();\r
1059 }\r
1060\r
1061 return 2;\r
1062}\r
1063\r
e8a5ac7c
DB
1064/**\r
1065\r
1066 Disasm instruction - STORESP.\r
1067\r
1068 @param InstructionAddress - The instruction address\r
1069 @param SystemContext - EBC system context.\r
1070 @param DisasmString - The instruction string\r
1071\r
1072 @return Instruction length\r
1073\r
1074**/\r
748edcd5
PB
1075UINTN\r
1076EdbDisasmSTORESP (\r
1077 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1078 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1079 OUT CHAR16 **DisasmString\r
1080 )\r
748edcd5
PB
1081{\r
1082 UINT8 Operands;\r
1083\r
1084 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_STORESP);\r
1085\r
1086 Operands = GET_OPERANDS (InstructionAddress);\r
1087\r
1088 //\r
1089 // Construct Disasm String\r
1090 //\r
1091 if (DisasmString != NULL) {\r
1092 *DisasmString = EdbPreInstructionString ();\r
1093\r
1094 EdbPrintInstructionName (L"STORESP");\r
1095\r
1096 EdbPrintRegister1 (Operands);\r
1097\r
1098 EdbPrintDedicatedRegister2 (Operands);\r
1099\r
1100 EdbPostInstructionString ();\r
1101 }\r
1102\r
1103 return 2;\r
1104}\r
1105\r
e8a5ac7c
DB
1106\r
1107/**\r
1108\r
1109 Disasm instruction - PUSH.\r
1110\r
1111 @param InstructionAddress - The instruction address\r
1112 @param SystemContext - EBC system context.\r
1113 @param DisasmString - The instruction string\r
1114\r
1115 @return Instruction length\r
1116\r
1117**/\r
748edcd5
PB
1118UINTN\r
1119EdbDisasmPUSH (\r
1120 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1121 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1122 OUT CHAR16 **DisasmString\r
1123 )\r
748edcd5
PB
1124{\r
1125 UINT8 Modifiers;\r
1126 UINT8 Operands;\r
1127 UINTN Size;\r
1128 UINT16 Data16;\r
1129\r
1130 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_PUSH);\r
1131\r
1132 Operands = GET_OPERANDS (InstructionAddress);\r
1133 Modifiers = GET_MODIFIERS (InstructionAddress);\r
532daaed 1134 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5
PB
1135 Size = 4;\r
1136 } else {\r
1137 Size = 2;\r
1138 }\r
1139\r
1140 //\r
1141 // Construct Disasm String\r
1142 //\r
1143 if (DisasmString != NULL) {\r
1144 *DisasmString = EdbPreInstructionString ();\r
1145\r
1146 EdbPrintInstructionName (L"PUSH");\r
1147// if (Modifiers & PUSHPOP_M_64) {\r
1148// EdbPrintInstructionName (L"64");\r
1149// } else {\r
1150// EdbPrintInstructionName (L"32");\r
1151// }\r
1152\r
1153 EdbPrintRegister1 (Operands);\r
1154\r
1155 InstructionAddress += 2;\r
532daaed 1156 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5 1157 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 1158 if ((Operands & OPERAND_M_INDIRECT1) != 0) {\r
748edcd5
PB
1159 EdbPrintRawIndexData16 (Data16);\r
1160 } else {\r
1161 EdbPrintImmDatan (Data16);\r
1162 }\r
1163 }\r
1164\r
1165 EdbPostInstructionString ();\r
1166 }\r
1167\r
1168 return Size;\r
1169}\r
1170\r
e8a5ac7c
DB
1171/**\r
1172\r
1173 Disasm instruction - POP.\r
1174\r
1175 @param InstructionAddress - The instruction address\r
1176 @param SystemContext - EBC system context.\r
1177 @param DisasmString - The instruction string\r
1178\r
1179 @return Instruction length\r
1180\r
1181**/\r
748edcd5
PB
1182UINTN\r
1183EdbDisasmPOP (\r
1184 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1185 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1186 OUT CHAR16 **DisasmString\r
1187 )\r
748edcd5
PB
1188{\r
1189 UINT8 Modifiers;\r
1190 UINT8 Operands;\r
1191 UINTN Size;\r
1192 UINT16 Data16;\r
1193\r
1194 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_POP);\r
1195\r
1196 Operands = GET_OPERANDS (InstructionAddress);\r
1197 Modifiers = GET_MODIFIERS (InstructionAddress);\r
532daaed 1198 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5
PB
1199 Size = 4;\r
1200 } else {\r
1201 Size = 2;\r
1202 }\r
1203\r
1204 //\r
1205 // Construct Disasm String\r
1206 //\r
1207 if (DisasmString != NULL) {\r
1208 *DisasmString = EdbPreInstructionString ();\r
1209\r
1210 EdbPrintInstructionName (L"POP");\r
1211// if (Modifiers & PUSHPOP_M_64) {\r
1212// EdbPrintInstructionName (L"64");\r
1213// } else {\r
1214// EdbPrintInstructionName (L"32");\r
1215// }\r
1216\r
1217 EdbPrintRegister1 (Operands);\r
1218\r
1219 InstructionAddress += 2;\r
532daaed 1220 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5 1221 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 1222 if ((Operands & OPERAND_M_INDIRECT1) != 0) {\r
748edcd5
PB
1223 EdbPrintRawIndexData16 (Data16);\r
1224 } else {\r
1225 EdbPrintImmDatan (Data16);\r
1226 }\r
1227 }\r
1228\r
1229 EdbPostInstructionString ();\r
1230 }\r
1231\r
1232 return Size;\r
1233}\r
1234\r
e8a5ac7c
DB
1235/**\r
1236\r
1237 Disasm instruction - CMPI.\r
1238\r
1239 @param InstructionAddress - The instruction address\r
1240 @param SystemContext - EBC system context.\r
1241 @param DisasmString - The instruction string\r
1242\r
1243 @return Instruction length\r
1244\r
1245**/\r
748edcd5
PB
1246UINTN\r
1247EdbDisasmCMPI (\r
1248 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1249 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1250 OUT CHAR16 **DisasmString\r
1251 )\r
748edcd5
PB
1252{\r
1253 UINT8 Modifiers;\r
1254 UINT8 Opcode;\r
1255 UINT8 Operands;\r
1256 UINT16 Data16;\r
1257 UINT32 Data32;\r
1258 UINTN Size;\r
1259\r
1260 ASSERT (\r
1261 (GET_OPCODE(InstructionAddress) == OPCODE_CMPIEQ) ||\r
1262 (GET_OPCODE(InstructionAddress) == OPCODE_CMPILTE) ||\r
1263 (GET_OPCODE(InstructionAddress) == OPCODE_CMPIGTE) ||\r
1264 (GET_OPCODE(InstructionAddress) == OPCODE_CMPIULTE) ||\r
1265 (GET_OPCODE(InstructionAddress) == OPCODE_CMPIUGTE)\r
1266 );\r
1267\r
1268 Modifiers = GET_MODIFIERS (InstructionAddress);\r
1269 Opcode = GET_OPCODE (InstructionAddress);\r
1270 Operands = GET_OPERANDS (InstructionAddress);\r
1271\r
1272 if ((Operands & 0xE0) != 0) {\r
1273 return 0;\r
1274 }\r
1275\r
1276 Size = 2;\r
532daaed 1277 if ((Operands & OPERAND_M_CMPI_INDEX) != 0) {\r
748edcd5
PB
1278 Size += 2;\r
1279 }\r
532daaed 1280 if ((Modifiers & OPCODE_M_CMPI32_DATA) != 0) {\r
748edcd5
PB
1281 Size += 4;\r
1282 } else {\r
1283 Size += 2;\r
1284 }\r
1285\r
1286 //\r
1287 // Construct Disasm String\r
1288 //\r
1289 if (DisasmString != NULL) {\r
1290 *DisasmString = EdbPreInstructionString ();\r
1291\r
1292 EdbPrintInstructionName (L"CMPI");\r
1293// if (Modifiers & OPCODE_M_CMPI64) {\r
1294// EdbPrintInstructionName (L"64");\r
1295// } else {\r
1296// EdbPrintInstructionName (L"32");\r
1297// }\r
532daaed 1298 if ((Modifiers & OPCODE_M_CMPI32_DATA) != 0) {\r
748edcd5
PB
1299 EdbPrintInstructionName (L"d");\r
1300 } else {\r
1301 EdbPrintInstructionName (L"w");\r
1302 }\r
1303 switch (Opcode) {\r
1304 case OPCODE_CMPIEQ:\r
1305 EdbPrintInstructionName (L"eq");\r
1306 break;\r
1307 case OPCODE_CMPILTE:\r
1308 EdbPrintInstructionName (L"lte");\r
1309 break;\r
1310 case OPCODE_CMPIGTE:\r
1311 EdbPrintInstructionName (L"gte");\r
1312 break;\r
1313 case OPCODE_CMPIULTE:\r
1314 EdbPrintInstructionName (L"ulte");\r
1315 break;\r
1316 case OPCODE_CMPIUGTE:\r
1317 EdbPrintInstructionName (L"ugte");\r
1318 break;\r
1319 }\r
1320\r
1321 EdbPrintRegister1 (Operands);\r
1322\r
1323 InstructionAddress += 2;\r
532daaed 1324 if ((Operands & OPERAND_M_CMPI_INDEX) != 0) {\r
748edcd5
PB
1325 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1326 InstructionAddress += 2;\r
1327 EdbPrintRawIndexData16 (Data16);\r
1328 }\r
1329\r
1330 EdbPrintComma ();\r
1331\r
532daaed 1332 if ((Modifiers & OPCODE_M_CMPI32_DATA) != 0) {\r
748edcd5
PB
1333 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
1334 EdbPrintDatan (Data32);\r
1335 } else {\r
1336 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1337 EdbPrintDatan (Data16);\r
1338 }\r
1339\r
1340 EdbPostInstructionString ();\r
1341 }\r
1342\r
1343 return Size;\r
1344}\r
1345\r
e8a5ac7c
DB
1346/**\r
1347\r
1348 Disasm instruction - PUSHn.\r
1349\r
1350 @param InstructionAddress - The instruction address\r
1351 @param SystemContext - EBC system context.\r
1352 @param DisasmString - The instruction string\r
1353\r
1354 @return Instruction length\r
1355\r
1356**/\r
748edcd5
PB
1357UINTN\r
1358EdbDisasmPUSHn (\r
1359 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1360 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1361 OUT CHAR16 **DisasmString\r
1362 )\r
748edcd5
PB
1363{\r
1364 UINT8 Modifiers;\r
1365 UINT8 Operands;\r
1366 UINTN Size;\r
1367 UINT16 Data16;\r
1368\r
1369 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_PUSHN);\r
1370\r
1371 Operands = GET_OPERANDS (InstructionAddress);\r
1372 Modifiers = GET_MODIFIERS (InstructionAddress);\r
532daaed 1373 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5
PB
1374 Size = 4;\r
1375 } else {\r
1376 Size = 2;\r
1377 }\r
1378\r
1379 //\r
1380 // Construct Disasm String\r
1381 //\r
1382 if (DisasmString != NULL) {\r
1383 *DisasmString = EdbPreInstructionString ();\r
1384\r
1385 EdbPrintInstructionName (L"PUSHn");\r
1386\r
1387 EdbPrintRegister1 (Operands);\r
1388\r
1389 InstructionAddress += 2;\r
532daaed 1390 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5 1391 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 1392 if ((Operands & OPERAND_M_INDIRECT1) != 0) {\r
748edcd5
PB
1393 EdbPrintRawIndexData16 (Data16);\r
1394 } else {\r
1395 EdbPrintImmDatan (Data16);\r
1396 }\r
1397 }\r
1398\r
1399 EdbPostInstructionString ();\r
1400 }\r
1401\r
1402 return Size;\r
1403}\r
1404\r
e8a5ac7c
DB
1405/**\r
1406\r
1407 Disasm instruction - POPn.\r
1408\r
1409 @param InstructionAddress - The instruction address\r
1410 @param SystemContext - EBC system context.\r
1411 @param DisasmString - The instruction string\r
1412\r
1413 @return Instruction length\r
1414\r
1415**/\r
748edcd5
PB
1416UINTN\r
1417EdbDisasmPOPn (\r
1418 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1419 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1420 OUT CHAR16 **DisasmString\r
1421 )\r
748edcd5
PB
1422{\r
1423 UINT8 Modifiers;\r
1424 UINT8 Operands;\r
1425 UINTN Size;\r
1426 UINT16 Data16;\r
1427\r
1428 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_POPN);\r
1429\r
1430 Operands = GET_OPERANDS (InstructionAddress);\r
1431 Modifiers = GET_MODIFIERS (InstructionAddress);\r
532daaed 1432 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5
PB
1433 Size = 4;\r
1434 } else {\r
1435 Size = 2;\r
1436 }\r
1437\r
1438 //\r
1439 // Construct Disasm String\r
1440 //\r
1441 if (DisasmString != NULL) {\r
1442 *DisasmString = EdbPreInstructionString ();\r
1443\r
1444 EdbPrintInstructionName (L"POPn");\r
1445\r
1446 EdbPrintRegister1 (Operands);\r
1447\r
1448 InstructionAddress += 2;\r
532daaed 1449 if ((Modifiers & PUSHPOP_M_IMMDATA) != 0) {\r
748edcd5 1450 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
532daaed 1451 if ((Operands & OPERAND_M_INDIRECT1) != 0) {\r
748edcd5
PB
1452 EdbPrintRawIndexData16 (Data16);\r
1453 } else {\r
1454 EdbPrintImmDatan (Data16);\r
1455 }\r
1456 }\r
1457\r
1458 EdbPostInstructionString ();\r
1459 }\r
1460\r
1461 return Size;\r
1462}\r
1463\r
e8a5ac7c
DB
1464/**\r
1465\r
1466 Disasm instruction - MOVI.\r
1467\r
1468 @param InstructionAddress - The instruction address\r
1469 @param SystemContext - EBC system context.\r
1470 @param DisasmString - The instruction string\r
1471\r
1472 @return Instruction length\r
1473\r
1474**/\r
748edcd5
PB
1475UINTN\r
1476EdbDisasmMOVI (\r
1477 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1478 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1479 OUT CHAR16 **DisasmString\r
1480 )\r
748edcd5
PB
1481{\r
1482 UINT8 Modifiers;\r
1483 UINT8 Operands;\r
1484 UINTN Size;\r
1485 UINT16 Data16;\r
1486 UINT32 Data32;\r
1487 UINT64 Data64;\r
1488\r
1489 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVI);\r
1490\r
1491 Modifiers = GET_MODIFIERS (InstructionAddress);\r
1492 Operands = GET_OPERANDS (InstructionAddress);\r
1493\r
532daaed 1494 if ((Operands & MOVI_M_IMMDATA) != 0) {\r
748edcd5
PB
1495 Size = 4;\r
1496 } else {\r
1497 Size = 2;\r
1498 }\r
1499 if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH16) {\r
1500 Size += 2;\r
1501 } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH32) {\r
1502 Size += 4;\r
1503 } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH64) {\r
1504 Size += 8;\r
1505 }\r
1506\r
1507 //\r
1508 // Construct Disasm String\r
1509 //\r
1510 if (DisasmString != NULL) {\r
1511 *DisasmString = EdbPreInstructionString ();\r
1512\r
1513 EdbPrintInstructionName (L"MOVI");\r
1514 switch (Operands & MOVI_M_MOVEWIDTH) {\r
1515 case MOVI_MOVEWIDTH8:\r
1516 EdbPrintInstructionName (L"b");\r
1517 break;\r
1518 case MOVI_MOVEWIDTH16:\r
1519 EdbPrintInstructionName (L"w");\r
1520 break;\r
1521 case MOVI_MOVEWIDTH32:\r
1522 EdbPrintInstructionName (L"d");\r
1523 break;\r
1524 case MOVI_MOVEWIDTH64:\r
1525 EdbPrintInstructionName (L"q");\r
1526 break;\r
1527 }\r
1528 switch (Modifiers & MOVI_M_DATAWIDTH) {\r
1529 case MOVI_DATAWIDTH16:\r
1530 EdbPrintInstructionName (L"w");\r
1531 break;\r
1532 case MOVI_DATAWIDTH32:\r
1533 EdbPrintInstructionName (L"d");\r
1534 break;\r
1535 case MOVI_DATAWIDTH64:\r
1536 EdbPrintInstructionName (L"q");\r
1537 break;\r
1538 }\r
1539\r
1540 EdbPrintRegister1 (Operands);\r
1541\r
1542 InstructionAddress += 2;\r
532daaed 1543 if ((Operands & MOVI_M_IMMDATA) != 0) {\r
748edcd5
PB
1544 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1545 InstructionAddress += 2;\r
1546 EdbPrintRawIndexData16 (Data16);\r
1547 }\r
1548\r
1549 EdbPrintComma ();\r
1550\r
1551 switch (Modifiers & MOVI_M_DATAWIDTH) {\r
1552 case MOVI_DATAWIDTH16:\r
1553 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1554 EdbPrintDatan (Data16);\r
1555 break;\r
1556 case MOVI_DATAWIDTH32:\r
1557 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
1558 EdbPrintDatan (Data32);\r
1559 break;\r
1560 case MOVI_DATAWIDTH64:\r
1561 CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
1562 EdbPrintData64n (Data64);\r
1563 break;\r
1564 }\r
1565\r
1566 EdbPostInstructionString ();\r
1567 }\r
1568\r
1569 return Size;\r
1570}\r
1571\r
e8a5ac7c
DB
1572/**\r
1573\r
1574 Disasm instruction - MOVIn.\r
1575\r
1576 @param InstructionAddress - The instruction address\r
1577 @param SystemContext - EBC system context.\r
1578 @param DisasmString - The instruction string\r
1579\r
1580 @return Instruction length\r
1581\r
1582**/\r
748edcd5
PB
1583UINTN\r
1584EdbDisasmMOVIn (\r
1585 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1586 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1587 OUT CHAR16 **DisasmString\r
1588 )\r
748edcd5
PB
1589{\r
1590 UINT8 Modifiers;\r
1591 UINT8 Operands;\r
1592 UINTN Size;\r
1593 UINT16 Data16;\r
1594 UINT32 Data32;\r
1595 UINT64 Data64;\r
1596\r
1597 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVIN);\r
1598\r
1599 Modifiers = GET_MODIFIERS (InstructionAddress);\r
1600 Operands = GET_OPERANDS (InstructionAddress);\r
1601\r
532daaed 1602 if ((Operands & MOVI_M_IMMDATA) != 0) {\r
748edcd5
PB
1603 Size = 4;\r
1604 } else {\r
1605 Size = 2;\r
1606 }\r
1607 if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH16) {\r
1608 Size += 2;\r
1609 } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH32) {\r
1610 Size += 4;\r
1611 } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH64) {\r
1612 Size += 8;\r
1613 }\r
1614\r
1615 //\r
1616 // Construct Disasm String\r
1617 //\r
1618 if (DisasmString != NULL) {\r
1619 *DisasmString = EdbPreInstructionString ();\r
1620\r
1621 EdbPrintInstructionName (L"MOVIn");\r
1622 switch (Modifiers & MOVI_M_DATAWIDTH) {\r
1623 case MOVI_DATAWIDTH16:\r
1624 EdbPrintInstructionName (L"w");\r
1625 break;\r
1626 case MOVI_DATAWIDTH32:\r
1627 EdbPrintInstructionName (L"d");\r
1628 break;\r
1629 case MOVI_DATAWIDTH64:\r
1630 EdbPrintInstructionName (L"q");\r
1631 break;\r
1632 }\r
1633\r
1634 EdbPrintRegister1 (Operands);\r
1635\r
1636 InstructionAddress += 2;\r
532daaed 1637 if ((Operands & MOVI_M_IMMDATA) != 0) {\r
748edcd5
PB
1638 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1639 InstructionAddress += 2;\r
1640 EdbPrintRawIndexData16 (Data16);\r
1641 }\r
1642\r
1643 EdbPrintComma ();\r
1644\r
1645 switch (Modifiers & MOVI_M_DATAWIDTH) {\r
1646 case MOVI_DATAWIDTH16:\r
1647 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1648 EdbPrintRawIndexData16 (Data16);\r
1649 break;\r
1650 case MOVI_DATAWIDTH32:\r
1651 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
1652 EdbPrintRawIndexData32 (Data32);\r
1653 break;\r
1654 case MOVI_DATAWIDTH64:\r
1655 CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
1656 EdbPrintRawIndexData64 (Data64);\r
1657 break;\r
1658 }\r
1659\r
1660 EdbPostInstructionString ();\r
1661 }\r
1662\r
1663 return Size;\r
1664}\r
1665\r
e8a5ac7c
DB
1666/**\r
1667\r
1668 Disasm instruction - MOVREL.\r
1669\r
1670 @param InstructionAddress - The instruction address\r
1671 @param SystemContext - EBC system context.\r
1672 @param DisasmString - The instruction string\r
1673\r
1674 @return Instruction length\r
1675\r
1676**/\r
748edcd5
PB
1677UINTN\r
1678EdbDisasmMOVREL (\r
1679 IN EFI_PHYSICAL_ADDRESS InstructionAddress,\r
1680 IN EFI_SYSTEM_CONTEXT SystemContext,\r
1681 OUT CHAR16 **DisasmString\r
1682 )\r
748edcd5
PB
1683{\r
1684 UINT8 Modifiers;\r
1685 UINT8 Operands;\r
1686 UINTN Size;\r
1687 UINT16 Data16;\r
1688 UINT32 Data32;\r
1689 UINT64 Data64;\r
1690 UINTN Result;\r
1691 EFI_PHYSICAL_ADDRESS SavedInstructionAddress;\r
1692\r
1693 ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVREL);\r
1694 SavedInstructionAddress = InstructionAddress;\r
1695\r
1696 Modifiers = GET_MODIFIERS (InstructionAddress);\r
1697 Operands = GET_OPERANDS (InstructionAddress);\r
1698\r
532daaed 1699 if ((Operands & MOVI_M_IMMDATA) != 0) {\r
748edcd5
PB
1700 Size = 4;\r
1701 } else {\r
1702 Size = 2;\r
1703 }\r
1704 if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH16) {\r
1705 Size += 2;\r
1706 } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH32) {\r
1707 Size += 4;\r
1708 } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH64) {\r
1709 Size += 8;\r
1710 } else {\r
1711 return 0;\r
1712 }\r
1713\r
1714 //\r
1715 // Construct Disasm String\r
1716 //\r
1717 if (DisasmString != NULL) {\r
1718 *DisasmString = EdbPreInstructionString ();\r
1719\r
1720 EdbPrintInstructionName (L"MOVrel");\r
1721 switch (Modifiers & MOVI_M_DATAWIDTH) {\r
1722 case MOVI_DATAWIDTH16:\r
1723 EdbPrintInstructionName (L"w");\r
1724 break;\r
1725 case MOVI_DATAWIDTH32:\r
1726 EdbPrintInstructionName (L"d");\r
1727 break;\r
1728 case MOVI_DATAWIDTH64:\r
1729 EdbPrintInstructionName (L"q");\r
1730 break;\r
1731 }\r
1732\r
1733 EdbPrintRegister1 (Operands);\r
1734\r
1735 InstructionAddress += 2;\r
532daaed 1736 if ((Operands & MOVI_M_IMMDATA) != 0) {\r
748edcd5
PB
1737 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1738 InstructionAddress += 2;\r
1739 EdbPrintRawIndexData16 (Data16);\r
1740 }\r
1741\r
1742 EdbPrintComma ();\r
1743\r
1744 switch (Modifiers & MOVI_M_DATAWIDTH) {\r
1745 case MOVI_DATAWIDTH16:\r
1746 CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
1747 Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Size + (INT16)Data16));\r
1748 if (Result == 0) {\r
1749 EdbPrintData16 (Data16);\r
1750 }\r
1751 break;\r
1752 case MOVI_DATAWIDTH32:\r
1753 CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
1754 Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Size + (INT32)Data32));\r
1755 if (Result == 0) {\r
1756 EdbPrintData32 (Data32);\r
1757 }\r
1758 break;\r
1759 case MOVI_DATAWIDTH64:\r
1760 CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
1761 if (sizeof(UINTN) == sizeof(UINT64)) {\r
1762 Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Size + (INT64)Data64));\r
1763 } else {\r
1764 Result = 0;\r
1765 }\r
1766 if (Result == 0) {\r
1767 EdbPrintData64 (Data64);\r
1768 }\r
1769 break;\r
1770 }\r
1771\r
1772 EdbPostInstructionString ();\r
1773 }\r
1774\r
1775 return Size;\r
1776}\r