[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v1 2/3] Using CPU_FOREACH() instead of scanning loca
From: |
Chen Fan |
Subject: |
[Qemu-devel] [PATCH v1 2/3] Using CPU_FOREACH() instead of scanning local_apics |
Date: |
Tue, 22 Oct 2013 15:05:26 +0800 |
And dropping MAX_APICS cast macro altogether.
Signed-off-by: Chen Fan <address@hidden>
---
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