Lines Matching refs:ip

1195 igetc(Map *map, Instr *ip, uchar *c)  in igetc()  argument
1197 if(ip->n+1 > sizeof(ip->mem)){ in igetc()
1201 if (get1(map, ip->addr+ip->n, c, 1) < 0) { in igetc()
1205 ip->mem[ip->n++] = *c; in igetc()
1213 igets(Map *map, Instr *ip, ushort *sp) in igets() argument
1218 if (igetc(map, ip, &c) < 0) in igets()
1221 if (igetc(map, ip, &c) < 0) in igets()
1232 igetl(Map *map, Instr *ip, uint32 *lp) in igetl() argument
1237 if (igets(map, ip, &s) < 0) in igetl()
1240 if (igets(map, ip, &s) < 0) in igetl()
1268 getdisp(Map *map, Instr *ip, int mod, int rm, int code, int pcrel) in getdisp() argument
1276 if (igetc(map, ip, &c) < 0) in getdisp()
1279 ip->disp = c|0xffffff00; in getdisp()
1281 ip->disp = c&0xff; in getdisp()
1283 if (ip->asize == 'E') { in getdisp()
1284 if (igetl(map, ip, &ip->disp) < 0) in getdisp()
1287 ip->rip = pcrel; in getdisp()
1289 if (igets(map, ip, &s) < 0) in getdisp()
1292 ip->disp = s|0xffff0000; in getdisp()
1294 ip->disp = s; in getdisp()
1297 ip->base = -1; in getdisp()
1303 modrm(Map *map, Instr *ip, uchar c) in modrm() argument
1309 ip->mod = mod; in modrm()
1310 ip->base = rm; in modrm()
1311 ip->reg = (c>>3)&7; in modrm()
1312 ip->rip = 0; in modrm()
1315 if (ip->asize == 0) { /* 16-bit mode */ in modrm()
1318 ip->base = BX; ip->index = SI; in modrm()
1321 ip->base = BX; ip->index = DI; in modrm()
1324 ip->base = BP; ip->index = SI; in modrm()
1327 ip->base = BP; ip->index = DI; in modrm()
1330 ip->base = SI; in modrm()
1333 ip->base = DI; in modrm()
1336 ip->base = BP; in modrm()
1339 ip->base = BX; in modrm()
1344 return getdisp(map, ip, mod, rm, 6, 0); in modrm()
1347 if (igetc(map, ip, &c) < 0) in modrm()
1349 ip->ss = (c>>6)&0x03; in modrm()
1350 ip->index = (c>>3)&0x07; in modrm()
1351 if (ip->index == 4) in modrm()
1352 ip->index = -1; in modrm()
1353 ip->base = c&0x07; in modrm()
1354 return getdisp(map, ip, mod, ip->base, 5, 0); in modrm()
1356 return getdisp(map, ip, mod, rm, 5, ip->amd64); in modrm()
1375 mkinstr(Map *map, Instr *ip, uvlong pc, int is64) in mkinstr() argument
1383 memset(ip, 0, sizeof(*ip)); in mkinstr()
1385 ip->base = -1; in mkinstr()
1386 ip->index = -1; in mkinstr()
1387 ip->osize = 'L'; in mkinstr()
1388 ip->asize = 'E'; in mkinstr()
1389 ip->amd64 = is64; in mkinstr()
1391 ip->addr = pc; in mkinstr()
1392 if (igetc(map, ip, &c) < 0) in mkinstr()
1396 if(ip->amd64 && !norex){ in mkinstr()
1398 ip->rex = c; in mkinstr()
1399 if(igetc(map, ip, &c) < 0) in mkinstr()
1403 if(ip->rex&REXW) in mkinstr()
1411 ip->op = c; in mkinstr()
1417 for (i = 0; i < ip->n && n < sizeof(buf)-3; i++, n+=2) in mkinstr()
1418 _hexify(buf+n, ip->mem[i], 1); in mkinstr()
1426 if (igetc(map, ip, &c) < 0) in mkinstr()
1428 ip->imm = c&0xff; in mkinstr()
1429 ip->imm64 = ip->imm; in mkinstr()
1432 if (igetc(map, ip, &c) < 0) in mkinstr()
1435 ip->imm = c|0xffffff00; in mkinstr()
1437 ip->imm = c&0xff; in mkinstr()
1438 ip->imm64 = (int32)ip->imm; in mkinstr()
1439 ip->jumptype = Jbs; in mkinstr()
1442 if (igetc(map, ip, &c) < 0) in mkinstr()
1445 if (ip->osize == 'L') in mkinstr()
1446 ip->imm = c|0xffffff00; in mkinstr()
1448 ip->imm = c|0xff00; in mkinstr()
1450 ip->imm = c&0xff; in mkinstr()
1451 ip->imm64 = (int32)ip->imm; in mkinstr()
1454 if (igets(map, ip, &s) < 0) in mkinstr()
1456 ip->imm = s&0xffff; in mkinstr()
1457 ip->imm64 = ip->imm; in mkinstr()
1458 ip->jumptype = Iw; in mkinstr()
1461 if (igets(map, ip, &s) < 0) in mkinstr()
1463 ip->imm2 = s&0xffff; in mkinstr()
1466 if (ip->osize == 'L') { in mkinstr()
1467 if (igetl(map, ip, &ip->imm) < 0) in mkinstr()
1469 ip->imm64 = ip->imm; in mkinstr()
1470 if(ip->rex&REXW && (ip->imm & (1<<31)) != 0) in mkinstr()
1471 ip->imm64 |= (vlong)~0 << 32; in mkinstr()
1473 if (igets(map, ip, &s)< 0) in mkinstr()
1475 ip->imm = s&0xffff; in mkinstr()
1476 ip->imm64 = ip->imm; in mkinstr()
1480 if (ip->osize == 'L') { in mkinstr()
1481 if (igetl(map, ip, &ip->imm) < 0) in mkinstr()
1483 ip->imm64 = ip->imm; in mkinstr()
1484 if (ip->rex & REXW) { in mkinstr()
1486 if (igetl(map, ip, &l) < 0) in mkinstr()
1488 ip->imm64 |= (uvlong)l << 32; in mkinstr()
1491 if (igets(map, ip, &s)< 0) in mkinstr()
1493 ip->imm = s&0xffff; in mkinstr()
1497 if (ip->asize == 'E') { in mkinstr()
1498 if (igetl(map, ip, &ip->imm) < 0) in mkinstr()
1502 if (igets(map, ip, &s)< 0) in mkinstr()
1504 ip->imm = s&0xffff; in mkinstr()
1508 if (ip->osize == 'L') { in mkinstr()
1509 if (igetl(map, ip, &ip->imm) < 0) in mkinstr()
1512 if (igets(map, ip, &s)< 0) in mkinstr()
1515 ip->imm = s|0xffff0000; in mkinstr()
1517 ip->imm = s&0xffff; in mkinstr()
1519 ip->jumptype = Iwds; in mkinstr()
1522 if (igetc(map, ip, &c) < 0) in mkinstr()
1528 if (ip->base != 0) in mkinstr()
1532 if (ip->base != 1) in mkinstr()
1536 if (igetc(map, ip, &c) < 0) in mkinstr()
1538 if (modrm(map, ip, c) < 0) in mkinstr()
1540 ip->osize = 'B'; in mkinstr()
1543 if (igetc(map, ip, &c) < 0) in mkinstr()
1545 if (modrm(map, ip, c) < 0) in mkinstr()
1549 if (igetc(map, ip, &c) < 0) in mkinstr()
1551 if (modrm(map, ip, c) < 0) in mkinstr()
1553 c = ip->reg; /* secondary op code */ in mkinstr()
1555 ip->osize = 'B'; in mkinstr()
1558 if (igetc(map, ip, &c) < 0) in mkinstr()
1560 if (modrm(map, ip, c) < 0) in mkinstr()
1563 if(ip->amd64 && obase == optab0F01 && c == 0xF8) in mkinstr()
1565 c = ip->reg; in mkinstr()
1568 if (igetc(map, ip, &c) < 0) in mkinstr()
1570 if (modrm(map, ip, c) < 0) in mkinstr()
1573 c = ip->reg+8; /* 16 entry table */ in mkinstr()
1575 c = ip->reg; in mkinstr()
1579 if (igetc(map, ip, &c) < 0) in mkinstr()
1581 if (modrm(map, ip, c) < 0) in mkinstr()
1586 c = ip->reg; in mkinstr()
1590 if (igetc(map, ip, &c) < 0) in mkinstr()
1596 if (modrm(map, ip, c) < 0) in mkinstr()
1600 if (igetc(map, ip, &c) < 0) in mkinstr()
1606 if (modrm(map, ip, c) < 0) in mkinstr()
1610 if (ip->osize == 'L') { in mkinstr()
1611 if (igetl(map, ip, &ip->disp) < 0) in mkinstr()
1614 if (igets(map, ip, &s)< 0) in mkinstr()
1616 ip->disp = s&0xffff; in mkinstr()
1618 if (igets(map, ip, (ushort*)&ip->seg) < 0) in mkinstr()
1620 ip->jumptype = PTR; in mkinstr()
1623 if (igetc(map, ip, &c) < 0) in mkinstr()
1626 switch (ip->opre) { in mkinstr()
1639 if (igetc(map, ip, &c) < 0) in mkinstr()
1643 ip->opre = c; in mkinstr()
1646 ip->prefix = (char*)op->proto; in mkinstr()
1647 if (igetc(map, ip, &c) < 0) in mkinstr()
1649 if (ip->opre && c == 0x0F) in mkinstr()
1650 ip->prefix = 0; in mkinstr()
1653 ip->segment = (char*)op->proto; in mkinstr()
1654 if (igetc(map, ip, &c) < 0) in mkinstr()
1658 ip->opre = c; in mkinstr()
1659 ip->osize = 'W'; in mkinstr()
1660 if (igetc(map, ip, &c) < 0) in mkinstr()
1663 ip->osize = 'L'; in mkinstr()
1664 else if (ip->amd64 && (c&0xF0) == 0x40) in mkinstr()
1665 ip->osize = 'Q'; in mkinstr()
1668 ip->asize = 0; in mkinstr()
1669 if (igetc(map, ip, &c) < 0) in mkinstr()
1674 ip->jumptype = op->operand[i]; in mkinstr()
1685 bprint(Instr *ip, char *fmt, ...) in bprint() argument
1690 ip->curr = vseprint(ip->curr, ip->end, fmt, arg); in bprint()
1701 #define ANAME(ip) "" argument
1702 #define ONAME(ip) "" argument
1731 immediate(Instr *ip, vlong val) in immediate() argument
1734 if((ip->rex & REXW) == 0) in immediate()
1735 bprint(ip, "%#lux", (long)val); in immediate()
1737 bprint(ip, "%#llux", val); in immediate()
1741 pea(Instr *ip) in pea() argument
1745 base = ip->base; in pea()
1746 if(base >= 0 && (ip->rex & REXB)) in pea()
1749 if (ip->mod == 3) { in pea()
1750 if (ip->osize == 'B') in pea()
1751 bprint(ip, (ip->rex & REXB? breg64: breg)[(uchar)ip->base]); in pea()
1753 bprint(ip, "%s%s", ANAME(ip), reg[base]); in pea()
1757 if (ip->segment) in pea()
1758 bprint(ip, ip->segment); in pea()
1760 if (ip->base < 0) in pea()
1761 immediate(ip, ip->disp); in pea()
1763 bprint(ip, "%#ux", ip->disp); in pea()
1764 if(ip->rip) in pea()
1765 bprint(ip, "(RIP)"); in pea()
1766 bprint(ip,"(%s%s)", ANAME(ip), reg[ip->rex&REXB? ip->base+8: ip->base]); in pea()
1769 if (ip->index >= 0) in pea()
1770 bprint(ip,"(%s%s*%d)", ANAME(ip), reg[ip->rex&REXX? ip->index+8: ip->index], 1<<ip->ss); in pea()
1774 prinstr(Instr *ip, char *fmt) in prinstr() argument
1779 if (ip->prefix) in prinstr()
1780 bprint(ip, "%s ", ip->prefix); in prinstr()
1781 for (; *fmt && ip->curr < ip->end; fmt++) { in prinstr()
1783 *ip->curr++ = *fmt; in prinstr()
1793 *ip->curr++ = '%'; in prinstr()
1796 bprint(ip, "%s", ANAME(ip)); in prinstr()
1799 bprint(ip, "CR%d", ip->reg); in prinstr()
1802 if (ip->reg < 4 || ip->reg == 6 || ip->reg == 7) in prinstr()
1803 bprint(ip, "DR%d",ip->reg); in prinstr()
1805 bprint(ip, "???"); in prinstr()
1808 bprint(ip, "$"); in prinstr()
1809 immediate(ip, ip->imm2); in prinstr()
1812 bprint(ip,"%s", ONAME(ip)); in prinstr()
1815 i = ip->op & 7; in prinstr()
1816 if(ip->rex & REXB) in prinstr()
1818 bprint(ip, "%s", reg[i]); in prinstr()
1822 bprint(ip, "$"); in prinstr()
1823 v = ip->imm; in prinstr()
1824 if(ip->rex & REXW) in prinstr()
1825 v = ip->imm64; in prinstr()
1826 immediate(ip, v); in prinstr()
1829 bprint(ip, "%s%s", ONAME(ip), reg[ip->rex&REXR? ip->reg+8: ip->reg]); in prinstr()
1832 if(ip->osize == 'Q' || (ip->osize == 'L' && ip->rex & REXW)) in prinstr()
1833 bprint(ip, "Q"); in prinstr()
1835 bprint(ip, "%c", ip->osize); in prinstr()
1838 if(ip->opre == 0 || ip->opre == 0x66) in prinstr()
1839 bprint(ip, "P"); in prinstr()
1841 bprint(ip, "S"); in prinstr()
1842 if(ip->opre == 0xf2 || ip->opre == 0x66) in prinstr()
1843 bprint(ip, "D"); in prinstr()
1845 bprint(ip, "S"); in prinstr()
1848 if (ip->reg == 6 || ip->reg == 7) in prinstr()
1849 bprint(ip, "TR%d",ip->reg); in prinstr()
1851 bprint(ip, "???"); in prinstr()
1854 if (ip->osize == 'Q' || (ip->osize == 'L' && ip->rex & REXW)) in prinstr()
1855 bprint(ip, "CDQE"); in prinstr()
1856 else if (ip->osize == 'L') in prinstr()
1857 bprint(ip,"CWDE"); in prinstr()
1859 bprint(ip, "CBW"); in prinstr()
1862 bprint(ip,"%#ux:%#ux", ip->seg, ip->disp); in prinstr()
1865 if (ip->mod == 3 && ip->osize != 'B') { in prinstr()
1867 if(ip->opre != 0) { in prinstr()
1868 bprint(ip, "X%d", ip->rex&REXB? ip->base+8: ip->base); in prinstr()
1873 bprint(ip, "M%d", ip->base); in prinstr()
1876 pea(ip); in prinstr()
1879 pea(ip); in prinstr()
1882 bprint(ip, "F%d", ip->base); in prinstr()
1885 if (ip->reg < 6) in prinstr()
1886 bprint(ip,"%s",sreg[ip->reg]); in prinstr()
1888 bprint(ip,"???"); in prinstr()
1894 v = (int32)ip->imm; in prinstr()
1895 immediate(ip, v+ip->addr+ip->n); in prinstr()
1898 if (ip->osize == 'B') in prinstr()
1899 bprint(ip,"%s", (ip->rex? breg64: breg)[ip->rex&REXR? ip->reg+8: ip->reg]); in prinstr()
1901 bprint(ip, reg[ip->rex&REXR? ip->reg+8: ip->reg]); in prinstr()
1904 if (ip->osize == 'Q' || ip->rex & REXW) in prinstr()
1905 bprint(ip, "CQO"); in prinstr()
1906 else if (ip->osize == 'L') in prinstr()
1907 bprint(ip,"CDQ"); in prinstr()
1909 bprint(ip, "CWD"); in prinstr()
1912 if(ip->opre != 0) in prinstr()
1913 bprint(ip, "X%d", ip->rex&REXR? ip->reg+8: ip->reg); in prinstr()
1915 bprint(ip, "M%d", ip->reg); in prinstr()
1918 if (ip->mod == 3 && ip->osize != 'B') { in prinstr()
1919 bprint(ip, "X%d", ip->rex&REXB? ip->base+8: ip->base); in prinstr()
1922 pea(ip); in prinstr()
1925 bprint(ip, "X%d", ip->rex&REXR? ip->reg+8: ip->reg); in prinstr()
1928 bprint(ip, "%%%c", *fmt); in prinstr()
1932 *ip->curr = 0; /* there's always room for 1 byte */ in prinstr()