diff options
| -rw-r--r-- | arch/x86/include/asm/xen/hypercall.h | 4 | ||||
| -rw-r--r-- | arch/x86/xen/enlighten.c | 24 | ||||
| -rw-r--r-- | arch/x86/xen/p2m.c | 19 | ||||
| -rw-r--r-- | arch/x86/xen/setup.c | 4 | ||||
| -rw-r--r-- | include/xen/interface/sched.h | 8 |
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 | ||
| 339 | static inline int | 339 | static inline long |
| 340 | HYPERVISOR_memory_op(unsigned int cmd, void *arg) | 340 | HYPERVISOR_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 | ||
| 345 | static inline int | 345 | static 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 | ||
| 1816 | static void xen_hvm_shutdown(void) | ||
| 1817 | { | ||
| 1818 | native_machine_shutdown(); | ||
| 1819 | if (kexec_in_progress) | ||
| 1820 | xen_reboot(SHUTDOWN_soft_reset); | ||
| 1821 | } | ||
| 1822 | |||
| 1823 | static 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 | |||
| 1810 | static void __init xen_hvm_guest_init(void) | 1830 | static 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; | |||
| 112 | static pte_t *p2m_missing_pte; | 112 | static pte_t *p2m_missing_pte; |
| 113 | static pte_t *p2m_identity_pte; | 113 | static 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 | */ | ||
| 122 | static unsigned long xen_p2m_last_pfn; | ||
| 123 | |||
| 115 | static inline unsigned p2m_top_index(unsigned long pfn) | 124 | static 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__ */ |
