summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/start/start16.S
diff options
context:
space:
mode:
authorJennifer Averett <Jennifer.Averett@OARcorp.com>2011-07-20 16:50:19 +0000
committerJennifer Averett <Jennifer.Averett@OARcorp.com>2011-07-20 16:50:19 +0000
commit5e8bfe22d78d641ffadb2d8f0885fc7eef7d6e6a (patch)
treeda22001ab310db2c3b7015b5bde25265fd95cb98 /c/src/lib/libbsp/i386/pc386/start/start16.S
parent2011-07-20 Till Straumann <strauman@slac.stanford.edu> (diff)
downloadrtems-5e8bfe22d78d641ffadb2d8f0885fc7eef7d6e6a.tar.bz2
2011-07-20 Jennifer Averett <Jennifer.Averett@OARcorp.com>
* start/start16.S: Removed tabs and added OAR standard copyright header in preperation for merging SMP support.
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/start/start16.S')
-rw-r--r--c/src/lib/libbsp/i386/pc386/start/start16.S250
1 files changed, 131 insertions, 119 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/start/start16.S b/c/src/lib/libbsp/i386/pc386/start/start16.S
index 8626bdb96e..74989dd014 100644
--- a/c/src/lib/libbsp/i386/pc386/start/start16.S
+++ b/c/src/lib/libbsp/i386/pc386/start/start16.S
@@ -1,34 +1,47 @@
-/*-------------------------------------------------------------------------+
-| start16.s v1.0 - PC386 BSP - 1998/04/13
-+--------------------------------------------------------------------------+
-| This file contains the entry point for the application.
-| The name of this entry point is compiler dependent.
-| It jumps to the BSP which is responsible for performing all initialization.
-+--------------------------------------------------------------------------+
-| (C) Copyright 1997 -
-| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
-|
-| http://pandora.ist.utl.pt
-|
-| Instituto Superior Tecnico * Lisboa * PORTUGAL
-+--------------------------------------------------------------------------+
-| Disclaimer:
-|
-| This file is provided "AS IS" without warranty of any kind, either
-| expressed or implied.
-+--------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------+
+ * start16.s v1.0 - PC386 BSP - 1998/04/13
+ *--------------------------------------------------------------------------+
+ * This file contains the entry point for the application.
+ * The name of this entry point is compiler dependent.
+ * It jumps to the BSP which is responsible for performing all initialization.
+ *--------------------------------------------------------------------------+
+ * (C) Copyright 1997 -
+ * - NavIST Group - Real-Time Distributed Systems and Industrial Automation
+ *
+ * http://pandora.ist.utl.pt
+ *
+ * Instituto Superior Tecnico * Lisboa * PORTUGAL
+ *--------------------------------------------------------------------------+
+ * Disclaimer:
+ *
+ * This file is provided "AS IS" without warranty of any kind, either
+ * expressed or implied.
+ *--------------------------------------------------------------------------+
+ */
+
+/*
+ * COPYRIGHT (c) 2011.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
#include <bspopts.h>
-/*----------------------------------------------------------------------------+
+/*---------------------------------------------------------------------------+
| Constants
+----------------------------------------------------------------------------*/
-.set PROT_CODE_SEG, 0x08 # offset of code segment descriptor into GDT
-.set PROT_DATA_SEG, 0x10 # offset of code segment descriptor into GDT
-.set CR0_PE, 1 # protected mode flag on CR0 register
-.set HDRSTART, HEADERADDR # address of start of bin2boot header
-.set HDROFF, 0x24 # offset into bin2boot header of start32 addr
+.set PROT_CODE_SEG, 0x0 # offset of code segment descriptor into GDT
+.set PROT_DATA_SEG, 0x10 # offset of code segment descriptor into GDT
+.set CR0_PE, 1 # protected mode flag on CR0 register
+.set HDRSTART, HEADERADDR # address of start of bin2boot header
+.set HDROFF, 0x24 # offset into bin2boot header of start32 addr
.set STACKOFF, 0x200-0x10 # offset to load into %esp, from start of image
/* #define NEW_GAS */
@@ -38,91 +51,90 @@
.text
- .globl _start16 # entry point
- .globl start16
+ .globl _start16 # entry point
+ .globl start16
start16:
_start16:
.code16
+ cli # DISABLE INTERRUPTS!!!
- cli # DISABLE INTERRUPTS!!!
-
- movw %cs, %ax #
- movw %ax, %ds # set the rest of real mode registers
- movw %ax, %es #
- movw %ax, %ss #
+ movw %cs, %ax #
+ movw %ax, %ds # set the rest of real mode registers
+ movw %ax, %es #
+ movw %ax, %ss #
#if (RTEMS_VIDEO_80x50 == 1)
- movl $0x0040,%eax # use 32 bit constant to ensure 16 MSB=0
- mov %ax,%es
- movw %es:0x4a, %ax # get 16 bit number of columns
- cmpw $0, %ax # or 0 if no video adapter
- je 1f # if no video, skip touching it
- /*---------------------------------------------------------------------+
- | Switch VGA video to 80 lines x 50 columns mode. Has to be done before
- | turning protected mode on since it uses BIOS int 10h (video) services.
- +---------------------------------------------------------------------*/
-
- movw $0x0003, %ax # forced set
- int $0x10
- movw $0x1112, %ax # use 8x8 font
- xorb %bl, %bl
- int $0x10
- movw $0x1201, %ax # turn off cursor emulation
- movb $0x34, %bl
- int $0x10
- movb $0x01, %ah # define cursor (scan lines 0 to 7)
- movw $0x0007, %cx
- int $0x10
+ movl $0x0040,%eax # use 32 bit constant to ensure 16 MSB=0
+ mov %ax,%es
+ movw %es:0x4a, %ax # get 16 bit number of columns
+ cmpw $0, %ax # or 0 if no video adapter
+ je 1f # if no video, skip touching it
+ /*---------------------------------------------------------------------+
+ | Switch VGA video to 80 lines x 50 columns mode. Has to be done before
+ | turning protected mode on since it uses BIOS int 10h (video) services.
+ +---------------------------------------------------------------------*/
+
+ movw $0x0003, %ax # forced set
+ int $0x10
+ movw $0x1112, %ax # use 8x8 font
+ xorb %bl, %bl
+ int $0x10
+ movw $0x1201, %ax # turn off cursor emulation
+ movb $0x34, %bl
+ int $0x10
+ movb $0x01, %ah # define cursor (scan lines 0 to 7)
+ movw $0x0007, %cx
+ int $0x10
1:
#endif /* RTEMS_VIDEO_80x50 */
- /*---------------------------------------------------------------------+
- | Bare PC machines boot in real mode! We have to turn protected mode on.
- +---------------------------------------------------------------------*/
+ /*---------------------------------------------------------------------+
+ | Bare PC machines boot in real mode! We have to turn protected mode on.
+ +---------------------------------------------------------------------*/
- lgdt gdtptr - start16 # load Global Descriptor Table
- movl %cr0, %eax
- orl $CR0_PE, %eax
- movl %eax, %cr0 # turn on protected mode
+ lgdt gdtptr - start16 # load Global Descriptor Table
+ movl %cr0, %eax
+ orl $CR0_PE, %eax
+ movl %eax, %cr0 # turn on protected mode
#ifdef NEW_GAS
- ljmpl $PROT_CODE_SEG, $1f # flush prefetch queue, and reload %cs
+ ljmpl $PROT_CODE_SEG, $1f # flush prefetch queue, and reload %cs
#else
- ljmp $PROT_CODE_SEG, $1f # flush prefetch queue, and reload %cs
+ ljmp $PROT_CODE_SEG, $1f # flush prefetch queue, and reload %cs
#endif
.code32
1:
/*---------------------------------------------------------------------+
| load the other segment registers
+---------------------------------------------------------------------*/
- movl $PROT_DATA_SEG, %eax
- movw %ax, %ds
- movw %ax, %es
- movw %ax, %ss
- movl $start16 + STACKOFF, %esp # set up stack pointer
- addl $start16 + STACKOFF, %ebp # set up stack pointer
+ movl $PROT_DATA_SEG, %eax
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %ss
+ movl $start16 + STACKOFF, %esp # set up stack pointer
+ addl $start16 + STACKOFF, %ebp # set up stack pointer
/*---------------------------------------------------------------------+
| we have to enable A20 in order to access memory above 1MByte
+---------------------------------------------------------------------*/
- call empty_8042
- movb $0xD1, %al # command write
- outb %al, $0x64
- call empty_8042
- movb $0xDF, %al # A20 on
- outb %al, $0x60
- call empty_8042
-
- call pc386_delay
- call pc386_delay
- call pc386_delay
-
- movl %cs:HDRSTART + HDROFF, %eax #
- pushl %eax # jump to start of 32 bit code
- ret #
+ call empty_8042
+ movb $0xD1, %al # command write
+ outb %al, $0x64
+ call empty_8042
+ movb $0xDF, %al # A20 on
+ outb %al, $0x60
+ call empty_8042
+
+ call pc386_delay
+ call pc386_delay
+ call pc386_delay
+
+ movl %cs:HDRSTART + HDROFF, %eax #
+ pushl %eax # jump to start of 32 bit code
+ ret #
/*----------------------------------------------------------------------------+
| pc386_delay
@@ -137,24 +149,24 @@ _start16:
!
| NOTE: Saving the content of the EAX register just in case. - Rosimildo.
+----------------------------------------------------------------------------*/
- .p2align 4
- .globl _pc386_delay
- .globl pc386_delay
+ .p2align 4
+ .globl _pc386_delay
+ .globl pc386_delay
pc386_delay:
_pc386_delay:
- pushl %eax
+ pushl %eax
#if defined(USE_OUTB_FOR_DELAY)
- outb %al, $0x80 # about 1uS delay on most machines
+ outb %al, $0x80 # about 1uS delay on most machines
#else
- movl $0x200, %eax
+ movl $0x200, %eax
pc386_delay1:
- dec %eax
- jnz pc386_delay1
+ dec %eax
+ jnz pc386_delay1
#endif
- popl %eax
- ret
+ popl %eax
+ ret
/*----------------------------------------------------------------------------+
| empty_8042
@@ -164,22 +176,22 @@ pc386_delay1:
| No timeout is used - if this hangs there is something wrong with the machine,
| and we probably couldn't proceed anyway.
+----------------------------------------------------------------------------*/
- .p2align 4
- .globl _empty_8042
- .globl empty_8042
+ .p2align 4
+ .globl _empty_8042
+ .globl empty_8042
empty_8042:
_empty_8042:
- call pc386_delay
- inb $0x64, %al # 8042 status port
- testb $0x01, %al # output buffer?
- jz no_output
- call pc386_delay
- in $0x60, %al # read it
- jmp empty_8042
+ call pc386_delay
+ inb $0x64, %al # 8042 status port
+ testb $0x01, %al # output buffer?
+ jz no_output
+ call pc386_delay
+ in $0x60, %al # read it
+ jmp empty_8042
no_output:
- test $0x02, %al # is input buffer full?
- jnz empty_8042 # yes - loop
- ret
+ test $0x02, %al # is input buffer full?
+ jnz empty_8042 # yes - loop
+ ret
/*----------------------------------------------------------------------------+
| DATA section
@@ -189,20 +201,20 @@ no_output:
* GLOBAL DESCRIPTOR TABLE *
**************************/
- .p2align 4
+ .p2align 4
gdtptr:
- /* we use the NULL descriptor to store the GDT pointer - a trick quite
- nifty due to: Robert Collins (rcollins@x86.org) */
- .word gdtlen - 1
- .long gdtptr
- .word 0x0000
+ /* we use the NULL descriptor to store the GDT pointer - a trick quite
+ nifty due to: Robert Collins (rcollins@x86.org) */
+ .word gdtlen - 1
+ .long gdtptr
+ .word 0x0000
- /* code segment */
- .word 0xffff, 0
- .byte 0, 0x9f, 0xcf, 0
+ /* code segment */
+ .word 0xffff, 0
+ .byte 0, 0x9f, 0xcf, 0
/* data segment */
- .word 0xffff, 0
- .byte 0, 0x93, 0xcf, 0
+ .word 0xffff, 0
+ .byte 0, 0x93, 0xcf, 0
- .set gdtlen, . - gdtptr # length of GDT
+ .set gdtlen, . - gdtptr # length of GDT