diff options
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/helper.c | 5 | ||||
-rw-r--r-- | target-i386/translate.c | 3 |
2 files changed, 6 insertions, 2 deletions
diff --git a/target-i386/helper.c b/target-i386/helper.c index c41cbb7278..424dc52848 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -2328,7 +2328,10 @@ void helper_invlpg(target_ulong addr) void helper_rdtsc(void) { uint64_t val; - + + if ((env->cr[4] & CR4_TSD_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) { + raise_exception(EXCP0D_GPF); + } val = cpu_get_tsc(env); EAX = (uint32_t)(val); EDX = (uint32_t)(val >> 32); diff --git a/target-i386/translate.c b/target-i386/translate.c index 619522a635..0f6b0eb7c6 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -4909,7 +4909,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) gen_op_movl_T1_imu(offset); } goto do_lcall; - case 0xe9: /* jmp */ + case 0xe9: /* jmp im */ if (dflag) tval = (int32_t)insn_get(s, OT_LONG); else @@ -5366,6 +5366,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) } break; case 0x131: /* rdtsc */ + gen_jmp_im(pc_start - s->cs_base); gen_op_rdtsc(); break; case 0x134: /* sysenter */ |