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