[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] Imported patch linux-2.6.19-rc1-kexec-move_segment_code-i386.patch from xen-unstable.hg 15200:bd3d6b4c52ec
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxxxxx> # Date 1180947923 -3600 # Node ID 948d16bbacc2d9362626015f536ea928d2415edf # Parent 07baeb6664de2fe650f32a2c77ed30217a84c701 Imported patch linux-2.6.19-rc1-kexec-move_segment_code-i386.patch from xen-unstable.hg 15200:bd3d6b4c52ec --- arch/i386/kernel/machine_kexec.c | 59 ------------------------------------- arch/i386/kernel/relocate_kernel.S | 58 +++++++++++++++++++++++++++++++++--- 2 files changed, 53 insertions(+), 64 deletions(-) diff -r 07baeb6664de -r 948d16bbacc2 arch/i386/kernel/machine_kexec.c --- a/arch/i386/kernel/machine_kexec.c Mon Jun 04 10:05:23 2007 +0100 +++ b/arch/i386/kernel/machine_kexec.c Mon Jun 04 10:05:23 2007 +0100 @@ -27,48 +27,6 @@ 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) -{ - struct Xgt_desc_struct curidt; - - /* ia32 supports unaliged loads & stores */ - curidt.size = limit; - curidt.address = (unsigned long)newidt; - - load_idt(&curidt); -}; - - -static void set_gdt(void *newgdt, __u16 limit) -{ - struct Xgt_desc_struct curgdt; - - /* ia32 supports unaligned loads & stores */ - curgdt.size = limit; - curgdt.address = (unsigned long)newgdt; - - load_gdt(&curgdt); -}; - -static void load_segments(void) -{ -#define __STR(X) #X -#define STR(X) __STR(X) - - __asm__ __volatile__ ( - "\tljmp $"STR(__KERNEL_CS)",$1f\n" - "\t1:\n" - "\tmovl $"STR(__KERNEL_DS)",%%eax\n" - "\tmovl %%eax,%%ds\n" - "\tmovl %%eax,%%es\n" - "\tmovl %%eax,%%fs\n" - "\tmovl %%eax,%%gs\n" - "\tmovl %%eax,%%ss\n" - ::: "eax", "memory"); -#undef STR -#undef __STR -} /* * A architecture hook called to validate the @@ -126,23 +84,6 @@ NORET_TYPE void machine_kexec(struct kim 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 - * set to a specific selector, the invisible part is loaded - * with from a table in memory. At no other time is the - * descriptor table in memory accessed. - * - * I take advantage of this here by force loading the - * segments, before I zap the gdt with an invalid value. - */ - load_segments(); - /* The gdt & idt are now invalid. - * If you want to load them you must set up your own idt & gdt. - */ - set_gdt(phys_to_virt(0),0); - set_idt(phys_to_virt(0),0); - - /* now call it */ relocate_kernel((unsigned long)image->head, (unsigned long)page_list, image->start, cpu_has_pae); } diff -r 07baeb6664de -r 948d16bbacc2 arch/i386/kernel/relocate_kernel.S --- a/arch/i386/kernel/relocate_kernel.S Mon Jun 04 10:05:23 2007 +0100 +++ b/arch/i386/kernel/relocate_kernel.S Mon Jun 04 10:05:23 2007 +0100 @@ -154,14 +154,45 @@ relocate_new_kernel: movl PTR(PA_PGD)(%ebp), %eax movl %eax, %cr3 + /* setup idt */ + movl %edi, %eax + addl $(idt_48 - relocate_kernel), %eax + lidtl (%eax) + + /* setup gdt */ + movl %edi, %eax + addl $(gdt - relocate_kernel), %eax + movl %edi, %esi + addl $((gdt_48 - relocate_kernel) + 2), %esi + movl %eax, (%esi) + + movl %edi, %eax + addl $(gdt_48 - relocate_kernel), %eax + lgdtl (%eax) + + /* setup data segment registers */ + mov $(gdt_ds - gdt), %eax + mov %eax, %ds + mov %eax, %es + mov %eax, %fs + mov %eax, %gs + mov %eax, %ss + /* setup a new stack at the end of the physical control page */ lea 4096(%edi), %esp - /* jump to identity mapped page */ - movl %edi, %eax - addl $(identity_mapped - relocate_kernel), %eax - pushl %eax - ret + /* load new code segment and jump to identity mapped page */ + movl %edi, %esi + xorl %eax, %eax + pushl %eax + pushl %esi + pushl %eax + movl $(gdt_cs - gdt), %eax + pushl %eax + movl %edi, %eax + addl $(identity_mapped - relocate_kernel),%eax + pushl %eax + iretl identity_mapped: /* store the start address on the stack */ @@ -250,3 +281,20 @@ 3: xorl %edi, %edi xorl %ebp, %ebp ret + + .align 16 +gdt: + .quad 0x0000000000000000 /* NULL descriptor */ +gdt_cs: + .quad 0x00cf9a000000ffff /* kernel 4GB code at 0x00000000 */ +gdt_ds: + .quad 0x00cf92000000ffff /* kernel 4GB data at 0x00000000 */ +gdt_end: + +gdt_48: + .word gdt_end - gdt - 1 /* limit */ + .long 0 /* base - filled in by code above */ + +idt_48: + .word 0 /* limit */ + .long 0 /* base */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |