summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2012-09-26 00:06:17 +0000
committerneel <neel@FreeBSD.org>2012-09-26 00:06:17 +0000
commit5dbc1ca26acaa3175dae7b9d0c45151fba0275ab (patch)
treec995abae29493221169dd97e854cf339038315e3 /sys/amd64
parentbc269b51afe43aab28df7ea0d543c167bb7c7d2e (diff)
downloadFreeBSD-src-5dbc1ca26acaa3175dae7b9d0c45151fba0275ab.zip
FreeBSD-src-5dbc1ca26acaa3175dae7b9d0c45151fba0275ab.tar.gz
Add an option "-a" to present the local apic in the XAPIC mode instead of the
default X2APIC mode to the guest.
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/vmm/io/vlapic.c22
-rw-r--r--sys/amd64/vmm/io/vlapic.h3
-rw-r--r--sys/amd64/vmm/vmm.c4
3 files changed, 19 insertions, 10 deletions
diff --git a/sys/amd64/vmm/io/vlapic.c b/sys/amd64/vmm/io/vlapic.c
index aedc692..1e8a4e8 100644
--- a/sys/amd64/vmm/io/vlapic.c
+++ b/sys/amd64/vmm/io/vlapic.c
@@ -823,14 +823,8 @@ static struct io_region vlapic_mmio[VM_MAXCPU];
struct vlapic *
vlapic_init(struct vm *vm, int vcpuid)
{
- int err;
- enum x2apic_state state;
struct vlapic *vlapic;
- err = vm_get_x2apic_state(vm, vcpuid, &state);
- if (err)
- panic("vlapic_set_apicbase: err %d fetching x2apic state", err);
-
vlapic = malloc(sizeof(struct vlapic), M_VLAPIC, M_WAITOK | M_ZERO);
vlapic->vm = vm;
vlapic->vcpuid = vcpuid;
@@ -840,9 +834,6 @@ vlapic_init(struct vm *vm, int vcpuid)
if (vcpuid == 0)
vlapic->msr_apicbase |= APICBASE_BSP;
- if (state == X2APIC_ENABLED)
- vlapic->msr_apicbase |= APICBASE_X2APIC;
-
vlapic->ops = &vlapic_dev_ops;
vlapic->mmio = vlapic_mmio + vcpuid;
@@ -888,3 +879,16 @@ vlapic_set_apicbase(struct vlapic *vlapic, uint64_t val)
vlapic->msr_apicbase = val;
}
+
+void
+vlapic_set_x2apic_state(struct vm *vm, int vcpuid, enum x2apic_state state)
+{
+ struct vlapic *vlapic;
+
+ vlapic = vm_lapic(vm, vcpuid);
+
+ if (state == X2APIC_ENABLED)
+ vlapic->msr_apicbase |= APICBASE_X2APIC;
+ else
+ vlapic->msr_apicbase &= ~APICBASE_X2APIC;
+}
diff --git a/sys/amd64/vmm/io/vlapic.h b/sys/amd64/vmm/io/vlapic.h
index cecd4d3..f43289d 100644
--- a/sys/amd64/vmm/io/vlapic.h
+++ b/sys/amd64/vmm/io/vlapic.h
@@ -88,6 +88,8 @@ struct vm;
*/
#define ISRVEC_STK_SIZE (16 + 1)
+enum x2apic_state;
+
struct vlapic *vlapic_init(struct vm *vm, int vcpuid);
void vlapic_cleanup(struct vlapic *vlapic);
@@ -104,5 +106,6 @@ void vlapic_timer_tick(struct vlapic *vlapic);
uint64_t vlapic_get_apicbase(struct vlapic *vlapic);
void vlapic_set_apicbase(struct vlapic *vlapic, uint64_t val);
+void vlapic_set_x2apic_state(struct vm *vm, int vcpuid, enum x2apic_state s);
#endif /* _VLAPIC_H_ */
diff --git a/sys/amd64/vmm/vmm.c b/sys/amd64/vmm/vmm.c
index 764ffbb..db2f9b8 100644
--- a/sys/amd64/vmm/vmm.c
+++ b/sys/amd64/vmm/vmm.c
@@ -160,8 +160,8 @@ vcpu_init(struct vm *vm, uint32_t vcpu_id)
vcpu->hostcpu = -1;
vcpu->vcpuid = vcpu_id;
- vcpu->x2apic_state = X2APIC_ENABLED;
vcpu->vlapic = vlapic_init(vm, vcpu_id);
+ vm_set_x2apic_state(vm, vcpu_id, X2APIC_ENABLED);
vcpu->guestfpu = fpu_save_area_alloc();
fpu_save_area_reset(vcpu->guestfpu);
vcpu->stats = vmm_stat_alloc();
@@ -770,5 +770,7 @@ vm_set_x2apic_state(struct vm *vm, int vcpuid, enum x2apic_state state)
vm->vcpu[vcpuid].x2apic_state = state;
+ vlapic_set_x2apic_state(vm, vcpuid, state);
+
return (0);
}
OpenPOWER on IntegriCloud