Commit 19f8e5dd2bf6f4093988b13c424a7ba35f39071d

Authored by blueswir1
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
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,
... ...