Date: Wed, 26 Sep 2012 00:06:17 +0000 (UTC) From: Neel Natu <neel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r240943 - in projects/bhyve: sys/amd64/vmm sys/amd64/vmm/io usr.sbin/bhyve Message-ID: <201209260006.q8Q06HVn018380@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: neel Date: Wed Sep 26 00:06:17 2012 New Revision: 240943 URL: http://svn.freebsd.org/changeset/base/240943 Log: Add an option "-a" to present the local apic in the XAPIC mode instead of the default X2APIC mode to the guest. Modified: projects/bhyve/sys/amd64/vmm/io/vlapic.c projects/bhyve/sys/amd64/vmm/io/vlapic.h projects/bhyve/sys/amd64/vmm/vmm.c projects/bhyve/usr.sbin/bhyve/fbsdrun.c projects/bhyve/usr.sbin/bhyve/fbsdrun.h projects/bhyve/usr.sbin/bhyve/spinup_ap.c Modified: projects/bhyve/sys/amd64/vmm/io/vlapic.c ============================================================================== --- projects/bhyve/sys/amd64/vmm/io/vlapic.c Tue Sep 25 23:41:45 2012 (r240942) +++ projects/bhyve/sys/amd64/vmm/io/vlapic.c Wed Sep 26 00:06:17 2012 (r240943) @@ -823,14 +823,8 @@ static struct io_region vlapic_mmio[VM_M 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 *vlapi 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; +} Modified: projects/bhyve/sys/amd64/vmm/io/vlapic.h ============================================================================== --- projects/bhyve/sys/amd64/vmm/io/vlapic.h Tue Sep 25 23:41:45 2012 (r240942) +++ projects/bhyve/sys/amd64/vmm/io/vlapic.h Wed Sep 26 00:06:17 2012 (r240943) @@ -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 *vl 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_ */ Modified: projects/bhyve/sys/amd64/vmm/vmm.c ============================================================================== --- projects/bhyve/sys/amd64/vmm/vmm.c Tue Sep 25 23:41:45 2012 (r240942) +++ projects/bhyve/sys/amd64/vmm/vmm.c Wed Sep 26 00:06:17 2012 (r240943) @@ -160,8 +160,8 @@ vcpu_init(struct vm *vm, uint32_t vcpu_i 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 v vm->vcpu[vcpuid].x2apic_state = state; + vlapic_set_x2apic_state(vm, vcpuid, state); + return (0); } Modified: projects/bhyve/usr.sbin/bhyve/fbsdrun.c ============================================================================== --- projects/bhyve/usr.sbin/bhyve/fbsdrun.c Tue Sep 25 23:41:45 2012 (r240942) +++ projects/bhyve/usr.sbin/bhyve/fbsdrun.c Wed Sep 26 00:06:17 2012 (r240943) @@ -84,7 +84,7 @@ int guest_ncpus; static int pincpu = -1; static int guest_vcpu_mux; -static int guest_vmexit_on_hlt, guest_vmexit_on_pause; +static int guest_vmexit_on_hlt, guest_vmexit_on_pause, disable_x2apic; static int foundcpus; @@ -128,8 +128,9 @@ usage(int code) { fprintf(stderr, - "Usage: %s [-ehBHIP][-g <gdb port>][-z <hz>][-s <pci>]" + "Usage: %s [-aehBHIP][-g <gdb port>][-z <hz>][-s <pci>]" "[-S <pci>][-p pincpu][-n <pci>][-m lowmem][-M highmem] <vm>\n" + " -a: local apic is in XAPIC mode (default is X2APIC)\n" " -g: gdb port (default is %d and 0 means don't open)\n" " -c: # cpus (default 1)\n" " -p: pin vcpu 'n' to host cpu 'pincpu + n'\n" @@ -174,6 +175,13 @@ fbsdrun_add_oemtbl(void *tbl, int tblsz) } int +fbsdrun_disable_x2apic(void) +{ + + return (disable_x2apic); +} + +int fbsdrun_vmexit_on_pause(void) { @@ -553,8 +561,11 @@ main(int argc, char *argv[]) guest_ncpus = 1; ioapic = 0; - while ((c = getopt(argc, argv, "ehBHIPxp:g:c:z:s:S:n:m:M:")) != -1) { + while ((c = getopt(argc, argv, "aehBHIPxp:g:c:z:s:S:n:m:M:")) != -1) { switch (c) { + case 'a': + disable_x2apic = 1; + break; case 'B': inject_bkpt = 1; break; @@ -656,6 +667,16 @@ main(int argc, char *argv[]) handler[VM_EXITCODE_PAUSE] = vmexit_pause; } + if (fbsdrun_disable_x2apic()) + err = vm_set_x2apic_state(ctx, BSP, X2APIC_DISABLED); + else + err = vm_set_x2apic_state(ctx, BSP, X2APIC_ENABLED); + + if (err) { + printf("Unable to set x2apic state (%d)\n", err); + exit(1); + } + if (lomem_sz != 0) { lomem_addr = vm_map_memory(ctx, 0, lomem_sz); if (lomem_addr == (char *) MAP_FAILED) { Modified: projects/bhyve/usr.sbin/bhyve/fbsdrun.h ============================================================================== --- projects/bhyve/usr.sbin/bhyve/fbsdrun.h Tue Sep 25 23:41:45 2012 (r240942) +++ projects/bhyve/usr.sbin/bhyve/fbsdrun.h Wed Sep 26 00:06:17 2012 (r240943) @@ -50,4 +50,5 @@ void fbsdrun_add_oemtbl(void *tbl, int t int fbsdrun_muxed(void); int fbsdrun_vmexit_on_hlt(void); int fbsdrun_vmexit_on_pause(void); +int fbsdrun_disable_x2apic(void); #endif Modified: projects/bhyve/usr.sbin/bhyve/spinup_ap.c ============================================================================== --- projects/bhyve/usr.sbin/bhyve/spinup_ap.c Tue Sep 25 23:41:45 2012 (r240942) +++ projects/bhyve/usr.sbin/bhyve/spinup_ap.c Wed Sep 26 00:06:17 2012 (r240943) @@ -156,6 +156,12 @@ spinup_ap(struct vmctx *ctx, int vcpu, i assert(error == 0); } + if (fbsdrun_disable_x2apic()) + error = vm_set_x2apic_state(ctx, newcpu, X2APIC_DISABLED); + else + error = vm_set_x2apic_state(ctx, newcpu, X2APIC_ENABLED); + assert(error == 0); + /* * There are 2 startup modes possible here: * - if the CPU supports 'unrestricted guest' mode, the spinup can
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209260006.q8Q06HVn018380>