/* SPDX-License-Identifier: GPL-2.0-only */1/*2* purgatory: setup code3*4* Copyright (C) 2003,2004 Eric Biederman ([email protected])5* Copyright (C) 2014 Red Hat Inc.6*7* This code has been taken from kexec-tools.8*/9#include <linux/linkage.h>10#include <asm/purgatory.h>1112.text13.balign 1614.code641516SYM_CODE_START(purgatory_start)17/* Load a gdt so I know what the segment registers are */18lgdt gdt(%rip)1920/* load the data segments */21movl $0x18, %eax /* data segment */22movl %eax, %ds23movl %eax, %es24movl %eax, %ss25movl %eax, %fs26movl %eax, %gs2728/* Setup a stack */29leaq lstack_end(%rip), %rsp3031/* Call the C code */32call purgatory33jmp entry6434SYM_CODE_END(purgatory_start)3536.section ".rodata"37.balign 1638SYM_DATA_START_LOCAL(gdt)39/* 0x00 unusable segment40* 0x08 unused41* so use them as the gdt ptr42*/43.word gdt_end - gdt - 144.quad gdt45.word 0, 0, 04647/* 0x10 4GB flat code segment */48.word 0xFFFF, 0x0000, 0x9A00, 0x00AF4950/* 0x18 4GB flat data segment */51.word 0xFFFF, 0x0000, 0x9200, 0x00CF52SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)5354.bss55.balign 409656SYM_DATA_START_LOCAL(lstack)57.skip 409658SYM_DATA_END_LABEL(lstack, SYM_L_LOCAL, lstack_end)596061