Deleted Added
full compact
db_disasm.c (144353) db_disasm.c (144354)
1/*-
2 * Mach Operating System
3 * Copyright (c) 1991,1990 Carnegie Mellon University
4 * All Rights Reserved.
5 *
6 * Permission to use, copy, modify and distribute this software and its
7 * documentation is hereby granted, provided that both the copyright
8 * notice and this permission notice appear in all copies of the

--- 11 unchanged lines hidden (view full) ---

20 * Carnegie Mellon University
21 * Pittsburgh PA 15213-3890
22 *
23 * any improvements or extensions that they make and grant Carnegie the
24 * rights to redistribute these changes.
25 */
26
27#include <sys/cdefs.h>
1/*-
2 * Mach Operating System
3 * Copyright (c) 1991,1990 Carnegie Mellon University
4 * All Rights Reserved.
5 *
6 * Permission to use, copy, modify and distribute this software and its
7 * documentation is hereby granted, provided that both the copyright
8 * notice and this permission notice appear in all copies of the

--- 11 unchanged lines hidden (view full) ---

20 * Carnegie Mellon University
21 * Pittsburgh PA 15213-3890
22 *
23 * any improvements or extensions that they make and grant Carnegie the
24 * rights to redistribute these changes.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/amd64/amd64/db_disasm.c 144353 2005-03-30 22:52:27Z peter $");
28__FBSDID("$FreeBSD: head/sys/amd64/amd64/db_disasm.c 144354 2005-03-30 22:57:41Z peter $");
29
30/*
31 * Instruction disassembler.
32 */
33#include <sys/param.h>
34
35#include <ddb/ddb.h>
36#include <ddb/db_access.h>

--- 52 unchanged lines hidden (view full) ---

89#define Dl 27 /* long displacement from EIP */
90#define o1 28 /* constant 1 */
91#define o3 29 /* constant 3 */
92#define OS 30 /* immediate offset/segment */
93#define ST 31 /* FP stack top */
94#define STI 32 /* FP stack */
95#define X 33 /* extended FP op */
96#define XA 34 /* for 'fstcw %ax' */
29
30/*
31 * Instruction disassembler.
32 */
33#include <sys/param.h>
34
35#include <ddb/ddb.h>
36#include <ddb/db_access.h>

--- 52 unchanged lines hidden (view full) ---

89#define Dl 27 /* long displacement from EIP */
90#define o1 28 /* constant 1 */
91#define o3 29 /* constant 3 */
92#define OS 30 /* immediate offset/segment */
93#define ST 31 /* FP stack top */
94#define STI 32 /* FP stack */
95#define X 33 /* extended FP op */
96#define XA 34 /* for 'fstcw %ax' */
97#define El 35 /* address, long size */
97#define El 35 /* address, long/quad size */
98#define Ril 36 /* long register in instruction */
99#define Iba 37 /* byte immediate, don't print if 0xa */
98#define Ril 36 /* long register in instruction */
99#define Iba 37 /* byte immediate, don't print if 0xa */
100#define EL 38 /* address, explicitly long size */
100
101struct inst {
102 const char * i_name; /* name */
103 short i_has_modrm; /* has regmodrm byte */
104 short i_size; /* operand size */
105 int i_mode; /* addressing modes */
106 const void * i_extra; /* pointer to extra opcode table */
107};

--- 109 unchanged lines hidden (view full) ---

217/*3a*/ { "", FALSE, NONE, 0, 0 },
218/*3b*/ { "", FALSE, NONE, 0, 0 },
219/*3c*/ { "", FALSE, NONE, 0, 0 },
220/*3d*/ { "", FALSE, NONE, 0, 0 },
221/*3e*/ { "", FALSE, NONE, 0, 0 },
222/*3f*/ { "", FALSE, NONE, 0, 0 },
223};
224
101
102struct inst {
103 const char * i_name; /* name */
104 short i_has_modrm; /* has regmodrm byte */
105 short i_size; /* operand size */
106 int i_mode; /* addressing modes */
107 const void * i_extra; /* pointer to extra opcode table */
108};

--- 109 unchanged lines hidden (view full) ---

218/*3a*/ { "", FALSE, NONE, 0, 0 },
219/*3b*/ { "", FALSE, NONE, 0, 0 },
220/*3c*/ { "", FALSE, NONE, 0, 0 },
221/*3d*/ { "", FALSE, NONE, 0, 0 },
222/*3e*/ { "", FALSE, NONE, 0, 0 },
223/*3f*/ { "", FALSE, NONE, 0, 0 },
224};
225
226static const struct inst db_inst_0f4x[] = {
227/*40*/ { "cmovo", TRUE, NONE, op2(E, R), 0 },
228/*41*/ { "cmovno", TRUE, NONE, op2(E, R), 0 },
229/*42*/ { "cmovb", TRUE, NONE, op2(E, R), 0 },
230/*43*/ { "cmovnb", TRUE, NONE, op2(E, R), 0 },
231/*44*/ { "cmovz", TRUE, NONE, op2(E, R), 0 },
232/*45*/ { "cmovnz", TRUE, NONE, op2(E, R), 0 },
233/*46*/ { "cmovbe", TRUE, NONE, op2(E, R), 0 },
234/*47*/ { "cmovnbe",TRUE, NONE, op2(E, R), 0 },
235
236/*48*/ { "cmovs", TRUE, NONE, op2(E, R), 0 },
237/*49*/ { "cmovns", TRUE, NONE, op2(E, R), 0 },
238/*4a*/ { "cmovp", TRUE, NONE, op2(E, R), 0 },
239/*4b*/ { "cmovnp", TRUE, NONE, op2(E, R), 0 },
240/*4c*/ { "cmovl", TRUE, NONE, op2(E, R), 0 },
241/*4d*/ { "cmovnl", TRUE, NONE, op2(E, R), 0 },
242/*4e*/ { "cmovle", TRUE, NONE, op2(E, R), 0 },
243/*4f*/ { "cmovnle",TRUE, NONE, op2(E, R), 0 },
244};
245
225static const struct inst db_inst_0f8x[] = {
226/*80*/ { "jo", FALSE, NONE, op1(Dl), 0 },
227/*81*/ { "jno", FALSE, NONE, op1(Dl), 0 },
228/*82*/ { "jb", FALSE, NONE, op1(Dl), 0 },
229/*83*/ { "jnb", FALSE, NONE, op1(Dl), 0 },
230/*84*/ { "jz", FALSE, NONE, op1(Dl), 0 },
231/*85*/ { "jnz", FALSE, NONE, op1(Dl), 0 },
232/*86*/ { "jbe", FALSE, NONE, op1(Dl), 0 },

--- 88 unchanged lines hidden (view full) ---

321/*cf*/ { "bswap", FALSE, LONG, op1(Ril), 0 },
322};
323
324static const struct inst * const db_inst_0f[] = {
325 db_inst_0f0x,
326 0,
327 db_inst_0f2x,
328 db_inst_0f3x,
246static const struct inst db_inst_0f8x[] = {
247/*80*/ { "jo", FALSE, NONE, op1(Dl), 0 },
248/*81*/ { "jno", FALSE, NONE, op1(Dl), 0 },
249/*82*/ { "jb", FALSE, NONE, op1(Dl), 0 },
250/*83*/ { "jnb", FALSE, NONE, op1(Dl), 0 },
251/*84*/ { "jz", FALSE, NONE, op1(Dl), 0 },
252/*85*/ { "jnz", FALSE, NONE, op1(Dl), 0 },
253/*86*/ { "jbe", FALSE, NONE, op1(Dl), 0 },

--- 88 unchanged lines hidden (view full) ---

342/*cf*/ { "bswap", FALSE, LONG, op1(Ril), 0 },
343};
344
345static const struct inst * const db_inst_0f[] = {
346 db_inst_0f0x,
347 0,
348 db_inst_0f2x,
349 db_inst_0f3x,
350 db_inst_0f4x,
329 0,
330 0,
331 0,
332 0,
333 db_inst_0f8x,
334 db_inst_0f9x,
335 db_inst_0fax,
336 db_inst_0fbx,

--- 291 unchanged lines hidden (view full) ---

628/*5c*/ { "pop", FALSE, LONG, op1(Ri), 0 },
629/*5d*/ { "pop", FALSE, LONG, op1(Ri), 0 },
630/*5e*/ { "pop", FALSE, LONG, op1(Ri), 0 },
631/*5f*/ { "pop", FALSE, LONG, op1(Ri), 0 },
632
633/*60*/ { "pusha", FALSE, LONG, 0, 0 },
634/*61*/ { "popa", FALSE, LONG, 0, 0 },
635/*62*/ { "bound", TRUE, LONG, op2(E, R), 0 },
351 0,
352 0,
353 0,
354 0,
355 db_inst_0f8x,
356 db_inst_0f9x,
357 db_inst_0fax,
358 db_inst_0fbx,

--- 291 unchanged lines hidden (view full) ---

650/*5c*/ { "pop", FALSE, LONG, op1(Ri), 0 },
651/*5d*/ { "pop", FALSE, LONG, op1(Ri), 0 },
652/*5e*/ { "pop", FALSE, LONG, op1(Ri), 0 },
653/*5f*/ { "pop", FALSE, LONG, op1(Ri), 0 },
654
655/*60*/ { "pusha", FALSE, LONG, 0, 0 },
656/*61*/ { "popa", FALSE, LONG, 0, 0 },
657/*62*/ { "bound", TRUE, LONG, op2(E, R), 0 },
636/*63*/ { "arpl", TRUE, NONE, op2(Rw,Ew), 0 },
658/*63*/ { "movslq", TRUE, NONE, op2(EL,R), 0 },
637
638/*64*/ { "", FALSE, NONE, 0, 0 },
639/*65*/ { "", FALSE, NONE, 0, 0 },
640/*66*/ { "", FALSE, NONE, 0, 0 },
641/*67*/ { "", FALSE, NONE, 0, 0 },
642
643/*68*/ { "push", FALSE, LONG, op1(I), 0 },
644/*69*/ { "imul", TRUE, LONG, op3(I,E,R), 0 },

--- 231 unchanged lines hidden (view full) ---

876 2, /* WORD */
877 4, /* LONG */
878 8, /* QUAD */
879 4, /* SNGL */
880 8, /* DBLR */
881 10, /* EXTR */
882};
883
659
660/*64*/ { "", FALSE, NONE, 0, 0 },
661/*65*/ { "", FALSE, NONE, 0, 0 },
662/*66*/ { "", FALSE, NONE, 0, 0 },
663/*67*/ { "", FALSE, NONE, 0, 0 },
664
665/*68*/ { "push", FALSE, LONG, op1(I), 0 },
666/*69*/ { "imul", TRUE, LONG, op3(I,E,R), 0 },

--- 231 unchanged lines hidden (view full) ---

898 2, /* WORD */
899 4, /* LONG */
900 8, /* QUAD */
901 4, /* SNGL */
902 8, /* DBLR */
903 10, /* EXTR */
904};
905
884
885#define get_value_inc(result, loc, size, is_signed) \
886 result = db_get_value((loc), (size), (is_signed)); \
887 (loc) += (size);
888
889static db_addr_t
890 db_disasm_esc(db_addr_t loc, int inst, int rex, int short_addr,
891 int size, const char *seg);
892static void db_print_address(const char *seg, int size, int rex,

--- 55 unchanged lines hidden (view full) ---

948 }
949 }
950 else {
951 if (mod != 3 && rm == 4) {
952 get_value_inc(sib, loc, 1, FALSE);
953 rm = sib_base(rex, sib);
954 index = sib_index(rex, sib);
955 if (index != 4)
906#define get_value_inc(result, loc, size, is_signed) \
907 result = db_get_value((loc), (size), (is_signed)); \
908 (loc) += (size);
909
910static db_addr_t
911 db_disasm_esc(db_addr_t loc, int inst, int rex, int short_addr,
912 int size, const char *seg);
913static void db_print_address(const char *seg, int size, int rex,

--- 55 unchanged lines hidden (view full) ---

969 }
970 }
971 else {
972 if (mod != 3 && rm == 4) {
973 get_value_inc(sib, loc, 1, FALSE);
974 rm = sib_base(rex, sib);
975 index = sib_index(rex, sib);
976 if (index != 4)
956 addrp->index = db_reg[rex != 0 ? 1 : 0][(rex & REX_R) ? QUAD : LONG][index];
977 addrp->index = db_reg[1][QUAD][index];
957 addrp->ss = sib_ss(rex, sib);
958 }
959
960 switch (mod) {
961 case 0:
962 if (rm == 5) {
963 get_value_inc(addrp->disp, loc, 4, FALSE);
964 addrp->base = 0;
965 }
966 else {
967 addrp->disp = 0;
978 addrp->ss = sib_ss(rex, sib);
979 }
980
981 switch (mod) {
982 case 0:
983 if (rm == 5) {
984 get_value_inc(addrp->disp, loc, 4, FALSE);
985 addrp->base = 0;
986 }
987 else {
988 addrp->disp = 0;
968 addrp->base = db_reg[rex != 0 ? 1 : 0][(rex & REX_R) ? QUAD : LONG][rm];
989 addrp->base = db_reg[1][QUAD][rm];
969 }
970 break;
971
972 case 1:
973 get_value_inc(disp, loc, 1, TRUE);
974 addrp->disp = disp;
990 }
991 break;
992
993 case 1:
994 get_value_inc(disp, loc, 1, TRUE);
995 addrp->disp = disp;
975 addrp->base = db_reg[rex != 0 ? 1 : 0][(rex & REX_R) ? QUAD : LONG][rm];
996 addrp->base = db_reg[1][QUAD][rm];
976 break;
977
978 case 2:
979 get_value_inc(disp, loc, 4, FALSE);
980 addrp->disp = disp;
997 break;
998
999 case 2:
1000 get_value_inc(disp, loc, 4, FALSE);
1001 addrp->disp = disp;
981 addrp->base = db_reg[rex != 0 ? 1 : 0][(rex & REX_R) ? QUAD : LONG][rm];
1002 addrp->base = db_reg[1][QUAD][rm];
982 break;
983 }
984 }
985 return (loc);
986}
987
988static void
989db_print_address(seg, size, rex, addrp)
990 const char * seg;
991 int size;
992 int rex;
993 struct i_addr * addrp;
994{
995 if (addrp->is_reg) {
1003 break;
1004 }
1005 }
1006 return (loc);
1007}
1008
1009static void
1010db_print_address(seg, size, rex, addrp)
1011 const char * seg;
1012 int size;
1013 int rex;
1014 struct i_addr * addrp;
1015{
1016 if (addrp->is_reg) {
996 db_printf("%s", db_reg[rex != 0 ? 1 : 0][size][addrp->disp]);
1017 db_printf("%s", db_reg[rex != 0 ? 1 : 0][(size == LONG && (rex & REX_W)) ? QUAD : size][addrp->disp]);
997 return;
998 }
999
1000 if (seg) {
1001 db_printf("%s:", seg);
1002 }
1003
1004 db_printsym((db_addr_t)addrp->disp, DB_STGY_ANY);

--- 238 unchanged lines hidden (view full) ---

1243 if (i_size == SDEP) {
1244 if (size == WORD)
1245 db_printf("%s", i_name);
1246 else
1247 db_printf("%s", (const char *)ip->i_extra);
1248 }
1249 else {
1250 db_printf("%s", i_name);
1018 return;
1019 }
1020
1021 if (seg) {
1022 db_printf("%s:", seg);
1023 }
1024
1025 db_printsym((db_addr_t)addrp->disp, DB_STGY_ANY);

--- 238 unchanged lines hidden (view full) ---

1264 if (i_size == SDEP) {
1265 if (size == WORD)
1266 db_printf("%s", i_name);
1267 else
1268 db_printf("%s", (const char *)ip->i_extra);
1269 }
1270 else {
1271 db_printf("%s", i_name);
1272 if ((inst >= 0x50 && inst <= 0x5f) || inst == 0x68 || inst == 0x6a) {
1273 i_size = NONE;
1274 db_printf("q");
1275 }
1251 if (i_size != NONE) {
1252 if (i_size == BYTE) {
1253 db_printf("b");
1254 size = BYTE;
1255 }
1256 else if (i_size == WORD) {
1257 db_printf("w");
1258 size = WORD;

--- 26 unchanged lines hidden (view full) ---

1285 db_printf("*");
1286 db_print_address(seg, size, rex, &address);
1287 break;
1288
1289 case El:
1290 db_print_address(seg, (rex & REX_W) ? QUAD : LONG, rex, &address);
1291 break;
1292
1276 if (i_size != NONE) {
1277 if (i_size == BYTE) {
1278 db_printf("b");
1279 size = BYTE;
1280 }
1281 else if (i_size == WORD) {
1282 db_printf("w");
1283 size = WORD;

--- 26 unchanged lines hidden (view full) ---

1310 db_printf("*");
1311 db_print_address(seg, size, rex, &address);
1312 break;
1313
1314 case El:
1315 db_print_address(seg, (rex & REX_W) ? QUAD : LONG, rex, &address);
1316 break;
1317
1318 case EL:
1319 db_print_address(seg, LONG, 0, &address);
1320 break;
1321
1293 case Ew:
1294 db_print_address(seg, WORD, rex, &address);
1295 break;
1296
1297 case Eb:
1298 db_print_address(seg, BYTE, rex, &address);
1299 break;
1300
1301 case R:
1322 case Ew:
1323 db_print_address(seg, WORD, rex, &address);
1324 break;
1325
1326 case Eb:
1327 db_print_address(seg, BYTE, rex, &address);
1328 break;
1329
1330 case R:
1302 db_printf("%s", db_reg[rex != 0 ? 1 : 0][size][f_reg(rex, regmodrm)]);
1331 db_printf("%s", db_reg[rex != 0 ? 1 : 0][(size == LONG && (rex & REX_W)) ? QUAD : size][f_reg(rex, regmodrm)]);
1303 break;
1304
1305 case Rw:
1306 db_printf("%s", db_reg[rex != 0 ? 1 : 0][WORD][f_reg(rex, regmodrm)]);
1307 break;
1308
1309 case Ri:
1332 break;
1333
1334 case Rw:
1335 db_printf("%s", db_reg[rex != 0 ? 1 : 0][WORD][f_reg(rex, regmodrm)]);
1336 break;
1337
1338 case Ri:
1310 db_printf("%s", db_reg[rex != 0 ? 1 : 0][size][f_rm(rex, inst)]);
1339 db_printf("%s", db_reg[0][QUAD][f_rm(rex, inst)]);
1311 break;
1312
1313 case Ril:
1314 db_printf("%s", db_reg[rex != 0 ? 1 : 0][(rex & REX_R) ? QUAD : LONG][f_rm(rex, inst)]);
1315 break;
1316
1317 case S:
1318 db_printf("%s", db_seg_reg[f_reg(rex, regmodrm)]);

--- 39 unchanged lines hidden (view full) ---

1358 db_printf("%%dr%d", f_reg(rex, regmodrm));
1359 break;
1360
1361 case TR:
1362 db_printf("%%tr%d", f_reg(rex, regmodrm));
1363 break;
1364
1365 case I:
1340 break;
1341
1342 case Ril:
1343 db_printf("%s", db_reg[rex != 0 ? 1 : 0][(rex & REX_R) ? QUAD : LONG][f_rm(rex, inst)]);
1344 break;
1345
1346 case S:
1347 db_printf("%s", db_seg_reg[f_reg(rex, regmodrm)]);

--- 39 unchanged lines hidden (view full) ---

1387 db_printf("%%dr%d", f_reg(rex, regmodrm));
1388 break;
1389
1390 case TR:
1391 db_printf("%%tr%d", f_reg(rex, regmodrm));
1392 break;
1393
1394 case I:
1366 len = db_lengths[(size == LONG && (rex & REX_W)) ? QUAD : size];
1395 len = db_lengths[size];
1367 get_value_inc(imm, loc, len, FALSE);
1368 db_printf("$%#r", imm);
1369 break;
1370
1371 case Is:
1372 len = db_lengths[(size == LONG && (rex & REX_W)) ? QUAD : size];
1373 get_value_inc(imm, loc, len, FALSE);
1374 db_printf("$%+#r", imm);

--- 70 unchanged lines hidden ---
1396 get_value_inc(imm, loc, len, FALSE);
1397 db_printf("$%#r", imm);
1398 break;
1399
1400 case Is:
1401 len = db_lengths[(size == LONG && (rex & REX_W)) ? QUAD : size];
1402 get_value_inc(imm, loc, len, FALSE);
1403 db_printf("$%+#r", imm);

--- 70 unchanged lines hidden ---