From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41920) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WMnt7-0000n5-GR for qemu-devel@nongnu.org; Sun, 09 Mar 2014 20:16:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WMnt1-00059F-DO for qemu-devel@nongnu.org; Sun, 09 Mar 2014 20:16:13 -0400 Received: from cantor2.suse.de ([195.135.220.15]:42220 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WMnt1-00058c-3I for qemu-devel@nongnu.org; Sun, 09 Mar 2014 20:16:07 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Mon, 10 Mar 2014 01:15:21 +0100 Message-Id: <1394410549-13751-13-git-send-email-afaerber@suse.de> In-Reply-To: <1394410549-13751-1-git-send-email-afaerber@suse.de> References: <1394410549-13751-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH qom-cpu v2 12/40] cpu: Move icount_extra field from CPU_COMMON to CPUState List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, =?UTF-8?q?Andreas=20F=C3=A4rber?= Reset it. Signed-off-by: Andreas F=C3=A4rber --- cpu-exec.c | 10 +++++----- cpus.c | 14 +++++++------- include/exec/cpu-defs.h | 1 - include/qom/cpu.h | 2 ++ qom/cpu.c | 1 + 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 6559d5e..4a03d83 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -650,15 +650,15 @@ int cpu_exec(CPUArchState *env) int insns_left; tb =3D (TranslationBlock *)(next_tb & ~TB_EXIT_M= ASK); insns_left =3D env->icount_decr.u32; - if (env->icount_extra && insns_left >=3D 0) { + if (cpu->icount_extra && insns_left >=3D 0) { /* Refill decrementer and continue execution= . */ - env->icount_extra +=3D insns_left; - if (env->icount_extra > 0xffff) { + cpu->icount_extra +=3D insns_left; + if (cpu->icount_extra > 0xffff) { insns_left =3D 0xffff; } else { - insns_left =3D env->icount_extra; + insns_left =3D cpu->icount_extra; } - env->icount_extra -=3D insns_left; + cpu->icount_extra -=3D insns_left; env->icount_decr.u16.low =3D insns_left; } else { if (insns_left > 0) { diff --git a/cpus.c b/cpus.c index dd5e59f..0acf788 100644 --- a/cpus.c +++ b/cpus.c @@ -143,7 +143,7 @@ static int64_t cpu_get_icount_locked(void) if (!cpu_can_do_io(cpu)) { fprintf(stderr, "Bad clock read\n"); } - icount -=3D (env->icount_decr.u16.low + env->icount_extra); + icount -=3D (env->icount_decr.u16.low + cpu->icount_extra); } return qemu_icount_bias + (icount << icount_time_shift); } @@ -1221,6 +1221,7 @@ int vm_stop_force_state(RunState state) =20 static int tcg_cpu_exec(CPUArchState *env) { + CPUState *cpu =3D ENV_GET_CPU(env); int ret; #ifdef CONFIG_PROFILER int64_t ti; @@ -1233,9 +1234,9 @@ static int tcg_cpu_exec(CPUArchState *env) int64_t count; int64_t deadline; int decr; - qemu_icount -=3D (env->icount_decr.u16.low + env->icount_extra); + qemu_icount -=3D (env->icount_decr.u16.low + cpu->icount_extra); env->icount_decr.u16.low =3D 0; - env->icount_extra =3D 0; + cpu->icount_extra =3D 0; deadline =3D qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL); =20 /* Maintain prior (possibly buggy) behaviour where if no deadlin= e @@ -1252,7 +1253,7 @@ static int tcg_cpu_exec(CPUArchState *env) decr =3D (count > 0xffff) ? 0xffff : count; count -=3D decr; env->icount_decr.u16.low =3D decr; - env->icount_extra =3D count; + cpu->icount_extra =3D count; } ret =3D cpu_exec(env); #ifdef CONFIG_PROFILER @@ -1261,10 +1262,9 @@ static int tcg_cpu_exec(CPUArchState *env) if (use_icount) { /* Fold pending instructions back into the instruction counter, and clear the interrupt flag. */ - qemu_icount -=3D (env->icount_decr.u16.low - + env->icount_extra); + qemu_icount -=3D (env->icount_decr.u16.low + cpu->icount_extra); env->icount_decr.u32 =3D 0; - env->icount_extra =3D 0; + cpu->icount_extra =3D 0; } return ret; } diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h index 4d34457..32a4a26 100644 --- a/include/exec/cpu-defs.h +++ b/include/exec/cpu-defs.h @@ -148,7 +148,6 @@ typedef struct CPUWatchpoint { CPU_COMMON_TLB = \ struct TranslationBlock *tb_jmp_cache[TB_JMP_CACHE_SIZE]; = \ = \ - int64_t icount_extra; /* Instructions until next timer event. */ = \ /* Number of cycles left, with interrupt flag in high bit. = \ This allows a single read-compare-cbranch-write sequence to test = \ for both decrementer underflow and exceptions. */ = \ diff --git a/include/qom/cpu.h b/include/qom/cpu.h index f80036e..012a7e6 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -157,6 +157,7 @@ struct kvm_run; * @tcg_exit_req: Set to force TCG to stop executing linked TBs for this * CPU and return to its top level loop. * @singlestep_enabled: Flags for single-stepping. + * @icount_extra: Instructions until next timer event. * @can_do_io: Nonzero if memory-mapped IO is safe. * @env_ptr: Pointer to subclass-specific CPUArchState field. * @current_tb: Currently executing TB. @@ -196,6 +197,7 @@ struct CPUState { volatile sig_atomic_t tcg_exit_req; uint32_t interrupt_request; int singlestep_enabled; + int64_t icount_extra; =20 AddressSpace *as; MemoryListener *tcg_as_listener; diff --git a/qom/cpu.c b/qom/cpu.c index 686b6f9..cf4b2fb 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -242,6 +242,7 @@ static void cpu_common_reset(CPUState *cpu) cpu->halted =3D 0; cpu->mem_io_pc =3D 0; cpu->mem_io_vaddr =3D 0; + cpu->icount_extra =3D 0; cpu->can_do_io =3D 0; } =20 --=20 1.8.4.5