On 2012-01-24 16:29, Jan Kiszka wrote:
> When an input line is handled as level-triggered, it will immediately
> raise an IRQ on the output of a PIC again that goes through an init
> reset. So only clear the edge-triggered inputs from IRR in that
> scenario.
> 
> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
> ---
>  hw/i8259.c        |    2 +-
>  hw/i8259_common.c |    2 +-
>  hw/kvm/i8259.c    |    2 +-
>  3 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/i8259.c b/hw/i8259.c
> index 3005ce2..264bfc6 100644
> --- a/hw/i8259.c
> +++ b/hw/i8259.c
> @@ -231,8 +231,8 @@ static void pic_reset(DeviceState *dev)
>  {
>      PICCommonState *s = DO_UPCAST(PICCommonState, dev.qdev, dev);
>  
> -    pic_init_reset(s);
>      s->elcr = 0;
> +    pic_init_reset(s);
>  }
>  
>  static void pic_ioport_write(void *opaque, target_phys_addr_t addr64,
> diff --git a/hw/i8259_common.c b/hw/i8259_common.c
> index e515876..37aeee2 100644
> --- a/hw/i8259_common.c
> +++ b/hw/i8259_common.c
> @@ -28,7 +28,7 @@
>  void pic_reset_common(PICCommonState *s)
>  {
>      s->last_irr = 0;
> -    s->irr = 0;
> +    s->irr &= s->elcr;
>      s->imr = 0;
>      s->isr = 0;
>      s->priority_add = 0;
> diff --git a/hw/kvm/i8259.c b/hw/kvm/i8259.c
> index 64bb5c2..298d9ca 100644
> --- a/hw/kvm/i8259.c
> +++ b/hw/kvm/i8259.c
> @@ -84,8 +84,8 @@ static void kvm_pic_reset(DeviceState *dev)
>  {
>      PICCommonState *s = DO_UPCAST(PICCommonState, dev.qdev, dev);
>  
> -    pic_reset_common(s);
>      s->elcr = 0;
> +    pic_reset_common(s);
>  
>      kvm_pic_put(s);
>  }

Ping.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

Reply via email to