always qemu_cpu_kick after unhalting a cpu
This ensures env->halt_cond is broadcast, and the loop in qemu_tcg_wait_io_event and qemu_kvm_wait_io_event is exited naturally rather than through a timeout. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
		
							parent
							
								
									eda48c344f
								
							
						
					
					
						commit
						94ad5b00a3
					
				
							
								
								
									
										2
									
								
								hw/ppc.c
								
								
								
								
							
							
						
						
									
										2
									
								
								hw/ppc.c
								
								
								
								
							| 
						 | 
				
			
			@ -208,6 +208,7 @@ static void ppc970_set_irq (void *opaque, int pin, int level)
 | 
			
		|||
            } else {
 | 
			
		||||
                LOG_IRQ("%s: restart the CPU\n", __func__);
 | 
			
		||||
                env->halted = 0;
 | 
			
		||||
                qemu_cpu_kick(env);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case PPC970_INPUT_HRESET:
 | 
			
		||||
| 
						 | 
				
			
			@ -300,6 +301,7 @@ static void ppc40x_set_irq (void *opaque, int pin, int level)
 | 
			
		|||
            } else {
 | 
			
		||||
                LOG_IRQ("%s: restart the CPU\n", __func__);
 | 
			
		||||
                env->halted = 0;
 | 
			
		||||
                qemu_cpu_kick(env);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case PPC40x_INPUT_DEBUG:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								hw/sun4m.c
								
								
								
								
							
							
						
						
									
										10
									
								
								hw/sun4m.c
								
								
								
								
							| 
						 | 
				
			
			@ -253,15 +253,21 @@ void cpu_check_irqs(CPUState *env)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void cpu_kick_irq(CPUState *env)
 | 
			
		||||
{
 | 
			
		||||
    env->halted = 0;
 | 
			
		||||
    cpu_check_irqs(env);
 | 
			
		||||
    qemu_cpu_kick(env);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void cpu_set_irq(void *opaque, int irq, int level)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *env = opaque;
 | 
			
		||||
 | 
			
		||||
    if (level) {
 | 
			
		||||
        trace_sun4m_cpu_set_irq_raise(irq);
 | 
			
		||||
        env->halted = 0;
 | 
			
		||||
        env->pil_in |= 1 << irq;
 | 
			
		||||
        cpu_check_irqs(env);
 | 
			
		||||
        cpu_kick_irq(env);
 | 
			
		||||
    } else {
 | 
			
		||||
        trace_sun4m_cpu_set_irq_lower(irq);
 | 
			
		||||
        env->pil_in &= ~(1 << irq);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -298,6 +298,7 @@ static void cpu_kick_irq(CPUState *env)
 | 
			
		|||
{
 | 
			
		||||
    env->halted = 0;
 | 
			
		||||
    cpu_check_irqs(env);
 | 
			
		||||
    qemu_cpu_kick(env);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void cpu_set_irq(void *opaque, int irq, int level)
 | 
			
		||||
| 
						 | 
				
			
			@ -306,9 +307,8 @@ static void cpu_set_irq(void *opaque, int irq, int level)
 | 
			
		|||
 | 
			
		||||
    if (level) {
 | 
			
		||||
        CPUIRQ_DPRINTF("Raise CPU IRQ %d\n", irq);
 | 
			
		||||
        env->halted = 0;
 | 
			
		||||
        env->pil_in |= 1 << irq;
 | 
			
		||||
        cpu_check_irqs(env);
 | 
			
		||||
        cpu_kick_irq(env);
 | 
			
		||||
    } else {
 | 
			
		||||
        CPUIRQ_DPRINTF("Lower CPU IRQ %d\n", irq);
 | 
			
		||||
        env->pil_in &= ~(1 << irq);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -194,6 +194,7 @@ static void kvm_s390_interrupt_internal(CPUState *env, int type, uint32_t parm,
 | 
			
		|||
 | 
			
		||||
    env->halted = 0;
 | 
			
		||||
    env->exception_index = -1;
 | 
			
		||||
    qemu_cpu_kick(env);
 | 
			
		||||
 | 
			
		||||
    kvmint.type = type;
 | 
			
		||||
    kvmint.parm = parm;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue