root/arch/x86/purgatory/entry64.S

/* [<][>][^][v][top][bottom][index][help] */
   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         .text
  12         .balign 16
  13         .code64
  14         .globl entry64, entry64_regs
  15 
  16 
  17 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 
  58         .section ".rodata"
  59         .balign 4
  60 entry64_regs:
  61 rax:    .quad 0x0
  62 rcx:    .quad 0x0
  63 rdx:    .quad 0x0
  64 rbx:    .quad 0x0
  65 rsp:    .quad 0x0
  66 rbp:    .quad 0x0
  67 rsi:    .quad 0x0
  68 rdi:    .quad 0x0
  69 r8:     .quad 0x0
  70 r9:     .quad 0x0
  71 r10:    .quad 0x0
  72 r11:    .quad 0x0
  73 r12:    .quad 0x0
  74 r13:    .quad 0x0
  75 r14:    .quad 0x0
  76 r15:    .quad 0x0
  77 rip:    .quad 0x0
  78         .size entry64_regs, . - entry64_regs
  79 
  80         /* GDT */
  81         .section ".rodata"
  82         .balign 16
  83 gdt:
  84         /* 0x00 unusable segment
  85          * 0x08 unused
  86          * so use them as gdt ptr
  87          */
  88         .word gdt_end - gdt - 1
  89         .quad gdt
  90         .word 0, 0, 0
  91 
  92         /* 0x10 4GB flat code segment */
  93         .word 0xFFFF, 0x0000, 0x9A00, 0x00AF
  94 
  95         /* 0x18 4GB flat data segment */
  96         .word 0xFFFF, 0x0000, 0x9200, 0x00CF
  97 gdt_end:
  98 stack:  .quad   0, 0
  99 stack_init:

/* [<][>][^][v][top][bottom][index][help] */