source: rtems/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S @ 6128a4a

4.104.114.84.95
Last change on this file since 6128a4a was 6128a4a, checked in by Ralf Corsepius <ralf.corsepius@…>, on 04/21/04 at 10:43:04

Remove stray white spaces.

  • Property mode set to 100644
File size: 7.6 KB
RevLine 
[7150f00f]1/*-------------------------------------------------------------------------+
2| ldsegs.s v1.1 - PC386 BSP - 1997/08/07
3+--------------------------------------------------------------------------+
4| This file assists the board independent startup code by loading the proper
5| segment register values. The values loaded are board dependent. In addition
6| it contains code to enable the A20 line and to reprogram the PIC to relocate
7| the IRQ interrupt vectors to 0x20 -> 0x2f.
8| NOTE: No stack has been established when this routine is invoked.
9|       It returns by jumping back to bspentry.
10+--------------------------------------------------------------------------+
11| (C) Copyright 1997 -
12| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
13|
14| http://pandora.ist.utl.pt
15|
16| Instituto Superior Tecnico * Lisboa * PORTUGAL
17+--------------------------------------------------------------------------+
18| Disclaimer:
19|
20| This file is provided "AS IS" without warranty of any kind, either
21| expressed or implied.
22+--------------------------------------------------------------------------+
23| This code is base on:
24|   ldsegs.s,v 1.4 1996/04/20 16:48:30 joel Exp - go32 BSP
25| With the following copyright notice:
26| **************************************************************************
[08311cc3]27| *  COPYRIGHT (c) 1989-1999.
[6f9c75c3]28| *  On-Line Applications Research Corporation (OAR).
29| *
30| *  The license and distribution terms for this file may be
31| *  found in found in the file LICENSE in this distribution or at
[af2abc9e]32| *  http://www.rtems.com/license/LICENSE.
[7150f00f]33| **************************************************************************
34|
[6f9c75c3]35|  $Id$
[7150f00f]36+--------------------------------------------------------------------------*/
37
[b14d8a48]38#include <rtems/asm.h>
[7150f00f]39
40/*----------------------------------------------------------------------------+
41| CODE section
42+----------------------------------------------------------------------------*/
[67a2288]43EXTERN (rtems_i8259_masks)
[6128a4a]44
[7150f00f]45BEGIN_CODE
46
[4050a7f]47        EXTERN (_establish_stack)
48        EXTERN (Timer_exit)
[67a2288]49        EXTERN (clockOff)
[7150f00f]50
51/*----------------------------------------------------------------------------+
[df49c60]52| pc386_delay
[7150f00f]53+------------------------------------------------------------------------------
[6128a4a]54| Delay is needed after doing I/O.
[76c356f]55|
56| The outb version is OK on most machines BUT the loop version ...
[6128a4a]57|
[76c356f]58| will delay for 1us on 1Gz machine, it will take a little bit
59| longer on slower machines, however, it does not matter because we
60| are going to call this function only a few times
61
[7150f00f]62+----------------------------------------------------------------------------*/
[2116e33]63#define DELAY_USE_OUTB
[6128a4a]64
[76c356f]65        .p2align 4
[df49c60]66        .globl _pc386_delay
67        .globl pc386_delay
68pc386_delay:
69_pc386_delay:
[2116e33]70#ifdef  DELAY_USE_OUTB
71        outb    al, $0x80       # about 1uS delay on most machines
72#else
73        movl    $0x200, eax
[df49c60]74pc386_delay1:
[2116e33]75        dec     eax
[df49c60]76        jnz     pc386_delay1
[2116e33]77#endif
[c3538f3]78        ret
[76c356f]79
[7150f00f]80/*-------------------------------------------------------------------------+
81|         Function: _load_segments
[4050a7f]82|      Description: Current environment is standard PC booted by grub.
83|                   So, there is no value in saving current GDT and IDT
[5d18fb0]84|                   settings we have to set it up ourseves. (Naturally
[4050a7f]85|                   it will be not so in case we are booted by some
86|                   boot monitor, however, then it will be different
[5d18fb0]87|                   BSP). After that we have to load board segment registers
[4050a7f]88|                   with apropriate values +  reprogram PIC.
[7150f00f]89| Global Variables: None.
90|        Arguments: None.
[6128a4a]91|          Returns: Nothing.
[7150f00f]92+--------------------------------------------------------------------------*/
[4050a7f]93        .p2align 4
[6128a4a]94
[7150f00f]95        PUBLIC (_load_segments)
96SYM (_load_segments):
[4050a7f]97
98        lgdt SYM(gdtdesc)
99        lidt SYM(idtdesc)
100
101        /* Load CS, flush prefetched queue */
102        ljmp $0x8, $next_step
103
[6128a4a]104next_step:
[4050a7f]105        /* Load segment registers */
106        movw $0x10, ax
107        movw ax, ss
108        movw ax, ds
109        movw ax, es
110        movw ax, fs
111        movw ax, gs
112
113/*---------------------------------------------------------------------+
114| Now we have to reprogram the interrupts :-(. We put them right after
115| the intel-reserved hardware interrupts, at int 0x20-0x2F. There they
116| won't mess up anything. Sadly IBM really messed this up with the
117| original PC, and they haven't been able to rectify it afterwards. Thus
118| the bios puts interrupts at 0x08-0x0f, which is used for the internal
119| hardware interrupts as well. We just have to reprogram the 8259's, and
120| it isn't fun.
121+---------------------------------------------------------------------*/
[7150f00f]122
123        movb    $0x11, al               /* initialization sequence          */
124        outb    al, $0x20               /* send it to 8259A-1               */
[df49c60]125        call    SYM(pc386_delay)
[7150f00f]126        outb    al, $0xA0               /* and to 8259A-2                   */
[df49c60]127        call    SYM(pc386_delay)
[6128a4a]128
[7150f00f]129        movb    $0x20, al               /* start of hardware int's (0x20)   */
130        outb    al, $0x21
[df49c60]131        call    SYM(pc386_delay)
[7150f00f]132        movb    $0x28, al               /* start of hardware int's 2 (0x28) */
133        outb    al, $0xA1
[df49c60]134        call    SYM(pc386_delay)
[6128a4a]135
[7150f00f]136        movb    $0x04, al               /* 8259-1 is master                 */
137        outb    al, $0x21
[df49c60]138        call    SYM(pc386_delay)
[7150f00f]139        movb    $0x02, al               /* 8259-2 is slave                  */
140        outb    al, $0xA1
[df49c60]141        call    SYM(pc386_delay)
[6128a4a]142
[7150f00f]143        movb    $0x01, al               /* 8086 mode for both               */
144        outb    al, $0x21
[df49c60]145        call    SYM(pc386_delay)
[7150f00f]146        outb    al, $0xA1
[df49c60]147        call    SYM(pc386_delay)
[6128a4a]148
[7150f00f]149        movb    $0xFF, al               /* mask off all interrupts for now  */
150        outb    al, $0xA1
[df49c60]151        call    SYM(pc386_delay)
[7150f00f]152        movb    $0xFB, al               /* mask all irq's but irq2 which    */
153        outb    al, $0x21               /* is cascaded                      */
[df49c60]154        call    SYM(pc386_delay)
[7150f00f]155
[99826740]156        movw    $0xFFFB, SYM(i8259s_cache) /* set up same values in cache */
[6128a4a]157
[7150f00f]158        jmp     SYM (_establish_stack)  # return to the bsp entry code
159
160/*-------------------------------------------------------------------------+
161|         Function: _return_to_monitor
162|      Description: Return to board's monitor (we have none so simply restart).
163| Global Variables: None.
164|        Arguments: None.
[6128a4a]165|          Returns: Nothing.
[7150f00f]166+--------------------------------------------------------------------------*/
[4050a7f]167
168        .p2align 4
[6128a4a]169
[7150f00f]170        PUBLIC (_return_to_monitor)
171SYM (_return_to_monitor):
172
173        call    SYM (Timer_exit)
174        call    SYM (Clock_exit)
175        jmp     SYM (start)
176
[4050a7f]177/*-------------------------------------------------------------------------+
178|         Function: _default_int_handler
179|      Description: default interrupt handler
180| Global Variables: None.
181|        Arguments: None.
[6128a4a]182|          Returns: Nothing.
[4050a7f]183+--------------------------------------------------------------------------*/
184        .p2align 4
[6128a4a]185
[4050a7f]186/*---------------------------------------------------------------------------+
187| GDT itself
188+--------------------------------------------------------------------------*/
189
190        .p2align 4
[6128a4a]191
[4050a7f]192        PUBLIC (_Global_descriptor_table)
193SYM (_Global_descriptor_table):
[7150f00f]194
[4050a7f]195        /* NULL segment */
[6128a4a]196        .word 0, 0
[4050a7f]197        .byte 0, 0, 0, 0
[7150f00f]198
[4050a7f]199        /* code segment */
200        .word 0xffff, 0
201        .byte 0, 0x9e, 0xcf, 0
[7150f00f]202
[4050a7f]203        /* data segment */
204        .word 0xffff, 0
205        .byte 0, 0x92, 0xcf, 0
[6128a4a]206
[4050a7f]207
208/*---------------------------------------------------------------------------+
209| Descriptor of GDT
210+--------------------------------------------------------------------------*/
211SYM (gdtdesc):
[6128a4a]212        .word (3*8 - 1)
[4050a7f]213        .long SYM (_Global_descriptor_table)
[7150f00f]214
[4050a7f]215
216/*---------------------------------------------------------------------------+
217| IDT itself
218+---------------------------------------------------------------------------*/
[58f7c34]219BEGIN_DATA
[4050a7f]220        .p2align 4
[6128a4a]221
[4050a7f]222        PUBLIC(Interrupt_descriptor_table)
223SYM(Interrupt_descriptor_table):
224        .rept 256
225        .word 0,0,0,0
226        .endr
[58f7c34]227END_DATA
[6128a4a]228
[4050a7f]229/*---------------------------------------------------------------------------+
230| Descriptor of IDT
231+--------------------------------------------------------------------------*/
[58f7c34]232BEGIN_CODE
233        .p2align 4
[6128a4a]234SYM(idtdesc):
[4050a7f]235        .word  (256*8 - 1)
236        .long  SYM (Interrupt_descriptor_table)
[6128a4a]237
[4050a7f]238END_CODE
[7150f00f]239
[99826740]240    .section .m_hdr
241        .long 0x1BADB002
242        .long 0
243        .long 0xE4524FFE
[7150f00f]244END
Note: See TracBrowser for help on using the repository browser.