1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/linkage.h>
14#include <linux/threads.h>
15#include <linux/init.h>
16#include <linux/pgtable.h>
17#include <asm/segment.h>
18#include <asm/page.h>
19#include <asm/msr.h>
20#include <asm/cache.h>
21#include <asm/processor-flags.h>
22#include <asm/percpu.h>
23#include <asm/nops.h>
24#include "../entry/calling.h"
25#include <asm/export.h>
26#include <asm/nospec-branch.h>
27#include <asm/fixmap.h>
28
29
30
31
32
33#define l4_index(x) (((x) >> 39) & 511)
34#define pud_index(x) (((x) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
35
36L4_PAGE_OFFSET = l4_index(__PAGE_OFFSET_BASE_L4)
37L4_START_KERNEL = l4_index(__START_KERNEL_map)
38
39L3_START_KERNEL = pud_index(__START_KERNEL_map)
40
41 .text
42 __HEAD
43 .code64
44SYM_CODE_START_NOALIGN(startup_64)
45 UNWIND_HINT_EMPTY
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 leaq (__end_init_task - FRAME_SIZE)(%rip), %rsp
66
67 leaq _text(%rip), %rdi
68 pushq %rsi
69 call startup_64_setup_env
70 popq %rsi
71
72
73 pushq $__KERNEL_CS
74 leaq .Lon_kernel_cs(%rip), %rax
75 pushq %rax
76 lretq
77
78.Lon_kernel_cs:
79 UNWIND_HINT_EMPTY
80
81
82 call verify_cpu
83
84
85
86
87
88
89
90 leaq _text(%rip), %rdi
91 pushq %rsi
92 call __startup_64
93 popq %rsi
94
95
96 addq $(early_top_pgt - __START_KERNEL_map), %rax
97 jmp 1f
98SYM_CODE_END(startup_64)
99
100SYM_CODE_START(secondary_startup_64)
101 UNWIND_HINT_EMPTY
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 call verify_cpu
118
119
120
121
122
123
124
125
126
127
128SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
129 UNWIND_HINT_EMPTY
130
131
132
133
134
135 pushq %rsi
136 call __startup_secondary_64
137 popq %rsi
138
139
140 addq $(init_top_pgt - __START_KERNEL_map), %rax
1411:
142
143
144 movl $(X86_CR4_PAE | X86_CR4_PGE), %ecx
145#ifdef CONFIG_X86_5LEVEL
146 testl $1, __pgtable_l5_enabled(%rip)
147 jz 1f
148 orl $X86_CR4_LA57, %ecx
1491:
150#endif
151 movq %rcx, %cr4
152
153
154 addq phys_base(%rip), %rax
155
156
157
158
159
160
161
162
163
164 pushq %rsi
165 movq %rax, %rdi
166 call sev_verify_cbit
167 popq %rsi
168
169
170 movq %rax, %cr3
171
172
173 movq $1f, %rax
174 ANNOTATE_RETPOLINE_SAFE
175 jmp *%rax
1761:
177 UNWIND_HINT_EMPTY
178
179
180
181
182
183
184
185 lgdt early_gdt_descr(%rip)
186
187
188 xorl %eax,%eax
189 movl %eax,%ds
190 movl %eax,%ss
191 movl %eax,%es
192
193
194
195
196
197
198 movl %eax,%fs
199 movl %eax,%gs
200
201
202
203
204
205
206
207
208 movl $MSR_GS_BASE,%ecx
209 movl initial_gs(%rip),%eax
210 movl initial_gs+4(%rip),%edx
211 wrmsr
212
213
214
215
216
217 movq initial_stack(%rip), %rsp
218
219
220 pushq %rsi
221 call early_setup_idt
222 popq %rsi
223
224
225 movl $0x80000001, %eax
226 cpuid
227 movl %edx,%edi
228
229
230 movl $MSR_EFER, %ecx
231 rdmsr
232 btsl $_EFER_SCE, %eax
233 btl $20,%edi
234 jnc 1f
235 btsl $_EFER_NX, %eax
236 btsq $_PAGE_BIT_NX,early_pmd_flags(%rip)
2371: wrmsr
238
239
240 movl $CR0_STATE, %eax
241
242 movq %rax, %cr0
243
244
245 pushq $0
246 popfq
247
248
249
250 movq %rsi, %rdi
251
252.Ljump_to_C_code:
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278 pushq $.Lafter_lret
279 xorl %ebp, %ebp
280 movq initial_code(%rip), %rax
281 pushq $__KERNEL_CS
282 pushq %rax
283 lretq
284.Lafter_lret:
285SYM_CODE_END(secondary_startup_64)
286
287#include "verify_cpu.S"
288#include "sev_verify_cbit.S"
289
290#ifdef CONFIG_HOTPLUG_CPU
291
292
293
294
295
296SYM_CODE_START(start_cpu0)
297 UNWIND_HINT_EMPTY
298 movq initial_stack(%rip), %rsp
299 jmp .Ljump_to_C_code
300SYM_CODE_END(start_cpu0)
301#endif
302
303#ifdef CONFIG_AMD_MEM_ENCRYPT
304
305
306
307
308
309
310
311
312SYM_CODE_START_NOALIGN(vc_boot_ghcb)
313 UNWIND_HINT_IRET_REGS offset=8
314
315
316 PUSH_AND_CLEAR_REGS
317
318
319 movq %rsp, %rdi
320 movq ORIG_RAX(%rsp), %rsi
321 movq initial_vc_handler(%rip), %rax
322 ANNOTATE_RETPOLINE_SAFE
323 call *%rax
324
325
326 POP_REGS
327
328
329 addq $8, %rsp
330
331
332 iretq
333SYM_CODE_END(vc_boot_ghcb)
334#endif
335
336
337 __REFDATA
338 .balign 8
339SYM_DATA(initial_code, .quad x86_64_start_kernel)
340SYM_DATA(initial_gs, .quad INIT_PER_CPU_VAR(fixed_percpu_data))
341#ifdef CONFIG_AMD_MEM_ENCRYPT
342SYM_DATA(initial_vc_handler, .quad handle_vc_boot_ghcb)
343#endif
344
345
346
347
348
349SYM_DATA(initial_stack, .quad init_thread_union + THREAD_SIZE - FRAME_SIZE)
350 __FINITDATA
351
352 __INIT
353SYM_CODE_START(early_idt_handler_array)
354 i = 0
355 .rept NUM_EXCEPTION_VECTORS
356 .if ((EXCEPTION_ERRCODE_MASK >> i) & 1) == 0
357 UNWIND_HINT_IRET_REGS
358 pushq $0
359 .else
360 UNWIND_HINT_IRET_REGS offset=8
361 .endif
362 pushq $i
363 jmp early_idt_handler_common
364 UNWIND_HINT_IRET_REGS
365 i = i + 1
366 .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
367 .endr
368 UNWIND_HINT_IRET_REGS offset=16
369SYM_CODE_END(early_idt_handler_array)
370
371SYM_CODE_START_LOCAL(early_idt_handler_common)
372
373
374
375
376 cld
377
378 incl early_recursion_flag(%rip)
379
380
381 pushq %rsi
382 movq 8(%rsp), %rsi
383 movq %rdi, 8(%rsp)
384 pushq %rdx
385 pushq %rcx
386 pushq %rax
387 pushq %r8
388 pushq %r9
389 pushq %r10
390 pushq %r11
391 pushq %rbx
392 pushq %rbp
393 pushq %r12
394 pushq %r13
395 pushq %r14
396 pushq %r15
397 UNWIND_HINT_REGS
398
399 movq %rsp,%rdi
400 call do_early_exception
401
402 decl early_recursion_flag(%rip)
403 jmp restore_regs_and_return_to_kernel
404SYM_CODE_END(early_idt_handler_common)
405
406#ifdef CONFIG_AMD_MEM_ENCRYPT
407
408
409
410
411
412
413
414
415SYM_CODE_START_NOALIGN(vc_no_ghcb)
416 UNWIND_HINT_IRET_REGS offset=8
417
418
419 PUSH_AND_CLEAR_REGS
420
421
422 movq %rsp, %rdi
423 movq ORIG_RAX(%rsp), %rsi
424 call do_vc_no_ghcb
425
426
427 POP_REGS
428
429
430 addq $8, %rsp
431
432
433 iretq
434SYM_CODE_END(vc_no_ghcb)
435#endif
436
437#define SYM_DATA_START_PAGE_ALIGNED(name) \
438 SYM_START(name, SYM_L_GLOBAL, .balign PAGE_SIZE)
439
440#ifdef CONFIG_PAGE_TABLE_ISOLATION
441
442
443
444
445
446
447
448
449
450
451#define PTI_USER_PGD_FILL 512
452
453#define SYM_DATA_START_PTI_ALIGNED(name) \
454 SYM_START(name, SYM_L_GLOBAL, .balign 2 * PAGE_SIZE)
455#else
456#define SYM_DATA_START_PTI_ALIGNED(name) \
457 SYM_DATA_START_PAGE_ALIGNED(name)
458#define PTI_USER_PGD_FILL 0
459#endif
460
461
462#define PMDS(START, PERM, COUNT) \
463 i = 0 ; \
464 .rept (COUNT) ; \
465 .quad (START) + (i << PMD_SHIFT) + (PERM) ; \
466 i = i + 1 ; \
467 .endr
468
469 __INITDATA
470 .balign 4
471
472SYM_DATA_START_PTI_ALIGNED(early_top_pgt)
473 .fill 512,8,0
474 .fill PTI_USER_PGD_FILL,8,0
475SYM_DATA_END(early_top_pgt)
476
477SYM_DATA_START_PAGE_ALIGNED(early_dynamic_pgts)
478 .fill 512*EARLY_DYNAMIC_PAGE_TABLES,8,0
479SYM_DATA_END(early_dynamic_pgts)
480
481SYM_DATA(early_recursion_flag, .long 0)
482
483 .data
484
485
486SYM_DATA_START_PTI_ALIGNED(init_top_pgt)
487 .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC
488 .org init_top_pgt + L4_PAGE_OFFSET*8, 0
489 .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC
490 .org init_top_pgt + L4_START_KERNEL*8, 0
491
492 .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC
493 .fill PTI_USER_PGD_FILL,8,0
494SYM_DATA_END(init_top_pgt)
495
496SYM_DATA_START_PAGE_ALIGNED(level3_ident_pgt)
497 .quad level2_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC
498 .fill 511, 8, 0
499SYM_DATA_END(level3_ident_pgt)
500SYM_DATA_START_PAGE_ALIGNED(level2_ident_pgt)
501
502
503
504
505
506
507
508
509 PMDS(0, __PAGE_KERNEL_IDENT_LARGE_EXEC, PTRS_PER_PMD)
510SYM_DATA_END(level2_ident_pgt)
511#else
512SYM_DATA_START_PTI_ALIGNED(init_top_pgt)
513 .fill 512,8,0
514 .fill PTI_USER_PGD_FILL,8,0
515SYM_DATA_END(init_top_pgt)
516#endif
517
518#ifdef CONFIG_X86_5LEVEL
519SYM_DATA_START_PAGE_ALIGNED(level4_kernel_pgt)
520 .fill 511,8,0
521 .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC
522SYM_DATA_END(level4_kernel_pgt)
523#endif
524
525SYM_DATA_START_PAGE_ALIGNED(level3_kernel_pgt)
526 .fill L3_START_KERNEL,8,0
527
528 .quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC
529 .quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC
530SYM_DATA_END(level3_kernel_pgt)
531
532SYM_DATA_START_PAGE_ALIGNED(level2_kernel_pgt)
533
534
535
536
537
538
539
540
541
542
543
544
545
546 PMDS(0, __PAGE_KERNEL_LARGE_EXEC, KERNEL_IMAGE_SIZE/PMD_SIZE)
547SYM_DATA_END(level2_kernel_pgt)
548
549SYM_DATA_START_PAGE_ALIGNED(level2_fixmap_pgt)
550 .fill (512 - 4 - FIXMAP_PMD_NUM),8,0
551 pgtno = 0
552 .rept (FIXMAP_PMD_NUM)
553 .quad level1_fixmap_pgt + (pgtno << PAGE_SHIFT) - __START_KERNEL_map \
554 + _PAGE_TABLE_NOENC;
555 pgtno = pgtno + 1
556 .endr
557
558 .fill 4,8,0
559SYM_DATA_END(level2_fixmap_pgt)
560
561SYM_DATA_START_PAGE_ALIGNED(level1_fixmap_pgt)
562 .rept (FIXMAP_PMD_NUM)
563 .fill 512,8,0
564 .endr
565SYM_DATA_END(level1_fixmap_pgt)
566
567#undef PMDS
568
569 .data
570 .align 16
571
572SYM_DATA(early_gdt_descr, .word GDT_ENTRIES*8-1)
573SYM_DATA_LOCAL(early_gdt_descr_base, .quad INIT_PER_CPU_VAR(gdt_page))
574
575 .align 16
576
577SYM_DATA(phys_base, .quad 0x0)
578EXPORT_SYMBOL(phys_base)
579
580#include "../../x86/xen/xen-head.S"
581
582 __PAGE_ALIGNED_BSS
583SYM_DATA_START_PAGE_ALIGNED(empty_zero_page)
584 .skip PAGE_SIZE
585SYM_DATA_END(empty_zero_page)
586EXPORT_SYMBOL(empty_zero_page)
587
588