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,6 +61,7 @@ typedef struct SLAVIO_TIMERState { | ||
| 61 | struct SLAVIO_TIMERState *master; | 61 | struct SLAVIO_TIMERState *master; |
| 62 | int slave_index; | 62 | int slave_index; |
| 63 | // system only | 63 | // system only |
| 64 | + unsigned int num_slaves; | ||
| 64 | struct SLAVIO_TIMERState *slave[MAX_CPUS]; | 65 | struct SLAVIO_TIMERState *slave[MAX_CPUS]; |
| 65 | uint32_t slave_mode; | 66 | uint32_t slave_mode; |
| 66 | } SLAVIO_TIMERState; | 67 | } SLAVIO_TIMERState; |
| @@ -230,7 +231,7 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | @@ -230,7 +231,7 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | ||
| 230 | if (s->master == NULL) { | 231 | if (s->master == NULL) { |
| 231 | unsigned int i; | 232 | unsigned int i; |
| 232 | 233 | ||
| 233 | - for (i = 0; i < MAX_CPUS; i++) { | 234 | + for (i = 0; i < s->num_slaves; i++) { |
| 234 | if (val & (1 << i)) { | 235 | if (val & (1 << i)) { |
| 235 | qemu_irq_lower(s->slave[i]->irq); | 236 | qemu_irq_lower(s->slave[i]->irq); |
| 236 | s->slave[i]->limit = -1ULL; | 237 | s->slave[i]->limit = -1ULL; |
| @@ -244,7 +245,7 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | @@ -244,7 +245,7 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | ||
| 244 | ptimer_run(s->slave[i]->timer, 0); | 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 | } else | 249 | } else |
| 249 | DPRINTF("not system timer\n"); | 250 | DPRINTF("not system timer\n"); |
| 250 | break; | 251 | break; |
| @@ -352,13 +353,15 @@ static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, | @@ -352,13 +353,15 @@ static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, | ||
| 352 | } | 353 | } |
| 353 | 354 | ||
| 354 | void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, | 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 | SLAVIO_TIMERState *master; | 358 | SLAVIO_TIMERState *master; |
| 358 | unsigned int i; | 359 | unsigned int i; |
| 359 | 360 | ||
| 360 | master = slavio_timer_init(base + SYS_TIMER_OFFSET, master_irq, NULL, 0); | 361 | master = slavio_timer_init(base + SYS_TIMER_OFFSET, master_irq, NULL, 0); |
| 361 | 362 | ||
| 363 | + master->num_slaves = num_cpus; | ||
| 364 | + | ||
| 362 | for (i = 0; i < MAX_CPUS; i++) { | 365 | for (i = 0; i < MAX_CPUS; i++) { |
| 363 | master->slave[i] = slavio_timer_init(base + (target_phys_addr_t) | 366 | master->slave[i] = slavio_timer_init(base + (target_phys_addr_t) |
| 364 | CPU_TIMER_OFFSET(i), | 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,7 +436,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
| 436 | hwdef->nvram_size, 8); | 436 | hwdef->nvram_size, 8); |
| 437 | 437 | ||
| 438 | slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq], | 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 | slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq], | 441 | slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq], |
| 442 | nographic); | 442 | nographic); |
hw/sun4m.h
| @@ -36,7 +36,7 @@ void slavio_irq_info(void *opaque); | @@ -36,7 +36,7 @@ void slavio_irq_info(void *opaque); | ||
| 36 | 36 | ||
| 37 | /* slavio_timer.c */ | 37 | /* slavio_timer.c */ |
| 38 | void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, | 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 | /* slavio_serial.c */ | 41 | /* slavio_serial.c */ |
| 42 | SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, | 42 | SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, |