aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/xen/hypercall.h4
-rw-r--r--arch/x86/xen/enlighten.c24
-rw-r--r--arch/x86/xen/p2m.c19
-rw-r--r--arch/x86/xen/setup.c4
-rw-r--r--include/xen/interface/sched.h8
5 files changed, 54 insertions, 5 deletions
diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h
index 83aea8055119..4c20dd333412 100644
--- a/arch/x86/include/asm/xen/hypercall.h
+++ b/arch/x86/include/asm/xen/hypercall.h
@@ -336,10 +336,10 @@ HYPERVISOR_update_descriptor(u64 ma, u64 desc)
336 return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32); 336 return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32);
337} 337}
338 338
339static inline int 339static inline long
340HYPERVISOR_memory_op(unsigned int cmd, void *arg) 340HYPERVISOR_memory_op(unsigned int cmd, void *arg)
341{ 341{
342 return _hypercall2(int, memory_op, cmd, arg); 342 return _hypercall2(long, memory_op, cmd, arg);
343} 343}
344 344
345static inline int 345static inline int
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 30d12afe52ed..993b7a71386d 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -33,6 +33,10 @@
33#include <linux/memblock.h> 33#include <linux/memblock.h>
34#include <linux/edd.h> 34#include <linux/edd.h>
35 35
36#ifdef CONFIG_KEXEC_CORE
37#include <linux/kexec.h>
38#endif
39
36#include <xen/xen.h> 40#include <xen/xen.h>
37#include <xen/events.h> 41#include <xen/events.h>
38#include <xen/interface/xen.h> 42#include <xen/interface/xen.h>
@@ -1077,6 +1081,7 @@ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
1077 /* Fast syscall setup is all done in hypercalls, so 1081 /* Fast syscall setup is all done in hypercalls, so
1078 these are all ignored. Stub them out here to stop 1082 these are all ignored. Stub them out here to stop
1079 Xen console noise. */ 1083 Xen console noise. */
1084 break;
1080 1085
1081 default: 1086 default:
1082 if (!pmu_msr_write(msr, low, high, &ret)) 1087 if (!pmu_msr_write(msr, low, high, &ret))
@@ -1807,6 +1812,21 @@ static struct notifier_block xen_hvm_cpu_notifier = {
1807 .notifier_call = xen_hvm_cpu_notify, 1812 .notifier_call = xen_hvm_cpu_notify,
1808}; 1813};
1809 1814
1815#ifdef CONFIG_KEXEC_CORE
1816static void xen_hvm_shutdown(void)
1817{
1818 native_machine_shutdown();
1819 if (kexec_in_progress)
1820 xen_reboot(SHUTDOWN_soft_reset);
1821}
1822
1823static void xen_hvm_crash_shutdown(struct pt_regs *regs)
1824{
1825 native_machine_crash_shutdown(regs);
1826 xen_reboot(SHUTDOWN_soft_reset);
1827}
1828#endif
1829
1810static void __init xen_hvm_guest_init(void) 1830static void __init xen_hvm_guest_init(void)
1811{ 1831{
1812 if (xen_pv_domain()) 1832 if (xen_pv_domain())
@@ -1826,6 +1846,10 @@ static void __init xen_hvm_guest_init(void)
1826 x86_init.irqs.intr_init = xen_init_IRQ; 1846 x86_init.irqs.intr_init = xen_init_IRQ;
1827 xen_hvm_init_time_ops(); 1847 xen_hvm_init_time_ops();
1828 xen_hvm_init_mmu_ops(); 1848 xen_hvm_init_mmu_ops();
1849#ifdef CONFIG_KEXEC_CORE
1850 machine_ops.shutdown = xen_hvm_shutdown;
1851 machine_ops.crash_shutdown = xen_hvm_crash_shutdown;
1852#endif
1829} 1853}
1830#endif 1854#endif
1831 1855
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index bfc08b13044b..660b3cfef234 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -112,6 +112,15 @@ static unsigned long *p2m_identity;
112static pte_t *p2m_missing_pte; 112static pte_t *p2m_missing_pte;
113static pte_t *p2m_identity_pte; 113static pte_t *p2m_identity_pte;
114 114
115/*
116 * Hint at last populated PFN.
117 *
118 * Used to set HYPERVISOR_shared_info->arch.max_pfn so the toolstack
119 * can avoid scanning the whole P2M (which may be sized to account for
120 * hotplugged memory).
121 */
122static unsigned long xen_p2m_last_pfn;
123
115static inline unsigned p2m_top_index(unsigned long pfn) 124static inline unsigned p2m_top_index(unsigned long pfn)
116{ 125{
117 BUG_ON(pfn >= MAX_P2M_PFN); 126 BUG_ON(pfn >= MAX_P2M_PFN);
@@ -270,7 +279,7 @@ void xen_setup_mfn_list_list(void)
270 else 279 else
271 HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = 280 HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
272 virt_to_mfn(p2m_top_mfn); 281 virt_to_mfn(p2m_top_mfn);
273 HYPERVISOR_shared_info->arch.max_pfn = xen_max_p2m_pfn; 282 HYPERVISOR_shared_info->arch.max_pfn = xen_p2m_last_pfn;
274 HYPERVISOR_shared_info->arch.p2m_generation = 0; 283 HYPERVISOR_shared_info->arch.p2m_generation = 0;
275 HYPERVISOR_shared_info->arch.p2m_vaddr = (unsigned long)xen_p2m_addr; 284 HYPERVISOR_shared_info->arch.p2m_vaddr = (unsigned long)xen_p2m_addr;
276 HYPERVISOR_shared_info->arch.p2m_cr3 = 285 HYPERVISOR_shared_info->arch.p2m_cr3 =
@@ -406,6 +415,8 @@ void __init xen_vmalloc_p2m_tree(void)
406 static struct vm_struct vm; 415 static struct vm_struct vm;
407 unsigned long p2m_limit; 416 unsigned long p2m_limit;
408 417
418 xen_p2m_last_pfn = xen_max_p2m_pfn;
419
409 p2m_limit = (phys_addr_t)P2M_LIMIT * 1024 * 1024 * 1024 / PAGE_SIZE; 420 p2m_limit = (phys_addr_t)P2M_LIMIT * 1024 * 1024 * 1024 / PAGE_SIZE;
410 vm.flags = VM_ALLOC; 421 vm.flags = VM_ALLOC;
411 vm.size = ALIGN(sizeof(unsigned long) * max(xen_max_p2m_pfn, p2m_limit), 422 vm.size = ALIGN(sizeof(unsigned long) * max(xen_max_p2m_pfn, p2m_limit),
@@ -608,6 +619,12 @@ static bool alloc_p2m(unsigned long pfn)
608 free_p2m_page(p2m); 619 free_p2m_page(p2m);
609 } 620 }
610 621
622 /* Expanded the p2m? */
623 if (pfn > xen_p2m_last_pfn) {
624 xen_p2m_last_pfn = pfn;
625 HYPERVISOR_shared_info->arch.max_pfn = xen_p2m_last_pfn;
626 }
627
611 return true; 628 return true;
612} 629}
613 630
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
index f5ef6746d47a..1c30e4ab1022 100644
--- a/arch/x86/xen/setup.c
+++ b/arch/x86/xen/setup.c
@@ -548,7 +548,7 @@ static unsigned long __init xen_get_max_pages(void)
548{ 548{
549 unsigned long max_pages, limit; 549 unsigned long max_pages, limit;
550 domid_t domid = DOMID_SELF; 550 domid_t domid = DOMID_SELF;
551 int ret; 551 long ret;
552 552
553 limit = xen_get_pages_limit(); 553 limit = xen_get_pages_limit();
554 max_pages = limit; 554 max_pages = limit;
@@ -798,7 +798,7 @@ char * __init xen_memory_setup(void)
798 xen_ignore_unusable(); 798 xen_ignore_unusable();
799 799
800 /* Make sure the Xen-supplied memory map is well-ordered. */ 800 /* Make sure the Xen-supplied memory map is well-ordered. */
801 sanitize_e820_map(xen_e820_map, xen_e820_map_entries, 801 sanitize_e820_map(xen_e820_map, ARRAY_SIZE(xen_e820_map),
802 &xen_e820_map_entries); 802 &xen_e820_map_entries);
803 803
804 max_pages = xen_get_max_pages(); 804 max_pages = xen_get_max_pages();
diff --git a/include/xen/interface/sched.h b/include/xen/interface/sched.h
index 9ce083960a25..f18490985fc8 100644
--- a/include/xen/interface/sched.h
+++ b/include/xen/interface/sched.h
@@ -107,5 +107,13 @@ struct sched_watchdog {
107#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ 107#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */
108#define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ 108#define SHUTDOWN_crash 3 /* Tell controller we've crashed. */
109#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */ 109#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */
110/*
111 * Domain asked to perform 'soft reset' for it. The expected behavior is to
112 * reset internal Xen state for the domain returning it to the point where it
113 * was created but leaving the domain's memory contents and vCPU contexts
114 * intact. This will allow the domain to start over and set up all Xen specific
115 * interfaces again.
116 */
117#define SHUTDOWN_soft_reset 5
110 118
111#endif /* __XEN_PUBLIC_SCHED_H__ */ 119#endif /* __XEN_PUBLIC_SCHED_H__ */