On 12/01/2015 13:00, Pavel Dovgalyuk wrote:
>
> + if (replay_exception()) {
> + cc->do_interrupt(cpu);
> + cpu->exception_index = -1;
I cannot see replay_exception() in the series?
> @@ -419,21 +434,24 @@ int cpu_exec(CPUArchState *env)
> cpu->exception_index = EXCP_DEBUG;
> cpu_loop_exit(cpu);
Why not for EXCP_DEBUG?
> }
> - if (interrupt_request & CPU_INTERRUPT_HALT) {
> + if ((interrupt_request & CPU_INTERRUPT_HALT)
> + && replay_interrupt()) {
> cpu->interrupt_request &= ~CPU_INTERRUPT_HALT;
> cpu->halted = 1;
> cpu->exception_index = EXCP_HLT;
> cpu_loop_exit(cpu);
> }
> #if defined(TARGET_I386)
> - if (interrupt_request & CPU_INTERRUPT_INIT) {
> + if ((interrupt_request & CPU_INTERRUPT_INIT)
> + && replay_interrupt()) {
> cpu_svm_check_intercept_param(env, SVM_EXIT_INIT, 0);
> do_cpu_init(x86_cpu);
> cpu->exception_index = EXCP_HALTED;
> cpu_loop_exit(cpu);
> }
> #else
> - if (interrupt_request & CPU_INTERRUPT_RESET) {
> + if ((interrupt_request & CPU_INTERRUPT_RESET)
> + && replay_interrupt()) {
> cpu_reset(cpu);
> }
> #endif
Perhaps check the replay_interrupt() outside, in an && with "if
(unlikely(interrupt_request))"?
> @@ -441,7 +459,10 @@ int cpu_exec(CPUArchState *env)
> False when the interrupt isn't processed,
> True when it is, and we should restart on a new TB,
> and via longjmp via cpu_loop_exit. */
> - if (cc->cpu_exec_interrupt(cpu, interrupt_request)) {
> + if ((replay_mode != REPLAY_MODE_PLAY
> + || replay_has_interrupt())
> + && cc->cpu_exec_interrupt(cpu, interrupt_request)) {
> + replay_interrupt();
Please put this in a separate function like:
if (replay_mode == REPLAY_MODE_PLAY && !replay_has_interrupt()) {
return false;
}
ret = cc->cpu_exec_interrupt(cpu, interrupt_request);
if (ret) {
replay_interrupt();
}
return ret;
Paolo
> next_tb = 0;
> }
> /* Don't use the cached interrupt_request value,
> @@ -453,7 +474,8 @@ int cpu_exec(CPUArchState *env)