]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blob - arch/x86/purgatory/setup-x86_64.S
x86/apic: Handle missing global clockevent gracefully
[mirror_ubuntu-eoan-kernel.git] / arch / x86 / purgatory / setup-x86_64.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * purgatory: setup code
4 *
5 * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com)
6 * Copyright (C) 2014 Red Hat Inc.
7 *
8 * This code has been taken from kexec-tools.
9 */
10 #include <asm/purgatory.h>
11
12 .text
13 .globl purgatory_start
14 .balign 16
15 purgatory_start:
16 .code64
17
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
36 .section ".rodata"
37 .balign 16
38 gdt: /* 0x00 unusable segment
39 * 0x08 unused
40 * so use them as the gdt ptr
41 */
42 .word gdt_end - gdt - 1
43 .quad gdt
44 .word 0, 0, 0
45
46 /* 0x10 4GB flat code segment */
47 .word 0xFFFF, 0x0000, 0x9A00, 0x00AF
48
49 /* 0x18 4GB flat data segment */
50 .word 0xFFFF, 0x0000, 0x9200, 0x00CF
51 gdt_end:
52
53 .bss
54 .balign 4096
55 lstack:
56 .skip 4096
57 lstack_end: