File Index
Files and directories
Sign in
FILE

entry64.S

File preview with syntax highlighting.

linux-6.19.14/arch/x86/purgatory/entry64.S S
  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#include <linux/linkage.h>
 12
 13	.text
 14	.balign 16
 15	.code64
 16
 17SYM_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
 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)
 57SYM_CODE_END(entry64)
 58
 59	.section ".rodata"
 60	.balign 4
 61SYM_DATA_START(entry64_regs)
 62rax:	.quad 0x0
 63rcx:	.quad 0x0
 64rdx:	.quad 0x0
 65rbx:	.quad 0x0
 66rsp:	.quad 0x0
 67rbp:	.quad 0x0
 68rsi:	.quad 0x0
 69rdi:	.quad 0x0
 70r8:	.quad 0x0
 71r9:	.quad 0x0
 72r10:	.quad 0x0
 73r11:	.quad 0x0
 74r12:	.quad 0x0
 75r13:	.quad 0x0
 76r14:	.quad 0x0
 77r15:	.quad 0x0
 78rip:	.quad 0x0
 79SYM_DATA_END(entry64_regs)
 80
 81	/* GDT */
 82	.section ".rodata"
 83	.balign 16
 84SYM_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
 99SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)
100
101SYM_DATA_START_LOCAL(stack)
102	.quad   0, 0
103SYM_DATA_END_LABEL(stack, SYM_L_LOCAL, stack_init)
~/ Read-only file preview.