root/arch/x86/realmode/rm/trampoline_32.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *
   4  *      Trampoline.S    Derived from Setup.S by Linus Torvalds
   5  *
   6  *      4 Jan 1997 Michael Chastain: changed to gnu as.
   7  *
   8  *      This is only used for booting secondary CPUs in SMP machine
   9  *
  10  *      Entry: CS:IP point to the start of our code, we are
  11  *      in real mode with no stack, but the rest of the
  12  *      trampoline page to make our stack and everything else
  13  *      is a mystery.
  14  *
  15  *      We jump into arch/x86/kernel/head_32.S.
  16  *
  17  *      On entry to trampoline_start, the processor is in real mode
  18  *      with 16-bit addressing and 16-bit data.  CS has some value
  19  *      and IP is zero.  Thus, we load CS to the physical segment
  20  *      of the real mode code before doing anything further.
  21  */
  22 
  23 #include <linux/linkage.h>
  24 #include <asm/segment.h>
  25 #include <asm/page_types.h>
  26 #include "realmode.h"
  27 
  28         .text
  29         .code16
  30 
  31         .balign PAGE_SIZE
  32 ENTRY(trampoline_start)
  33         wbinvd                  # Needed for NUMA-Q should be harmless for others
  34 
  35         LJMPW_RM(1f)
  36 1:
  37         mov     %cs, %ax        # Code and data in the same place
  38         mov     %ax, %ds
  39 
  40         cli                     # We should be safe anyway
  41 
  42         movl    tr_start, %eax  # where we need to go
  43 
  44         /*
  45          * GDT tables in non default location kernel can be beyond 16MB and
  46          * lgdt will not be able to load the address as in real mode default
  47          * operand size is 16bit. Use lgdtl instead to force operand size
  48          * to 32 bit.
  49          */
  50         lidtl   tr_idt                  # load idt with 0, 0
  51         lgdtl   tr_gdt                  # load gdt with whatever is appropriate
  52 
  53         movw    $1, %dx                 # protected mode (PE) bit
  54         lmsw    %dx                     # into protected mode
  55 
  56         ljmpl   $__BOOT_CS, $pa_startup_32
  57 
  58         .section ".text32","ax"
  59         .code32
  60 ENTRY(startup_32)                       # note: also used from wakeup_asm.S
  61         jmp     *%eax
  62 
  63         .bss
  64         .balign 8
  65 GLOBAL(trampoline_header)
  66         tr_start:               .space  4
  67         tr_gdt_pad:             .space  2
  68         tr_gdt:                 .space  6
  69 END(trampoline_header)
  70         
  71 #include "trampoline_common.S"

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