Linux 4.6-rc6
[linux/fpc-iii.git] / arch / x86 / purgatory / setup-x86_64.S
blobfe3c91ba1bd0c6fd0fe0c880510364dbda0fa5c5
1 /*
2  * purgatory:  setup code
3  *
4  * Copyright (C) 2003,2004  Eric Biederman (ebiederm@xmission.com)
5  * Copyright (C) 2014 Red Hat Inc.
6  *
7  * This code has been taken from kexec-tools.
8  *
9  * This source code is licensed under the GNU General Public License,
10  * Version 2.  See the file COPYING for more details.
11  */
13         .text
14         .globl purgatory_start
15         .balign 16
16 purgatory_start:
17         .code64
19         /* Load a gdt so I know what the segment registers are */
20         lgdt    gdt(%rip)
22         /* load the data segments */
23         movl    $0x18, %eax     /* data segment */
24         movl    %eax, %ds
25         movl    %eax, %es
26         movl    %eax, %ss
27         movl    %eax, %fs
28         movl    %eax, %gs
30         /* Setup a stack */
31         leaq    lstack_end(%rip), %rsp
33         /* Call the C code */
34         call purgatory
35         jmp     entry64
37         .section ".rodata"
38         .balign 16
39 gdt:    /* 0x00 unusable segment
40          * 0x08 unused
41          * so use them as the gdt ptr
42          */
43         .word   gdt_end - gdt - 1
44         .quad   gdt
45         .word   0, 0, 0
47         /* 0x10 4GB flat code segment */
48         .word   0xFFFF, 0x0000, 0x9A00, 0x00AF
50         /* 0x18 4GB flat data segment */
51         .word   0xFFFF, 0x0000, 0x9200, 0x00CF
52 gdt_end:
54         .bss
55         .balign 4096
56 lstack:
57         .skip 4096
58 lstack_end: