Commit 4c54e8756839e5ba2812ebe812d3542498a6a8a1
1 parent
50bf72b3
Remember the state of level-triggered interrupts
(Hollis Blanchard) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4330 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
7 additions
and
2 deletions
hw/ppc4xx_devs.c
| @@ -278,6 +278,7 @@ typedef struct ppcuic_t ppcuic_t; | @@ -278,6 +278,7 @@ typedef struct ppcuic_t ppcuic_t; | ||
| 278 | struct ppcuic_t { | 278 | struct ppcuic_t { |
| 279 | uint32_t dcr_base; | 279 | uint32_t dcr_base; |
| 280 | int use_vectors; | 280 | int use_vectors; |
| 281 | + uint32_t level; /* Remembers the state of level-triggered interrupts. */ | ||
| 281 | uint32_t uicsr; /* Status register */ | 282 | uint32_t uicsr; /* Status register */ |
| 282 | uint32_t uicer; /* Enable register */ | 283 | uint32_t uicer; /* Enable register */ |
| 283 | uint32_t uiccr; /* Critical register */ | 284 | uint32_t uiccr; /* Critical register */ |
| @@ -385,10 +386,13 @@ static void ppcuic_set_irq (void *opaque, int irq_num, int level) | @@ -385,10 +386,13 @@ static void ppcuic_set_irq (void *opaque, int irq_num, int level) | ||
| 385 | uic->uicsr |= mask; | 386 | uic->uicsr |= mask; |
| 386 | } else { | 387 | } else { |
| 387 | /* Level sensitive interrupt */ | 388 | /* Level sensitive interrupt */ |
| 388 | - if (level == 1) | 389 | + if (level == 1) { |
| 389 | uic->uicsr |= mask; | 390 | uic->uicsr |= mask; |
| 390 | - else | 391 | + uic->level |= mask; |
| 392 | + } else { | ||
| 391 | uic->uicsr &= ~mask; | 393 | uic->uicsr &= ~mask; |
| 394 | + uic->level &= ~mask; | ||
| 395 | + } | ||
| 392 | } | 396 | } |
| 393 | #ifdef DEBUG_UIC | 397 | #ifdef DEBUG_UIC |
| 394 | if (loglevel & CPU_LOG_INT) { | 398 | if (loglevel & CPU_LOG_INT) { |
| @@ -460,6 +464,7 @@ static void dcr_write_uic (void *opaque, int dcrn, target_ulong val) | @@ -460,6 +464,7 @@ static void dcr_write_uic (void *opaque, int dcrn, target_ulong val) | ||
| 460 | switch (dcrn) { | 464 | switch (dcrn) { |
| 461 | case DCR_UICSR: | 465 | case DCR_UICSR: |
| 462 | uic->uicsr &= ~val; | 466 | uic->uicsr &= ~val; |
| 467 | + uic->uicsr |= uic->level; | ||
| 463 | ppcuic_trigger_irq(uic); | 468 | ppcuic_trigger_irq(uic); |
| 464 | break; | 469 | break; |
| 465 | case DCR_UICSRS: | 470 | case DCR_UICSRS: |