Commit e6e35b1ea3395d8c2e750fc515b00cf24c86d892
1 parent
e568902a
qemu: refactor tcg cpu execution loop (Marcelo Tosatti)
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7246 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
29 additions
and
24 deletions
vl.c
... | ... | @@ -3951,6 +3951,30 @@ static int qemu_cpu_exec(CPUState *env) |
3951 | 3951 | return ret; |
3952 | 3952 | } |
3953 | 3953 | |
3954 | +static void tcg_cpu_exec(void) | |
3955 | +{ | |
3956 | + int ret; | |
3957 | + | |
3958 | + if (next_cpu == NULL) | |
3959 | + next_cpu = first_cpu; | |
3960 | + for (; next_cpu != NULL; next_cpu = next_cpu->next_cpu) { | |
3961 | + CPUState *env = cur_cpu = next_cpu; | |
3962 | + | |
3963 | + if (!vm_running) | |
3964 | + break; | |
3965 | + if (timer_alarm_pending) { | |
3966 | + timer_alarm_pending = 0; | |
3967 | + break; | |
3968 | + } | |
3969 | + ret = qemu_cpu_exec(env); | |
3970 | + if (ret == EXCP_DEBUG) { | |
3971 | + gdb_set_stop_cpu(env); | |
3972 | + debug_requested = 1; | |
3973 | + break; | |
3974 | + } | |
3975 | + } | |
3976 | +} | |
3977 | + | |
3954 | 3978 | static int cpu_has_work(CPUState *env) |
3955 | 3979 | { |
3956 | 3980 | if (!env->halted) |
... | ... | @@ -4034,31 +4058,13 @@ static int vm_can_run(void) |
4034 | 4058 | |
4035 | 4059 | static void main_loop(void) |
4036 | 4060 | { |
4037 | - int ret = 0; | |
4038 | -#ifdef CONFIG_PROFILER | |
4039 | - int64_t ti; | |
4040 | -#endif | |
4041 | - | |
4042 | 4061 | for (;;) { |
4043 | - do { | |
4044 | - if (next_cpu == NULL) | |
4045 | - next_cpu = first_cpu; | |
4046 | - for (; next_cpu != NULL; next_cpu = next_cpu->next_cpu) { | |
4047 | - CPUState *env = cur_cpu = next_cpu; | |
4048 | 4062 | |
4049 | - if (!vm_running) | |
4050 | - break; | |
4051 | - if (timer_alarm_pending) { | |
4052 | - timer_alarm_pending = 0; | |
4053 | - break; | |
4054 | - } | |
4055 | - ret = qemu_cpu_exec(env); | |
4056 | - if (ret == EXCP_DEBUG) { | |
4057 | - gdb_set_stop_cpu(env); | |
4058 | - debug_requested = 1; | |
4059 | - break; | |
4060 | - } | |
4061 | - } | |
4063 | + do { | |
4064 | +#ifdef CONFIG_PROFILER | |
4065 | + int64_t ti; | |
4066 | +#endif | |
4067 | + tcg_cpu_exec(); | |
4062 | 4068 | #ifdef CONFIG_PROFILER |
4063 | 4069 | ti = profile_getclock(); |
4064 | 4070 | #endif |
... | ... | @@ -4068,7 +4074,6 @@ static void main_loop(void) |
4068 | 4074 | #endif |
4069 | 4075 | } while (vm_can_run()); |
4070 | 4076 | |
4071 | - | |
4072 | 4077 | if (qemu_debug_requested()) |
4073 | 4078 | vm_stop(EXCP_DEBUG); |
4074 | 4079 | if (qemu_shutdown_requested()) { | ... | ... |