|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC] xen/arm: domain kernel: Small fixes for making suspendable for arm
Modify makefile to compile driver/xen/manage.c for arm and implement
resuming the shared page info. This patch is required for domu kernel
to test the xen-on-arndale migration.
Since there are lot of missing functions for compiling hibernation mode,
temporarily I put empty functions in xen/dummy.c, but they are originally
belong to such as arch/arm/power directories (which is not existing).
I think there would be any better way...
Signed-off-by: Jaeyong Yoo <jaeyong.yoo@xxxxxxxxxxx>
---
arch/arm/Kconfig | 3 ++
arch/arm/boot/dts/xenvm-4.2.dts | 2 +-
arch/arm/xen/Makefile | 2 +-
arch/arm/xen/dummy.c | 30 ++++++++++++++++
arch/arm/xen/mmu.c | 12 +++++++
arch/arm/xen/suspend.c | 76 +++++++++++++++++++++++++++++++++++++++++
arch/arm/xen/time.c | 7 ++++
drivers/xen/Makefile | 2 +-
drivers/xen/manage.c | 8 +++++
9 files changed, 139 insertions(+), 3 deletions(-)
create mode 100644 arch/arm/xen/dummy.c
create mode 100644 arch/arm/xen/mmu.c
create mode 100644 arch/arm/xen/suspend.c
create mode 100644 arch/arm/xen/time.c
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 2c3bdce..77309f7 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1469,6 +1469,9 @@ config ARCH_NO_VIRT_TO_BUS
config ISA_DMA_API
bool
+config ARCH_HIBERNATION_POSSIBLE
+ def_bool y
+
config PCI
bool "PCI support" if MIGHT_HAVE_PCI
help
diff --git a/arch/arm/boot/dts/xenvm-4.2.dts b/arch/arm/boot/dts/xenvm-4.2.dts
index 2f4136b..33df5e6 100644
--- a/arch/arm/boot/dts/xenvm-4.2.dts
+++ b/arch/arm/boot/dts/xenvm-4.2.dts
@@ -17,7 +17,7 @@
chosen {
/* this field is going to be adjusted by the hypervisor */
- bootargs = "console=hvc0 root=/dev/xvda";
+ bootargs = "console=hvc0 root=/dev/xvda1 rw init";
};
cpus {
diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile
index 4384103..6fdc47a 100644
--- a/arch/arm/xen/Makefile
+++ b/arch/arm/xen/Makefile
@@ -1 +1 @@
-obj-y := enlighten.o hypercall.o grant-table.o
+obj-y := enlighten.o hypercall.o grant-table.o suspend.o mmu.o time.o
dummy.o
diff --git a/arch/arm/xen/dummy.c b/arch/arm/xen/dummy.c
new file mode 100644
index 0000000..daa949c
--- /dev/null
+++ b/arch/arm/xen/dummy.c
@@ -0,0 +1,30 @@
+#include <linux/kernel.h>
+#include <linux/printk.h>
+
+void save_processor_state(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
+
+void restore_processor_state(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
+
+int swsusp_arch_suspend(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+ return 0;
+}
+
+int swsusp_arch_resume(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+ return 0;
+}
+
+int pfn_is_nosave(unsigned long pfn)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+ return 0;
+}
diff --git a/arch/arm/xen/mmu.c b/arch/arm/xen/mmu.c
new file mode 100644
index 0000000..cc0ccc9
--- /dev/null
+++ b/arch/arm/xen/mmu.c
@@ -0,0 +1,12 @@
+#include <linux/kernel.h>
+#include <xen/xen.h>
+
+void xen_mm_pin_all(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
+
+void xen_mm_unpin_all(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
diff --git a/arch/arm/xen/suspend.c b/arch/arm/xen/suspend.c
new file mode 100644
index 0000000..946a960
--- /dev/null
+++ b/arch/arm/xen/suspend.c
@@ -0,0 +1,76 @@
+#include <xen/xen.h>
+#include <xen/events.h>
+#include <xen/grant_table.h>
+#include <xen/hvm.h>
+#include <xen/interface/vcpu.h>
+#include <xen/interface/xen.h>
+#include <xen/interface/memory.h>
+#include <xen/interface/hvm/params.h>
+#include <xen/features.h>
+#include <xen/platform_pci.h>
+#include <xen/xenbus.h>
+#include <xen/page.h>
+#include <xen/xen-ops.h>
+#include <asm/xen/hypervisor.h>
+#include <asm/xen/hypercall.h>
+#include <linux/interrupt.h>
+#include <linux/irqreturn.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_address.h>
+
+#include <linux/mm.h>
+
+void xen_arch_pre_suspend(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
+
+void xen_arch_hvm_post_suspend(int suspend_cancelled)
+{
+ if( !suspend_cancelled ) {
+ int cpu;
+ struct xen_add_to_physmap xatp;
+ static struct shared_info *shared_info_page = 0;
+
+ if( !shared_info_page )
+ shared_info_page = (struct shared_info *)
+ get_zeroed_page(GFP_KERNEL);
+ if (!shared_info_page) {
+ pr_err("not enough memory\n");
+ return;
+ }
+
+ xatp.domid = DOMID_SELF;
+ xatp.idx = 0;
+ xatp.space = XENMAPSPACE_shared_info;
+ xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT;
+ if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
+ BUG();
+
+ HYPERVISOR_shared_info = (struct shared_info *)shared_info_page;
+
+ /* xen_vcpu is a pointer to the vcpu_info struct in the
shared_info
+ * page, we use it in the event channel upcall */
+ for_each_online_cpu(cpu) {
+ per_cpu(xen_vcpu, cpu) =
&HYPERVISOR_shared_info->vcpu_info[cpu];
+ }
+ printk(KERN_ERR"%s: remmaping shared info...\n", __func__);
+ }
+}
+
+void xen_arch_post_suspend(int suspend_cancelled)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
+
+static void xen_vcpu_notify_restore(void *data)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
+
+void xen_arch_resume(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
diff --git a/arch/arm/xen/time.c b/arch/arm/xen/time.c
new file mode 100644
index 0000000..af90e53
--- /dev/null
+++ b/arch/arm/xen/time.c
@@ -0,0 +1,7 @@
+#include <linux/kernel.h>
+#include <xen/xen.h>
+
+void xen_timer_resume(void)
+{
+ printk(KERN_ERR"%s: function not implemented\n", __func__);
+}
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index eabd0ee..3d24a95 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -1,10 +1,10 @@
ifneq ($(CONFIG_ARM),y)
-obj-y += manage.o
obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
endif
obj-$(CONFIG_X86) += fallback.o
obj-y += grant-table.o features.o events.o balloon.o
obj-y += xenbus/
+obj-y += manage.o
nostackp := $(call cc-option, -fno-stack-protector)
CFLAGS_features.o := $(nostackp)
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index 412b96c..140c7a9 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -17,6 +17,7 @@
#include <xen/events.h>
#include <xen/hvc-console.h>
#include <xen/xen-ops.h>
+#include <xen/interface/sched.h>
#include <asm/xen/hypercall.h>
#include <asm/xen/page.h>
@@ -86,7 +87,14 @@ static int xen_suspend(void *data)
* or the domain was merely checkpointed, and 0 if it
* is resuming in a new domain.
*/
+#ifdef CONFIG_ARM
+ {
+ struct sched_shutdown r = { .reason = SHUTDOWN_suspend };
+ HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
+ }
+#else
si->cancelled = HYPERVISOR_suspend(si->arg);
+#endif
if (si->post)
si->post(si->cancelled);
--
1.8.1.2
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |