- Update Xen patches to 3.3-rc5 and c/s 1157.
[linux-flexiantxendom0-3.2.10.git] / arch / x86 / kernel / head_64-xen.S
1 /*
2  *  linux/arch/x86_64/kernel/head.S -- start in 32bit and switch to 64bit
3  *
4  *  Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
5  *  Copyright (C) 2000 Pavel Machek <pavel@suse.cz>
6  *  Copyright (C) 2000 Karsten Keil <kkeil@suse.de>
7  *  Copyright (C) 2001,2002 Andi Kleen <ak@suse.de>
8  *  Copyright (C) 2005 Eric Biederman <ebiederm@xmission.com>
9  *  Jun Nakajima <jun.nakajima@intel.com>
10  *    Modified for Xen                                
11  */
12
13
14 #include <linux/linkage.h>
15 #include <linux/threads.h>
16 #include <linux/init.h>
17 #include <linux/elfnote.h>
18 #include <asm/segment.h>
19 #include <asm/page.h>
20 #include <asm/pgtable.h>
21 #include <asm/msr.h>
22 #include <asm/cache.h>
23 #include <asm/dwarf2.h>
24 #include <asm/percpu.h>
25 #include <xen/interface/elfnote.h>
26 #include <xen/interface/features.h>
27
28         __HEAD
29         .code64
30         .globl startup_64
31 startup_64:
32         movq $(init_thread_union+THREAD_SIZE-8),%rsp
33
34         /* rsi is pointer to startup info structure.
35            pass it to C */
36         movq %rsi,%rdi
37
38         /* Set up %gs.
39          *
40          * The base of %gs always points to the bottom of the irqstack
41          * union.  If the stack protector canary is enabled, it is
42          * located at %gs:40.  Note that, on SMP, the boot cpu uses
43          * init data section till per cpu areas are set up.
44          */
45         movl    $MSR_GS_BASE,%ecx
46         movq    $INIT_PER_CPU_VAR(irq_stack_union),%rax
47         movq    %rax,%rdx
48         shrq    $32,%rdx
49         wrmsr
50
51         pushq $0                # fake return address
52         jmp x86_64_start_kernel
53
54 #define NEXT_PAGE(name) \
55         .balign PAGE_SIZE; \
56 ENTRY(name)
57
58         __PAGE_ALIGNED_BSS
59 NEXT_PAGE(init_level4_pgt)
60         .fill   512,8,0
61
62 NEXT_PAGE(level3_kernel_pgt)
63         .fill   512,8,0
64
65         /*
66          * This is used for vsyscall area mapping as we have a different
67          * level4 page table for user.
68          */
69 NEXT_PAGE(level3_user_pgt)
70         .fill   512,8,0
71
72 NEXT_PAGE(level2_fixmap_pgt)
73         .fill   512,8,0
74
75 NEXT_PAGE(level1_fixmap_pgt)
76         .fill   512,8,0
77
78         .previous
79 NEXT_PAGE(hypercall_page)
80         phys_hypercall_page = . - .head.text
81         CFI_STARTPROC
82         .rept 0x1000 / 0x20
83         .skip 1 /* push %rcx */
84         CFI_ADJUST_CFA_OFFSET   8
85         CFI_REL_OFFSET  rcx,0
86         .skip 2 /* push %r11 */
87         CFI_ADJUST_CFA_OFFSET   8
88         CFI_REL_OFFSET  rcx,0
89         .skip 5 /* mov $#,%eax */
90         .skip 2 /* syscall */
91         .skip 2 /* pop %r11 */
92         CFI_ADJUST_CFA_OFFSET -8
93         CFI_RESTORE r11
94         .skip 1 /* pop %rcx */
95         CFI_ADJUST_CFA_OFFSET -8
96         CFI_RESTORE rcx
97         .align 0x20,0 /* ret */
98         .endr
99         CFI_ENDPROC
100
101 #undef NEXT_PAGE
102
103         __PAGE_ALIGNED_BSS
104         .align PAGE_SIZE
105 ENTRY(empty_zero_page)
106         .skip PAGE_SIZE
107
108 #ifdef CONFIG_XEN_UNPRIVILEGED_GUEST
109 # define XEN_DOM0_CAP           0
110 # define XEN_DOM0_CAP_STR       ""
111 #else
112 # define XEN_DOM0_CAP           (1 << XENFEAT_dom0)
113 # if CONFIG_XEN_COMPAT < 0x040200
114 #  define XEN_DOM0_CAP_STR      ""
115 # else
116 #  define XEN_DOM0_CAP_STR      "|dom0"
117 # endif
118 #endif
119
120 #if CONFIG_XEN_COMPAT <= 0x030002
121 /*
122  * __xen_guest information
123  */
124 .macro utoh value
125  i = 64
126  .rept 16
127   i = i - 4
128   .byte '0' + ((((\value) >> i) & 0xf) > 9) * ('0' - 'A' + 10) + (((\value) >> i) & 0xf)
129  .endr
130 .endm
131
132 .section __xen_guest
133         .ascii  "GUEST_OS=linux,GUEST_VER=2.6"
134         .ascii  ",XEN_VER=xen-3.0"
135         .ascii  ",VIRT_BASE=0x"
136                 utoh __START_KERNEL_map
137         .ascii  ",ELF_PADDR_OFFSET=0x"
138                 utoh __START_KERNEL_map
139         .ascii  ",VIRT_ENTRY=0x"
140                 utoh (__START_KERNEL_map + __PHYSICAL_START)
141         .ascii  ",HYPERCALL_PAGE=0x"
142                 utoh (phys_hypercall_page >> PAGE_SHIFT)
143         .ascii  ",FEATURES=writable_page_tables"
144         .ascii           "|writable_descriptor_tables"
145         .ascii           "|auto_translated_physmap"
146         .ascii           "|supervisor_mode_kernel"
147         .ascii  ",LOADER=generic"
148         .byte   0
149 #endif /* CONFIG_XEN_COMPAT <= 0x030002 */
150         
151         ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz "linux")
152         ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz "2.6")
153         ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz "xen-3.0")
154         ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      .quad __START_KERNEL_map)
155 #if CONFIG_XEN_COMPAT <= 0x030002
156         ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad __START_KERNEL_map)
157 #else
158         ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad 0)
159 #endif
160         ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .quad startup_64)
161         ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad hypercall_page)
162         ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .quad _PAGE_PRESENT, _PAGE_PRESENT)
163         ELFNOTE(Xen, XEN_ELFNOTE_MOD_START_PFN,  .long 1)
164         ELFNOTE(Xen, XEN_ELFNOTE_INIT_P2M,       .quad VMEMMAP_START)
165         ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .ascii "writable_page_tables";
166                                                  .ascii "|writable_descriptor_tables";
167                                                  .ascii "|auto_translated_physmap";
168                                                  .ascii "|supervisor_mode_kernel";
169                                                  .asciz XEN_DOM0_CAP_STR)
170         ELFNOTE(Xen, XEN_ELFNOTE_SUPPORTED_FEATURES, .long XEN_DOM0_CAP |
171                                            (1 << XENFEAT_writable_page_tables) |
172                                            (1 << XENFEAT_writable_descriptor_tables) |
173                                            (1 << XENFEAT_auto_translated_physmap) |
174                                            (1 << XENFEAT_supervisor_mode_kernel))
175         ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz "generic")
176         ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long 1)