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 <asm/purgatory.h> 11 12 .text 13 .globl purgatory_start 14 .balign 16 15purgatory_start: 16 .code64 17 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 36 .section ".rodata" 37 .balign 16 38gdt: /* 0x00 unusable segment 39 * 0x08 unused 40 * so use them as the gdt ptr 41 */ 42 .word gdt_end - gdt - 1 43 .quad gdt 44 .word 0, 0, 0 45 46 /* 0x10 4GB flat code segment */ 47 .word 0xFFFF, 0x0000, 0x9A00, 0x00AF 48 49 /* 0x18 4GB flat data segment */ 50 .word 0xFFFF, 0x0000, 0x9200, 0x00CF 51gdt_end: 52 53 .bss 54 .balign 4096 55lstack: 56 .skip 4096 57lstack_end: 58