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