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 * arch/i386/boot/pmjump.S
  13 *
  14 * The actual transition into protected mode
  15 */
  16
  17#include <asm/boot.h>
  18#include <asm/processor-flags.h>
  19#include <asm/segment.h>
  20
  21        .text
  22
  23        .globl  protected_mode_jump
  24        .type   protected_mode_jump, @function
  25
  26        .code16
  27
  28/*
  29 * void protected_mode_jump(u32 entrypoint, u32 bootparams);
  30 */
  31protected_mode_jump:
  32        movl    %edx, %esi              # Pointer to boot_params table
  33
  34        xorl    %ebx, %ebx
  35        movw    %cs, %bx
  36        shll    $4, %ebx
  37        addl    %ebx, 2f
  38
  39        movw    $__BOOT_DS, %cx
  40        movw    $__BOOT_TSS, %di
  41
  42        movl    %cr0, %edx
  43        orb     $X86_CR0_PE, %dl        # Protected mode
  44        movl    %edx, %cr0
  45        jmp     1f                      # Short jump to serialize on 386/486
  461:
  47
  48        # Transition to 32-bit mode
  49        .byte   0x66, 0xea              # ljmpl opcode
  502:      .long   in_pm32                 # offset
  51        .word   __BOOT_CS               # segment
  52
  53        .size   protected_mode_jump, .-protected_mode_jump
  54
  55        .code32
  56        .type   in_pm32, @function
  57in_pm32:
  58        # Set up data segments for flat 32-bit mode
  59        movl    %ecx, %ds
  60        movl    %ecx, %es
  61        movl    %ecx, %fs
  62        movl    %ecx, %gs
  63        movl    %ecx, %ss
  64        # The 32-bit code sets up its own stack, but this way we do have
  65        # a valid stack if some debugging hack wants to use it.
  66        addl    %ebx, %esp
  67
  68        # Set up TR to make Intel VT happy
  69        ltr     %di
  70
  71        # Clear registers to allow for future extensions to the
  72        # 32-bit boot protocol
  73        xorl    %ecx, %ecx
  74        xorl    %edx, %edx
  75        xorl    %ebx, %ebx
  76        xorl    %ebp, %ebp
  77        xorl    %edi, %edi
  78
  79        # Set up LDTR to make Intel VT happy
  80        lldt    %cx
  81
  82        jmpl    *%eax                   # Jump to the 32-bit entrypoint
  83
  84        .size   in_pm32, .-in_pm32
  85
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.