qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] pvevent: pvevent device driver
@ 2013-03-14  8:51 Hu Tao
  2013-03-14  9:07 ` Gleb Natapov
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Hu Tao @ 2013-03-14  8:51 UTC (permalink / raw)
  To: qemu-devel, Daniel P. Berrange, KAMEZAWA Hiroyuki, Jan Kiszka,
	Gleb Natapov, Blue Swirl, Eric Blake, Andrew Jones,
	Marcelo Tosatti, Sasha Levin, Luiz Capitulino, Anthony Liguori,
	Markus Armbruster, Paolo Bonzini, Stefan Hajnoczi, Juan Quintela,
	Orit Wasserman, Kevin Wolf, Wen Congyang, Michael S. Tsirkin,
	Alexander Graf, Alex Williamson, Peter Maydell,
	Christian Borntraeger, Matthew Garrett, linux-kernel,
	platform-driver-x86

pvevent device is a qemu simulated device through which guest panic
event is sent to host.

ref: http://lists.nongnu.org/archive/html/qemu-devel/2013-03/msg02293.html

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 drivers/platform/x86/Kconfig   |   7 +++
 drivers/platform/x86/Makefile  |   2 +
 drivers/platform/x86/pvevent.c | 115 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 124 insertions(+)
 create mode 100644 drivers/platform/x86/pvevent.c

diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 7ab0b2f..369135e 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -768,4 +768,11 @@ config APPLE_GMUX
 	  graphics as well as the backlight. Currently only backlight
 	  control is supported by the driver.
 
+config PVEVENT
+	tristate "pvevent device support"
+	depends on ACPI
+	---help---
+	  This driver provides support for pvevent device, which is a qemu
+	  simulated device through which guest panic event is sent to host.
+
 endif # X86_PLATFORM_DEVICES
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index bf7e4f9..8779396 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -50,3 +50,5 @@ obj-$(CONFIG_INTEL_MID_POWER_BUTTON)	+= intel_mid_powerbtn.o
 obj-$(CONFIG_INTEL_OAKTRAIL)	+= intel_oaktrail.o
 obj-$(CONFIG_SAMSUNG_Q10)	+= samsung-q10.o
 obj-$(CONFIG_APPLE_GMUX)	+= apple-gmux.o
+
+obj-$(CONFIG_PVEVENT)           += pvevent.o
diff --git a/drivers/platform/x86/pvevent.c b/drivers/platform/x86/pvevent.c
new file mode 100644
index 0000000..00ef7f4
--- /dev/null
+++ b/drivers/platform/x86/pvevent.c
@@ -0,0 +1,115 @@
+/*
+ *  pvevent.c - pvevent Device Support
+ *
+ *  Copyright (C) 2013 Fujitsu.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <acpi/acpi_bus.h>
+#include <acpi/acpi_drivers.h>
+
+MODULE_AUTHOR("Hu Tao <hutao@cn.fujitsu.com>");
+MODULE_DESCRIPTION("pvevent device driver");
+MODULE_LICENSE("GPL");
+
+static int pvevent_add(struct acpi_device *device);
+static int pvevent_remove(struct acpi_device *device);
+
+static const struct acpi_device_id pvevent_device_ids[] = {
+	{ "MSFT0001", 0},
+	{ "", 0},
+};
+MODULE_DEVICE_TABLE(acpi, pvevent_device_ids);
+
+#define PVEVENT_PANICKED	(1 << 0)
+
+static acpi_handle handle;
+
+static struct acpi_driver pvevent_driver = {
+	.name =		"pvevent",
+	.class =	"QEMU",
+	.ids =		pvevent_device_ids,
+	.ops =		{
+				.add =		pvevent_add,
+				.remove =	pvevent_remove,
+			},
+	.owner =	THIS_MODULE,
+};
+
+static void
+pvevent_send_event(unsigned int event)
+{
+	union acpi_object arg;
+	struct acpi_object_list arg_list;
+
+	if (!handle)
+		return;
+
+	arg.type = ACPI_TYPE_INTEGER;
+	arg.integer.value = event;
+
+	arg_list.count = 1;
+	arg_list.pointer = &arg;
+
+	acpi_evaluate_object(handle, "WRPT", &arg_list, NULL);
+}
+
+static int
+pvevent_panic_notify(struct notifier_block *nb, unsigned long code,
+		     void *unused)
+{
+	pvevent_send_event(PVEVENT_PANICKED);
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block pvevent_panic_nb = {
+	.notifier_call = pvevent_panic_notify,
+};
+
+static int pvevent_add(struct acpi_device *device)
+{
+	acpi_status status;
+	u64 ret;
+
+	status = acpi_evaluate_integer(device->handle, "_STA", NULL,
+				       &ret);
+
+	if (ACPI_FAILURE(status) || !ret)
+		return -ENODEV;
+
+	handle = device->handle;
+	atomic_notifier_chain_register(&panic_notifier_list,
+				       &pvevent_panic_nb);
+
+	return 0;
+}
+
+static int pvevent_remove(struct acpi_device *device)
+{
+
+	atomic_notifier_chain_unregister(&panic_notifier_list,
+					 &pvevent_panic_nb);
+	handle = NULL;
+	return 0;
+}
+
+module_acpi_driver(pvevent_driver);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-03-19  5:49 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-14  8:51 [Qemu-devel] [PATCH] pvevent: pvevent device driver Hu Tao
2013-03-14  9:07 ` Gleb Natapov
2013-03-15 19:35 ` Matthew Garrett
2013-03-18  9:55   ` Paolo Bonzini
2013-03-19  5:49   ` Hu Tao
2013-03-17 19:12 ` Blue Swirl
2013-03-19  5:45   ` Hu Tao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).