[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 |