|
|||
Prex Home / Browse Source - Prex Version: 0.9.0 |
|||
root/bsp/boot/x86/pc/head.S/* [<][>][^][v][top][bottom][index][help] */DEFINITIONSThis source file includes following definitions.1 /*- 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 /* [<][>][^][v][top][bottom][index][help] */ | |||
Copyright© 2005-2009 Kohsuke Ohtani |