And dropping MAX_APICS cast macro altogether. Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com> --- hw/intc/apic.c | 82 +++++++++++++++++------------------------ include/hw/i386/apic_internal.h | 2 - 2 files changed, 33 insertions(+), 51 deletions(-)
diff --git a/hw/intc/apic.c b/hw/intc/apic.c index 8080e20..fc18600 100644 --- a/hw/intc/apic.c +++ b/hw/intc/apic.c @@ -32,8 +32,6 @@ #define SYNC_TO_VAPIC 0x2 #define SYNC_ISR_IRR_TO_VAPIC 0x4 -static APICCommonState *local_apics[MAX_APICS + 1]; - static void apic_set_irq(APICCommonState *s, int vector_num, int trigger_mode); static void apic_update_irq(APICCommonState *s); static void apic_get_delivery_bitmask(uint32_t *deliver_bitmask, @@ -200,18 +198,15 @@ static void apic_external_nmi(APICCommonState *s) #define foreach_apic(apic, deliver_bitmask, code) \ {\ + CPUState *cpu;\ int __i, __j, __mask;\ - for(__i = 0; __i < MAX_APIC_WORDS; __i++) {\ + CPU_FOREACH(cpu) {\ + apic = APIC_COMMON(X86_CPU(cpu)->env.apic_state);\ + __i = apic->idx / 32;\ + __j = apic->idx % 32;\ __mask = deliver_bitmask[__i];\ - if (__mask) {\ - for(__j = 0; __j < 32; __j++) {\ - if (__mask & (1 << __j)) {\ - apic = local_apics[__i * 32 + __j];\ - if (apic) {\ - code;\ - }\ - }\ - }\ + if (__mask & (1 << __j)) {\ + code;\ }\ }\ } @@ -235,9 +230,13 @@ static void apic_bus_deliver(const uint32_t *deliver_bitmask, } } if (d >= 0) { - apic_iter = local_apics[d]; - if (apic_iter) { - apic_set_irq(apic_iter, vector_num, trigger_mode); + CPUState *cpu; + CPU_FOREACH(cpu) { + apic_iter = APIC_COMMON(X86_CPU(cpu)->env.apic_state); + if (apic_iter->idx == d) { + apic_set_irq(apic_iter, vector_num, trigger_mode); + break; + } } } } @@ -422,18 +421,14 @@ static void apic_eoi(APICCommonState *s) static int apic_find_dest(uint8_t dest) { - APICCommonState *apic = local_apics[dest]; - int i; - - if (apic && apic->id == dest) - return dest; /* shortcut in case apic->id == apic->idx */ + APICCommonState *apic; + CPUState *cpu; - for (i = 0; i < MAX_APICS; i++) { - apic = local_apics[i]; - if (apic && apic->id == dest) - return i; - if (!apic) - break; + CPU_FOREACH(cpu) { + apic = APIC_COMMON(X86_CPU(cpu)->env.apic_state); + if (apic->id == dest) { + return apic->idx; + } } return -1; @@ -443,7 +438,7 @@ static void apic_get_delivery_bitmask(uint32_t *deliver_bitmask, uint8_t dest, uint8_t dest_mode) { APICCommonState *apic_iter; - int i; + CPUState *cpu; if (dest_mode == 0) { if (dest == 0xff) { @@ -457,20 +452,17 @@ static void apic_get_delivery_bitmask(uint32_t *deliver_bitmask, } else { /* XXX: cluster mode */ memset(deliver_bitmask, 0x00, MAX_APIC_WORDS * sizeof(uint32_t)); - for(i = 0; i < MAX_APICS; i++) { - apic_iter = local_apics[i]; - if (apic_iter) { - if (apic_iter->dest_mode == 0xf) { - if (dest & apic_iter->log_dest) - apic_set_bit(deliver_bitmask, i); - } else if (apic_iter->dest_mode == 0x0) { - if ((dest & 0xf0) == (apic_iter->log_dest & 0xf0) && - (dest & apic_iter->log_dest & 0x0f)) { - apic_set_bit(deliver_bitmask, i); - } + CPU_FOREACH(cpu) { + apic_iter = APIC_COMMON(X86_CPU(cpu)->env.apic_state); + if (apic_iter->dest_mode == 0xf) { + if (dest & apic_iter->log_dest) { + apic_set_bit(deliver_bitmask, apic_iter->idx); + } + } else if (apic_iter->dest_mode == 0x0) { + if ((dest & 0xf0) == (apic_iter->log_dest & 0xf0) && + (dest & apic_iter->log_dest & 0x0f)) { + apic_set_bit(deliver_bitmask, apic_iter->idx); } - } else { - break; } } } @@ -875,20 +867,12 @@ static void apic_realize(DeviceState *dev, Error **errp) { APICCommonState *s = APIC_COMMON(dev); APICCommonClass *acc = APIC_COMMON_GET_CLASS(s); - static int apic_no; - - if (apic_no >= MAX_APICS) { - error_setg(errp, "the new apic number: %d " - "exceeded max apic number", apic_no); - return; - } memory_region_init_io(&s->io_memory, OBJECT(s), &apic_io_ops, s, "apic-msi", APIC_SPACE_SIZE); s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, apic_timer, s); - s->idx = apic_no++; - local_apics[s->idx] = s; + s->idx = s->id; msi_supported = true; acc->parent_realize(dev, errp); diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h index 0d775dd..a8b7b46 100644 --- a/include/hw/i386/apic_internal.h +++ b/include/hw/i386/apic_internal.h @@ -64,8 +64,6 @@ #define VAPIC_ENABLE_BIT 0 #define VAPIC_ENABLE_MASK (1 << VAPIC_ENABLE_BIT) -#define MAX_APICS 255 - typedef struct APICCommonState APICCommonState; #define TYPE_APIC_COMMON "apic-common" -- 1.8.1.4