linux/arch/x86/boot/pmjump.S
<<
>>
Prefs
   1/* ----------------------------------------------------------------------- *
   2 *
   3 *   Copyright (C) 1991, 1992 Linus Torvalds
   4 *   Copyright 2007 rPath, Inc. - All Rights Reserved
   5 *
   6 *   This file is part of the Linux kernel, and is made available under
   7 *   the terms of the GNU General Public License version 2.
   8 *
   9 * ----------------------------------------------------------------------- */
  10
  11/*
  12 * The actual transition into protected mode
  13 */
  14
  15#include <asm/boot.h>
  16#include <asm/processor-flags.h>
  17#include <asm/segment.h>
  18#include <linux/linkage.h>
  19
  20        .text
  21        .code16
  22
  23/*
  24 * void protected_mode_jump(u32 entrypoint, u32 bootparams);
  25 */
  26GLOBAL(protected_mode_jump)
  27        movl    %edx, %esi              # Pointer to boot_params table
  28
  29        xorl    %ebx, %ebx
  30        movw    %cs, %bx
  31        shll    $4, %ebx
  32        addl    %ebx, 2f
  33        jmp     1f                      # Short jump to serialize on 386/486
  341:
  35
  36        movw    $__BOOT_DS, %cx
  37        movw    $__BOOT_TSS, %di
  38
  39        movl    %cr0, %edx
  40        orb     $X86_CR0_PE, %dl        # Protected mode
  41        movl    %edx, %cr0
  42
  43        # Transition to 32-bit mode
  44        .byte   0x66, 0xea              # ljmpl opcode
  452:      .long   in_pm32                 # offset
  46        .word   __BOOT_CS               # segment
  47ENDPROC(protected_mode_jump)
  48
  49        .code32
  50        .section ".text32","ax"
  51GLOBAL(in_pm32)
  52        # Set up data segments for flat 32-bit mode
  53        movl    %ecx, %ds
  54        movl    %ecx, %es
  55        movl    %ecx, %fs
  56        movl    %ecx, %gs
  57        movl    %ecx, %ss
  58        # The 32-bit code sets up its own stack, but this way we do have
  59        # a valid stack if some debugging hack wants to use it.
  60        addl    %ebx, %esp
  61
  62        # Set up TR to make Intel VT happy
  63        ltr     %di
  64
  65        # Clear registers to allow for future extensions to the
  66        # 32-bit boot protocol
  67        xorl    %ecx, %ecx
  68        xorl    %edx, %edx
  69        xorl    %ebx, %ebx
  70        xorl    %ebp, %ebp
  71        xorl    %edi, %edi
  72
  73        # Set up LDTR to make Intel VT happy
  74        lldt    %cx
  75
  76        jmpl    *%eax                   # Jump to the 32-bit entrypoint
  77ENDPROC(in_pm32)
  78