From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K8u1s-0003t8-9n for qemu-devel@nongnu.org; Wed, 18 Jun 2008 05:32:36 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K8u1q-0003sm-Vi for qemu-devel@nongnu.org; Wed, 18 Jun 2008 05:32:35 -0400 Received: from [199.232.76.173] (port=57700 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K8u1q-0003sf-J4 for qemu-devel@nongnu.org; Wed, 18 Jun 2008 05:32:34 -0400 Received: from savannah.gnu.org ([199.232.41.3]:38002 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1K8u1q-0002JB-JS for qemu-devel@nongnu.org; Wed, 18 Jun 2008 05:32:34 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1K8u1p-00024b-4i for qemu-devel@nongnu.org; Wed, 18 Jun 2008 09:32:33 +0000 Received: from bellard by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1K8u1o-00024X-Ox for qemu-devel@nongnu.org; Wed, 18 Jun 2008 09:32:33 +0000 MIME-Version: 1.0 Errors-To: bellard Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Fabrice Bellard Message-Id: Date: Wed, 18 Jun 2008 09:32:32 +0000 Subject: [Qemu-devel] [4746] HLT, MWAIT and MONITOR insn fixes (initial patch by Alexander Graf) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4746 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4746 Author: bellard Date: 2008-06-18 09:32:32 +0000 (Wed, 18 Jun 2008) Log Message: ----------- HLT, MWAIT and MONITOR insn fixes (initial patch by Alexander Graf) Modified Paths: -------------- trunk/target-i386/helper.h trunk/target-i386/op_helper.c trunk/target-i386/translate.c Modified: trunk/target-i386/helper.h =================================================================== --- trunk/target-i386/helper.h 2008-06-18 01:58:52 UTC (rev 4745) +++ trunk/target-i386/helper.h 2008-06-18 09:32:32 UTC (rev 4746) @@ -60,9 +60,9 @@ DEF_HELPER(void, helper_syscall, (int next_eip_addend)) DEF_HELPER(void, helper_sysret, (int dflag)) #endif -DEF_HELPER(void, helper_hlt, (void)) +DEF_HELPER(void, helper_hlt, (int next_eip_addend)) DEF_HELPER(void, helper_monitor, (target_ulong ptr)) -DEF_HELPER(void, helper_mwait, (void)) +DEF_HELPER(void, helper_mwait, (int next_eip_addend)) DEF_HELPER(void, helper_debug, (void)) DEF_HELPER(void, helper_raise_interrupt, (int intno, int next_eip_addend)) DEF_HELPER(void, helper_raise_exception, (int exception_index)) Modified: trunk/target-i386/op_helper.c =================================================================== --- trunk/target-i386/op_helper.c 2008-06-18 01:58:52 UTC (rev 4745) +++ trunk/target-i386/op_helper.c 2008-06-18 09:32:32 UTC (rev 4746) @@ -4547,16 +4547,22 @@ } #endif -void helper_hlt(void) +static void do_hlt(void) { - helper_svm_check_intercept_param(SVM_EXIT_HLT, 0); - env->hflags &= ~HF_INHIBIT_IRQ_MASK; /* needed if sti is just before */ env->halted = 1; env->exception_index = EXCP_HLT; cpu_loop_exit(); } +void helper_hlt(int next_eip_addend) +{ + helper_svm_check_intercept_param(SVM_EXIT_HLT, 0); + EIP += next_eip_addend; + + do_hlt(); +} + void helper_monitor(target_ulong ptr) { if ((uint32_t)ECX != 0) @@ -4565,17 +4571,19 @@ helper_svm_check_intercept_param(SVM_EXIT_MONITOR, 0); } -void helper_mwait(void) +void helper_mwait(int next_eip_addend) { if ((uint32_t)ECX != 0) raise_exception(EXCP0D_GPF); helper_svm_check_intercept_param(SVM_EXIT_MWAIT, 0); + EIP += next_eip_addend; + /* XXX: not complete but not completely erroneous */ if (env->cpu_index != 0 || env->next_cpu != NULL) { /* more than one CPU: do not sleep because another CPU may wake this one */ } else { - helper_hlt(); + do_hlt(); } } Modified: trunk/target-i386/translate.c =================================================================== --- trunk/target-i386/translate.c 2008-06-18 01:58:52 UTC (rev 4745) +++ trunk/target-i386/translate.c 2008-06-18 09:32:32 UTC (rev 4746) @@ -6420,8 +6420,8 @@ } else { if (s->cc_op != CC_OP_DYNAMIC) gen_op_set_cc_op(s->cc_op); - gen_jmp_im(s->pc - s->cs_base); - tcg_gen_helper_0_0(helper_hlt); + gen_jmp_im(pc_start - s->cs_base); + tcg_gen_helper_0_1(helper_hlt, tcg_const_i32(s->pc - pc_start)); s->is_jmp = 3; } break; @@ -6519,6 +6519,8 @@ if (!(s->cpuid_ext_features & CPUID_EXT_MONITOR) || s->cpl != 0) goto illegal_op; + if (s->cc_op != CC_OP_DYNAMIC) + gen_op_set_cc_op(s->cc_op); gen_jmp_im(pc_start - s->cs_base); #ifdef TARGET_X86_64 if (s->aflag == 2) { @@ -6541,8 +6543,8 @@ gen_op_set_cc_op(s->cc_op); s->cc_op = CC_OP_DYNAMIC; } - gen_jmp_im(s->pc - s->cs_base); - tcg_gen_helper_0_0(helper_mwait); + gen_jmp_im(pc_start - s->cs_base); + tcg_gen_helper_0_1(helper_mwait, tcg_const_i32(s->pc - pc_start)); gen_eob(s); break; default: