1187{
1190 int short_addr;
1191 const char * seg;
1192 const struct inst * ip;
1196 int rex = 0;
1197 int regmodrm = 0;
1198 bool first;
1199 int displ;
1200 int prefix;
1201 int rep;
1202 int imm;
1203 int imm2;
1204 long imm64;
1207
1211 seg = 0;
1212
1213
1214
1215
1218 do {
1220 case 0x66:
1222 break;
1223 case 0x67:
1225 break;
1226 case 0x26:
1227 seg = "%es";
1228 break;
1229 case 0x36:
1230 seg = "%ss";
1231 break;
1232 case 0x2e:
1233 seg = "%cs";
1234 break;
1235 case 0x3e:
1236 seg = "%ds";
1237 break;
1238 case 0x64:
1239 seg = "%fs";
1240 break;
1241 case 0x65:
1242 seg = "%gs";
1243 break;
1244 case 0xf0:
1246 break;
1247 case 0xf2:
1249 break;
1250 case 0xf3:
1252 break;
1253 default:
1255 break;
1256 }
1260 }
1261 if (prefix) {
1263 }
1264 } while (prefix);
1265
1266 if (
inst >= 0xd8 &&
inst <= 0xdf) {
1269 return (loc);
1270 }
1271
1276 if (ip == 0) {
1278 }
1279 else {
1281 }
1282 }
1283
1287 }
1288
1292
1298 }
1301 ip = &ip[
f_reg(rex, regmodrm)];
1304 }
1307 ip = &ip[
f_reg(rex, regmodrm)];
1311 }
1312
1313
1315 switch (regmodrm) {
1316 case 0xc1:
1320 break;
1321 case 0xc2:
1325 break;
1326 case 0xc3:
1330 break;
1331 case 0xc4:
1335 break;
1336 case 0xc8:
1340 break;
1341 case 0xc9:
1345 break;
1346 case 0xd0:
1350 break;
1351 case 0xd1:
1355 break;
1356 case 0xf8:
1360 break;
1361 case 0xf9:
1365 break;
1366 }
1367 }
1372 }
1373
1374
1382 f_reg(rex, regmodrm) == 0x6) {
1385 }
1386 }
1389 f_reg(rex, regmodrm) == 0x6) {
1391 }
1392 }
1398 }
1399
1402
1406 else
1409 if (short_addr ==
FALSE)
1411 else
1413 }
1414 else {
1419 }
1424 }
1428 }
1431 else {
1434 else
1436 }
1437 }
1438 }
1443 {
1444 if (!first)
1446
1448
1451 break;
1452
1456 break;
1457
1460 break;
1461
1464 break;
1465
1468 break;
1469
1472 break;
1473
1476 break;
1477
1480 break;
1481
1484 break;
1485
1488 break;
1489
1492 break;
1493
1496 break;
1497
1500 break;
1501
1504 break;
1505
1507 if (seg)
1509 kprintf(
"(%s)", short_addr ?
"%bx" :
"%ebx");
1510 break;
1511
1514 break;
1515
1518 break;
1519
1521 if (seg)
1523 kprintf(
"(%s)", short_addr ?
"%si" :
"%rsi");
1524 break;
1525
1527 kprintf(
"%%es:(%s)", short_addr ?
"%di" :
"%rdi");
1528 break;
1529
1532 break;
1533
1536 break;
1537
1540 break;
1541
1546 break;
1547
1552 break;
1553
1557 break;
1558
1561 if (imm != 0x0a)
1563 break;
1564
1568 imm &= 0xFFFF;
1570 break;
1571
1575 break;
1576
1581 break;
1582
1584 len = (short_addr ? 2 : 4);
1586 if (seg)
1588 else
1590 break;
1591
1594 displ += loc;
1596 displ &= 0xFFFF;
1598 break;
1599
1603 displ += loc;
1605 displ &= 0xFFFF;
1607 break;
1608
1611 break;
1612
1615 break;
1616
1622 break;
1623 }
1624 }
1626 return (loc);
1627}
static const char *const db_Grp1[]
static const char *const db_reg[2][4][16]
static const struct inst db_Grp4[]
static void db_print_address(const char *seg, int size, int rex, struct i_addr *addrp)
static uintptr_t db_disasm_esc(uintptr_t loc, int inst, int rex, int short_addr, int size, const char *seg)
static const char *const db_Grp15[]
static const struct inst db_inst_table[256]
static const char *const db_Grp7[]
static const struct inst db_Grp5[]
static const char *const db_Grp15b[]
static const char *const db_Grp2[]
static const char *const db_Grp8[]
#define get_value_inc(result, loc, size, is_signed)
static uintptr_t db_read_address(uintptr_t loc, int short_addr, int rex, int regmodrm, struct i_addr *addrp)
static const int db_lengths[]
static const char *const db_seg_reg[8]
static const struct inst db_Grp3[]
static const char *const db_Grp6[]
static const char *const db_Grp9[]
static const struct inst db_bad_inst
int kprintf(const char *fmt,...)
void Debug_PrintSymbol(uintptr_t off, int strategy)
int strcmp(const char *s1, const char *s2)