[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [LINUX] kexec: remove patches which are not straight backports.



# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxxxxx>
# Node ID 1db125262365b993d486272cc28e084bf57e0d66
# Parent  7c3dee5ff185b5cb88078281077e234dcec6138e
[LINUX] kexec: remove patches which are not straight backports.

Their contents will be added to the sparse tree in a subsequent patch.

Changes to kernel/sys.c in kexec-generic.patch remain for now. These
will be taken care of in a later patch.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxxxxx>
---
 patches/linux-2.6.16.33/linux-2.6.19-rc1-kexec-xen-i386.patch   |  105 -----
 patches/linux-2.6.16.33/linux-2.6.19-rc1-kexec-xen-x86_64.patch |  209 
----------
 patches/linux-2.6.16.33/kexec-generic.patch                     |  199 
---------
 patches/linux-2.6.16.33/series                                  |    2 
 4 files changed, 515 deletions(-)

diff -r 7c3dee5ff185 -r 1db125262365 patches/linux-2.6.16.33/kexec-generic.patch
--- a/patches/linux-2.6.16.33/kexec-generic.patch       Fri Dec 08 11:46:48 
2006 +0000
+++ b/patches/linux-2.6.16.33/kexec-generic.patch       Fri Dec 08 11:47:09 
2006 +0000
@@ -1,216 +1,3 @@
---- 0001/include/linux/kexec.h
-+++ work/include/linux/kexec.h
-@@ -31,6 +31,13 @@
- #error KEXEC_ARCH not defined
- #endif
- 
-+#ifndef KEXEC_ARCH_HAS_PAGE_MACROS
-+#define kexec_page_to_pfn(page)  page_to_pfn(page)
-+#define kexec_pfn_to_page(pfn)   pfn_to_page(pfn)
-+#define kexec_virt_to_phys(addr) virt_to_phys(addr)
-+#define kexec_phys_to_virt(addr) phys_to_virt(addr)
-+#endif
-+
- /*
-  * This structure is used to hold the arguments that are used when loading
-  * kernel binaries.
-@@ -91,6 +98,13 @@ struct kimage {
- extern NORET_TYPE void machine_kexec(struct kimage *image) ATTRIB_NORET;
- extern int machine_kexec_prepare(struct kimage *image);
- extern void machine_kexec_cleanup(struct kimage *image);
-+#ifdef CONFIG_XEN
-+extern int xen_machine_kexec_load(struct kimage *image);
-+extern void xen_machine_kexec_unload(struct kimage *image);
-+extern NORET_TYPE void xen_machine_kexec(struct kimage *image) ATTRIB_NORET;
-+extern void xen_machine_kexec_setup_resources(void);
-+extern void xen_machine_kexec_register_resources(struct resource *res);
-+#endif
- extern asmlinkage long sys_kexec_load(unsigned long entry,
-                                       unsigned long nr_segments,
-                                       struct kexec_segment __user *segments,
---- 0001/kernel/kexec.c
-+++ work/kernel/kexec.c
-@@ -403,7 +403,7 @@ static struct page *kimage_alloc_normal_
-               pages = kimage_alloc_pages(GFP_KERNEL, order);
-               if (!pages)
-                       break;
--              pfn   = page_to_pfn(pages);
-+              pfn   = kexec_page_to_pfn(pages);
-               epfn  = pfn + count;
-               addr  = pfn << PAGE_SHIFT;
-               eaddr = epfn << PAGE_SHIFT;
-@@ -437,6 +437,7 @@ static struct page *kimage_alloc_normal_
-       return pages;
- }
- 
-+#ifndef CONFIG_XEN
- static struct page *kimage_alloc_crash_control_pages(struct kimage *image,
-                                                     unsigned int order)
- {
-@@ -490,7 +491,7 @@ static struct page *kimage_alloc_crash_c
-               }
-               /* If I don't overlap any segments I have found my hole! */
-               if (i == image->nr_segments) {
--                      pages = pfn_to_page(hole_start >> PAGE_SHIFT);
-+                      pages = kexec_pfn_to_page(hole_start >> PAGE_SHIFT);
-                       break;
-               }
-       }
-@@ -517,6 +518,13 @@ struct page *kimage_alloc_control_pages(
- 
-       return pages;
- }
-+#else /* !CONFIG_XEN */
-+struct page *kimage_alloc_control_pages(struct kimage *image,
-+                                       unsigned int order)
-+{
-+      return kimage_alloc_normal_control_pages(image, order);
-+}
-+#endif
- 
- static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
- {
-@@ -532,7 +540,7 @@ static int kimage_add_entry(struct kimag
-                       return -ENOMEM;
- 
-               ind_page = page_address(page);
--              *image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
-+              *image->entry = kexec_virt_to_phys(ind_page) | IND_INDIRECTION;
-               image->entry = ind_page;
-               image->last_entry = ind_page +
-                                     ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
-@@ -593,13 +601,13 @@ static int kimage_terminate(struct kimag
- #define for_each_kimage_entry(image, ptr, entry) \
-       for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
-               ptr = (entry & IND_INDIRECTION)? \
--                      phys_to_virt((entry & PAGE_MASK)): ptr +1)
-+                      kexec_phys_to_virt((entry & PAGE_MASK)): ptr +1)
- 
- static void kimage_free_entry(kimage_entry_t entry)
- {
-       struct page *page;
- 
--      page = pfn_to_page(entry >> PAGE_SHIFT);
-+      page = kexec_pfn_to_page(entry >> PAGE_SHIFT);
-       kimage_free_pages(page);
- }
- 
-@@ -611,6 +619,10 @@ static void kimage_free(struct kimage *i
-       if (!image)
-               return;
- 
-+#ifdef CONFIG_XEN
-+      xen_machine_kexec_unload(image);
-+#endif
-+
-       kimage_free_extra_pages(image);
-       for_each_kimage_entry(image, ptr, entry) {
-               if (entry & IND_INDIRECTION) {
-@@ -686,7 +698,7 @@ static struct page *kimage_alloc_page(st
-        * have a match.
-        */
-       list_for_each_entry(page, &image->dest_pages, lru) {
--              addr = page_to_pfn(page) << PAGE_SHIFT;
-+              addr = kexec_page_to_pfn(page) << PAGE_SHIFT;
-               if (addr == destination) {
-                       list_del(&page->lru);
-                       return page;
-@@ -701,12 +713,12 @@ static struct page *kimage_alloc_page(st
-               if (!page)
-                       return NULL;
-               /* If the page cannot be used file it away */
--              if (page_to_pfn(page) >
-+              if (kexec_page_to_pfn(page) >
-                               (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
-                       list_add(&page->lru, &image->unuseable_pages);
-                       continue;
-               }
--              addr = page_to_pfn(page) << PAGE_SHIFT;
-+              addr = kexec_page_to_pfn(page) << PAGE_SHIFT;
- 
-               /* If it is the destination page we want use it */
-               if (addr == destination)
-@@ -729,7 +741,7 @@ static struct page *kimage_alloc_page(st
-                       struct page *old_page;
- 
-                       old_addr = *old & PAGE_MASK;
--                      old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
-+                      old_page = kexec_pfn_to_page(old_addr >> PAGE_SHIFT);
-                       copy_highpage(page, old_page);
-                       *old = addr | (*old & ~PAGE_MASK);
- 
-@@ -779,7 +791,7 @@ static int kimage_load_normal_segment(st
-                       result  = -ENOMEM;
-                       goto out;
-               }
--              result = kimage_add_page(image, page_to_pfn(page)
-+              result = kimage_add_page(image, kexec_page_to_pfn(page)
-                                                               << PAGE_SHIFT);
-               if (result < 0)
-                       goto out;
-@@ -811,6 +823,7 @@ out:
-       return result;
- }
- 
-+#ifndef CONFIG_XEN
- static int kimage_load_crash_segment(struct kimage *image,
-                                       struct kexec_segment *segment)
- {
-@@ -833,7 +846,7 @@ static int kimage_load_crash_segment(str
-               char *ptr;
-               size_t uchunk, mchunk;
- 
--              page = pfn_to_page(maddr >> PAGE_SHIFT);
-+              page = kexec_pfn_to_page(maddr >> PAGE_SHIFT);
-               if (page == 0) {
-                       result  = -ENOMEM;
-                       goto out;
-@@ -881,6 +894,13 @@ static int kimage_load_segment(struct ki
- 
-       return result;
- }
-+#else /* CONFIG_XEN */
-+static int kimage_load_segment(struct kimage *image,
-+                              struct kexec_segment *segment)
-+{
-+      return kimage_load_normal_segment(image, segment);
-+}
-+#endif
- 
- /*
-  * Exec Kernel system call: for obvious reasons only root may call it.
-@@ -991,6 +1011,11 @@ asmlinkage long sys_kexec_load(unsigned 
-               if (result)
-                       goto out;
-       }
-+#ifdef CONFIG_XEN
-+      result = xen_machine_kexec_load(image);
-+      if (result)
-+              goto out;
-+#endif
-       /* Install the new kernel, and  Uninstall the old */
-       image = xchg(dest_image, image);
- 
-@@ -1045,7 +1070,6 @@ void crash_kexec(struct pt_regs *regs)
-       struct kimage *image;
-       int locked;
- 
--
-       /* Take the kexec_lock here to prevent sys_kexec_load
-        * running on one cpu from replacing the crash kernel
-        * we are using after a panic on a different cpu.
-@@ -1061,7 +1085,11 @@ void crash_kexec(struct pt_regs *regs)
-                       struct pt_regs fixed_regs;
-                       crash_setup_regs(&fixed_regs, regs);
-                       machine_crash_shutdown(&fixed_regs);
-+#ifdef CONFIG_XEN
-+                      xen_machine_kexec(image);
-+#else
-                       machine_kexec(image);
-+#endif
-               }
-               xchg(&kexec_lock, 0);
-       }
 --- 0002/kernel/sys.c
 +++ work/kernel/sys.c
 @@ -435,8 +435,12 @@ void kernel_kexec(void)
diff -r 7c3dee5ff185 -r 1db125262365 patches/linux-2.6.16.33/series
--- a/patches/linux-2.6.16.33/series    Fri Dec 08 11:46:48 2006 +0000
+++ b/patches/linux-2.6.16.33/series    Fri Dec 08 11:47:09 2006 +0000
@@ -3,10 +3,8 @@ git-2a8a3d5b65e86ec1dfef7d268c64a909eab9
 git-2a8a3d5b65e86ec1dfef7d268c64a909eab94af7.patch
 git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch
 linux-2.6.19-rc1-kexec-move_segment_code-i386.patch
-linux-2.6.19-rc1-kexec-xen-i386.patch
 git-4bfaaef01a1badb9e8ffb0c0a37cd2379008d21f.patch
 linux-2.6.19-rc1-kexec-move_segment_code-x86_64.patch
-linux-2.6.19-rc1-kexec-xen-x86_64.patch
 blktap-aio-16_03_06.patch
 device_bind.patch
 fix-hz-suspend.patch
diff -r 7c3dee5ff185 -r 1db125262365 
patches/linux-2.6.16.33/linux-2.6.19-rc1-kexec-xen-i386.patch
--- a/patches/linux-2.6.16.33/linux-2.6.19-rc1-kexec-xen-i386.patch     Fri Dec 
08 11:46:48 2006 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
---- 0001/arch/i386/kernel/crash.c
-+++ work/arch/i386/kernel/crash.c
-@@ -90,6 +90,7 @@ static void crash_save_self(struct pt_re
-       crash_save_this_cpu(regs, cpu);
- }
- 
-+#ifndef CONFIG_XEN
- #ifdef CONFIG_SMP
- static atomic_t waiting_for_crash_ipi;
- 
-@@ -158,6 +159,7 @@ static void nmi_shootdown_cpus(void)
-       /* There are no cpus to shootdown */
- }
- #endif
-+#endif /* CONFIG_XEN */
- 
- void machine_crash_shutdown(struct pt_regs *regs)
- {
-@@ -174,10 +176,12 @@ void machine_crash_shutdown(struct pt_re
- 
-       /* Make a note of crashing cpu. Will be used in NMI callback.*/
-       crashing_cpu = smp_processor_id();
-+#ifndef CONFIG_XEN
-       nmi_shootdown_cpus();
-       lapic_shutdown();
- #if defined(CONFIG_X86_IO_APIC)
-       disable_IO_APIC();
- #endif
-+#endif /* CONFIG_XEN */
-       crash_save_self(regs);
- }
---- 0007/arch/i386/kernel/machine_kexec.c
-+++ work/arch/i386/kernel/machine_kexec.c
-@@ -19,6 +19,10 @@
- #include <asm/desc.h>
- #include <asm/system.h>
- 
-+#ifdef CONFIG_XEN
-+#include <xen/interface/kexec.h>
-+#endif
-+
- #define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
- static u32 kexec_pgd[1024] PAGE_ALIGNED;
- #ifdef CONFIG_X86_PAE
-@@ -28,6 +32,40 @@ static u32 kexec_pmd1[1024] PAGE_ALIGNED
- static u32 kexec_pte0[1024] PAGE_ALIGNED;
- static u32 kexec_pte1[1024] PAGE_ALIGNED;
- 
-+#ifdef CONFIG_XEN
-+
-+#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
-+
-+#if PAGES_NR > KEXEC_XEN_NO_PAGES
-+#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
-+#endif
-+
-+#if PA_CONTROL_PAGE != 0
-+#error PA_CONTROL_PAGE is non zero - Xen support will break
-+#endif
-+
-+void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage 
*image)
-+{
-+      void *control_page;
-+
-+      memset(xki->page_list, 0, sizeof(xki->page_list));
-+
-+      control_page = page_address(image->control_code_page);
-+      memcpy(control_page, relocate_kernel, PAGE_SIZE);
-+
-+      xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
-+      xki->page_list[PA_PGD] = __ma(kexec_pgd);
-+#ifdef CONFIG_X86_PAE
-+      xki->page_list[PA_PMD_0] = __ma(kexec_pmd0);
-+      xki->page_list[PA_PMD_1] = __ma(kexec_pmd1);
-+#endif
-+      xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
-+      xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
-+
-+}
-+
-+#endif /* CONFIG_XEN */
-+
- /*
-  * A architecture hook called to validate the
-  * proposed image and prepare the control pages
---- 0006/include/asm-i386/kexec.h
-+++ work/include/asm-i386/kexec.h
-@@ -98,6 +98,20 @@ relocate_kernel(unsigned long indirectio
-               unsigned long start_address,
-               unsigned int has_pae) ATTRIB_NORET;
- 
-+
-+/* Under Xen we need to work with machine addresses. These macros give the
-+ * machine address of a certain page to the generic kexec code instead of 
-+ * the pseudo physical address which would be given by the default macros.
-+ */
-+
-+#ifdef CONFIG_XEN
-+#define KEXEC_ARCH_HAS_PAGE_MACROS
-+#define kexec_page_to_pfn(page)  pfn_to_mfn(page_to_pfn(page))
-+#define kexec_pfn_to_page(pfn)   pfn_to_page(mfn_to_pfn(pfn))
-+#define kexec_virt_to_phys(addr) virt_to_machine(addr)
-+#define kexec_phys_to_virt(addr) phys_to_virt(machine_to_phys(addr))
-+#endif
-+
- #endif /* __ASSEMBLY__ */
- 
- #endif /* _I386_KEXEC_H */
diff -r 7c3dee5ff185 -r 1db125262365 
patches/linux-2.6.16.33/linux-2.6.19-rc1-kexec-xen-x86_64.patch
--- a/patches/linux-2.6.16.33/linux-2.6.19-rc1-kexec-xen-x86_64.patch   Fri Dec 
08 11:46:48 2006 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,219 +0,0 @@
---- 0001/arch/x86_64/kernel/crash.c
-+++ work/arch/x86_64/kernel/crash.c
-@@ -92,6 +92,7 @@ static void crash_save_self(struct pt_re
-       crash_save_this_cpu(regs, cpu);
- }
- 
-+#ifndef CONFIG_XEN
- #ifdef CONFIG_SMP
- static atomic_t waiting_for_crash_ipi;
- 
-@@ -156,6 +157,7 @@ static void nmi_shootdown_cpus(void)
-       /* There are no cpus to shootdown */
- }
- #endif
-+#endif /* CONFIG_XEN */
- 
- void machine_crash_shutdown(struct pt_regs *regs)
- {
-@@ -173,6 +175,8 @@ void machine_crash_shutdown(struct pt_re
- 
-       /* Make a note of crashing cpu. Will be used in NMI callback.*/
-       crashing_cpu = smp_processor_id();
-+
-+#ifndef CONFIG_XEN
-       nmi_shootdown_cpus();
- 
-       if(cpu_has_apic)
-@@ -181,6 +185,6 @@ void machine_crash_shutdown(struct pt_re
- #if defined(CONFIG_X86_IO_APIC)
-       disable_IO_APIC();
- #endif
--
-+#endif /* CONFIG_XEN */
-       crash_save_self(regs);
- }
---- 0010/arch/x86_64/kernel/machine_kexec.c
-+++ work/arch/x86_64/kernel/machine_kexec.c
-@@ -24,6 +24,104 @@ static u64 kexec_pud1[512] PAGE_ALIGNED;
- static u64 kexec_pmd1[512] PAGE_ALIGNED;
- static u64 kexec_pte1[512] PAGE_ALIGNED;
- 
-+#ifdef CONFIG_XEN
-+
-+/* In the case of Xen, override hypervisor functions to be able to create
-+ * a regular identity mapping page table...
-+ */
-+
-+#include <xen/interface/kexec.h>
-+#include <xen/interface/memory.h>
-+
-+#define x__pmd(x) ((pmd_t) { (x) } )
-+#define x__pud(x) ((pud_t) { (x) } )
-+#define x__pgd(x) ((pgd_t) { (x) } )
-+
-+#define x_pmd_val(x)   ((x).pmd)
-+#define x_pud_val(x)   ((x).pud)
-+#define x_pgd_val(x)   ((x).pgd)
-+
-+static inline void x_set_pmd(pmd_t *dst, pmd_t val)
-+{
-+      x_pmd_val(*dst) = x_pmd_val(val);
-+}
-+
-+static inline void x_set_pud(pud_t *dst, pud_t val)
-+{
-+      x_pud_val(*dst) = phys_to_machine(x_pud_val(val));
-+}
-+
-+static inline void x_pud_clear (pud_t *pud)
-+{
-+      x_pud_val(*pud) = 0;
-+}
-+
-+static inline void x_set_pgd(pgd_t *dst, pgd_t val)
-+{
-+      x_pgd_val(*dst) = phys_to_machine(x_pgd_val(val));
-+}
-+
-+static inline void x_pgd_clear (pgd_t * pgd)
-+{
-+      x_pgd_val(*pgd) = 0;
-+}
-+
-+#define X__PAGE_KERNEL_LARGE_EXEC \
-+         _PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_PSE
-+#define X_KERNPG_TABLE _PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY
-+
-+#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
-+
-+#if PAGES_NR > KEXEC_XEN_NO_PAGES
-+#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
-+#endif
-+
-+#if PA_CONTROL_PAGE != 0
-+#error PA_CONTROL_PAGE is non zero - Xen support will break
-+#endif
-+
-+void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage 
*image)
-+{
-+      void *control_page;
-+      void *table_page;
-+
-+      memset(xki->page_list, 0, sizeof(xki->page_list));
-+
-+      control_page = page_address(image->control_code_page) + PAGE_SIZE;
-+      memcpy(control_page, relocate_kernel, PAGE_SIZE);
-+
-+      table_page = page_address(image->control_code_page);
-+
-+      xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
-+      xki->page_list[PA_TABLE_PAGE] = __ma(table_page);
-+
-+      xki->page_list[PA_PGD] = __ma(kexec_pgd);
-+      xki->page_list[PA_PUD_0] = __ma(kexec_pud0);
-+      xki->page_list[PA_PUD_1] = __ma(kexec_pud1);
-+      xki->page_list[PA_PMD_0] = __ma(kexec_pmd0);
-+      xki->page_list[PA_PMD_1] = __ma(kexec_pmd1);
-+      xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
-+      xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
-+}
-+
-+#else /* CONFIG_XEN */
-+
-+#define x__pmd(x) __pmd(x)
-+#define x__pud(x) __pud(x)
-+#define x__pgd(x) __pgd(x)
-+
-+#define x_set_pmd(x, y) set_pmd(x, y)
-+#define x_set_pud(x, y) set_pud(x, y)
-+#define x_set_pgd(x, y) set_pgd(x, y)
-+
-+#define x_pud_clear(x) pud_clear(x)
-+#define x_pgd_clear(x) pgd_clear(x)
-+
-+#define X__PAGE_KERNEL_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC
-+#define X_KERNPG_TABLE _KERNPG_TABLE
-+
-+#endif /* CONFIG_XEN */
-+
- static void init_level2_page(pmd_t *level2p, unsigned long addr)
- {
-       unsigned long end_addr;
-@@ -31,7 +129,7 @@ static void init_level2_page(pmd_t *leve
-       addr &= PAGE_MASK;
-       end_addr = addr + PUD_SIZE;
-       while (addr < end_addr) {
--              set_pmd(level2p++, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
-+              x_set_pmd(level2p++, x__pmd(addr | X__PAGE_KERNEL_LARGE_EXEC));
-               addr += PMD_SIZE;
-       }
- }
-@@ -56,12 +154,12 @@ static int init_level3_page(struct kimag
-               }
-               level2p = (pmd_t *)page_address(page);
-               init_level2_page(level2p, addr);
--              set_pud(level3p++, __pud(__pa(level2p) | _KERNPG_TABLE));
-+              x_set_pud(level3p++, x__pud(__pa(level2p) | X_KERNPG_TABLE));
-               addr += PUD_SIZE;
-       }
-       /* clear the unused entries */
-       while (addr < end_addr) {
--              pud_clear(level3p++);
-+              x_pud_clear(level3p++);
-               addr += PUD_SIZE;
-       }
- out:
-@@ -92,12 +190,12 @@ static int init_level4_page(struct kimag
-               if (result) {
-                       goto out;
-               }
--              set_pgd(level4p++, __pgd(__pa(level3p) | _KERNPG_TABLE));
-+              x_set_pgd(level4p++, x__pgd(__pa(level3p) | X_KERNPG_TABLE));
-               addr += PGDIR_SIZE;
-       }
-       /* clear the unused entries */
-       while (addr < end_addr) {
--              pgd_clear(level4p++);
-+              x_pgd_clear(level4p++);
-               addr += PGDIR_SIZE;
-       }
- out:
-@@ -108,8 +206,14 @@ out:
- static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
- {
-       pgd_t *level4p;
-+      unsigned long x_end_pfn = end_pfn;
-+
-+#ifdef CONFIG_XEN
-+      x_end_pfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
-+#endif
-+
-       level4p = (pgd_t *)__va(start_pgtable);
--      return init_level4_page(image, level4p, 0, end_pfn << PAGE_SHIFT);
-+      return init_level4_page(image, level4p, 0, x_end_pfn << PAGE_SHIFT);
- }
- 
- int machine_kexec_prepare(struct kimage *image)
---- 0009/include/asm-x86_64/kexec.h
-+++ work/include/asm-x86_64/kexec.h
-@@ -91,6 +91,19 @@ relocate_kernel(unsigned long indirectio
-               unsigned long page_list,
-               unsigned long start_address) ATTRIB_NORET;
- 
-+/* Under Xen we need to work with machine addresses. These macros give the
-+ * machine address of a certain page to the generic kexec code instead of 
-+ * the pseudo physical address which would be given by the default macros.
-+ */
-+
-+#ifdef CONFIG_XEN
-+#define KEXEC_ARCH_HAS_PAGE_MACROS
-+#define kexec_page_to_pfn(page)  pfn_to_mfn(page_to_pfn(page))
-+#define kexec_pfn_to_page(pfn)   pfn_to_page(mfn_to_pfn(pfn))
-+#define kexec_virt_to_phys(addr) virt_to_machine(addr)
-+#define kexec_phys_to_virt(addr) phys_to_virt(machine_to_phys(addr))
-+#endif
-+
- #endif /* __ASSEMBLY__ */
- 
- #endif /* _X86_64_KEXEC_H */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.