root/arch/x86/purgatory/setup-x86_64.S

/* [<][>][^][v][top][bottom][index][help] */
   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:

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