Commit 19f8e5dd2bf6f4093988b13c424a7ba35f39071d
1 parent
4fddf62a
Only create as many per CPU timers as there are CPUs. (Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3833 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
8 additions
and
5 deletions
hw/slavio_timer.c
... | ... | @@ -61,6 +61,7 @@ typedef struct SLAVIO_TIMERState { |
61 | 61 | struct SLAVIO_TIMERState *master; |
62 | 62 | int slave_index; |
63 | 63 | // system only |
64 | + unsigned int num_slaves; | |
64 | 65 | struct SLAVIO_TIMERState *slave[MAX_CPUS]; |
65 | 66 | uint32_t slave_mode; |
66 | 67 | } SLAVIO_TIMERState; |
... | ... | @@ -230,7 +231,7 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, |
230 | 231 | if (s->master == NULL) { |
231 | 232 | unsigned int i; |
232 | 233 | |
233 | - for (i = 0; i < MAX_CPUS; i++) { | |
234 | + for (i = 0; i < s->num_slaves; i++) { | |
234 | 235 | if (val & (1 << i)) { |
235 | 236 | qemu_irq_lower(s->slave[i]->irq); |
236 | 237 | s->slave[i]->limit = -1ULL; |
... | ... | @@ -244,7 +245,7 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, |
244 | 245 | ptimer_run(s->slave[i]->timer, 0); |
245 | 246 | } |
246 | 247 | } |
247 | - s->slave_mode = val & ((1 << MAX_CPUS) - 1); | |
248 | + s->slave_mode = val & ((1 << s->num_slaves) - 1); | |
248 | 249 | } else |
249 | 250 | DPRINTF("not system timer\n"); |
250 | 251 | break; |
... | ... | @@ -352,13 +353,15 @@ static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, |
352 | 353 | } |
353 | 354 | |
354 | 355 | void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, |
355 | - qemu_irq *cpu_irqs) | |
356 | + qemu_irq *cpu_irqs, unsigned int num_cpus) | |
356 | 357 | { |
357 | 358 | SLAVIO_TIMERState *master; |
358 | 359 | unsigned int i; |
359 | 360 | |
360 | 361 | master = slavio_timer_init(base + SYS_TIMER_OFFSET, master_irq, NULL, 0); |
361 | 362 | |
363 | + master->num_slaves = num_cpus; | |
364 | + | |
362 | 365 | for (i = 0; i < MAX_CPUS; i++) { |
363 | 366 | master->slave[i] = slavio_timer_init(base + (target_phys_addr_t) |
364 | 367 | CPU_TIMER_OFFSET(i), | ... | ... |
hw/sun4m.c
... | ... | @@ -436,7 +436,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
436 | 436 | hwdef->nvram_size, 8); |
437 | 437 | |
438 | 438 | slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq], |
439 | - slavio_cpu_irq); | |
439 | + slavio_cpu_irq, smp_cpus); | |
440 | 440 | |
441 | 441 | slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq], |
442 | 442 | nographic); | ... | ... |
hw/sun4m.h
... | ... | @@ -36,7 +36,7 @@ void slavio_irq_info(void *opaque); |
36 | 36 | |
37 | 37 | /* slavio_timer.c */ |
38 | 38 | void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, |
39 | - qemu_irq *cpu_irqs); | |
39 | + qemu_irq *cpu_irqs, unsigned int num_cpus); | |
40 | 40 | |
41 | 41 | /* slavio_serial.c */ |
42 | 42 | SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, | ... | ... |