aboutsummaryrefslogtreecommitdiffstats
path: root/patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch')
-rw-r--r--patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch382
1 files changed, 0 insertions, 382 deletions
diff --git a/patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch b/patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch
deleted file mode 100644
index d4b0d38ce8..0000000000
--- a/patches/linux-2.6.18/git-3566561bfadffcb5dbc85d576be80c0dbf2cccc9.patch
+++ /dev/null
@@ -1,382 +0,0 @@
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/machine_kexec.c ./arch/i386/kernel/machine_kexec.c
---- ../orig-linux-2.6.18/arch/i386/kernel/machine_kexec.c 2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/kernel/machine_kexec.c 2007-01-12 16:03:23.000000000 +0000
-@@ -20,70 +20,13 @@
- #include <asm/system.h>
-
- #define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
--
--#define L0_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
--#define L1_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
--#define L2_ATTR (_PAGE_PRESENT)
--
--#define LEVEL0_SIZE (1UL << 12UL)
--
--#ifndef CONFIG_X86_PAE
--#define LEVEL1_SIZE (1UL << 22UL)
--static u32 pgtable_level1[1024] PAGE_ALIGNED;
--
--static void identity_map_page(unsigned long address)
--{
-- unsigned long level1_index, level2_index;
-- u32 *pgtable_level2;
--
-- /* Find the current page table */
-- pgtable_level2 = __va(read_cr3());
--
-- /* Find the indexes of the physical address to identity map */
-- level1_index = (address % LEVEL1_SIZE)/LEVEL0_SIZE;
-- level2_index = address / LEVEL1_SIZE;
--
-- /* Identity map the page table entry */
-- pgtable_level1[level1_index] = address | L0_ATTR;
-- pgtable_level2[level2_index] = __pa(pgtable_level1) | L1_ATTR;
--
-- /* Flush the tlb so the new mapping takes effect.
-- * Global tlb entries are not flushed but that is not an issue.
-- */
-- load_cr3(pgtable_level2);
--}
--
--#else
--#define LEVEL1_SIZE (1UL << 21UL)
--#define LEVEL2_SIZE (1UL << 30UL)
--static u64 pgtable_level1[512] PAGE_ALIGNED;
--static u64 pgtable_level2[512] PAGE_ALIGNED;
--
--static void identity_map_page(unsigned long address)
--{
-- unsigned long level1_index, level2_index, level3_index;
-- u64 *pgtable_level3;
--
-- /* Find the current page table */
-- pgtable_level3 = __va(read_cr3());
--
-- /* Find the indexes of the physical address to identity map */
-- level1_index = (address % LEVEL1_SIZE)/LEVEL0_SIZE;
-- level2_index = (address % LEVEL2_SIZE)/LEVEL1_SIZE;
-- level3_index = address / LEVEL2_SIZE;
--
-- /* Identity map the page table entry */
-- pgtable_level1[level1_index] = address | L0_ATTR;
-- pgtable_level2[level2_index] = __pa(pgtable_level1) | L1_ATTR;
-- set_64bit(&pgtable_level3[level3_index],
-- __pa(pgtable_level2) | L2_ATTR);
--
-- /* Flush the tlb so the new mapping takes effect.
-- * Global tlb entries are not flushed but that is not an issue.
-- */
-- load_cr3(pgtable_level3);
--}
-+static u32 kexec_pgd[1024] PAGE_ALIGNED;
-+#ifdef CONFIG_X86_PAE
-+static u32 kexec_pmd0[1024] PAGE_ALIGNED;
-+static u32 kexec_pmd1[1024] PAGE_ALIGNED;
- #endif
-+static u32 kexec_pte0[1024] PAGE_ALIGNED;
-+static u32 kexec_pte1[1024] PAGE_ALIGNED;
-
- static void set_idt(void *newidt, __u16 limit)
- {
-@@ -127,16 +70,6 @@ static void load_segments(void)
- #undef __STR
- }
-
--typedef asmlinkage NORET_TYPE void (*relocate_new_kernel_t)(
-- unsigned long indirection_page,
-- unsigned long reboot_code_buffer,
-- unsigned long start_address,
-- unsigned int has_pae) ATTRIB_NORET;
--
--extern const unsigned char relocate_new_kernel[];
--extern void relocate_new_kernel_end(void);
--extern const unsigned int relocate_new_kernel_size;
--
- /*
- * A architecture hook called to validate the
- * proposed image and prepare the control pages
-@@ -169,25 +102,29 @@ void machine_kexec_cleanup(struct kimage
- */
- NORET_TYPE void machine_kexec(struct kimage *image)
- {
-- unsigned long page_list;
-- unsigned long reboot_code_buffer;
--
-- relocate_new_kernel_t rnk;
-+ unsigned long page_list[PAGES_NR];
-+ void *control_page;
-
- /* Interrupts aren't acceptable while we reboot */
- local_irq_disable();
-
-- /* Compute some offsets */
-- reboot_code_buffer = page_to_pfn(image->control_code_page)
-- << PAGE_SHIFT;
-- page_list = image->head;
--
-- /* Set up an identity mapping for the reboot_code_buffer */
-- identity_map_page(reboot_code_buffer);
--
-- /* copy it out */
-- memcpy((void *)reboot_code_buffer, relocate_new_kernel,
-- relocate_new_kernel_size);
-+ control_page = page_address(image->control_code_page);
-+ memcpy(control_page, relocate_kernel, PAGE_SIZE);
-+
-+ page_list[PA_CONTROL_PAGE] = __pa(control_page);
-+ page_list[VA_CONTROL_PAGE] = (unsigned long)relocate_kernel;
-+ page_list[PA_PGD] = __pa(kexec_pgd);
-+ page_list[VA_PGD] = (unsigned long)kexec_pgd;
-+#ifdef CONFIG_X86_PAE
-+ page_list[PA_PMD_0] = __pa(kexec_pmd0);
-+ page_list[VA_PMD_0] = (unsigned long)kexec_pmd0;
-+ page_list[PA_PMD_1] = __pa(kexec_pmd1);
-+ page_list[VA_PMD_1] = (unsigned long)kexec_pmd1;
-+#endif
-+ page_list[PA_PTE_0] = __pa(kexec_pte0);
-+ page_list[VA_PTE_0] = (unsigned long)kexec_pte0;
-+ page_list[PA_PTE_1] = __pa(kexec_pte1);
-+ page_list[VA_PTE_1] = (unsigned long)kexec_pte1;
-
- /* The segment registers are funny things, they have both a
- * visible and an invisible part. Whenever the visible part is
-@@ -206,6 +143,6 @@ NORET_TYPE void machine_kexec(struct kim
- set_idt(phys_to_virt(0),0);
-
- /* now call it */
-- rnk = (relocate_new_kernel_t) reboot_code_buffer;
-- (*rnk)(page_list, reboot_code_buffer, image->start, cpu_has_pae);
-+ relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-+ image->start, cpu_has_pae);
- }
-diff -pruN ../orig-linux-2.6.18/arch/i386/kernel/relocate_kernel.S ./arch/i386/kernel/relocate_kernel.S
---- ../orig-linux-2.6.18/arch/i386/kernel/relocate_kernel.S 2006-09-20 04:42:06.000000000 +0100
-+++ ./arch/i386/kernel/relocate_kernel.S 2007-01-12 16:03:23.000000000 +0000
-@@ -7,16 +7,138 @@
- */
-
- #include <linux/linkage.h>
-+#include <asm/page.h>
-+#include <asm/kexec.h>
-+
-+/*
-+ * Must be relocatable PIC code callable as a C function
-+ */
-+
-+#define PTR(x) (x << 2)
-+#define PAGE_ALIGNED (1 << PAGE_SHIFT)
-+#define PAGE_ATTR 0x63 /* _PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY */
-+#define PAE_PGD_ATTR 0x01 /* _PAGE_PRESENT */
-+
-+ .text
-+ .align PAGE_ALIGNED
-+ .globl relocate_kernel
-+relocate_kernel:
-+ movl 8(%esp), %ebp /* list of pages */
-+
-+#ifdef CONFIG_X86_PAE
-+ /* map the control page at its virtual address */
-+
-+ movl PTR(VA_PGD)(%ebp), %edi
-+ movl PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0xc0000000, %eax
-+ shrl $27, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_PMD_0)(%ebp), %edx
-+ orl $PAE_PGD_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ movl PTR(VA_PMD_0)(%ebp), %edi
-+ movl PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0x3fe00000, %eax
-+ shrl $18, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_PTE_0)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ movl PTR(VA_PTE_0)(%ebp), %edi
-+ movl PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0x001ff000, %eax
-+ shrl $9, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ /* identity map the control page at its physical address */
-+
-+ movl PTR(VA_PGD)(%ebp), %edi
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0xc0000000, %eax
-+ shrl $27, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_PMD_1)(%ebp), %edx
-+ orl $PAE_PGD_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ movl PTR(VA_PMD_1)(%ebp), %edi
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0x3fe00000, %eax
-+ shrl $18, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_PTE_1)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ movl PTR(VA_PTE_1)(%ebp), %edi
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0x001ff000, %eax
-+ shrl $9, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+#else
-+ /* map the control page at its virtual address */
-+
-+ movl PTR(VA_PGD)(%ebp), %edi
-+ movl PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0xffc00000, %eax
-+ shrl $20, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_PTE_0)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ movl PTR(VA_PTE_0)(%ebp), %edi
-+ movl PTR(VA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0x003ff000, %eax
-+ shrl $10, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ /* identity map the control page at its physical address */
-+
-+ movl PTR(VA_PGD)(%ebp), %edi
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0xffc00000, %eax
-+ shrl $20, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_PTE_1)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+
-+ movl PTR(VA_PTE_1)(%ebp), %edi
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %eax
-+ andl $0x003ff000, %eax
-+ shrl $10, %eax
-+ addl %edi, %eax
-+
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %edx
-+ orl $PAGE_ATTR, %edx
-+ movl %edx, (%eax)
-+#endif
-
-- /*
-- * Must be relocatable PIC code callable as a C function, that once
-- * it starts can not use the previous processes stack.
-- */
-- .globl relocate_new_kernel
- relocate_new_kernel:
- /* read the arguments and say goodbye to the stack */
- movl 4(%esp), %ebx /* page_list */
-- movl 8(%esp), %ebp /* reboot_code_buffer */
-+ movl 8(%esp), %ebp /* list of pages */
- movl 12(%esp), %edx /* start address */
- movl 16(%esp), %ecx /* cpu_has_pae */
-
-@@ -24,11 +146,26 @@ relocate_new_kernel:
- pushl $0
- popfl
-
-- /* set a new stack at the bottom of our page... */
-- lea 4096(%ebp), %esp
-+ /* get physical address of control page now */
-+ /* this is impossible after page table switch */
-+ movl PTR(PA_CONTROL_PAGE)(%ebp), %edi
-+
-+ /* switch to new set of page tables */
-+ movl PTR(PA_PGD)(%ebp), %eax
-+ movl %eax, %cr3
-+
-+ /* setup a new stack at the end of the physical control page */
-+ lea 4096(%edi), %esp
-
-- /* store the parameters back on the stack */
-- pushl %edx /* store the start address */
-+ /* jump to identity mapped page */
-+ movl %edi, %eax
-+ addl $(identity_mapped - relocate_kernel), %eax
-+ pushl %eax
-+ ret
-+
-+identity_mapped:
-+ /* store the start address on the stack */
-+ pushl %edx
-
- /* Set cr0 to a known state:
- * 31 0 == Paging disabled
-@@ -113,8 +250,3 @@ relocate_new_kernel:
- xorl %edi, %edi
- xorl %ebp, %ebp
- ret
--relocate_new_kernel_end:
--
-- .globl relocate_new_kernel_size
--relocate_new_kernel_size:
-- .long relocate_new_kernel_end - relocate_new_kernel
-diff -pruN ../orig-linux-2.6.18/include/asm-i386/kexec.h ./include/asm-i386/kexec.h
---- ../orig-linux-2.6.18/include/asm-i386/kexec.h 2006-09-20 04:42:06.000000000 +0100
-+++ ./include/asm-i386/kexec.h 2007-01-12 16:03:23.000000000 +0000
-@@ -1,6 +1,26 @@
- #ifndef _I386_KEXEC_H
- #define _I386_KEXEC_H
-
-+#define PA_CONTROL_PAGE 0
-+#define VA_CONTROL_PAGE 1
-+#define PA_PGD 2
-+#define VA_PGD 3
-+#define PA_PTE_0 4
-+#define VA_PTE_0 5
-+#define PA_PTE_1 6
-+#define VA_PTE_1 7
-+#ifdef CONFIG_X86_PAE
-+#define PA_PMD_0 8
-+#define VA_PMD_0 9
-+#define PA_PMD_1 10
-+#define VA_PMD_1 11
-+#define PAGES_NR 12
-+#else
-+#define PAGES_NR 8
-+#endif
-+
-+#ifndef __ASSEMBLY__
-+
- #include <asm/fixmap.h>
- #include <asm/ptrace.h>
- #include <asm/string.h>
-@@ -72,5 +92,12 @@ static inline void crash_setup_regs(stru
- newregs->eip = (unsigned long)current_text_addr();
- }
- }
-+asmlinkage NORET_TYPE void
-+relocate_kernel(unsigned long indirection_page,
-+ unsigned long control_page,
-+ unsigned long start_address,
-+ unsigned int has_pae) ATTRIB_NORET;
-+
-+#endif /* __ASSEMBLY__ */
-
- #endif /* _I386_KEXEC_H */