Lines Matching +full:cmd +full:- +full:db

29     printf(TARGET_FMT_lx ": failed to decode instruction ", env->eip);  in decode_invalid()
30 for (int i = 0; i < decode->opcode_len; i++) { in decode_invalid()
31 printf("%x ", decode->opcode[i]); in decode_invalid()
74 target_ulong va = linear_rip(env_cpu(env), env->eip) + decode->len; in decode_bytes()
75 emul_ops->read_mem(env_cpu(env), &val, va, size); in decode_bytes()
76 decode->len += size; in decode_bytes()
104 op->type = X86_VAR_RM; in decode_modrm_rm()
110 op->type = X86_VAR_REG; in decode_modrm_reg()
111 op->reg = decode->modrm.reg; in decode_modrm_reg()
112 op->regptr = get_reg_ref(env, op->reg, decode->rex.rex, decode->rex.r, in decode_modrm_reg()
113 decode->operand_size); in decode_modrm_reg()
119 op->type = X86_VAR_REG; in decode_rax()
120 op->reg = R_EAX; in decode_rax()
122 op->regptr = get_reg_ref(env, op->reg, false, 0, in decode_rax()
123 decode->operand_size); in decode_rax()
129 var->type = X86_VAR_IMMEDIATE; in decode_immediate()
130 var->size = size; in decode_immediate()
133 var->val = decode_byte(env, decode); in decode_immediate()
136 var->val = decode_word(env, decode); in decode_immediate()
139 var->val = decode_dword(env, decode); in decode_immediate()
142 var->val = decode_qword(env, decode); in decode_immediate()
153 op->type = X86_VAR_IMMEDIATE; in decode_imm8()
160 op->val = sign(op->val, 1); in decode_imm8_signed()
161 op->type = X86_VAR_IMMEDIATE; in decode_imm8_signed()
168 op->type = X86_VAR_IMMEDIATE; in decode_imm16()
175 if (8 == decode->operand_size) { in decode_imm()
177 op->val = sign(op->val, decode->operand_size); in decode_imm()
179 decode_immediate(env, decode, op, decode->operand_size); in decode_imm()
181 op->type = X86_VAR_IMMEDIATE; in decode_imm()
187 decode_immediate(env, decode, op, decode->operand_size); in decode_imm_signed()
188 op->val = sign(op->val, decode->operand_size); in decode_imm_signed()
189 op->type = X86_VAR_IMMEDIATE; in decode_imm_signed()
195 op->type = X86_VAR_IMMEDIATE; in decode_imm_1()
196 op->val = 1; in decode_imm_1()
202 op->type = X86_VAR_IMMEDIATE; in decode_imm_0()
203 op->val = 0; in decode_imm_0()
209 uint8_t op = (decode->opcode_len > 1) ? decode->opcode[1] : decode->opcode[0]; in decode_pushseg()
211 decode->op[0].type = X86_VAR_REG; in decode_pushseg()
214 decode->op[0].reg = R_CS; in decode_pushseg()
217 decode->op[0].reg = R_SS; in decode_pushseg()
220 decode->op[0].reg = R_DS; in decode_pushseg()
223 decode->op[0].reg = R_ES; in decode_pushseg()
226 decode->op[0].reg = R_FS; in decode_pushseg()
229 decode->op[0].reg = R_GS; in decode_pushseg()
236 uint8_t op = (decode->opcode_len > 1) ? decode->opcode[1] : decode->opcode[0]; in decode_popseg()
238 decode->op[0].type = X86_VAR_REG; in decode_popseg()
241 decode->op[0].reg = R_CS; in decode_popseg()
244 decode->op[0].reg = R_SS; in decode_popseg()
247 decode->op[0].reg = R_DS; in decode_popseg()
250 decode->op[0].reg = R_ES; in decode_popseg()
253 decode->op[0].reg = R_FS; in decode_popseg()
256 decode->op[0].reg = R_GS; in decode_popseg()
263 decode->op[0].type = X86_VAR_REG; in decode_incgroup()
264 decode->op[0].reg = decode->opcode[0] - 0x40; in decode_incgroup()
265 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_incgroup()
266 decode->rex.b, decode->operand_size); in decode_incgroup()
271 decode->op[0].type = X86_VAR_REG; in decode_decgroup()
272 decode->op[0].reg = decode->opcode[0] - 0x48; in decode_decgroup()
273 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_decgroup()
274 decode->rex.b, decode->operand_size); in decode_decgroup()
279 if (!decode->modrm.reg) { in decode_incgroup2()
280 decode->cmd = X86_DECODE_CMD_INC; in decode_incgroup2()
281 } else if (1 == decode->modrm.reg) { in decode_incgroup2()
282 decode->cmd = X86_DECODE_CMD_DEC; in decode_incgroup2()
288 decode->op[0].type = X86_VAR_REG; in decode_pushgroup()
289 decode->op[0].reg = decode->opcode[0] - 0x50; in decode_pushgroup()
290 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_pushgroup()
291 decode->rex.b, decode->operand_size); in decode_pushgroup()
296 decode->op[0].type = X86_VAR_REG; in decode_popgroup()
297 decode->op[0].reg = decode->opcode[0] - 0x58; in decode_popgroup()
298 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_popgroup()
299 decode->rex.b, decode->operand_size); in decode_popgroup()
304 decode->displacement = decode_bytes(env, decode, decode->operand_size); in decode_jxx()
305 decode->displacement_size = decode->operand_size; in decode_jxx()
310 decode->op[0].type = X86_VAR_IMMEDIATE; in decode_farjmp()
311 decode->op[0].val = decode_bytes(env, decode, decode->operand_size); in decode_farjmp()
312 decode->displacement = decode_word(env, decode); in decode_farjmp()
327 decode->cmd = group[decode->modrm.reg]; in decode_addgroup()
342 decode->cmd = group[decode->modrm.reg]; in decode_rotgroup()
357 decode->cmd = group[decode->modrm.reg]; in decode_f7group()
358 decode_modrm_rm(env, decode, &decode->op[0]); in decode_f7group()
360 switch (decode->modrm.reg) { in decode_f7group()
363 decode_imm(env, decode, &decode->op[1]); in decode_f7group()
368 decode->op[1].type = X86_VAR_IMMEDIATE; in decode_f7group()
369 decode->op[1].val = 0; in decode_f7group()
378 decode->op[0].type = X86_VAR_REG; in decode_xchgroup()
379 decode->op[0].reg = decode->opcode[0] - 0x90; in decode_xchgroup()
380 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_xchgroup()
381 decode->rex.b, decode->operand_size); in decode_xchgroup()
386 decode->op[0].type = X86_VAR_REG; in decode_movgroup()
387 decode->op[0].reg = decode->opcode[0] - 0xb8; in decode_movgroup()
388 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_movgroup()
389 decode->rex.b, decode->operand_size); in decode_movgroup()
390 decode_immediate(env, decode, &decode->op[1], decode->operand_size); in decode_movgroup()
396 op->type = X86_VAR_OFFSET; in fetch_moffs()
397 op->addr = decode_bytes(env, decode, decode->addressing_size); in fetch_moffs()
402 decode->op[0].type = X86_VAR_REG; in decode_movgroup8()
403 decode->op[0].reg = decode->opcode[0] - 0xb0; in decode_movgroup8()
404 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_movgroup8()
405 decode->rex.b, decode->operand_size); in decode_movgroup8()
406 decode_immediate(env, decode, &decode->op[1], decode->operand_size); in decode_movgroup8()
412 op->type = X86_VAR_REG; in decode_rcx()
413 op->reg = R_ECX; in decode_rcx()
414 op->regptr = get_reg_ref(env, op->reg, decode->rex.rex, decode->rex.b, in decode_rcx()
415 decode->operand_size); in decode_rcx()
420 enum x86_decode_cmd cmd; member
438 enum x86_decode_cmd cmd; member
460 decode->is_fpu = true; in decode_x87_ins()
461 int mode = decode->modrm.mod == 3 ? 1 : 0; in decode_x87_ins()
462 int index = ((decode->opcode[0] & 0xf) << 4) | (mode << 3) | in decode_x87_ins()
463 decode->modrm.reg; in decode_x87_ins()
467 decode->cmd = decoder->cmd; in decode_x87_ins()
468 if (decoder->operand_size) { in decode_x87_ins()
469 decode->operand_size = decoder->operand_size; in decode_x87_ins()
471 decode->fpop_stack = decoder->pop; in decode_x87_ins()
472 decode->frev = decoder->rev; in decode_x87_ins()
474 if (decoder->decode_op1) { in decode_x87_ins()
475 decoder->decode_op1(env, decode, &decode->op[0]); in decode_x87_ins()
477 if (decoder->decode_op2) { in decode_x87_ins()
478 decoder->decode_op2(env, decode, &decode->op[1]); in decode_x87_ins()
480 if (decoder->decode_postfix) { in decode_x87_ins()
481 decoder->decode_postfix(env, decode); in decode_x87_ins()
484 VM_PANIC_ON_EX(!decode->cmd, "x87 opcode %x %x (%x %x) not decoded\n", in decode_x87_ins()
485 decode->opcode[0], decode->modrm.modrm, decoder->modrm_reg, in decode_x87_ins()
486 decoder->modrm_mod); in decode_x87_ins()
502 decode->cmd = group[decode->modrm.reg]; in decode_ffgroup()
518 decode->cmd = group[decode->modrm.reg]; in decode_sldtgroup()
533 decode->cmd = group[decode->modrm.reg]; in decode_lidtgroup()
534 if (0xf9 == decode->modrm.modrm) { in decode_lidtgroup()
535 decode->opcode[decode->len++] = decode->modrm.modrm; in decode_lidtgroup()
536 decode->cmd = X86_DECODE_CMD_RDTSCP; in decode_lidtgroup()
552 decode->cmd = group[decode->modrm.reg]; in decode_btgroup()
557 decode->is_fpu = true; in decode_x87_general()
563 op->type = X87_VAR_FLOATP; in decode_x87_modrm_floatp()
569 op->type = X87_VAR_INTP; in decode_x87_modrm_intp()
575 op->type = X87_VAR_BYTEP; in decode_x87_modrm_bytep()
581 op->type = X87_VAR_REG; in decode_x87_modrm_st0()
582 op->reg = 0; in decode_x87_modrm_st0()
589 op->type = X87_VAR_REG; in decode_decode_x87_modrm_st0()
590 op->reg = decode->modrm.modrm & 7; in decode_decode_x87_modrm_st0()
596 decode->is_fpu = true; in decode_aegroup()
597 switch (decode->modrm.reg) { in decode_aegroup()
599 decode->cmd = X86_DECODE_CMD_FXSAVE; in decode_aegroup()
600 decode_x87_modrm_bytep(env, decode, &decode->op[0]); in decode_aegroup()
603 decode_x87_modrm_bytep(env, decode, &decode->op[0]); in decode_aegroup()
604 decode->cmd = X86_DECODE_CMD_FXRSTOR; in decode_aegroup()
607 if (decode->modrm.modrm == 0xe8) { in decode_aegroup()
608 decode->cmd = X86_DECODE_CMD_LFENCE; in decode_aegroup()
614 VM_PANIC_ON(decode->modrm.modrm != 0xf0); in decode_aegroup()
615 decode->cmd = X86_DECODE_CMD_MFENCE; in decode_aegroup()
618 if (decode->modrm.modrm == 0xf8) { in decode_aegroup()
619 decode->cmd = X86_DECODE_CMD_SFENCE; in decode_aegroup()
621 decode->cmd = X86_DECODE_CMD_CLFLUSH; in decode_aegroup()
625 VM_PANIC_EX("0xae: reg %d\n", decode->modrm.reg); in decode_aegroup()
632 decode->op[0].type = X86_VAR_REG; in decode_bswap()
633 decode->op[0].reg = decode->opcode[1] - 0xc8; in decode_bswap()
634 decode->op[0].regptr = get_reg_ref(env, decode->op[0].reg, decode->rex.rex, in decode_bswap()
635 decode->rex.b, decode->operand_size); in decode_bswap()
640 switch (decode->modrm.modrm) { in decode_d9_4()
643 decode->cmd = X86_DECODE_CMD_FCHS; in decode_d9_4()
646 decode->cmd = X86_DECODE_CMD_FABS; in decode_d9_4()
653 decode->cmd = X86_DECODE_CMD_FXAM; in decode_d9_4()
663 switch (decode->modrm.modrm) { in decode_db_4()
665 VM_PANIC_EX("unhandled FNENI: %x %x\n", decode->opcode[0], in decode_db_4()
666 decode->modrm.modrm); in decode_db_4()
669 VM_PANIC_EX("unhandled FNDISI: %x %x\n", decode->opcode[0], in decode_db_4()
670 decode->modrm.modrm); in decode_db_4()
673 VM_PANIC_EX("unhandled FCLEX: %x %x\n", decode->opcode[0], in decode_db_4()
674 decode->modrm.modrm); in decode_db_4()
677 decode->cmd = X86_DECODE_CMD_FNINIT; in decode_db_4()
680 decode->cmd = X86_DECODE_CMD_FNSETPM; in decode_db_4()
683 VM_PANIC_EX("unhandled fpu opcode: %x %x\n", decode->opcode[0], in decode_db_4()
684 decode->modrm.modrm); in decode_db_4()
1619 if (!decode->modrm.mod && 6 == decode->modrm.rm) { in calc_modrm_operand16()
1620 ptr = decode->displacement; in calc_modrm_operand16()
1624 if (decode->displacement_size) { in calc_modrm_operand16()
1625 ptr = sign(decode->displacement, decode->displacement_size); in calc_modrm_operand16()
1628 switch (decode->modrm.rm) { in calc_modrm_operand16()
1658 if (X86_DECODE_CMD_LEA == decode->cmd) { in calc_modrm_operand16()
1659 op->addr = (uint16_t)ptr; in calc_modrm_operand16()
1661 op->addr = decode_linear_addr(env, decode, (uint16_t)ptr, seg); in calc_modrm_operand16()
1679 ptr = &RH(env, reg - 4); in get_reg_ref()
1704 int addr_size = decode->addressing_size; in get_sib_val()
1705 int base_reg = decode->sib.base; in get_sib_val()
1706 int index_reg = decode->sib.index; in get_sib_val()
1710 if (decode->modrm.mod || base_reg != R_EBP) { in get_sib_val()
1711 if (decode->rex.b) { in get_sib_val()
1717 base = get_reg_val(env, decode->sib.base, decode->rex.rex, in get_sib_val()
1718 decode->rex.b, addr_size); in get_sib_val()
1721 if (decode->rex.x) { in get_sib_val()
1726 scaled_index = get_reg_val(env, index_reg, decode->rex.rex, in get_sib_val()
1727 decode->rex.x, addr_size) << in get_sib_val()
1728 decode->sib.scale; in get_sib_val()
1738 int addr_size = decode->addressing_size; in calc_modrm_operand32()
1740 if (decode->displacement_size) { in calc_modrm_operand32()
1741 ptr = sign(decode->displacement, decode->displacement_size); in calc_modrm_operand32()
1744 if (4 == decode->modrm.rm) { in calc_modrm_operand32()
1746 } else if (!decode->modrm.mod && 5 == decode->modrm.rm) { in calc_modrm_operand32()
1748 ptr += env->eip + decode->len; in calc_modrm_operand32()
1750 ptr = decode->displacement; in calc_modrm_operand32()
1753 if (decode->modrm.rm == R_EBP || decode->modrm.rm == R_ESP) { in calc_modrm_operand32()
1756 ptr += get_reg_val(env, decode->modrm.rm, decode->rex.rex, in calc_modrm_operand32()
1757 decode->rex.b, addr_size); in calc_modrm_operand32()
1760 if (X86_DECODE_CMD_LEA == decode->cmd) { in calc_modrm_operand32()
1761 op->addr = (uint32_t)ptr; in calc_modrm_operand32()
1763 op->addr = decode_linear_addr(env, decode, (uint32_t)ptr, seg); in calc_modrm_operand32()
1772 int mod = decode->modrm.mod; in calc_modrm_operand64()
1773 int rm = decode->modrm.rm; in calc_modrm_operand64()
1775 int src = decode->modrm.rm; in calc_modrm_operand64()
1777 if (decode->displacement_size) { in calc_modrm_operand64()
1778 offset = sign(decode->displacement, decode->displacement_size); in calc_modrm_operand64()
1784 ptr = env->eip + decode->len + (int32_t) offset; in calc_modrm_operand64()
1786 ptr = get_reg_val(env, src, decode->rex.rex, decode->rex.b, 8) + in calc_modrm_operand64()
1790 if (X86_DECODE_CMD_LEA == decode->cmd) { in calc_modrm_operand64()
1791 op->addr = ptr; in calc_modrm_operand64()
1793 op->addr = decode_linear_addr(env, decode, ptr, seg); in calc_modrm_operand64()
1801 if (3 == decode->modrm.mod) { in calc_modrm_operand()
1802 op->reg = decode->modrm.reg; in calc_modrm_operand()
1803 op->type = X86_VAR_REG; in calc_modrm_operand()
1804 op->regptr = get_reg_ref(env, decode->modrm.rm, decode->rex.rex, in calc_modrm_operand()
1805 decode->rex.b, decode->operand_size); in calc_modrm_operand()
1809 switch (decode->addressing_size) { in calc_modrm_operand()
1820 VM_PANIC_EX("unsupported address size %d\n", decode->addressing_size); in calc_modrm_operand()
1836 decode->lock = byte; in decode_prefix()
1837 decode->rex.rex = 0; in decode_prefix()
1841 decode->rep = byte; in decode_prefix()
1842 decode->rex.rex = 0; in decode_prefix()
1850 decode->segment_override = byte; in decode_prefix()
1851 decode->rex.rex = 0; in decode_prefix()
1854 decode->op_size_override = byte; in decode_prefix()
1855 decode->rex.rex = 0; in decode_prefix()
1858 decode->addr_size_override = byte; in decode_prefix()
1859 decode->rex.rex = 0; in decode_prefix()
1863 decode->rex.rex = byte; in decode_prefix()
1868 decode->len--; in decode_prefix()
1876 decode->addressing_size = -1; in set_addressing_size()
1878 if (decode->addr_size_override) { in set_addressing_size()
1879 decode->addressing_size = 4; in set_addressing_size()
1881 decode->addressing_size = 2; in set_addressing_size()
1886 emul_ops->read_segment_descriptor(env_cpu(env), &cs, R_CS); in set_addressing_size()
1887 /* check db */ in set_addressing_size()
1888 if (cs.db) { in set_addressing_size()
1889 if (decode->addr_size_override) { in set_addressing_size()
1890 decode->addressing_size = 2; in set_addressing_size()
1892 decode->addressing_size = 4; in set_addressing_size()
1895 if (decode->addr_size_override) { in set_addressing_size()
1896 decode->addressing_size = 4; in set_addressing_size()
1898 decode->addressing_size = 2; in set_addressing_size()
1903 if (decode->addr_size_override) { in set_addressing_size()
1904 decode->addressing_size = 4; in set_addressing_size()
1906 decode->addressing_size = 8; in set_addressing_size()
1913 decode->operand_size = -1; in set_operand_size()
1915 if (decode->op_size_override) { in set_operand_size()
1916 decode->operand_size = 4; in set_operand_size()
1918 decode->operand_size = 2; in set_operand_size()
1923 emul_ops->read_segment_descriptor(env_cpu(env), &cs, R_CS); in set_operand_size()
1924 /* check db */ in set_operand_size()
1925 if (cs.db) { in set_operand_size()
1926 if (decode->op_size_override) { in set_operand_size()
1927 decode->operand_size = 2; in set_operand_size()
1929 decode->operand_size = 4; in set_operand_size()
1932 if (decode->op_size_override) { in set_operand_size()
1933 decode->operand_size = 4; in set_operand_size()
1935 decode->operand_size = 2; in set_operand_size()
1940 if (decode->op_size_override) { in set_operand_size()
1941 decode->operand_size = 2; in set_operand_size()
1943 decode->operand_size = 4; in set_operand_size()
1946 if (decode->rex.w) { in set_operand_size()
1947 decode->operand_size = 8; in set_operand_size()
1954 if ((decode->modrm.mod != 3) && (4 == decode->modrm.rm) && in decode_sib()
1955 (decode->addressing_size != 2)) { in decode_sib()
1956 decode->sib.sib = decode_byte(env, decode); in decode_sib()
1957 decode->sib_present = true; in decode_sib()
1969 /* 32/64-bit modrm */
1971 {0, 0, 0, 0, -1, 4, 0, 0},
1979 int addressing_size = decode->addressing_size; in decode_displacement()
1980 int mod = decode->modrm.mod; in decode_displacement()
1981 int rm = decode->modrm.rm; in decode_displacement()
1983 decode->displacement_size = 0; in decode_displacement()
1986 decode->displacement_size = disp16_tbl[mod][rm]; in decode_displacement()
1987 if (decode->displacement_size) { in decode_displacement()
1988 decode->displacement = (uint16_t)decode_bytes(env, decode, in decode_displacement()
1989 decode->displacement_size); in decode_displacement()
1994 if (-1 == disp32_tbl[mod][rm]) { in decode_displacement()
1995 if (5 == decode->sib.base) { in decode_displacement()
1996 decode->displacement_size = 4; in decode_displacement()
1999 decode->displacement_size = disp32_tbl[mod][rm]; in decode_displacement()
2002 if (decode->displacement_size) { in decode_displacement()
2003 decode->displacement = (uint32_t)decode_bytes(env, decode, in decode_displacement()
2004 decode->displacement_size); in decode_displacement()
2012 decode->modrm.modrm = decode_byte(env, decode); in decode_modrm()
2013 decode->is_modrm = true; in decode_modrm()
2024 decode->cmd = inst_decoder->cmd; in decode_opcode_general()
2025 if (inst_decoder->operand_size) { in decode_opcode_general()
2026 decode->operand_size = inst_decoder->operand_size; in decode_opcode_general()
2029 if (inst_decoder->is_modrm) { in decode_opcode_general()
2032 if (inst_decoder->decode_op1) { in decode_opcode_general()
2033 inst_decoder->decode_op1(env, decode, &decode->op[0]); in decode_opcode_general()
2035 if (inst_decoder->decode_op2) { in decode_opcode_general()
2036 inst_decoder->decode_op2(env, decode, &decode->op[1]); in decode_opcode_general()
2038 if (inst_decoder->decode_op3) { in decode_opcode_general()
2039 inst_decoder->decode_op3(env, decode, &decode->op[2]); in decode_opcode_general()
2041 if (inst_decoder->decode_op4) { in decode_opcode_general()
2042 inst_decoder->decode_op4(env, decode, &decode->op[3]); in decode_opcode_general()
2044 if (inst_decoder->decode_postfix) { in decode_opcode_general()
2045 inst_decoder->decode_postfix(env, decode); in decode_opcode_general()
2069 decode->opcode[decode->opcode_len++] = opcode; in decode_opcodes()
2074 decode->opcode[decode->opcode_len++] = opcode; in decode_opcodes()
2088 return decode->len; in decode_instruction()
2120 const char *decode_cmd_to_string(enum x86_decode_cmd cmd) in decode_cmd_to_string() argument
2144 return cmds[cmd]; in decode_cmd_to_string()
2150 switch (decode->segment_override) { in decode_linear_addr()
2172 return linear_addr_size(env_cpu(env), addr, decode->addressing_size, seg); in decode_linear_addr()