1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * purgatory: setup code |
4 | * |
5 | * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com) |
6 | * Copyright (C) 2014 Red Hat Inc. |
7 | * |
8 | * This code has been taken from kexec-tools. |
9 | */ |
10 | #include <linux/linkage.h> |
11 | #include <asm/purgatory.h> |
12 | |
13 | .text |
14 | .balign 16 |
15 | .code64 |
16 | |
17 | SYM_CODE_START(purgatory_start) |
18 | /* Load a gdt so I know what the segment registers are */ |
19 | lgdt gdt(%rip) |
20 | |
21 | /* load the data segments */ |
22 | movl $0x18, %eax /* data segment */ |
23 | movl %eax, %ds |
24 | movl %eax, %es |
25 | movl %eax, %ss |
26 | movl %eax, %fs |
27 | movl %eax, %gs |
28 | |
29 | /* Setup a stack */ |
30 | leaq lstack_end(%rip), %rsp |
31 | |
32 | /* Call the C code */ |
33 | call purgatory |
34 | jmp entry64 |
35 | SYM_CODE_END(purgatory_start) |
36 | |
37 | .section ".rodata" |
38 | .balign 16 |
39 | SYM_DATA_START_LOCAL(gdt) |
40 | /* 0x00 unusable segment |
41 | * 0x08 unused |
42 | * so use them as the gdt ptr |
43 | */ |
44 | .word gdt_end - gdt - 1 |
45 | .quad gdt |
46 | .word 0, 0, 0 |
47 | |
48 | /* 0x10 4GB flat code segment */ |
49 | .word 0xFFFF, 0x0000, 0x9A00, 0x00AF |
50 | |
51 | /* 0x18 4GB flat data segment */ |
52 | .word 0xFFFF, 0x0000, 0x9200, 0x00CF |
53 | SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end) |
54 | |
55 | .bss |
56 | .balign 4096 |
57 | SYM_DATA_START_LOCAL(lstack) |
58 | .skip 4096 |
59 | SYM_DATA_END_LABEL(lstack, SYM_L_LOCAL, lstack_end) |
60 | |