Revision b5b38f61 target-i386/translate.c
b/target-i386/translate.c | ||
---|---|---|
2275 | 2275 |
gen_op_mov_TN_reg(OT_LONG, 0, R_EBP); |
2276 | 2276 |
gen_op_st_T0_A0(ot + s->mem_index); |
2277 | 2277 |
if (level) { |
2278 |
gen_op_enter64_level(level, (ot == OT_QUAD)); |
|
2278 |
/* XXX: must save state */ |
|
2279 |
tcg_gen_helper_0_2(helper_enter64_level, |
|
2280 |
tcg_const_i32(level), |
|
2281 |
tcg_const_i32((ot == OT_QUAD))); |
|
2279 | 2282 |
} |
2280 | 2283 |
gen_op_mov_reg_T1(ot, R_EBP); |
2281 | 2284 |
gen_op_addl_T1_im( -esp_addend + (-opsize * level) ); |
... | ... | |
2297 | 2300 |
gen_op_mov_TN_reg(OT_LONG, 0, R_EBP); |
2298 | 2301 |
gen_op_st_T0_A0(ot + s->mem_index); |
2299 | 2302 |
if (level) { |
2300 |
gen_op_enter_level(level, s->dflag); |
|
2303 |
/* XXX: must save state */ |
|
2304 |
tcg_gen_helper_0_2(helper_enter_level, |
|
2305 |
tcg_const_i32(level), |
|
2306 |
tcg_const_i32(s->dflag)); |
|
2301 | 2307 |
} |
2302 | 2308 |
gen_op_mov_reg_T1(ot, R_EBP); |
2303 | 2309 |
gen_op_addl_T1_im( -esp_addend + (-opsize * level) ); |
... | ... | |
2310 | 2316 |
if (s->cc_op != CC_OP_DYNAMIC) |
2311 | 2317 |
gen_op_set_cc_op(s->cc_op); |
2312 | 2318 |
gen_jmp_im(cur_eip); |
2313 |
gen_op_raise_exception(trapno);
|
|
2319 |
tcg_gen_helper_0_1(helper_raise_exception, tcg_const_i32(trapno));
|
|
2314 | 2320 |
s->is_jmp = 3; |
2315 | 2321 |
} |
2316 | 2322 |
|
... | ... | |
2322 | 2328 |
if (s->cc_op != CC_OP_DYNAMIC) |
2323 | 2329 |
gen_op_set_cc_op(s->cc_op); |
2324 | 2330 |
gen_jmp_im(cur_eip); |
2325 |
gen_op_raise_interrupt(intno, (int)(next_eip - cur_eip)); |
|
2331 |
tcg_gen_helper_0_2(helper_raise_interrupt, |
|
2332 |
tcg_const_i32(intno), |
|
2333 |
tcg_const_i32(next_eip - cur_eip)); |
|
2326 | 2334 |
s->is_jmp = 3; |
2327 | 2335 |
} |
2328 | 2336 |
|
... | ... | |
2331 | 2339 |
if (s->cc_op != CC_OP_DYNAMIC) |
2332 | 2340 |
gen_op_set_cc_op(s->cc_op); |
2333 | 2341 |
gen_jmp_im(cur_eip); |
2334 |
gen_op_debug();
|
|
2342 |
tcg_gen_helper_0_0(helper_debug);
|
|
2335 | 2343 |
s->is_jmp = 3; |
2336 | 2344 |
} |
2337 | 2345 |
|
... | ... | |
2342 | 2350 |
if (s->cc_op != CC_OP_DYNAMIC) |
2343 | 2351 |
gen_op_set_cc_op(s->cc_op); |
2344 | 2352 |
if (s->tb->flags & HF_INHIBIT_IRQ_MASK) { |
2345 |
gen_op_reset_inhibit_irq();
|
|
2353 |
tcg_gen_helper_0_0(helper_reset_inhibit_irq);
|
|
2346 | 2354 |
} |
2347 | 2355 |
if (s->singlestep_enabled) { |
2348 |
gen_op_debug();
|
|
2356 |
tcg_gen_helper_0_0(helper_debug);
|
|
2349 | 2357 |
} else if (s->tf) { |
2350 |
gen_op_single_step();
|
|
2358 |
tcg_gen_helper_0_0(helper_single_step);
|
|
2351 | 2359 |
} else { |
2352 | 2360 |
tcg_gen_exit_tb(0); |
2353 | 2361 |
} |
... | ... | |
3659 | 3667 |
switch(ot) { |
3660 | 3668 |
case OT_BYTE: |
3661 | 3669 |
gen_jmp_im(pc_start - s->cs_base); |
3662 |
gen_op_divb_AL_T0();
|
|
3670 |
tcg_gen_helper_0_1(helper_divb_AL, cpu_T[0]);
|
|
3663 | 3671 |
break; |
3664 | 3672 |
case OT_WORD: |
3665 | 3673 |
gen_jmp_im(pc_start - s->cs_base); |
3666 |
gen_op_divw_AX_T0();
|
|
3674 |
tcg_gen_helper_0_1(helper_divw_AX, cpu_T[0]);
|
|
3667 | 3675 |
break; |
3668 | 3676 |
default: |
3669 | 3677 |
case OT_LONG: |
3670 | 3678 |
gen_jmp_im(pc_start - s->cs_base); |
3671 |
#ifdef MACRO_TEST |
|
3672 |
/* XXX: this is just a test */ |
|
3673 |
tcg_gen_macro_2(cpu_T[0], cpu_T[0], MACRO_TEST); |
|
3674 |
#else |
|
3675 |
tcg_gen_helper_0_1(helper_divl_EAX_T0, cpu_T[0]); |
|
3676 |
#endif |
|
3679 |
tcg_gen_helper_0_1(helper_divl_EAX, cpu_T[0]); |
|
3677 | 3680 |
break; |
3678 | 3681 |
#ifdef TARGET_X86_64 |
3679 | 3682 |
case OT_QUAD: |
3680 | 3683 |
gen_jmp_im(pc_start - s->cs_base); |
3681 |
gen_op_divq_EAX_T0();
|
|
3684 |
tcg_gen_helper_0_1(helper_divq_EAX, cpu_T[0]);
|
|
3682 | 3685 |
break; |
3683 | 3686 |
#endif |
3684 | 3687 |
} |
... | ... | |
3687 | 3690 |
switch(ot) { |
3688 | 3691 |
case OT_BYTE: |
3689 | 3692 |
gen_jmp_im(pc_start - s->cs_base); |
3690 |
gen_op_idivb_AL_T0();
|
|
3693 |
tcg_gen_helper_0_1(helper_idivb_AL, cpu_T[0]);
|
|
3691 | 3694 |
break; |
3692 | 3695 |
case OT_WORD: |
3693 | 3696 |
gen_jmp_im(pc_start - s->cs_base); |
3694 |
gen_op_idivw_AX_T0();
|
|
3697 |
tcg_gen_helper_0_1(helper_idivw_AX, cpu_T[0]);
|
|
3695 | 3698 |
break; |
3696 | 3699 |
default: |
3697 | 3700 |
case OT_LONG: |
3698 | 3701 |
gen_jmp_im(pc_start - s->cs_base); |
3699 |
tcg_gen_helper_0_1(helper_idivl_EAX_T0, cpu_T[0]);
|
|
3702 |
tcg_gen_helper_0_1(helper_idivl_EAX, cpu_T[0]); |
|
3700 | 3703 |
break; |
3701 | 3704 |
#ifdef TARGET_X86_64 |
3702 | 3705 |
case OT_QUAD: |
3703 | 3706 |
gen_jmp_im(pc_start - s->cs_base); |
3704 |
gen_op_idivq_EAX_T0();
|
|
3707 |
tcg_gen_helper_0_1(helper_idivq_EAX, cpu_T[0]);
|
|
3705 | 3708 |
break; |
3706 | 3709 |
#endif |
3707 | 3710 |
} |
... | ... | |
4088 | 4091 |
/* If several instructions disable interrupts, only the |
4089 | 4092 |
_first_ does it */ |
4090 | 4093 |
if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) |
4091 |
gen_op_set_inhibit_irq();
|
|
4094 |
tcg_gen_helper_0_0(helper_set_inhibit_irq);
|
|
4092 | 4095 |
s->tf = 0; |
4093 | 4096 |
} |
4094 | 4097 |
if (s->is_jmp) { |
... | ... | |
4164 | 4167 |
/* If several instructions disable interrupts, only the |
4165 | 4168 |
_first_ does it */ |
4166 | 4169 |
if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) |
4167 |
gen_op_set_inhibit_irq();
|
|
4170 |
tcg_gen_helper_0_0(helper_set_inhibit_irq);
|
|
4168 | 4171 |
s->tf = 0; |
4169 | 4172 |
} |
4170 | 4173 |
if (s->is_jmp) { |
... | ... | |
5471 | 5474 |
s->cc_op = CC_OP_EFLAGS; |
5472 | 5475 |
break; |
5473 | 5476 |
case 0xfc: /* cld */ |
5474 |
gen_op_cld(); |
|
5477 |
tcg_gen_movi_i32(cpu_tmp2, 1); |
|
5478 |
tcg_gen_st_i32(cpu_tmp2, cpu_env, offsetof(CPUState, df)); |
|
5475 | 5479 |
break; |
5476 | 5480 |
case 0xfd: /* std */ |
5477 |
gen_op_std(); |
|
5481 |
tcg_gen_movi_i32(cpu_tmp2, -1); |
|
5482 |
tcg_gen_st_i32(cpu_tmp2, cpu_env, offsetof(CPUState, df)); |
|
5478 | 5483 |
break; |
5479 | 5484 |
|
5480 | 5485 |
/************************/ |
... | ... | |
5670 | 5675 |
case 0xfa: /* cli */ |
5671 | 5676 |
if (!s->vm86) { |
5672 | 5677 |
if (s->cpl <= s->iopl) { |
5673 |
gen_op_cli();
|
|
5678 |
tcg_gen_helper_0_0(helper_cli);
|
|
5674 | 5679 |
} else { |
5675 | 5680 |
gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); |
5676 | 5681 |
} |
5677 | 5682 |
} else { |
5678 | 5683 |
if (s->iopl == 3) { |
5679 |
gen_op_cli();
|
|
5684 |
tcg_gen_helper_0_0(helper_cli);
|
|
5680 | 5685 |
} else { |
5681 | 5686 |
gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); |
5682 | 5687 |
} |
... | ... | |
5686 | 5691 |
if (!s->vm86) { |
5687 | 5692 |
if (s->cpl <= s->iopl) { |
5688 | 5693 |
gen_sti: |
5689 |
gen_op_sti();
|
|
5694 |
tcg_gen_helper_0_0(helper_sti);
|
|
5690 | 5695 |
/* interruptions are enabled only the first insn after sti */ |
5691 | 5696 |
/* If several instructions disable interrupts, only the |
5692 | 5697 |
_first_ does it */ |
5693 | 5698 |
if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) |
5694 |
gen_op_set_inhibit_irq();
|
|
5699 |
tcg_gen_helper_0_0(helper_set_inhibit_irq);
|
|
5695 | 5700 |
/* give a chance to handle pending irqs */ |
5696 | 5701 |
gen_jmp_im(s->pc - s->cs_base); |
5697 | 5702 |
gen_eob(s); |
... | ... | |
5719 | 5724 |
gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
5720 | 5725 |
gen_jmp_im(pc_start - s->cs_base); |
5721 | 5726 |
if (ot == OT_WORD) |
5722 |
gen_op_boundw();
|
|
5727 |
tcg_gen_helper_0_0(helper_boundw);
|
|
5723 | 5728 |
else |
5724 |
gen_op_boundl();
|
|
5729 |
tcg_gen_helper_0_0(helper_boundl);
|
|
5725 | 5730 |
break; |
5726 | 5731 |
case 0x1c8 ... 0x1cf: /* bswap reg */ |
5727 | 5732 |
reg = (b & 7) | REX_B(s); |
... | ... | |
5800 | 5805 |
int retval = 0; |
5801 | 5806 |
if (b & 2) { |
5802 | 5807 |
retval = gen_svm_check_intercept_param(s, pc_start, SVM_EXIT_MSR, 0); |
5803 |
gen_op_rdmsr();
|
|
5808 |
tcg_gen_helper_0_0(helper_rdmsr);
|
|
5804 | 5809 |
} else { |
5805 | 5810 |
retval = gen_svm_check_intercept_param(s, pc_start, SVM_EXIT_MSR, 1); |
5806 |
gen_op_wrmsr();
|
|
5811 |
tcg_gen_helper_0_0(helper_wrmsr);
|
|
5807 | 5812 |
} |
5808 | 5813 |
if(retval) |
5809 | 5814 |
gen_eob(s); |
... | ... | |
5813 | 5818 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_RDTSC)) |
5814 | 5819 |
break; |
5815 | 5820 |
gen_jmp_im(pc_start - s->cs_base); |
5816 |
gen_op_rdtsc();
|
|
5821 |
tcg_gen_helper_0_0(helper_rdtsc);
|
|
5817 | 5822 |
break; |
5818 | 5823 |
case 0x133: /* rdpmc */ |
5819 | 5824 |
gen_jmp_im(pc_start - s->cs_base); |
5820 |
gen_op_rdpmc();
|
|
5825 |
tcg_gen_helper_0_0(helper_rdpmc);
|
|
5821 | 5826 |
break; |
5822 | 5827 |
case 0x134: /* sysenter */ |
5823 | 5828 |
if (CODE64(s)) |
... | ... | |
5830 | 5835 |
s->cc_op = CC_OP_DYNAMIC; |
5831 | 5836 |
} |
5832 | 5837 |
gen_jmp_im(pc_start - s->cs_base); |
5833 |
gen_op_sysenter();
|
|
5838 |
tcg_gen_helper_0_0(helper_sysenter);
|
|
5834 | 5839 |
gen_eob(s); |
5835 | 5840 |
} |
5836 | 5841 |
break; |
... | ... | |
5845 | 5850 |
s->cc_op = CC_OP_DYNAMIC; |
5846 | 5851 |
} |
5847 | 5852 |
gen_jmp_im(pc_start - s->cs_base); |
5848 |
gen_op_sysexit();
|
|
5853 |
tcg_gen_helper_0_0(helper_sysexit);
|
|
5849 | 5854 |
gen_eob(s); |
5850 | 5855 |
} |
5851 | 5856 |
break; |
... | ... | |
5857 | 5862 |
s->cc_op = CC_OP_DYNAMIC; |
5858 | 5863 |
} |
5859 | 5864 |
gen_jmp_im(pc_start - s->cs_base); |
5860 |
gen_op_syscall(s->pc - pc_start);
|
|
5865 |
tcg_gen_helper_0_1(helper_syscall, tcg_const_i32(s->pc - pc_start));
|
|
5861 | 5866 |
gen_eob(s); |
5862 | 5867 |
break; |
5863 | 5868 |
case 0x107: /* sysret */ |
... | ... | |
5869 | 5874 |
s->cc_op = CC_OP_DYNAMIC; |
5870 | 5875 |
} |
5871 | 5876 |
gen_jmp_im(pc_start - s->cs_base); |
5872 |
gen_op_sysret(s->dflag);
|
|
5877 |
tcg_gen_helper_0_1(helper_sysret, tcg_const_i32(s->dflag));
|
|
5873 | 5878 |
/* condition codes are modified only in long mode */ |
5874 | 5879 |
if (s->lma) |
5875 | 5880 |
s->cc_op = CC_OP_EFLAGS; |
... | ... | |
5880 | 5885 |
case 0x1a2: /* cpuid */ |
5881 | 5886 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_CPUID)) |
5882 | 5887 |
break; |
5883 |
gen_op_cpuid();
|
|
5888 |
tcg_gen_helper_0_0(helper_cpuid);
|
|
5884 | 5889 |
break; |
5885 | 5890 |
case 0xf4: /* hlt */ |
5886 | 5891 |
if (s->cpl != 0) { |
... | ... | |
5891 | 5896 |
if (s->cc_op != CC_OP_DYNAMIC) |
5892 | 5897 |
gen_op_set_cc_op(s->cc_op); |
5893 | 5898 |
gen_jmp_im(s->pc - s->cs_base); |
5894 |
gen_op_hlt();
|
|
5899 |
tcg_gen_helper_0_0(helper_hlt);
|
|
5895 | 5900 |
s->is_jmp = 3; |
5896 | 5901 |
} |
5897 | 5902 |
break; |
... | ... | |
5921 | 5926 |
break; |
5922 | 5927 |
gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); |
5923 | 5928 |
gen_jmp_im(pc_start - s->cs_base); |
5924 |
gen_op_lldt_T0(); |
|
5929 |
tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); |
|
5930 |
tcg_gen_helper_0_1(helper_lldt, cpu_tmp2); |
|
5925 | 5931 |
} |
5926 | 5932 |
break; |
5927 | 5933 |
case 1: /* str */ |
... | ... | |
5945 | 5951 |
break; |
5946 | 5952 |
gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); |
5947 | 5953 |
gen_jmp_im(pc_start - s->cs_base); |
5948 |
gen_op_ltr_T0(); |
|
5954 |
tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); |
|
5955 |
tcg_gen_helper_0_1(helper_ltr, cpu_tmp2); |
|
5949 | 5956 |
} |
5950 | 5957 |
break; |
5951 | 5958 |
case 4: /* verr */ |
... | ... | |
6008 | 6015 |
gen_op_andl_A0_ffff(); |
6009 | 6016 |
} |
6010 | 6017 |
gen_add_A0_ds_seg(s); |
6011 |
gen_op_monitor();
|
|
6018 |
tcg_gen_helper_0_1(helper_monitor, cpu_A0);
|
|
6012 | 6019 |
break; |
6013 | 6020 |
case 1: /* mwait */ |
6014 | 6021 |
if (!(s->cpuid_ext_features & CPUID_EXT_MONITOR) || |
... | ... | |
6021 | 6028 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_MWAIT)) |
6022 | 6029 |
break; |
6023 | 6030 |
gen_jmp_im(s->pc - s->cs_base); |
6024 |
gen_op_mwait();
|
|
6031 |
tcg_gen_helper_0_0(helper_mwait);
|
|
6025 | 6032 |
gen_eob(s); |
6026 | 6033 |
break; |
6027 | 6034 |
default: |
... | ... | |
6050 | 6057 |
if (s->cc_op != CC_OP_DYNAMIC) |
6051 | 6058 |
gen_op_set_cc_op(s->cc_op); |
6052 | 6059 |
gen_jmp_im(s->pc - s->cs_base); |
6053 |
gen_op_vmrun();
|
|
6060 |
tcg_gen_helper_0_0(helper_vmrun);
|
|
6054 | 6061 |
s->cc_op = CC_OP_EFLAGS; |
6055 | 6062 |
gen_eob(s); |
6056 | 6063 |
break; |
... | ... | |
6058 | 6065 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMMCALL)) |
6059 | 6066 |
break; |
6060 | 6067 |
/* FIXME: cause #UD if hflags & SVM */ |
6061 |
gen_op_vmmcall();
|
|
6068 |
tcg_gen_helper_0_0(helper_vmmcall);
|
|
6062 | 6069 |
break; |
6063 | 6070 |
case 2: /* VMLOAD */ |
6064 | 6071 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMLOAD)) |
6065 | 6072 |
break; |
6066 |
gen_op_vmload();
|
|
6073 |
tcg_gen_helper_0_0(helper_vmload);
|
|
6067 | 6074 |
break; |
6068 | 6075 |
case 3: /* VMSAVE */ |
6069 | 6076 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMSAVE)) |
6070 | 6077 |
break; |
6071 |
gen_op_vmsave();
|
|
6078 |
tcg_gen_helper_0_0(helper_vmsave);
|
|
6072 | 6079 |
break; |
6073 | 6080 |
case 4: /* STGI */ |
6074 | 6081 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_STGI)) |
6075 | 6082 |
break; |
6076 |
gen_op_stgi();
|
|
6083 |
tcg_gen_helper_0_0(helper_stgi);
|
|
6077 | 6084 |
break; |
6078 | 6085 |
case 5: /* CLGI */ |
6079 | 6086 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_CLGI)) |
6080 | 6087 |
break; |
6081 |
gen_op_clgi();
|
|
6088 |
tcg_gen_helper_0_0(helper_clgi);
|
|
6082 | 6089 |
break; |
6083 | 6090 |
case 6: /* SKINIT */ |
6084 | 6091 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_SKINIT)) |
6085 | 6092 |
break; |
6086 |
gen_op_skinit();
|
|
6093 |
tcg_gen_helper_0_0(helper_skinit);
|
|
6087 | 6094 |
break; |
6088 | 6095 |
case 7: /* INVLPGA */ |
6089 | 6096 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_INVLPGA)) |
6090 | 6097 |
break; |
6091 |
gen_op_invlpga();
|
|
6098 |
tcg_gen_helper_0_0(helper_invlpga);
|
|
6092 | 6099 |
break; |
6093 | 6100 |
default: |
6094 | 6101 |
goto illegal_op; |
... | ... | |
6153 | 6160 |
if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_INVLPG)) |
6154 | 6161 |
break; |
6155 | 6162 |
gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
6156 |
gen_op_invlpg_A0();
|
|
6163 |
tcg_gen_helper_0_1(helper_invlpg, cpu_A0);
|
|
6157 | 6164 |
gen_jmp_im(s->pc - s->cs_base); |
6158 | 6165 |
gen_eob(s); |
6159 | 6166 |
} |
... | ... | |
6458 | 6465 |
s->cc_op = CC_OP_DYNAMIC; |
6459 | 6466 |
} |
6460 | 6467 |
gen_jmp_im(s->pc - s->cs_base); |
6461 |
gen_op_rsm();
|
|
6468 |
tcg_gen_helper_0_0(helper_rsm);
|
|
6462 | 6469 |
gen_eob(s); |
6463 | 6470 |
break; |
6464 | 6471 |
case 0x10e ... 0x10f: |
... | ... | |
6855 | 6862 |
cpu_A0 = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "A0"); |
6856 | 6863 |
cpu_tmp1 = tcg_global_reg2_new_hack(TCG_TYPE_I64, TCG_AREG1, TCG_AREG2, "tmp1"); |
6857 | 6864 |
#endif |
6858 |
/* the helpers are only registered to print debug info */ |
|
6859 |
TCG_HELPER(helper_divl_EAX_T0); |
|
6860 |
TCG_HELPER(helper_idivl_EAX_T0); |
|
6861 | 6865 |
} |
6862 | 6866 |
|
6863 | 6867 |
/* CPU flags computation optimization: we move backward thru the |
Also available in: Unified diff