Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/x86/purgatory/setup-x86_64.S
26450 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* purgatory: setup code
4
*
5
* Copyright (C) 2003,2004 Eric Biederman ([email protected])
6
* Copyright (C) 2014 Red Hat Inc.
7
*
8
* This code has been taken from kexec-tools.
9
*/
10
#include <linux/linkage.h>
11
#include <asm/purgatory.h>
12
13
.text
14
.balign 16
15
.code64
16
17
SYM_CODE_START(purgatory_start)
18
/* Load a gdt so I know what the segment registers are */
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 a stack */
30
leaq lstack_end(%rip), %rsp
31
32
/* Call the C code */
33
call purgatory
34
jmp entry64
35
SYM_CODE_END(purgatory_start)
36
37
.section ".rodata"
38
.balign 16
39
SYM_DATA_START_LOCAL(gdt)
40
/* 0x00 unusable segment
41
* 0x08 unused
42
* so use them as the gdt ptr
43
*/
44
.word gdt_end - gdt - 1
45
.quad gdt
46
.word 0, 0, 0
47
48
/* 0x10 4GB flat code segment */
49
.word 0xFFFF, 0x0000, 0x9A00, 0x00AF
50
51
/* 0x18 4GB flat data segment */
52
.word 0xFFFF, 0x0000, 0x9200, 0x00CF
53
SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)
54
55
.bss
56
.balign 4096
57
SYM_DATA_START_LOCAL(lstack)
58
.skip 4096
59
SYM_DATA_END_LABEL(lstack, SYM_L_LOCAL, lstack_end)
60
61