From 477806703a43558108cd1efbfb59a67c1d24e074 Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Fri, 31 Jul 2009 07:26:44 +0000 Subject: esp: fix interrupt register read Read of interrupt register should clear it and also sequence step and status. Signed-off-by: Blue Swirl Signed-off-by: Anthony Liguori --- hw/esp.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/hw/esp.c b/hw/esp.c index 9eacccbf8d..cb6c993c8e 100644 --- a/hw/esp.c +++ b/hw/esp.c @@ -422,7 +422,7 @@ static void parent_esp_reset(void *opaque, int irq, int level) static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) { ESPState *s = opaque; - uint32_t saddr; + uint32_t saddr, old_val; saddr = addr >> s->it_shift; DPRINTF("read reg[%d]: 0x%2.2x\n", saddr, s->rregs[saddr]); @@ -445,10 +445,15 @@ static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) } break; case ESP_RINTR: - // Clear interrupt/error status bits - s->rregs[ESP_RSTAT] &= ~(STAT_GE | STAT_PE); + /* Clear sequence step, interrupt register and all status bits + except TC */ + old_val = s->rregs[ESP_RINTR]; + s->rregs[ESP_RINTR] = 0; + s->rregs[ESP_RSTAT] &= ~STAT_TC; + s->rregs[ESP_RSEQ] = SEQ_CD; esp_lower_irq(s); - break; + + return old_val; default: break; } -- cgit v1.2.1