Annotation of prex-old/boot/i386/pc/head.S, Revision 1.1
1.1 ! nbrk 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 "platform.h"
! 36:
! 37: #define SCREEN_80x25 1
! 38: /* #define SCREEN_80x50 1 */
! 39:
! 40: #define SEL_CODE32 0x10
! 41: #define SEL_DATA32 0x18
! 42:
! 43: #define ENTRY(x) .global x; .align; x##:
! 44:
! 45: .text
! 46: .code16
! 47:
! 48: /*
! 49: * boot_entry - Entry point for prex boot loader
! 50: */
! 51: ENTRY(boot_entry)
! 52: cld
! 53: cli
! 54:
! 55: /*
! 56: * Relocate boot loader
! 57: */
! 58: movw %cs, %ax
! 59: movw %ax, %ds
! 60: xorw %si, %si
! 61: movw %si, %es
! 62: movw $0x4000, %di /* Relocation address 0:4000 */
! 63: movw $0x800, %cx /* size 0x2000 */
! 64: rep movsl
! 65: ljmp $0x0000, $(reset_cs)
! 66: reset_cs:
! 67:
! 68: movw %cs, %ax /* Reset segment registers */
! 69: movw %ax, %ds
! 70:
! 71: xorw %ax, %ax /* Reset stack */
! 72: movw %ax, %ss
! 73: movw $(BOOT_STACK+0x800), %sp
! 74:
! 75: call setup_screen
! 76: call get_memsize
! 77: cli /* Disable all interrupts */
! 78: call enable_a20 /* Enable A20 line */
! 79:
! 80: lgdt gdt_desc /* Load GDT */
! 81:
! 82: movl %cr0, %eax /* Switch to protected mode */
! 83: orl $0x1, %eax
! 84: movl %eax, %cr0
! 85:
! 86: .byte 0x66 /* 32-bit long jump to reset CS */
! 87: .byte 0xea
! 88: .long go_prot
! 89: .word SEL_CODE32
! 90: .code32
! 91: .align 4
! 92: go_prot:
! 93: movw $(SEL_DATA32), %ax /* Reset data segments */
! 94: movw %ax, %ds
! 95: movw %ax, %es
! 96: movw %ax, %ss
! 97: movw %ax, %fs
! 98: movw %ax, %gs
! 99: /*
! 100: * Relocate archive file
! 101: */
! 102: movl $(ARCHIVE_START), %edi /* Relocation target */
! 103: movl $0x32000, %esi
! 104: movl $0x1B8000, %ecx /* size 0x6e000 */
! 105: rep movsl
! 106:
! 107: jmp loader_main /* Jump to main routine in C */
! 108:
! 109: /*
! 110: * get_memsize - Get memory size
! 111: */
! 112: .code16
! 113: get_memsize:
! 114: xorl %eax, %eax
! 115: int $0x12 /* Get conventional memory size */
! 116: movl %eax, lo_mem /* ax = K bytes */
! 117:
! 118: mov $0x88, %ah
! 119: int $0x15
! 120: andb $0xfc, %al /* Adjust to page boundary */
! 121: movl %eax, hi_mem /* ax = K bytes at 100000h */
! 122: ret
! 123:
! 124: /*
! 125: * enable_a20 - Enable A20
! 126: */
! 127: .code16
! 128: enable_a20:
! 129: call empty_8042
! 130: movb $0xd1, %al
! 131: outb %al, $0x64
! 132: call empty_8042
! 133: movb $0xdf, %al
! 134: outb %al, $0x60
! 135: call empty_8042
! 136: wait_enable:
! 137: ret
! 138:
! 139: /*
! 140: * empty_8042 - Empty 8042
! 141: */
! 142: empty_8042:
! 143: pushw %ax
! 144: retry:
! 145: call io_delay
! 146: inb $0x64, %al
! 147: testb $1, %al
! 148: jz no_output
! 149:
! 150: call io_delay
! 151: inb $0x60, %al
! 152: jmp retry
! 153:
! 154: no_output:
! 155: testb $2, %al
! 156: jnz retry
! 157: popw %ax
! 158: ret
! 159:
! 160: /*
! 161: * io_delay - I/O delay
! 162: */
! 163: io_delay:
! 164: pushw %ax
! 165: inb $0x80, %al
! 166: inb $0x80, %al
! 167: popw %ax
! 168: ret
! 169:
! 170: /*
! 171: * Setup screen
! 172: */
! 173: setup_screen:
! 174: pushaw
! 175: pushw %es
! 176: pushw %ds
! 177: pushw %bp
! 178: movb $0x2e, %al /* print '.' for verify */
! 179: movb $0x0e, %ah
! 180: movw $0x07, %bx
! 181: int $0x10
! 182:
! 183: movw $0x3, %ax /* Use mode-3 */
! 184: int $0x10
! 185: movw $0x1202, %ax /* 400 scan lines */
! 186: movb $0x30, %bl
! 187: int $0x10
! 188: #if SCREEN_80x50
! 189: movw $0x1112, %ax /* Load 8x8 character set */
! 190: movb $0x0, %bl
! 191: int $0x10
! 192: movw $0x1201, %ax /* Turn off cursor emulation */
! 193: movb $0x34, %bl
! 194: int $0x10
! 195: movb $0x01, %ah /* Set cursor type */
! 196: movw $0x0607, %cx
! 197: int $0x10
! 198: #endif
! 199: popw %bp
! 200: popw %ds
! 201: popw %es
! 202: popaw
! 203: ret
! 204:
! 205: .code32
! 206: /*
! 207: * Start kernel
! 208: */
! 209: ENTRY(start_kernel)
! 210: movl 4(%esp), %eax
! 211: movl 8(%esp), %ebx /* Store multiboot information in EBX */
! 212: movl %eax, kern_start
! 213: jmp code_flush
! 214: code_flush:
! 215:
! 216: /* Prepare registers for kernel */
! 217: movw $(SEL_DATA32), %ax
! 218: movw %ax, %ds
! 219: movw %ax, %es
! 220: movw %ax, %fs
! 221: movw %ax, %gs
! 222:
! 223: xorl %eax, %eax
! 224: movl %eax, %ecx
! 225: movl %eax, %edx
! 226: movl %eax, %esi
! 227: movl %eax, %edi
! 228:
! 229: movl $0x2BADB002, %eax /* Store multiboot magic in EAX */
! 230: cli
! 231:
! 232: .byte 0xea
! 233: kern_start:
! 234: .long 0
! 235: .word SEL_CODE32
! 236:
! 237: /*
! 238: * Data
! 239: */
! 240: .align 16
! 241: gdt:
! 242: .word 0x0,0x0,0x0,0x0 /* 0x00 - Null descritor */
! 243: .word 0x0,0x0,0x0,0x0 /* 0x08 - Null descritor */
! 244: .word 0xffff,0x0,0x9a00,0xcf /* 0x10 - 32 bit code segment */
! 245: .word 0xffff,0x0,0x9200,0xcf /* 0x18 - 32 bit data segment */
! 246: .word 0xffff,0x0,0x9a00,0x0 /* 0x20 - 16 bit code segment */
! 247: .word 0xffff,0x0,0x9200,0x0 /* 0x28 - 16 bit data segment */
! 248:
! 249: gdt_desc:
! 250: .word 0x2F /* limit */
! 251: .long gdt /* address */
! 252:
! 253: .word 0x0 /* alignment */
! 254: idt_desc:
! 255: .word 0x0
! 256: .long 0x0
! 257:
! 258: e820_buf:
! 259: .space 20
! 260:
! 261: .align 16
! 262: .global lo_mem, hi_mem
! 263: lo_mem:
! 264: .long 0x0
! 265: hi_mem:
! 266: .long 0x0
! 267:
! 268: /*
! 269: * Pad data
! 270: */
! 271: .section .tail,"a"
! 272: dummy:
! 273: .byte 0xff
CVSweb