apic: Store X86CPU in APICCommonState

Prepares for using a link<> property to connect APIC with CPU and for
changing the CPU APIs to CPUState.

Resolve Coding Style warnings by moving the closing parenthesis of
foreach_apic() macro to next line.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
This commit is contained in:
Andreas Färber 2012-10-10 14:10:07 +02:00
parent 449994eb58
commit 60671e583c
5 changed files with 30 additions and 25 deletions

View File

@ -107,7 +107,7 @@ static void apic_sync_vapic(APICCommonState *s, int sync_type)
length = offsetof(VAPICState, enabled) - offsetof(VAPICState, isr); length = offsetof(VAPICState, enabled) - offsetof(VAPICState, isr);
if (sync_type & SYNC_TO_VAPIC) { if (sync_type & SYNC_TO_VAPIC) {
assert(qemu_cpu_is_self(s->cpu_env)); assert(qemu_cpu_is_self(&s->cpu->env));
vapic_state.tpr = s->tpr; vapic_state.tpr = s->tpr;
vapic_state.enabled = 1; vapic_state.enabled = 1;
@ -151,15 +151,15 @@ static void apic_local_deliver(APICCommonState *s, int vector)
switch ((lvt >> 8) & 7) { switch ((lvt >> 8) & 7) {
case APIC_DM_SMI: case APIC_DM_SMI:
cpu_interrupt(s->cpu_env, CPU_INTERRUPT_SMI); cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_SMI);
break; break;
case APIC_DM_NMI: case APIC_DM_NMI:
cpu_interrupt(s->cpu_env, CPU_INTERRUPT_NMI); cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_NMI);
break; break;
case APIC_DM_EXTINT: case APIC_DM_EXTINT:
cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_HARD);
break; break;
case APIC_DM_FIXED: case APIC_DM_FIXED:
@ -187,7 +187,7 @@ void apic_deliver_pic_intr(DeviceState *d, int level)
reset_bit(s->irr, lvt & 0xff); reset_bit(s->irr, lvt & 0xff);
/* fall through */ /* fall through */
case APIC_DM_EXTINT: case APIC_DM_EXTINT:
cpu_reset_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); cpu_reset_interrupt(&s->cpu->env, CPU_INTERRUPT_HARD);
break; break;
} }
} }
@ -248,18 +248,22 @@ static void apic_bus_deliver(const uint32_t *deliver_bitmask,
case APIC_DM_SMI: case APIC_DM_SMI:
foreach_apic(apic_iter, deliver_bitmask, foreach_apic(apic_iter, deliver_bitmask,
cpu_interrupt(apic_iter->cpu_env, CPU_INTERRUPT_SMI) ); cpu_interrupt(&apic_iter->cpu->env, CPU_INTERRUPT_SMI)
);
return; return;
case APIC_DM_NMI: case APIC_DM_NMI:
foreach_apic(apic_iter, deliver_bitmask, foreach_apic(apic_iter, deliver_bitmask,
cpu_interrupt(apic_iter->cpu_env, CPU_INTERRUPT_NMI) ); cpu_interrupt(&apic_iter->cpu->env, CPU_INTERRUPT_NMI)
);
return; return;
case APIC_DM_INIT: case APIC_DM_INIT:
/* normal INIT IPI sent to processors */ /* normal INIT IPI sent to processors */
foreach_apic(apic_iter, deliver_bitmask, foreach_apic(apic_iter, deliver_bitmask,
cpu_interrupt(apic_iter->cpu_env, CPU_INTERRUPT_INIT) ); cpu_interrupt(&apic_iter->cpu->env,
CPU_INTERRUPT_INIT)
);
return; return;
case APIC_DM_EXTINT: case APIC_DM_EXTINT:
@ -293,7 +297,7 @@ static void apic_set_base(APICCommonState *s, uint64_t val)
/* if disabled, cannot be enabled again */ /* if disabled, cannot be enabled again */
if (!(val & MSR_IA32_APICBASE_ENABLE)) { if (!(val & MSR_IA32_APICBASE_ENABLE)) {
s->apicbase &= ~MSR_IA32_APICBASE_ENABLE; s->apicbase &= ~MSR_IA32_APICBASE_ENABLE;
cpu_clear_apic_feature(s->cpu_env); cpu_clear_apic_feature(&s->cpu->env);
s->spurious_vec &= ~APIC_SV_ENABLE; s->spurious_vec &= ~APIC_SV_ENABLE;
} }
} }
@ -362,10 +366,10 @@ static void apic_update_irq(APICCommonState *s)
if (!(s->spurious_vec & APIC_SV_ENABLE)) { if (!(s->spurious_vec & APIC_SV_ENABLE)) {
return; return;
} }
if (!qemu_cpu_is_self(s->cpu_env)) { if (!qemu_cpu_is_self(&s->cpu->env)) {
cpu_interrupt(s->cpu_env, CPU_INTERRUPT_POLL); cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_POLL);
} else if (apic_irq_pending(s) > 0) { } else if (apic_irq_pending(s) > 0) {
cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD); cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_HARD);
} }
} }
@ -472,18 +476,18 @@ static void apic_get_delivery_bitmask(uint32_t *deliver_bitmask,
static void apic_startup(APICCommonState *s, int vector_num) static void apic_startup(APICCommonState *s, int vector_num)
{ {
s->sipi_vector = vector_num; s->sipi_vector = vector_num;
cpu_interrupt(s->cpu_env, CPU_INTERRUPT_SIPI); cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_SIPI);
} }
void apic_sipi(DeviceState *d) void apic_sipi(DeviceState *d)
{ {
APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d); APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
cpu_reset_interrupt(s->cpu_env, CPU_INTERRUPT_SIPI); cpu_reset_interrupt(&s->cpu->env, CPU_INTERRUPT_SIPI);
if (!s->wait_for_sipi) if (!s->wait_for_sipi)
return; return;
cpu_x86_load_seg_cache_sipi(s->cpu_env, s->sipi_vector); cpu_x86_load_seg_cache_sipi(&s->cpu->env, s->sipi_vector);
s->wait_for_sipi = 0; s->wait_for_sipi = 0;
} }
@ -672,7 +676,7 @@ static uint32_t apic_mem_readl(void *opaque, hwaddr addr)
case 0x08: case 0x08:
apic_sync_vapic(s, SYNC_FROM_VAPIC); apic_sync_vapic(s, SYNC_FROM_VAPIC);
if (apic_report_tpr_access) { if (apic_report_tpr_access) {
cpu_report_tpr_access(s->cpu_env, TPR_ACCESS_READ); cpu_report_tpr_access(&s->cpu->env, TPR_ACCESS_READ);
} }
val = s->tpr; val = s->tpr;
break; break;
@ -774,7 +778,7 @@ static void apic_mem_writel(void *opaque, hwaddr addr, uint32_t val)
break; break;
case 0x08: case 0x08:
if (apic_report_tpr_access) { if (apic_report_tpr_access) {
cpu_report_tpr_access(s->cpu_env, TPR_ACCESS_WRITE); cpu_report_tpr_access(&s->cpu->env, TPR_ACCESS_WRITE);
} }
s->tpr = val; s->tpr = val;
apic_sync_vapic(s, SYNC_TO_VAPIC); apic_sync_vapic(s, SYNC_TO_VAPIC);

View File

@ -103,7 +103,7 @@ void apic_handle_tpr_access_report(DeviceState *d, target_ulong ip,
{ {
APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d); APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
vapic_report_tpr_access(s->vapic, s->cpu_env, ip, access); vapic_report_tpr_access(s->vapic, &s->cpu->env, ip, access);
} }
void apic_report_irq_delivered(int delivered) void apic_report_irq_delivered(int delivered)
@ -217,7 +217,7 @@ static void apic_reset_common(DeviceState *d)
APICCommonClass *info = APIC_COMMON_GET_CLASS(s); APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
bool bsp; bool bsp;
bsp = cpu_is_bsp(x86_env_get_cpu(s->cpu_env)); bsp = cpu_is_bsp(s->cpu);
s->apicbase = 0xfee00000 | s->apicbase = 0xfee00000 |
(bsp ? MSR_IA32_APICBASE_BSP : 0) | MSR_IA32_APICBASE_ENABLE; (bsp ? MSR_IA32_APICBASE_BSP : 0) | MSR_IA32_APICBASE_ENABLE;

View File

@ -95,8 +95,9 @@ typedef struct APICCommonClass
struct APICCommonState { struct APICCommonState {
SysBusDevice busdev; SysBusDevice busdev;
MemoryRegion io_memory; MemoryRegion io_memory;
void *cpu_env; X86CPU *cpu;
uint32_t apicbase; uint32_t apicbase;
uint8_t id; uint8_t id;
uint8_t arb_id; uint8_t arb_id;

View File

@ -104,7 +104,7 @@ static void kvm_apic_enable_tpr_reporting(APICCommonState *s, bool enable)
.enabled = enable .enabled = enable
}; };
kvm_vcpu_ioctl(s->cpu_env, KVM_TPR_ACCESS_REPORTING, &ctl); kvm_vcpu_ioctl(&s->cpu->env, KVM_TPR_ACCESS_REPORTING, &ctl);
} }
static void kvm_apic_vapic_base_update(APICCommonState *s) static void kvm_apic_vapic_base_update(APICCommonState *s)
@ -114,7 +114,7 @@ static void kvm_apic_vapic_base_update(APICCommonState *s)
}; };
int ret; int ret;
ret = kvm_vcpu_ioctl(s->cpu_env, KVM_SET_VAPIC_ADDR, &vapid_addr); ret = kvm_vcpu_ioctl(&s->cpu->env, KVM_SET_VAPIC_ADDR, &vapid_addr);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "KVM: setting VAPIC address failed (%s)\n", fprintf(stderr, "KVM: setting VAPIC address failed (%s)\n",
strerror(-ret)); strerror(-ret));
@ -125,7 +125,7 @@ static void kvm_apic_vapic_base_update(APICCommonState *s)
static void do_inject_external_nmi(void *data) static void do_inject_external_nmi(void *data)
{ {
APICCommonState *s = data; APICCommonState *s = data;
CPUX86State *env = s->cpu_env; CPUX86State *env = &s->cpu->env;
uint32_t lvt; uint32_t lvt;
int ret; int ret;
@ -143,7 +143,7 @@ static void do_inject_external_nmi(void *data)
static void kvm_apic_external_nmi(APICCommonState *s) static void kvm_apic_external_nmi(APICCommonState *s)
{ {
run_on_cpu(s->cpu_env, do_inject_external_nmi, s); run_on_cpu(&s->cpu->env, do_inject_external_nmi, s);
} }
static uint64_t kvm_apic_mem_read(void *opaque, hwaddr addr, static uint64_t kvm_apic_mem_read(void *opaque, hwaddr addr,

View File

@ -1913,7 +1913,7 @@ static void x86_cpu_apic_init(X86CPU *cpu, Error **errp)
qdev_prop_set_uint8(env->apic_state, "id", env->cpuid_apic_id); qdev_prop_set_uint8(env->apic_state, "id", env->cpuid_apic_id);
/* TODO: convert to link<> */ /* TODO: convert to link<> */
apic = APIC_COMMON(env->apic_state); apic = APIC_COMMON(env->apic_state);
apic->cpu_env = env; apic->cpu = cpu;
if (qdev_init(env->apic_state)) { if (qdev_init(env->apic_state)) {
error_setg(errp, "APIC device '%s' could not be initialized", error_setg(errp, "APIC device '%s' could not be initialized",