1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com) 4 * Copyright (C) 2014 Red Hat Inc. 5 6 * Author(s): Vivek Goyal <vgoyal@redhat.com> 7 * 8 * This code has been taken from kexec-tools. 9 */ 10 11#include <linux/linkage.h> 12 13 .text 14 .balign 16 15 .code64 16 17SYM_CODE_START(entry64) 18 /* Setup a gdt that should be preserved */ 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 new stack */ 30 leaq stack_init(%rip), %rsp 31 pushq $0x10 /* CS */ 32 leaq new_cs_exit(%rip), %rax 33 pushq %rax 34 lretq 35new_cs_exit: 36 37 /* Load the registers */ 38 movq rax(%rip), %rax 39 movq rbx(%rip), %rbx 40 movq rcx(%rip), %rcx 41 movq rdx(%rip), %rdx 42 movq rsi(%rip), %rsi 43 movq rdi(%rip), %rdi 44 movq rsp(%rip), %rsp 45 movq rbp(%rip), %rbp 46 movq r8(%rip), %r8 47 movq r9(%rip), %r9 48 movq r10(%rip), %r10 49 movq r11(%rip), %r11 50 movq r12(%rip), %r12 51 movq r13(%rip), %r13 52 movq r14(%rip), %r14 53 movq r15(%rip), %r15 54 55 /* Jump to the new code... */ 56 jmpq *rip(%rip) 57SYM_CODE_END(entry64) 58 59 .section ".rodata" 60 .balign 4 61SYM_DATA_START(entry64_regs) 62rax: .quad 0x0 63rcx: .quad 0x0 64rdx: .quad 0x0 65rbx: .quad 0x0 66rsp: .quad 0x0 67rbp: .quad 0x0 68rsi: .quad 0x0 69rdi: .quad 0x0 70r8: .quad 0x0 71r9: .quad 0x0 72r10: .quad 0x0 73r11: .quad 0x0 74r12: .quad 0x0 75r13: .quad 0x0 76r14: .quad 0x0 77r15: .quad 0x0 78rip: .quad 0x0 79SYM_DATA_END(entry64_regs) 80 81 /* GDT */ 82 .section ".rodata" 83 .balign 16 84SYM_DATA_START_LOCAL(gdt) 85 /* 86 * 0x00 unusable segment 87 * 0x08 unused 88 * so use them as gdt ptr 89 */ 90 .word gdt_end - gdt - 1 91 .quad gdt 92 .word 0, 0, 0 93 94 /* 0x10 4GB flat code segment */ 95 .word 0xFFFF, 0x0000, 0x9A00, 0x00AF 96 97 /* 0x18 4GB flat data segment */ 98 .word 0xFFFF, 0x0000, 0x9200, 0x00CF 99SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end) 100 101SYM_DATA_START_LOCAL(stack) 102 .quad 0, 0 103SYM_DATA_END_LABEL(stack, SYM_L_LOCAL, stack_init) 104