Revision f930d07e hw/slavio_intctl.c
b/hw/slavio_intctl.c | ||
---|---|---|
100 | 100 |
DPRINTF("write cpu %d reg 0x" TARGET_FMT_plx " = %x\n", cpu, addr, val); |
101 | 101 |
switch (saddr) { |
102 | 102 |
case 1: // clear pending softints |
103 |
if (val & 0x4000)
|
|
104 |
val |= 80000000;
|
|
105 |
val &= 0xfffe0000;
|
|
106 |
s->intreg_pending[cpu] &= ~val;
|
|
103 |
if (val & 0x4000)
|
|
104 |
val |= 80000000;
|
|
105 |
val &= 0xfffe0000;
|
|
106 |
s->intreg_pending[cpu] &= ~val;
|
|
107 | 107 |
slavio_check_interrupts(s); |
108 |
DPRINTF("Cleared cpu %d irq mask %x, curmask %x\n", cpu, val, s->intreg_pending[cpu]);
|
|
109 |
break;
|
|
108 |
DPRINTF("Cleared cpu %d irq mask %x, curmask %x\n", cpu, val, s->intreg_pending[cpu]);
|
|
109 |
break;
|
|
110 | 110 |
case 2: // set softint |
111 |
val &= 0xfffe0000;
|
|
112 |
s->intreg_pending[cpu] |= val;
|
|
111 |
val &= 0xfffe0000;
|
|
112 |
s->intreg_pending[cpu] |= val;
|
|
113 | 113 |
slavio_check_interrupts(s); |
114 |
DPRINTF("Set cpu %d irq mask %x, curmask %x\n", cpu, val, s->intreg_pending[cpu]);
|
|
115 |
break;
|
|
114 |
DPRINTF("Set cpu %d irq mask %x, curmask %x\n", cpu, val, s->intreg_pending[cpu]);
|
|
115 |
break;
|
|
116 | 116 |
default: |
117 |
break;
|
|
117 |
break;
|
|
118 | 118 |
} |
119 | 119 |
} |
120 | 120 |
|
... | ... | |
165 | 165 |
DPRINTF("write system reg 0x" TARGET_FMT_plx " = %x\n", addr, val); |
166 | 166 |
switch (saddr) { |
167 | 167 |
case 2: // clear (enable) |
168 |
// Force clear unused bits
|
|
169 |
val &= ~0x4fb2007f;
|
|
170 |
s->intregm_disabled &= ~val;
|
|
171 |
DPRINTF("Enabled master irq mask %x, curmask %x\n", val, s->intregm_disabled);
|
|
172 |
slavio_check_interrupts(s);
|
|
173 |
break;
|
|
168 |
// Force clear unused bits
|
|
169 |
val &= ~0x4fb2007f;
|
|
170 |
s->intregm_disabled &= ~val;
|
|
171 |
DPRINTF("Enabled master irq mask %x, curmask %x\n", val, s->intregm_disabled);
|
|
172 |
slavio_check_interrupts(s);
|
|
173 |
break;
|
|
174 | 174 |
case 3: // set (disable, clear pending) |
175 |
// Force clear unused bits
|
|
176 |
val &= ~0x4fb2007f;
|
|
177 |
s->intregm_disabled |= val;
|
|
178 |
s->intregm_pending &= ~val;
|
|
175 |
// Force clear unused bits
|
|
176 |
val &= ~0x4fb2007f;
|
|
177 |
s->intregm_disabled |= val;
|
|
178 |
s->intregm_pending &= ~val;
|
|
179 | 179 |
slavio_check_interrupts(s); |
180 |
DPRINTF("Disabled master irq mask %x, curmask %x\n", val, s->intregm_disabled);
|
|
181 |
break;
|
|
180 |
DPRINTF("Disabled master irq mask %x, curmask %x\n", val, s->intregm_disabled);
|
|
181 |
break;
|
|
182 | 182 |
case 4: |
183 |
s->target_cpu = val & (MAX_CPUS - 1);
|
|
183 |
s->target_cpu = val & (MAX_CPUS - 1);
|
|
184 | 184 |
slavio_check_interrupts(s); |
185 |
DPRINTF("Set master irq cpu %d\n", s->target_cpu);
|
|
186 |
break;
|
|
185 |
DPRINTF("Set master irq cpu %d\n", s->target_cpu);
|
|
186 |
break;
|
|
187 | 187 |
default: |
188 |
break;
|
|
188 |
break;
|
|
189 | 189 |
} |
190 | 190 |
} |
191 | 191 |
|
... | ... | |
207 | 207 |
int i; |
208 | 208 |
|
209 | 209 |
for (i = 0; i < MAX_CPUS; i++) { |
210 |
term_printf("per-cpu %d: pending 0x%08x\n", i, s->intreg_pending[i]);
|
|
210 |
term_printf("per-cpu %d: pending 0x%08x\n", i, s->intreg_pending[i]);
|
|
211 | 211 |
} |
212 | 212 |
term_printf("master: pending 0x%08x, disabled 0x%08x\n", s->intregm_pending, s->intregm_disabled); |
213 | 213 |
} |
... | ... | |
310 | 310 |
int i; |
311 | 311 |
|
312 | 312 |
for (i = 0; i < MAX_CPUS; i++) { |
313 |
qemu_put_be32s(f, &s->intreg_pending[i]);
|
|
313 |
qemu_put_be32s(f, &s->intreg_pending[i]);
|
|
314 | 314 |
} |
315 | 315 |
qemu_put_be32s(f, &s->intregm_pending); |
316 | 316 |
qemu_put_be32s(f, &s->intregm_disabled); |
... | ... | |
326 | 326 |
return -EINVAL; |
327 | 327 |
|
328 | 328 |
for (i = 0; i < MAX_CPUS; i++) { |
329 |
qemu_get_be32s(f, &s->intreg_pending[i]);
|
|
329 |
qemu_get_be32s(f, &s->intreg_pending[i]);
|
|
330 | 330 |
} |
331 | 331 |
qemu_get_be32s(f, &s->intregm_pending); |
332 | 332 |
qemu_get_be32s(f, &s->intregm_disabled); |
... | ... | |
341 | 341 |
int i; |
342 | 342 |
|
343 | 343 |
for (i = 0; i < MAX_CPUS; i++) { |
344 |
s->intreg_pending[i] = 0;
|
|
344 |
s->intreg_pending[i] = 0;
|
|
345 | 345 |
} |
346 | 346 |
s->intregm_disabled = ~0xffb2007f; |
347 | 347 |
s->intregm_pending = 0; |
... | ... | |
363 | 363 |
|
364 | 364 |
s->intbit_to_level = intbit_to_level; |
365 | 365 |
for (i = 0; i < MAX_CPUS; i++) { |
366 |
slavio_intctl_io_memory = cpu_register_io_memory(0, slavio_intctl_mem_read, slavio_intctl_mem_write, s);
|
|
367 |
cpu_register_physical_memory(addr + i * TARGET_PAGE_SIZE, INTCTL_SIZE,
|
|
366 |
slavio_intctl_io_memory = cpu_register_io_memory(0, slavio_intctl_mem_read, slavio_intctl_mem_write, s);
|
|
367 |
cpu_register_physical_memory(addr + i * TARGET_PAGE_SIZE, INTCTL_SIZE,
|
|
368 | 368 |
slavio_intctl_io_memory); |
369 | 369 |
s->cpu_irqs[i] = parent_irq[i]; |
370 | 370 |
} |
Also available in: Unified diff