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, | ... | ... |