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 */ 12#include <asm/purgatory.h> 13 14 .text 15 .globl purgatory_start 16 .balign 16 17purgatory_start: 18 .code64 19 20 /* Load a gdt so I know what the segment registers are */ 21 lgdt gdt(%rip) 22 23 /* load the data segments */ 24 movl $0x18, %eax /* data segment */ 25 movl %eax, %ds 26 movl %eax, %es 27 movl %eax, %ss 28 movl %eax, %fs 29 movl %eax, %gs 30 31 /* Setup a stack */ 32 leaq lstack_end(%rip), %rsp 33 34 /* Call the C code */ 35 call purgatory 36 jmp entry64 37 38 .section ".rodata" 39 .balign 16 40gdt: /* 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 53gdt_end: 54 55 .bss 56 .balign 4096 57lstack: 58 .skip 4096 59lstack_end: 60