Print this page
Rearrange multiboot2_entry.S so all data is first, code64 is second,
code32 is third. (No more dual code64 sections.)
| Split |
Close |
| Expand all |
| Collapse all |
--- old/src/arch/x86/image/multiboot2_entry.S
+++ new/src/arch/x86/image/multiboot2_entry.S
1 1 /*
2 2 * Parts copyright Michael Brown <mbrown@fensystems.co.uk>
3 3 *
4 - * Copyright (c) 2019, Joyent, Inc.
4 + * Copyright 2020, Joyent, Inc.
5 5 */
6 6
7 7 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
8 8
9 9 /* CR0: protection enabled */
10 10 #define CR0_PE ( 1 << 0 )
11 11
12 12 /* CR0: paging */
13 13 #define CR0_PG ( 1 << 31 )
14 14
15 15 /* CR4: physical address extensions */
16 16 #define CR4_PSE ( 1 << 4 )
17 17 #define CR4_PAE ( 1 << 5 )
18 18 #define CR4_PGE ( 1 << 7 )
19 19
20 20 /* Extended feature enable MSR (EFER) */
21 21 #define MSR_EFER 0xc0000080
22 22
|
↓ open down ↓ |
8 lines elided |
↑ open up ↑ |
23 23 /* EFER: long mode enable */
24 24 #define EFER_LME ( 1 << 8 )
25 25
26 26 #define GDTSEL_CODE 0x8
27 27 #define GDTSEL_DATA 0x10
28 28
29 29 #if defined(PXE_EFI) && defined(__x86_64__)
30 30
31 31 .section ".text", "ax", @progbits
32 32
33 + .data
34 +
35 +newcs_vector:
36 + .long newcs, GDTSEL_CODE
37 +
38 +entry_gdt:
39 + /* null entry */
40 + .word 0x0, 0x0
41 + .byte 0x0, 0x0, 0x0, 0x0
42 +
43 + /* 32 bit protected mode code segment */
44 + .word 0xffff, 0x0
45 + .byte 0x0, 0x9f, 0xcf, 0x0
46 +
47 + /* 32 bit protected mode data segment */
48 + .word 0xffff, 0x0
49 + .byte 0x0, 0x93, 0xcf, 0x0
50 +
51 +entry_gdt_end:
52 + .equ entry_gdt_length, entry_gdt_end - entry_gdt
53 +
54 +entry_gdtr:
55 + .word entry_gdt_length - 1
56 +entry_gdt_base:
57 + .quad 0
58 +
33 59 /*
60 + * %rdi -> struct mb2 *
61 + * %rsi -> stack pointer to switch to
62 + * %rdx -> &multiboot2_enter_kernel
63 + */
64 + .code64
65 + .globl multiboot2_bounce
66 +
67 +multiboot2_bounce:
68 + movq %rsi, %rsp
69 + jmp *%rdx
70 +
71 + /*
34 72 * %rdi -> multiboot2 magic
35 73 * %rsi -> multiboot info pointer
36 74 * %rdx -> entry address (32 bits)
37 75 *
38 76 *
39 77 * We need to transition from our 64-bit environment into the one
40 78 * defined by the multiboot2 spec, section 3.3. Namely, drop down to
41 79 * 32-bit protected mode with a basic GDT, paging disabled, interrupts
42 80 * off, and
43 81 *
44 82 * %eax -> multiboot2 magic
45 83 * %ebx -> multiboot info pointer (physical)
46 84 */
47 - .align 16
48 85 .globl multiboot2_entry
49 86
50 87 multiboot2_entry:
51 88 cli
52 89
53 90 movq %rsi, %rbx /* mb2 infop */
54 91 movq %rdx, %rsi /* entry address */
55 92
56 93 /* Load the mb2-mandated code and data segments. */
57 94 leaq entry_gdt_base(%rip), %rcx
58 95 leaq entry_gdt(%rip), %rax
59 96 movq %rax, (%rcx)
60 97
61 98 leaq entry_gdtr(%rip), %rax
62 99 lgdt (%rax)
63 100
64 101 /* Load our new %cs. */
65 102 ljmp *newcs_vector
66 103
67 104 .code32
68 105 newcs:
69 106
70 107 movw $GDTSEL_DATA, %ax
71 108 movw %ax, %ds
72 109 movw %ax, %es
73 110 movw %ax, %fs
74 111 movw %ax, %gs
75 112 movw %ax, %ss
76 113
77 114 /* Disable paging */
78 115 movl %cr0, %eax
79 116 andl $~CR0_PG, %eax
80 117 movl %eax, %cr0
81 118
82 119 movl %cr4, %eax
83 120 andb $~(CR4_PAE | CR4_PGE | CR4_PSE), %al
84 121 movl %eax, %cr4
85 122
|
↓ open down ↓ |
28 lines elided |
↑ open up ↑ |
86 123 /* Disable long mode (clobbers %eax, %edx) */
87 124 movl $MSR_EFER, %ecx
88 125 rdmsr
89 126 andw $~EFER_LME, %ax
90 127 wrmsr
91 128
92 129 /* %ebx still has our infop */
93 130 movl %edi, %eax
94 131 jmp *%esi
95 132
96 - /*
97 - * %rdi -> struct mb2 *
98 - * %rsi -> stack pointer to switch to
99 - * %rdx -> &multiboot2_enter_kernel
100 - */
101 - .align 16
102 - .code64
103 - .globl multiboot2_bounce
104 -
105 -multiboot2_bounce:
106 - movq %rsi, %rsp
107 - jmp *%rdx
108 -
109 - .data
110 -
111 -newcs_vector:
112 - .long newcs, GDTSEL_CODE
113 -
114 - .align 16
115 -entry_gdt:
116 - /* null entry */
117 - .word 0x0, 0x0
118 - .byte 0x0, 0x0, 0x0, 0x0
119 -
120 - /* 32 bit protected mode code segment */
121 - .word 0xffff, 0x0
122 - .byte 0x0, 0x9f, 0xcf, 0x0
123 -
124 - /* 32 bit protected mode data segment */
125 - .word 0xffff, 0x0
126 - .byte 0x0, 0x93, 0xcf, 0x0
127 -
128 -entry_gdt_end:
129 - .equ entry_gdt_length, entry_gdt_end - entry_gdt
130 -
131 - .align 16
132 -entry_gdtr:
133 - .word entry_gdt_length - 1
134 -entry_gdt_base:
135 - .quad 0
136 -
137 133 #endif /* PXE_EFI && __x86_64__ */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX