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 17SYM_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 35SYM_CODE_END(purgatory_start) 36 37 .section ".rodata" 38 .balign 16 39SYM_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 53SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end) 54 55 .bss 56 .balign 4096 57SYM_DATA_START_LOCAL(lstack) 58 .skip 4096 59SYM_DATA_END_LABEL(lstack, SYM_L_LOCAL, lstack_end) 60