Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/x86/purgatory/entry64.S
26424 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* Copyright (C) 2003,2004 Eric Biederman ([email protected])
4
* Copyright (C) 2014 Red Hat Inc.
5
6
* Author(s): Vivek Goyal <[email protected]>
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 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
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_init)
104
105