root / prex-0.9.0 / bsp / boot / x86 / pc / head.S @ 03e9c04a
History | View | Annotate | Download (5.56 KB)
1 | 03e9c04a | Brad Neuman | /*- |
---|---|---|---|
2 | * Copyright (c) 2005-2007, Kohsuke Ohtani |
||
3 | * All rights reserved. |
||
4 | * |
||
5 | * Redistribution and use in source and binary forms, with or without |
||
6 | * modification, are permitted provided that the following conditions |
||
7 | * are met: |
||
8 | * 1. Redistributions of source code must retain the above copyright |
||
9 | * notice, this list of conditions and the following disclaimer. |
||
10 | * 2. Redistributions in binary form must reproduce the above copyright |
||
11 | * notice, this list of conditions and the following disclaimer in the |
||
12 | * documentation and/or other materials provided with the distribution. |
||
13 | * 3. Neither the name of the author nor the names of any co-contributors |
||
14 | * may be used to endorse or promote products derived from this software |
||
15 | * without specific prior written permission. |
||
16 | * |
||
17 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
||
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||
20 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
||
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
||
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
||
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
||
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
||
27 | * SUCH DAMAGE. |
||
28 | */ |
||
29 | |||
30 | /* |
||
31 | * head.S - low level platform support |
||
32 | */ |
||
33 | |||
34 | #include <conf/config.h> |
||
35 | #include <machine/memory.h> |
||
36 | #include <machine/syspage.h> |
||
37 | |||
38 | #define SCREEN_80x25 1 |
||
39 | /* #define SCREEN_80x50 1 */ |
||
40 | |||
41 | #define SEL_CODE32 0x10 |
||
42 | #define SEL_DATA32 0x18 |
||
43 | |||
44 | #define ENTRY(x) .global x; .align; x##: |
||
45 | |||
46 | .text |
||
47 | .code16 |
||
48 | |||
49 | /* |
||
50 | * boot_entry - Entry point for prex boot loader. |
||
51 | * |
||
52 | * We assume boot sector copied us at 0x30000. |
||
53 | */ |
||
54 | ENTRY(boot_entry) |
||
55 | cld |
||
56 | cli /* Disable all interrupts */ |
||
57 | |||
58 | /* |
||
59 | * Relocate boot loader to 0x4000. |
||
60 | */ |
||
61 | movw %cs, %ax |
||
62 | movw %ax, %ds |
||
63 | xorw %si, %si /* Source address cs:0 */ |
||
64 | movw %si, %es |
||
65 | movw $0x4000, %di /* Destination */ |
||
66 | movw $0x800, %cx /* size 8K */ |
||
67 | rep movsl |
||
68 | ljmp $0x0000, $(reset_cs) |
||
69 | reset_cs: |
||
70 | movw %cs, %ax /* Reset segment registers */ |
||
71 | movw %ax, %ds |
||
72 | |||
73 | xorw %ax, %ax /* Reset stack */ |
||
74 | movw %ax, %ss |
||
75 | movw $(BOOTSTKTOP - KERNBASE), %sp |
||
76 | |||
77 | /* |
||
78 | * Do 16-bit BIOS call here. |
||
79 | */ |
||
80 | call setup_screen |
||
81 | call get_memsize |
||
82 | |||
83 | /* |
||
84 | * Switch to 32-bit protected mode. |
||
85 | */ |
||
86 | call enable_a20 /* Enable A20 line */ |
||
87 | lgdt gdt_desc /* Load GDT */ |
||
88 | |||
89 | movl %cr0, %eax /* Set PE bit in CR0 */ |
||
90 | orl $0x1, %eax |
||
91 | movl %eax, %cr0 |
||
92 | |||
93 | .byte 0x66 /* 32-bit long jump to reset CS */ |
||
94 | .byte 0xea |
||
95 | .long go_prot |
||
96 | .word SEL_CODE32 |
||
97 | .code32 |
||
98 | .align 4 |
||
99 | go_prot: |
||
100 | movw $(SEL_DATA32), %ax /* Reset all segments */ |
||
101 | movw %ax, %ds |
||
102 | movw %ax, %es |
||
103 | movw %ax, %ss |
||
104 | movw %ax, %fs |
||
105 | movw %ax, %gs |
||
106 | |||
107 | /* |
||
108 | * Relocate OS image. |
||
109 | */ |
||
110 | movl $(CONFIG_BOOTIMG_BASE - KERNBASE), %edi /* Destination */ |
||
111 | movl $0x32000, %esi /* Source address: 0x32000 */ |
||
112 | movl $0x1B800, %ecx /* size 0x6e000 */ |
||
113 | rep movsl |
||
114 | |||
115 | jmp main /* Jump to main routine in C */ |
||
116 | |||
117 | |||
118 | /* |
||
119 | * get_memsize - Get memory size |
||
120 | */ |
||
121 | .code16 |
||
122 | get_memsize: |
||
123 | xorl %eax, %eax |
||
124 | int $0x12 /* Get conventional memory size */ |
||
125 | movl %eax, lo_mem /* ax = K bytes */ |
||
126 | |||
127 | mov $0x88, %ah |
||
128 | int $0x15 |
||
129 | andb $0xfc, %al /* Adjust to page boundary */ |
||
130 | movl %eax, hi_mem /* ax = K bytes at 100000h */ |
||
131 | ret |
||
132 | |||
133 | /* |
||
134 | * enable_a20 - Enable A20 |
||
135 | */ |
||
136 | .code16 |
||
137 | enable_a20: |
||
138 | call empty_8042 |
||
139 | movb $0xd1, %al |
||
140 | outb %al, $0x64 |
||
141 | call empty_8042 |
||
142 | movb $0xdf, %al |
||
143 | outb %al, $0x60 |
||
144 | call empty_8042 |
||
145 | call wait_a20 |
||
146 | ret |
||
147 | |||
148 | /* |
||
149 | * empty_8042 - Empty 8042 |
||
150 | */ |
||
151 | empty_8042: |
||
152 | inb $0x64, %al |
||
153 | testb $0x01, %al |
||
154 | jz no_output |
||
155 | inb $0x60, %al |
||
156 | jmp empty_8042 |
||
157 | no_output: |
||
158 | testb $0x02, %al |
||
159 | jnz empty_8042 |
||
160 | ret |
||
161 | |||
162 | /* |
||
163 | * wait_a20 - Wait A20 ready |
||
164 | */ |
||
165 | wait_a20: |
||
166 | xorw %ax, %ax |
||
167 | movw %ax, %fs |
||
168 | movw $0xffff, %ax |
||
169 | movw %ax, %gs |
||
170 | movw %fs:(0x0), %ax |
||
171 | cmp %gs:(16), %ax |
||
172 | jne a20_ready |
||
173 | movw %dx, %ax |
||
174 | notw %ax |
||
175 | movw %ax, %fs:(0x0) |
||
176 | cmp %gs:(16), %ax |
||
177 | mov %fs:(0), %dx |
||
178 | jne a20_ready |
||
179 | jmp wait_a20 |
||
180 | a20_ready: |
||
181 | ret |
||
182 | |||
183 | /* |
||
184 | * Setup screen |
||
185 | */ |
||
186 | setup_screen: |
||
187 | pushaw |
||
188 | pushw %es |
||
189 | pushw %ds |
||
190 | pushw %bp |
||
191 | movb $0x2e, %al /* print '.' for verify */ |
||
192 | movb $0x0e, %ah |
||
193 | movw $0x07, %bx |
||
194 | int $0x10 |
||
195 | |||
196 | movw $0x3, %ax /* Use mode-3 */ |
||
197 | int $0x10 |
||
198 | movw $0x1202, %ax /* 400 scan lines */ |
||
199 | movb $0x30, %bl |
||
200 | int $0x10 |
||
201 | #if SCREEN_80x50 |
||
202 | movw $0x1112, %ax /* Load 8x8 character set */ |
||
203 | movb $0x0, %bl |
||
204 | int $0x10 |
||
205 | movw $0x1201, %ax /* Turn off cursor emulation */ |
||
206 | movb $0x34, %bl |
||
207 | int $0x10 |
||
208 | movb $0x01, %ah /* Set cursor type */ |
||
209 | movw $0x0607, %cx |
||
210 | int $0x10 |
||
211 | #endif |
||
212 | popw %bp |
||
213 | popw %ds |
||
214 | popw %es |
||
215 | popaw |
||
216 | ret |
||
217 | |||
218 | .code32 |
||
219 | |||
220 | ENTRY(outb) |
||
221 | movl 4(%esp), %edx |
||
222 | movl 8(%esp), %eax |
||
223 | outb %al, %dx |
||
224 | ret |
||
225 | |||
226 | ENTRY(inb) |
||
227 | movl 4(%esp), %edx |
||
228 | xorl %eax, %eax |
||
229 | inb %dx, %al |
||
230 | ret |
||
231 | |||
232 | /* |
||
233 | * Data |
||
234 | */ |
||
235 | .align 16 |
||
236 | gdt: |
||
237 | .word 0x0,0x0,0x0,0x0 /* 0x00 - Null descritor */ |
||
238 | .word 0x0,0x0,0x0,0x0 /* 0x08 - Null descritor */ |
||
239 | .word 0xffff,0x0,0x9a00,0xcf /* 0x10 - 32 bit code segment */ |
||
240 | .word 0xffff,0x0,0x9200,0xcf /* 0x18 - 32 bit data segment */ |
||
241 | .word 0xffff,0x0,0x9a00,0x0 /* 0x20 - 16 bit code segment */ |
||
242 | .word 0xffff,0x0,0x9200,0x0 /* 0x28 - 16 bit data segment */ |
||
243 | |||
244 | gdt_desc: |
||
245 | .word 0x2F /* limit */ |
||
246 | .long gdt /* address */ |
||
247 | |||
248 | .word 0x0 /* alignment */ |
||
249 | idt_desc: |
||
250 | .word 0x0 |
||
251 | .long 0x0 |
||
252 | |||
253 | e820_buf: |
||
254 | .space 20 |
||
255 | |||
256 | .align 16 |
||
257 | .global lo_mem, hi_mem |
||
258 | lo_mem: |
||
259 | .long 0x0 |
||
260 | hi_mem: |
||
261 | .long 0x0 |
||
262 | |||
263 | /* |
||
264 | * Pad data |
||
265 | */ |
||
266 | .section .tail,"a" |
||
267 | dummy: |
||
268 | .byte 0xff |