diff options
author | neel <neel@FreeBSD.org> | 2012-09-26 00:06:17 +0000 |
---|---|---|
committer | neel <neel@FreeBSD.org> | 2012-09-26 00:06:17 +0000 |
commit | 5dbc1ca26acaa3175dae7b9d0c45151fba0275ab (patch) | |
tree | c995abae29493221169dd97e854cf339038315e3 /sys | |
parent | bc269b51afe43aab28df7ea0d543c167bb7c7d2e (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/amd64/vmm/io/vlapic.c | 22 | ||||
-rw-r--r-- | sys/amd64/vmm/io/vlapic.h | 3 | ||||
-rw-r--r-- | sys/amd64/vmm/vmm.c | 4 |
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); } |