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 .text 12 .balign 16 13 .code64 14 .globl entry64, entry64_regs 15 16 17entry64: 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) 57 58 .section ".rodata" 59 .balign 4 60entry64_regs: 61rax: .quad 0x0 62rcx: .quad 0x0 63rdx: .quad 0x0 64rbx: .quad 0x0 65rsp: .quad 0x0 66rbp: .quad 0x0 67rsi: .quad 0x0 68rdi: .quad 0x0 69r8: .quad 0x0 70r9: .quad 0x0 71r10: .quad 0x0 72r11: .quad 0x0 73r12: .quad 0x0 74r13: .quad 0x0 75r14: .quad 0x0 76r15: .quad 0x0 77rip: .quad 0x0 78 .size entry64_regs, . - entry64_regs 79 80 /* GDT */ 81 .section ".rodata" 82 .balign 16 83gdt: 84 /* 0x00 unusable segment 85 * 0x08 unused 86 * so use them as gdt ptr 87 */ 88 .word gdt_end - gdt - 1 89 .quad gdt 90 .word 0, 0, 0 91 92 /* 0x10 4GB flat code segment */ 93 .word 0xFFFF, 0x0000, 0x9A00, 0x00AF 94 95 /* 0x18 4GB flat data segment */ 96 .word 0xFFFF, 0x0000, 0x9200, 0x00CF 97gdt_end: 98stack: .quad 0, 0 99stack_init: 100