Upgraded GRUB2 to 2.00 release.
[AROS.git] / arch / all-pc / boot / grub2-aros / grub-core / lib / i386 / relocator64.S
blobe4648d8183e39bb81b9c06e4b6595a6431ff92c5
1 /*
2  *  GRUB  --  GRand Unified Bootloader
3  *  Copyright (C) 2009,2010  Free Software Foundation, Inc.
4  *
5  *  GRUB is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  GRUB is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
17  */
19 #define CODE32_SEGMENT  0x18
20 #define CODE_SEGMENT    0x08
22 /* The data segment of the protected mode.  */
23 #define DATA_SEGMENT    0x10
25 #include "relocator_common.S"
27         .p2align        4       /* force 16-byte alignment */
29 VARIABLE(grub_relocator64_start)
30         PREAMBLE
31 #ifndef __x86_64__
32         DISABLE_PAGING
34         /* Turn on PAE. */
35         movl    %cr4, %eax
36         orl     $(GRUB_MEMORY_CPU_CR4_PAE_ON | GRUB_MEMORY_CPU_CR4_PSE_ON), %eax
37         movl    %eax, %cr4
39         /* mov imm32, %eax */
40         .byte   0xb8
41 VARIABLE(grub_relocator64_cr3)
42         .long   0
43         movl    %eax, %cr3
45         /* Turn on amd64. */
46         movl    $GRUB_MEMORY_CPU_AMD64_MSR, %ecx
47         rdmsr
48         orl     $GRUB_MEMORY_CPU_AMD64_MSR_ON, %eax
49         wrmsr
51         /* Enable paging. */
52         movl    %cr0, %eax
53         orl     $GRUB_MEMORY_CPU_CR0_PAGING_ON, %eax
54         movl    %eax, %cr0
56         RELOAD_GDT
57 #else
58         /* mov imm64, %rax */
59         .byte   0x48
60         .byte   0xb8
61 VARIABLE(grub_relocator64_cr3)
62         .quad   0
63         movq    %rax, %cr3
64 #endif
66         .code64
68         /* mov imm64, %rax */
69         .byte   0x48
70         .byte   0xb8
71 VARIABLE(grub_relocator64_rsp)
72         .quad   0
74         movq    %rax, %rsp
76         /* mov imm64, %rax */
77         .byte   0x48
78         .byte   0xb8
79 VARIABLE(grub_relocator64_rsi)
80         .quad   0
82         movq    %rax, %rsi
83         
84         /* mov imm64, %rax */
85         .byte   0x48
86         .byte   0xb8
87 VARIABLE(grub_relocator64_rax)
88         .quad   0
90         /* mov imm64, %rbx */
91         .byte   0x48
92         .byte   0xbb
93 VARIABLE(grub_relocator64_rbx)
94         .quad   0
96         /* mov imm64, %rcx */
97         .byte   0x48
98         .byte   0xb9
99 VARIABLE(grub_relocator64_rcx)
100         .quad   0
102         /* mov imm64, %rdx */
103         .byte   0x48
104         .byte   0xba
105 VARIABLE(grub_relocator64_rdx)
106         .quad   0
108         /* Cleared direction flag is of no problem with any current
109            payload and makes this implementation easier.  */
110         cld
112 #ifdef __APPLE__
113         .byte 0xff, 0x25
114         .quad 0
115 #else
116         jmp *LOCAL(jump_addr) (%rip)
117 #endif
119 LOCAL(jump_addr):
120 VARIABLE(grub_relocator64_rip)
121         .quad   0
123 #ifndef __x86_64__
124         .p2align        4
125 LOCAL(gdt):
126         /* NULL.  */
127         .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
129         /* 64-bit segment.  */
130         .word 0xffff /* Limit xffff.  */
131         .word 0x0000 /* Base xxxx0000.  */
132         .byte 0x00 /* Base xx00xxxx.  */
133         .byte (0x8 /* Type 8.  */ | (1 << 4) /* Code.  */ \
134                | (0 << 5) /* Ring 0.  */ | (1 << 7) /* Present.  */)
135         .byte (0xf /* Limit fxxxx.  */ | (0 << 4) /* AVL flag.  */ \
136                | (1 << 5) /* 64-bit.  */ | (0 << 6) \
137                | (1 << 7) /* 4K granular.  */)
138         .byte 0x00 /* Base 00xxxxxx.  */
140         /* Data segment*/
141         .word 0xffff /* Limit xffff.  */
142         .word 0x0000 /* Base xxxx0000.  */
143         .byte 0x00 /* Base xx00xxxx.  */
144         .byte (0x0 /* Type 0.  */ | (0 << 4) /* Data.  */ \
145                | (0 << 5) /* Ring 0.  */ | (1 << 7) /* Present.  */)
146         .byte (0xf /* Limit fxxxx.  */ | (0 << 4) /* AVL flag.  */ \
147                | (0 << 5) /* Data.  */ | (0 << 6) \
148                | (1 << 7) /* 4K granular.  */)
149         .byte 0x00 /* Base 00xxxxxx.  */
151         /* Compatibility segment.  */
152         .word 0xffff /* Limit xffff.  */
153         .word 0x0000 /* Base xxxx0000.  */
154         .byte 0x00 /* Base xx00xxxx.  */
155         .byte (0x8 /* Type 8.  */ | (1 << 4) /* Code.  */  \
156                | (0 << 5) /* Ring 0.  */ | (1 << 7) /* Present.  */)
157         .byte (0xf /* Limit fxxxx.  */ | (0 << 4) /* AVL flag.  */ \
158                | (0 << 5) /* 32-bit.  */ | (1 << 6) /* 32-bit.  */ \
159                | (1 << 7) /* 4K granular.  */)
160         .byte 0x00 /* Base 00xxxxxx.  */
162 LOCAL(gdt_end):
163 #endif
165 VARIABLE(grub_relocator64_end)