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