1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2003,2004 Eric Biederman (eb 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 17 SYM_CODE_START(entry64) 18 /* Setup a gdt that should be preserve 19 lgdt gdt(%rip) 20 21 /* load the data segments */ 22 movl $0x18, %eax /* data segmen 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 35 new_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 SYM_CODE_END(entry64) 58 59 .section ".rodata" 60 .balign 4 61 SYM_DATA_START(entry64_regs) 62 rax: .quad 0x0 63 rcx: .quad 0x0 64 rdx: .quad 0x0 65 rbx: .quad 0x0 66 rsp: .quad 0x0 67 rbp: .quad 0x0 68 rsi: .quad 0x0 69 rdi: .quad 0x0 70 r8: .quad 0x0 71 r9: .quad 0x0 72 r10: .quad 0x0 73 r11: .quad 0x0 74 r12: .quad 0x0 75 r13: .quad 0x0 76 r14: .quad 0x0 77 r15: .quad 0x0 78 rip: .quad 0x0 79 SYM_DATA_END(entry64_regs) 80 81 /* GDT */ 82 .section ".rodata" 83 .balign 16 84 SYM_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 99 SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end) 100 101 SYM_DATA_START_LOCAL(stack) 102 .quad 0, 0 103 SYM_DATA_END_LABEL(stack, SYM_L_LOCAL, stack_i
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.