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