Commit 0d0a7e69e853639b123798877e019c3c7ee6634a
1 parent
15a1956a
Don't set IRQs on device reset and loadvm/savevm
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
22 additions
and
18 deletions
hw/slavio_intctl.c
| ... | ... | @@ -80,7 +80,7 @@ typedef struct SLAVIO_CPUINTCTLState { |
| 80 | 80 | #define CPU_IRQ_INT15_IN 0x0004000 |
| 81 | 81 | #define CPU_IRQ_INT15_MASK 0x80000000 |
| 82 | 82 | |
| 83 | -static void slavio_check_interrupts(SLAVIO_INTCTLState *s); | |
| 83 | +static void slavio_check_interrupts(SLAVIO_INTCTLState *s, int set_irqs); | |
| 84 | 84 | |
| 85 | 85 | // per-cpu interrupt controller |
| 86 | 86 | static uint32_t slavio_intctl_mem_readl(void *opaque, target_phys_addr_t addr) |
| ... | ... | @@ -116,14 +116,14 @@ static void slavio_intctl_mem_writel(void *opaque, target_phys_addr_t addr, |
| 116 | 116 | val |= CPU_IRQ_INT15_MASK; |
| 117 | 117 | val &= CPU_SOFTIRQ_MASK; |
| 118 | 118 | s->intreg_pending &= ~val; |
| 119 | - slavio_check_interrupts(s->master); | |
| 119 | + slavio_check_interrupts(s->master, 1); | |
| 120 | 120 | DPRINTF("Cleared cpu %d irq mask %x, curmask %x\n", s->cpu, val, |
| 121 | 121 | s->intreg_pending); |
| 122 | 122 | break; |
| 123 | 123 | case 2: // set softint |
| 124 | 124 | val &= CPU_SOFTIRQ_MASK; |
| 125 | 125 | s->intreg_pending |= val; |
| 126 | - slavio_check_interrupts(s->master); | |
| 126 | + slavio_check_interrupts(s->master, 1); | |
| 127 | 127 | DPRINTF("Set cpu %d irq mask %x, curmask %x\n", s->cpu, val, |
| 128 | 128 | s->intreg_pending); |
| 129 | 129 | break; |
| ... | ... | @@ -185,20 +185,20 @@ static void slavio_intctlm_mem_writel(void *opaque, target_phys_addr_t addr, |
| 185 | 185 | s->intregm_disabled &= ~val; |
| 186 | 186 | DPRINTF("Enabled master irq mask %x, curmask %x\n", val, |
| 187 | 187 | s->intregm_disabled); |
| 188 | - slavio_check_interrupts(s); | |
| 188 | + slavio_check_interrupts(s, 1); | |
| 189 | 189 | break; |
| 190 | 190 | case 3: // set (disable, clear pending) |
| 191 | 191 | // Force clear unused bits |
| 192 | 192 | val &= MASTER_IRQ_MASK; |
| 193 | 193 | s->intregm_disabled |= val; |
| 194 | 194 | s->intregm_pending &= ~val; |
| 195 | - slavio_check_interrupts(s); | |
| 195 | + slavio_check_interrupts(s, 1); | |
| 196 | 196 | DPRINTF("Disabled master irq mask %x, curmask %x\n", val, |
| 197 | 197 | s->intregm_disabled); |
| 198 | 198 | break; |
| 199 | 199 | case 4: |
| 200 | 200 | s->target_cpu = val & (MAX_CPUS - 1); |
| 201 | - slavio_check_interrupts(s); | |
| 201 | + slavio_check_interrupts(s, 1); | |
| 202 | 202 | DPRINTF("Set master irq cpu %d\n", s->target_cpu); |
| 203 | 203 | break; |
| 204 | 204 | default: |
| ... | ... | @@ -249,7 +249,7 @@ void slavio_irq_info(Monitor *mon, void *opaque) |
| 249 | 249 | #endif |
| 250 | 250 | } |
| 251 | 251 | |
| 252 | -static void slavio_check_interrupts(SLAVIO_INTCTLState *s) | |
| 252 | +static void slavio_check_interrupts(SLAVIO_INTCTLState *s, int set_irqs) | |
| 253 | 253 | { |
| 254 | 254 | uint32_t pending = s->intregm_pending, pil_pending; |
| 255 | 255 | unsigned int i, j; |
| ... | ... | @@ -268,13 +268,17 @@ static void slavio_check_interrupts(SLAVIO_INTCTLState *s) |
| 268 | 268 | } |
| 269 | 269 | pil_pending |= (s->slaves[i]->intreg_pending & CPU_SOFTIRQ_MASK) >> 16; |
| 270 | 270 | |
| 271 | - for (j = 0; j < MAX_PILS; j++) { | |
| 272 | - if (pil_pending & (1 << j)) { | |
| 273 | - if (!(s->pil_out[i] & (1 << j))) | |
| 274 | - qemu_irq_raise(s->cpu_irqs[i][j]); | |
| 275 | - } else { | |
| 276 | - if (s->pil_out[i] & (1 << j)) | |
| 277 | - qemu_irq_lower(s->cpu_irqs[i][j]); | |
| 271 | + if (set_irqs) { | |
| 272 | + for (j = 0; j < MAX_PILS; j++) { | |
| 273 | + if (pil_pending & (1 << j)) { | |
| 274 | + if (!(s->pil_out[i] & (1 << j))) { | |
| 275 | + qemu_irq_raise(s->cpu_irqs[i][j]); | |
| 276 | + } | |
| 277 | + } else { | |
| 278 | + if (s->pil_out[i] & (1 << j)) { | |
| 279 | + qemu_irq_lower(s->cpu_irqs[i][j]); | |
| 280 | + } | |
| 281 | + } | |
| 278 | 282 | } |
| 279 | 283 | } |
| 280 | 284 | s->pil_out[i] = pil_pending; |
| ... | ... | @@ -304,7 +308,7 @@ static void slavio_set_irq(void *opaque, int irq, int level) |
| 304 | 308 | s->intregm_pending &= ~mask; |
| 305 | 309 | s->slaves[s->target_cpu]->intreg_pending &= ~(1 << pil); |
| 306 | 310 | } |
| 307 | - slavio_check_interrupts(s); | |
| 311 | + slavio_check_interrupts(s, 1); | |
| 308 | 312 | } |
| 309 | 313 | } |
| 310 | 314 | |
| ... | ... | @@ -322,7 +326,7 @@ static void slavio_set_timer_irq_cpu(void *opaque, int cpu, int level) |
| 322 | 326 | s->slaves[cpu]->intreg_pending &= ~s->cputimer_lbit; |
| 323 | 327 | } |
| 324 | 328 | |
| 325 | - slavio_check_interrupts(s); | |
| 329 | + slavio_check_interrupts(s, 1); | |
| 326 | 330 | } |
| 327 | 331 | |
| 328 | 332 | static void slavio_intctl_save(QEMUFile *f, void *opaque) |
| ... | ... | @@ -352,7 +356,7 @@ static int slavio_intctl_load(QEMUFile *f, void *opaque, int version_id) |
| 352 | 356 | qemu_get_be32s(f, &s->intregm_pending); |
| 353 | 357 | qemu_get_be32s(f, &s->intregm_disabled); |
| 354 | 358 | qemu_get_be32s(f, &s->target_cpu); |
| 355 | - slavio_check_interrupts(s); | |
| 359 | + slavio_check_interrupts(s, 0); | |
| 356 | 360 | return 0; |
| 357 | 361 | } |
| 358 | 362 | |
| ... | ... | @@ -367,7 +371,7 @@ static void slavio_intctl_reset(void *opaque) |
| 367 | 371 | s->intregm_disabled = ~MASTER_IRQ_MASK; |
| 368 | 372 | s->intregm_pending = 0; |
| 369 | 373 | s->target_cpu = 0; |
| 370 | - slavio_check_interrupts(s); | |
| 374 | + slavio_check_interrupts(s, 0); | |
| 371 | 375 | } |
| 372 | 376 | |
| 373 | 377 | void *slavio_intctl_init(target_phys_addr_t addr, target_phys_addr_t addrg, | ... | ... |