1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 .section .head
17
18#define ELFNOTE_START(name, type, flags) \
19.pushsection .note.name, flags,@note ; \
20 .balign 4 ; \
21 .long 2f - 1f ; \
22 .long 4484f - 3f ; \
23 .long type ; \
241:.asciz
252:.balign 4 ; \
263:
27
28#define ELFNOTE_END \
294484:.balign 4 ; \
30.popsection ;
31
32#define ELFNOTE(name, type, desc) \
33 ELFNOTE_START(name, type, "") \
34 desc ; \
35 ELFNOTE_END
36
37#define XEN_ELFNOTE_ENTRY 1
38#define XEN_ELFNOTE_HYPERCALL_PAGE 2
39#define XEN_ELFNOTE_VIRT_BASE 3
40#define XEN_ELFNOTE_PADDR_OFFSET 4
41#define XEN_ELFNOTE_PHYS32_ENTRY 18
42
43#define __ASM_FORM(x) x
44#define __ASM_FORM_RAW(x) x
45#define __ASM_FORM_COMMA(x) x,
46#define __ASM_SEL(a,b) __ASM_FORM(b)
47#define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
48#define _ASM_PTR __ASM_SEL(.long, .quad)
49
50 ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, _ASM_PTR 0x100000)
51 ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, _ASM_PTR _start)
52 ELFNOTE(Xen, XEN_ELFNOTE_PHYS32_ENTRY, _ASM_PTR _start)
53 ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, _ASM_PTR 0)
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 .code32
78 .section .text
79
80.global _start
81_start:
82 cld
83 lgdt gdtr
84
85 ljmp $0x8,$.Lloadcs
86.Lloadcs:
87 mov $0x10,%eax
88 mov %eax,%ds
89 mov %eax,%es
90 mov %eax,%fs
91 mov %eax,%gs
92 mov %eax,%ss
93
94
95 mov %cr4, %eax
96 btsl $5, %eax
97 mov %eax, %cr4
98
99#define MSR_EFER 0xc0000080
100
101
102 mov $MSR_EFER, %ecx
103 rdmsr
104 btsl $8, %eax
105 wrmsr
106
107
108 mov $.Lpml4, %ecx
109 mov %ecx, %cr3
110
111 mov %cr0, %eax
112 btsl $31, %eax
113 mov %eax, %cr0
114
115
116 lgdt gdtr64
117 ljmp $0x8,$.Lenter64
118
119 .code64
120 .section .text
121.Lenter64:
122
123
124
125 movq $stack_end,%rsp
126
127
128 call main
129
130
131 test %al, %al
132 jz 1f
133 out %ax, $0xf4
134
1351:
136 mov $0x604,%edx
137 mov $0x2000,%eax
138 out %ax,%dx
139 hlt
140 jmp 1b
141
142
143
144
145
146
147
148
149 .global __sys_outc
150__sys_outc:
151 pushq %rax
152 mov %rax, %rdx
153 out %al,$0xE9
154 popq %rax
155 ret
156
157
158
159 .section .data
160 .align 16
161
162idt_00: .int 0, 0
163idt_01: .int 0, 0
164idt_02: .int 0, 0
165idt_03: .int 0, 0
166idt_04: .int 0, 0
167idt_05: .int 0, 0
168idt_06: .int 0, 0
169idt_07: .int 0, 0
170idt_08: .int 0, 0
171idt_09: .int 0, 0
172idt_0A: .int 0, 0
173idt_0B: .int 0, 0
174idt_0C: .int 0, 0
175idt_0D: .int 0, 0
176idt_0E: .int 0, 0
177idt_0F: .int 0, 0
178idt_10: .int 0, 0
179idt_11: .int 0, 0
180idt_12: .int 0, 0
181idt_13: .int 0, 0
182idt_14: .int 0, 0
183idt_15: .int 0, 0
184idt_16: .int 0, 0
185idt_17: .int 0, 0
186idt_18: .int 0, 0
187idt_19: .int 0, 0
188idt_1A: .int 0, 0
189idt_1B: .int 0, 0
190idt_1C: .int 0, 0
191idt_1D: .int 0, 0
192idt_1E: .int 0, 0
193idt_1F: .int 0, 0
194
195
196
197
198
199
200
201
202
203
204
205
206gdt:
207 .short 0
208gdtr:
209 .short gdt_en - gdt - 1
210 .int gdt
211
212
213 .short 0xFFFF
214 .short 0
215 .byte 0
216 .byte 0x9b
217 .byte 0xCF
218 .byte 0
219
220
221 .short 0xFFFF
222 .short 0
223 .byte 0
224 .byte 0x93
225 .byte 0xCF
226 .byte 0
227gdt_en:
228
229gdt64:
230 .short 0
231gdtr64:
232 .short gdt64_en - gdt64 - 1
233 .int gdt64
234
235
236 .short 0xFFFF
237 .short 0
238 .byte 0
239 .byte 0x9b
240 .byte 0xAF
241 .byte 0
242
243
244 .short 0xFFFF
245 .short 0
246 .byte 0
247 .byte 0x93
248 .byte 0xCF
249 .byte 0
250gdt64_en:
251
252 .section .bss
253 .align 16
254
255stack: .space 65536
256stack_end:
257
258 .section .data
259
260.align 4096
261.Lpd:
262i = 0
263 .rept 512 * 4
264 .quad 0x1e7 | (i << 21)
265 i = i + 1
266 .endr
267
268.align 4096
269.Lpdp:
270 .quad .Lpd + 7 + 0 * 4096
271 .quad .Lpd + 7 + 1 * 4096
272 .quad .Lpd + 7 + 2 * 4096
273 .quad .Lpd + 7 + 3 * 4096
274
275.align 4096
276.Lpml4:
277 .quad .Lpdp + 7
278