diff options
Diffstat (limited to 'linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S')
-rw-r--r-- | linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S b/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S deleted file mode 100644 index 0ab1074f01..0000000000 --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/head-xen.S +++ /dev/null @@ -1,203 +0,0 @@ -/* - * linux/arch/x86_64/kernel/head.S -- start in 32bit and switch to 64bit - * - * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE - * Copyright (C) 2000 Pavel Machek <pavel@suse.cz> - * Copyright (C) 2000 Karsten Keil <kkeil@suse.de> - * Copyright (C) 2001,2002 Andi Kleen <ak@suse.de> - * - * $Id: head.S,v 1.49 2002/03/19 17:39:25 ak Exp $ - * - * Jun Nakajima <jun.nakajima@intel.com> - * Modified for Xen - */ - - -#include <linux/linkage.h> -#include <linux/threads.h> -#include <linux/init.h> -#include <linux/elfnote.h> -#include <asm/desc.h> -#include <asm/segment.h> -#include <asm/page.h> -#include <asm/msr.h> -#include <asm/cache.h> -#include <asm/dwarf2.h> -#include <xen/interface/elfnote.h> - - .section .bootstrap.text, "ax", @progbits - .code64 -#define VIRT_ENTRY_OFFSET 0x0 -.org VIRT_ENTRY_OFFSET - .globl startup_64 -startup_64: -ENTRY(_start) - movq $(init_thread_union+THREAD_SIZE-8),%rsp - - /* rsi is pointer to startup info structure. - pass it to C */ - movq %rsi,%rdi - pushq $0 # fake return address - jmp x86_64_start_kernel - -ENTRY(stext) -ENTRY(_stext) - - $page = 0 -#define NEXT_PAGE(name) \ - $page = $page + 1; \ - .org $page * 0x1000; \ - phys_##name = $page * 0x1000 + __PHYSICAL_START; \ -ENTRY(name) - -NEXT_PAGE(init_level4_pgt) - /* This gets initialized in x86_64_start_kernel */ - .fill 512,8,0 - - /* - * We update two pgd entries to make kernel and user pgd consistent - * at pgd_populate(). It can be used for kernel modules. So we place - * this page here for those cases to avoid memory corruption. - * We also use this page to establish the initiali mapping for - * vsyscall area. - */ -NEXT_PAGE(init_level4_user_pgt) - .fill 512,8,0 - -NEXT_PAGE(level3_kernel_pgt) - .fill 512,8,0 - - /* - * This is used for vsyscall area mapping as we have a different - * level4 page table for user. - */ -NEXT_PAGE(level3_user_pgt) - .fill 512,8,0 - -NEXT_PAGE(level2_kernel_pgt) - .fill 512,8,0 - -NEXT_PAGE(hypercall_page) - CFI_STARTPROC - .rept 0x1000 / 0x20 - .skip 1 /* push %rcx */ - CFI_ADJUST_CFA_OFFSET 8 - CFI_REL_OFFSET rcx,0 - .skip 2 /* push %r11 */ - CFI_ADJUST_CFA_OFFSET 8 - CFI_REL_OFFSET rcx,0 - .skip 5 /* mov $#,%eax */ - .skip 2 /* syscall */ - .skip 2 /* pop %r11 */ - CFI_ADJUST_CFA_OFFSET -8 - CFI_RESTORE r11 - .skip 1 /* pop %rcx */ - CFI_ADJUST_CFA_OFFSET -8 - CFI_RESTORE rcx - .align 0x20,0 /* ret */ - .endr - CFI_ENDPROC - -#undef NEXT_PAGE - - .data - - .align 16 - .globl cpu_gdt_descr -cpu_gdt_descr: - .word gdt_end-cpu_gdt_table-1 -gdt: - .quad cpu_gdt_table -#ifdef CONFIG_SMP - .rept NR_CPUS-1 - .word 0 - .quad 0 - .endr -#endif - -/* We need valid kernel segments for data and code in long mode too - * IRET will check the segment types kkeil 2000/10/28 - * Also sysret mandates a special GDT layout - */ - - .section .data.page_aligned, "aw" - .align PAGE_SIZE - -/* The TLS descriptors are currently at a different place compared to i386. - Hopefully nobody expects them at a fixed place (Wine?) */ - -ENTRY(cpu_gdt_table) - .quad 0x0000000000000000 /* NULL descriptor */ - .quad 0x0 /* unused */ - .quad 0x00af9a000000ffff /* __KERNEL_CS */ - .quad 0x00cf92000000ffff /* __KERNEL_DS */ - .quad 0x00cffa000000ffff /* __USER32_CS */ - .quad 0x00cff2000000ffff /* __USER_DS, __USER32_DS */ - .quad 0x00affa000000ffff /* __USER_CS */ - .quad 0x00cf9a000000ffff /* __KERNEL32_CS */ - .quad 0,0 /* TSS */ - .quad 0,0 /* LDT */ - .quad 0,0,0 /* three TLS descriptors */ - .quad 0 /* unused */ -gdt_end: - /* asm/segment.h:GDT_ENTRIES must match this */ - /* This should be a multiple of the cache line size */ - /* GDTs of other CPUs are now dynamically allocated */ - - /* zero the remaining page */ - .fill PAGE_SIZE / 8 - GDT_ENTRIES,8,0 - - .section .bss.page_aligned, "aw", @nobits - .align PAGE_SIZE -ENTRY(empty_zero_page) - .skip PAGE_SIZE - -#if CONFIG_XEN_COMPAT <= 0x030002 -/* - * __xen_guest information - */ -.macro utoh value - .if (\value) < 0 || (\value) >= 0x10 - utoh (((\value)>>4)&0x0fffffffffffffff) - .endif - .if ((\value) & 0xf) < 10 - .byte '0' + ((\value) & 0xf) - .else - .byte 'A' + ((\value) & 0xf) - 10 - .endif -.endm - -.section __xen_guest - .ascii "GUEST_OS=linux,GUEST_VER=2.6" - .ascii ",XEN_VER=xen-3.0" - .ascii ",VIRT_BASE=0x" - utoh __START_KERNEL_map - .ascii ",ELF_PADDR_OFFSET=0x" - utoh __START_KERNEL_map - .ascii ",VIRT_ENTRY=0x" - utoh (__START_KERNEL_map + __PHYSICAL_START + VIRT_ENTRY_OFFSET) - .ascii ",HYPERCALL_PAGE=0x" - utoh (phys_hypercall_page >> PAGE_SHIFT) - .ascii ",FEATURES=writable_page_tables" - .ascii "|writable_descriptor_tables" - .ascii "|auto_translated_physmap" - .ascii "|supervisor_mode_kernel" - .ascii ",LOADER=generic" - .byte 0 -#endif /* CONFIG_XEN_COMPAT <= 0x030002 */ - - ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz, "linux") - ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz, "2.6") - ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz, "xen-3.0") - ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, .quad, __START_KERNEL_map) -#if CONFIG_XEN_COMPAT <= 0x030002 - ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .quad, __START_KERNEL_map) -#else - ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .quad, 0) -#endif - ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .quad, startup_64) - ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad, hypercall_page) - ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID, .quad, _PAGE_PRESENT,_PAGE_PRESENT) - ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel") - ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz, "generic") - ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long, 1) |