lapic.c (83d4c286931c9d28c5be21bac3c73a2332cab681) lapic.c (8d14695f9542e9e0195d6e41ddaa52c32322adf5)
1
2/*
3 * Local APIC virtualization
4 *
5 * Copyright (C) 2006 Qumranet, Inc.
6 * Copyright (C) 2007 Novell
7 * Copyright (C) 2007 Intel
8 * Copyright 2009 Red Hat, Inc. and/or its affiliates.

--- 126 unchanged lines hidden (view full) ---

135
136#define LVT_MASK \
137 (APIC_LVT_MASKED | APIC_SEND_PENDING | APIC_VECTOR_MASK)
138
139#define LINT_MASK \
140 (LVT_MASK | APIC_MODE_MASK | APIC_INPUT_POLARITY | \
141 APIC_LVT_REMOTE_IRR | APIC_LVT_LEVEL_TRIGGER)
142
1
2/*
3 * Local APIC virtualization
4 *
5 * Copyright (C) 2006 Qumranet, Inc.
6 * Copyright (C) 2007 Novell
7 * Copyright (C) 2007 Intel
8 * Copyright 2009 Red Hat, Inc. and/or its affiliates.

--- 126 unchanged lines hidden (view full) ---

135
136#define LVT_MASK \
137 (APIC_LVT_MASKED | APIC_SEND_PENDING | APIC_VECTOR_MASK)
138
139#define LINT_MASK \
140 (LVT_MASK | APIC_MODE_MASK | APIC_INPUT_POLARITY | \
141 APIC_LVT_REMOTE_IRR | APIC_LVT_LEVEL_TRIGGER)
142
143static inline int apic_x2apic_mode(struct kvm_lapic *apic)
144{
145 return apic->vcpu->arch.apic_base & X2APIC_ENABLE;
146}
147
148static inline int kvm_apic_id(struct kvm_lapic *apic)
149{
150 return (kvm_apic_get_reg(apic, APIC_ID) >> 24) & 0xff;
151}
152
153static inline u16 apic_cluster_id(struct kvm_apic_map *map, u32 ldr)
154{
155 u16 cid;

--- 1142 unchanged lines hidden (view full) ---

1298
1299 tpr = (u64) kvm_apic_get_reg(vcpu->arch.apic, APIC_TASKPRI);
1300
1301 return (tpr & 0xf0) >> 4;
1302}
1303
1304void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
1305{
143static inline int kvm_apic_id(struct kvm_lapic *apic)
144{
145 return (kvm_apic_get_reg(apic, APIC_ID) >> 24) & 0xff;
146}
147
148static inline u16 apic_cluster_id(struct kvm_apic_map *map, u32 ldr)
149{
150 u16 cid;

--- 1142 unchanged lines hidden (view full) ---

1293
1294 tpr = (u64) kvm_apic_get_reg(vcpu->arch.apic, APIC_TASKPRI);
1295
1296 return (tpr & 0xf0) >> 4;
1297}
1298
1299void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
1300{
1301 u64 old_value = vcpu->arch.apic_base;
1306 struct kvm_lapic *apic = vcpu->arch.apic;
1307
1308 if (!apic) {
1309 value |= MSR_IA32_APICBASE_BSP;
1310 vcpu->arch.apic_base = value;
1311 return;
1312 }
1313

--- 5 unchanged lines hidden (view full) ---

1319 static_key_slow_inc(&apic_hw_disabled.key);
1320 recalculate_apic_map(vcpu->kvm);
1321 }
1322
1323 if (!kvm_vcpu_is_bsp(apic->vcpu))
1324 value &= ~MSR_IA32_APICBASE_BSP;
1325
1326 vcpu->arch.apic_base = value;
1302 struct kvm_lapic *apic = vcpu->arch.apic;
1303
1304 if (!apic) {
1305 value |= MSR_IA32_APICBASE_BSP;
1306 vcpu->arch.apic_base = value;
1307 return;
1308 }
1309

--- 5 unchanged lines hidden (view full) ---

1315 static_key_slow_inc(&apic_hw_disabled.key);
1316 recalculate_apic_map(vcpu->kvm);
1317 }
1318
1319 if (!kvm_vcpu_is_bsp(apic->vcpu))
1320 value &= ~MSR_IA32_APICBASE_BSP;
1321
1322 vcpu->arch.apic_base = value;
1327 if (apic_x2apic_mode(apic)) {
1328 u32 id = kvm_apic_id(apic);
1329 u32 ldr = ((id >> 4) << 16) | (1 << (id & 0xf));
1330 kvm_apic_set_ldr(apic, ldr);
1323 if ((old_value ^ value) & X2APIC_ENABLE) {
1324 if (value & X2APIC_ENABLE) {
1325 u32 id = kvm_apic_id(apic);
1326 u32 ldr = ((id >> 4) << 16) | (1 << (id & 0xf));
1327 kvm_apic_set_ldr(apic, ldr);
1328 kvm_x86_ops->set_virtual_x2apic_mode(vcpu, true);
1329 } else
1330 kvm_x86_ops->set_virtual_x2apic_mode(vcpu, false);
1331 }
1331 }
1332
1332 apic->base_address = apic->vcpu->arch.apic_base &
1333 MSR_IA32_APICBASE_BASE;
1334
1335 /* with FSB delivery interrupt, we can restart APIC functionality */
1336 apic_debug("apic base msr is 0x%016" PRIx64 ", and base address is "
1337 "0x%lx.\n", apic->vcpu->arch.apic_base, apic->base_address);
1338
1339}

--- 468 unchanged lines hidden ---
1333 apic->base_address = apic->vcpu->arch.apic_base &
1334 MSR_IA32_APICBASE_BASE;
1335
1336 /* with FSB delivery interrupt, we can restart APIC functionality */
1337 apic_debug("apic base msr is 0x%016" PRIx64 ", and base address is "
1338 "0x%lx.\n", apic->vcpu->arch.apic_base, apic->base_address);
1339
1340}

--- 468 unchanged lines hidden ---