Prex Home / Browse Source - Prex Version: 0.9.0

root/bsp/boot/x86/pc/head.S

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. boot_entry
  2. outb
  3. inb

   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] */