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