svn commit: r240943 - in projects/bhyve: sys/amd64/vmm
sys/amd64/vmm/io usr.sbin/bhyve
Neel Natu
neel at FreeBSD.org
Wed Sep 26 00:06:18 UTC 2012
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
More information about the svn-src-projects
mailing list