summaryrefslogtreecommitdiffstats
path: root/sys/x86/xen/hvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/x86/xen/hvm.c')
-rw-r--r--sys/x86/xen/hvm.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index 9ad196a..c969e26 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -100,8 +100,15 @@ DPCPU_DEFINE(struct vcpu_info *, vcpu_info);
shared_info_t *HYPERVISOR_shared_info;
start_info_t *HYPERVISOR_start_info;
+
+/*------------------------------ Sysctl tunables -----------------------------*/
+int xen_disable_pv_disks = 0;
+int xen_disable_pv_nics = 0;
+TUNABLE_INT("hw.xen.disable_pv_disks", &xen_disable_pv_disks);
+TUNABLE_INT("hw.xen.disable_pv_nics", &xen_disable_pv_nics);
+
#ifdef SMP
-/* XEN diverged cpu operations */
+/*---------------------- XEN diverged cpu operations -------------------------*/
static void
xen_hvm_cpu_resume(void)
{
@@ -256,21 +263,34 @@ enum {
static void
xen_hvm_disable_emulated_devices(void)
{
+ u_short disable_devs = 0;
if (xen_pv_domain()) {
/*
* No emulated devices in the PV case, so no need to unplug
* anything.
*/
+ if (xen_disable_pv_disks != 0 || xen_disable_pv_nics != 0)
+ printf("PV devices cannot be disabled in PV guests\n");
return;
}
if (inw(XEN_MAGIC_IOPORT) != XMI_MAGIC)
return;
- if (bootverbose)
- printf("XEN: Disabling emulated block and network devices\n");
- outw(XEN_MAGIC_IOPORT, XMI_UNPLUG_IDE_DISKS|XMI_UNPLUG_NICS);
+ if (xen_disable_pv_disks == 0) {
+ if (bootverbose)
+ printf("XEN: disabling emulated disks\n");
+ disable_devs |= XMI_UNPLUG_IDE_DISKS;
+ }
+ if (xen_disable_pv_nics == 0) {
+ if (bootverbose)
+ printf("XEN: disabling emulated nics\n");
+ disable_devs |= XMI_UNPLUG_NICS;
+ }
+
+ if (disable_devs != 0)
+ outw(XEN_MAGIC_IOPORT, disable_devs);
}
static void
OpenPOWER on IntegriCloud