diff options
| -rw-r--r-- | drivers/xen/Kconfig | 11 | ||||
| -rw-r--r-- | drivers/xen/Makefile | 1 | ||||
| -rw-r--r-- | drivers/xen/xen-stub.c | 66 | ||||
| -rw-r--r-- | include/xen/acpi.h | 7 |
4 files changed, 85 insertions, 0 deletions
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index cabfa97f4674..c1c8566c6840 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig | |||
| @@ -180,6 +180,17 @@ config XEN_PRIVCMD | |||
| 180 | depends on XEN | 180 | depends on XEN |
| 181 | default m | 181 | default m |
| 182 | 182 | ||
| 183 | config XEN_STUB | ||
| 184 | bool "Xen stub drivers" | ||
| 185 | depends on XEN && X86_64 | ||
| 186 | default n | ||
| 187 | help | ||
| 188 | Allow kernel to install stub drivers, to reserve space for Xen drivers, | ||
| 189 | i.e. memory hotplug and cpu hotplug, and to block native drivers loaded, | ||
| 190 | so that real Xen drivers can be modular. | ||
| 191 | |||
| 192 | To enable Xen features like cpu and memory hotplug, select Y here. | ||
| 193 | |||
| 183 | config XEN_ACPI_PROCESSOR | 194 | config XEN_ACPI_PROCESSOR |
| 184 | tristate "Xen ACPI processor" | 195 | tristate "Xen ACPI processor" |
| 185 | depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ | 196 | depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ |
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index fb213cf81a7b..b63edd824ad4 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile | |||
| @@ -30,6 +30,7 @@ obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o | |||
| 30 | obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o | 30 | obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o |
| 31 | obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ | 31 | obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ |
| 32 | obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o | 32 | obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o |
| 33 | obj-$(CONFIG_XEN_STUB) += xen-stub.o | ||
| 33 | obj-$(CONFIG_XEN_ACPI_PROCESSOR) += xen-acpi-processor.o | 34 | obj-$(CONFIG_XEN_ACPI_PROCESSOR) += xen-acpi-processor.o |
| 34 | xen-evtchn-y := evtchn.o | 35 | xen-evtchn-y := evtchn.o |
| 35 | xen-gntdev-y := gntdev.o | 36 | xen-gntdev-y := gntdev.o |
diff --git a/drivers/xen/xen-stub.c b/drivers/xen/xen-stub.c new file mode 100644 index 000000000000..811152f67137 --- /dev/null +++ b/drivers/xen/xen-stub.c | |||
| @@ -0,0 +1,66 @@ | |||
| 1 | /* | ||
| 2 | * xen-stub.c - stub drivers to reserve space for Xen | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 Intel Corporation | ||
| 5 | * Author: Liu Jinsong <jinsong.liu@intel.com> | ||
| 6 | * Author: Jiang Yunhong <yunhong.jiang@intel.com> | ||
| 7 | * | ||
| 8 | * Copyright (C) 2012 Oracle Inc | ||
| 9 | * Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or (at | ||
| 14 | * your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, but | ||
| 17 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 19 | * NON INFRINGEMENT. See the GNU General Public License for more | ||
| 20 | * details. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/kernel.h> | ||
| 24 | #include <linux/init.h> | ||
| 25 | #include <linux/export.h> | ||
| 26 | #include <linux/types.h> | ||
| 27 | #include <linux/acpi.h> | ||
| 28 | #include <acpi/acpi_drivers.h> | ||
| 29 | #include <xen/acpi.h> | ||
| 30 | |||
| 31 | /*-------------------------------------------- | ||
| 32 | stub driver for Xen memory hotplug | ||
| 33 | --------------------------------------------*/ | ||
| 34 | |||
| 35 | #ifdef CONFIG_ACPI | ||
| 36 | |||
| 37 | static const struct acpi_device_id memory_device_ids[] = { | ||
| 38 | {ACPI_MEMORY_DEVICE_HID, 0}, | ||
| 39 | {"", 0}, | ||
| 40 | }; | ||
| 41 | |||
| 42 | static struct acpi_driver xen_stub_memory_device_driver = { | ||
| 43 | /* same name as native memory driver to block native loaded */ | ||
| 44 | .name = "acpi_memhotplug", | ||
| 45 | .class = ACPI_MEMORY_DEVICE_CLASS, | ||
| 46 | .ids = memory_device_ids, | ||
| 47 | }; | ||
| 48 | |||
| 49 | int xen_stub_memory_device_init(void) | ||
| 50 | { | ||
| 51 | if (!xen_initial_domain()) | ||
| 52 | return -ENODEV; | ||
| 53 | |||
| 54 | /* just reserve space for Xen, block native driver loaded */ | ||
| 55 | return acpi_bus_register_driver(&xen_stub_memory_device_driver); | ||
| 56 | } | ||
| 57 | EXPORT_SYMBOL_GPL(xen_stub_memory_device_init); | ||
| 58 | subsys_initcall(xen_stub_memory_device_init); | ||
| 59 | |||
| 60 | void xen_stub_memory_device_exit(void) | ||
| 61 | { | ||
| 62 | acpi_bus_unregister_driver(&xen_stub_memory_device_driver); | ||
| 63 | } | ||
| 64 | EXPORT_SYMBOL_GPL(xen_stub_memory_device_exit); | ||
| 65 | |||
| 66 | #endif | ||
diff --git a/include/xen/acpi.h b/include/xen/acpi.h index 48a9c0171b65..ce7e5264b320 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h | |||
| @@ -40,6 +40,13 @@ | |||
| 40 | #include <xen/xen.h> | 40 | #include <xen/xen.h> |
| 41 | #include <linux/acpi.h> | 41 | #include <linux/acpi.h> |
| 42 | 42 | ||
| 43 | #define ACPI_MEMORY_DEVICE_CLASS "memory" | ||
| 44 | #define ACPI_MEMORY_DEVICE_HID "PNP0C80" | ||
| 45 | #define ACPI_MEMORY_DEVICE_NAME "Hotplug Mem Device" | ||
| 46 | |||
| 47 | int xen_stub_memory_device_init(void); | ||
| 48 | void xen_stub_memory_device_exit(void); | ||
| 49 | |||
| 43 | int xen_acpi_notify_hypervisor_state(u8 sleep_state, | 50 | int xen_acpi_notify_hypervisor_state(u8 sleep_state, |
| 44 | u32 pm1a_cnt, u32 pm1b_cnd); | 51 | u32 pm1a_cnt, u32 pm1b_cnd); |
| 45 | 52 | ||
