source: rtems/c/src/lib/libbsp/i386/force386/start/start.s @ 4e01c9c

4.104.114.84.95
Last change on this file since 4e01c9c was 4e01c9c, checked in by Joel Sherrill <joel.sherrill@…>, on Mar 21, 1998 at 3:44:26 PM

Added BSP specific start since it had become VERY complex to attempt
to share the start code across i386 BSPs.

  • Property mode set to 100644
File size: 7.2 KB
Line 
1/*  start.s
2 *
3 *  This file contains the entry point for the application.
4 *  The name of this entry point is compiler dependent.
5 *  It jumps to the BSP which is responsible for performing
6 *  all initialization.
7 *
8 *
9 *  COPYRIGHT (c) 1989-1998.
10 *  On-Line Applications Research Corporation (OAR).
11 *  Copyright assigned to U.S. Government, 1994.
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.OARcorp.com/rtems/license.html.
16 *
17 *  $Id$
18 */
19
20#include "asm.h"
21
22/*
23 *  A Descriptor table register has the following format
24 */
25
26.set DTR_LIMIT,   0    # offset of two byte limit
27.set DTR_BASE,    2    # offset of four byte base address
28.set DTR_SIZE,    6    # size of DTR register
29
30        BEGIN_DATA
31        EXTERN (Do_Load_IDT)
32        EXTERN (Do_Load_GDT)
33        END_DATA
34
35        BEGIN_CODE
36
37        PUBLIC (start)                   # GNU default entry point
38
39        EXTERN (boot_card)
40        EXTERN (load_segments)
41        EXTERN (exit)
42
43SYM (start):
44        nop
45        cli                             # DISABLE INTERRUPTS!!!
46/*
47 *  Load the segment registers
48 *
49 *  NOTE: Upon return, gs will contain the segment descriptor for
50 *        a segment which maps directly to all of physical memory.
51 */
52        jmp     SYM (_load_segments)    # load board dependent segments
53
54/*
55 *  Set up the stack
56 */
57
58        PUBLIC (_establish_stack)
59SYM (_establish_stack):
60
61        movl    $end,eax               # eax = end of bss/start of heap
62        addl    $heap_size,eax         # eax = end of heap
63        movl    eax,stack_start        # Save for brk() routine
64        addl    $stack_size,eax        # make room for stack
65        andl    $0xffffffc0,eax        # align it on 16 byte boundary
66        movl    eax,esp               # set stack pointer
67        movl    eax,ebp               # set base pointer
68/*
69 *  Zero out the BSS segment
70 */
71SYM (zero_bss):
72        cld                             # make direction flag count up
73        movl    $ SYM (end),ecx        # find end of .bss
74        movl    $ SYM (_bss_start),edi # edi = beginning of .bss
75        subl    edi,ecx               # ecx = size of .bss in bytes
76        shrl    ecx                    # size of .bss in longs
77        shrl    ecx
78        xorl    eax,eax               # value to clear out memory
79        repne                           # while ecx != 0
80        stosl                           #   clear a long in the bss
81
82/*
83 *  Copy the Global Descriptor Table to our space
84 */
85
86        sgdt    SYM (_Original_GDTR)          # save original GDT
87        movzwl  SYM (_Original_GDTR)+DTR_LIMIT,ecx
88                                        /* size of GDT in bytes; limit is */
89                                        /*   8192 entries * 8 bytes per */
90
91        /*
92         * make ds:esi point to the original GDT
93         */
94
95        movl    SYM (_Original_GDTR)+DTR_BASE,esi
96        push    ds                     # save ds
97        movw    gs,ax
98        movw    ax,ds
99
100        /*
101         * make es:edi point to the new (our copy) GDT
102         */
103
104        movl    $ SYM (_Global_descriptor_table),edi
105
106        rep
107        movsb                            # copy the GDT (ds:esi -> es:edi)
108
109        pop     ds                      # restore ds
110
111        /*
112         * Build and load new contents of GDTR
113         */
114        movw     SYM (_Original_GDTR)+DTR_LIMIT,ecx # set new limit
115        movw    cx, SYM (_New_GDTR)+DTR_LIMIT
116
117        push    $ SYM (_Global_descriptor_table)
118        push    es
119        call    SYM (i386_Logical_to_physical)
120        addl    $6,esp
121        movl    eax, SYM (_New_GDTR)+DTR_BASE      # set new base
122
123        cmpb    $0, SYM (_Do_Load_GDT)         # Should the new GDT be loaded?
124        je      SYM (no_gdt_load)              # NO, then branch
125        lgdt    SYM (_New_GDTR)                # load the new GDT
126SYM (no_gdt_load):
127
128/*
129 *  Copy the Interrupt Descriptor Table to our space
130 */
131
132        sidt    SYM (_Original_IDTR)    # save original IDT
133        movzwl  SYM (_Original_IDTR)+DTR_LIMIT,ecx
134                                        /* size of IDT in bytes; limit is */
135                                        /*   256 entries * 8 bytes per */
136
137
138        /*
139         * make ds:esi point to the original IDT
140         */
141        movl    SYM (_Original_IDTR)+DTR_BASE,esi
142
143        push    ds                     # save ds
144        movw    gs,ax
145        movw    ax,ds
146
147        /*
148         * make es:edi point to the new (our copy) IDT
149         */
150        movl    $ SYM (Interrupt_descriptor_table),edi
151
152        rep
153        movsb                            # copy the IDT (ds:esi -> es:edi)
154        pop     ds                      # restore ds
155
156        /*
157         * Build and load new contents of IDTR
158         */
159        movw    SYM (_Original_IDTR+DTR_LIMIT),ecx # set new limit
160        movw    cx,SYM (_New_IDTR)+DTR_LIMIT
161
162        push    $ SYM (Interrupt_descriptor_table)
163        push    es
164        call    SYM (i386_Logical_to_physical)
165        addl    $6,esp
166        movl    eax, SYM (_New_IDTR)+DTR_BASE      # set new base
167
168        cmpb    $0, SYM (_Do_Load_IDT)    # Should the new IDT be loaded?
169        je      SYM (no_idt_load)         # NO, then branch
170        lidt    SYM (_New_IDTR)           # load the new IDT
171SYM (no_idt_load):
172
173/*
174 *  Initialize the i387.
175 *
176 *  Using the NO WAIT form of the instruction insures that
177 *  if it is not present the board will not lock up or get an
178 *  exception.
179 */
180
181        fninit                           # MUST USE NO-WAIT FORM
182
183/*
184 *  Transfer control to User's Board Support Package
185 */
186        pushl   $0                       # environp
187        pushl   $0                       # argv
188        pushl   $0                       # argc
189        call    SYM (boot_card)
190        addl    $12,esp
191
192/*
193 *  Clean up
194 */
195
196        EXTERN (return_to_monitor)
197
198        PUBLIC (Bsp_cleanup)
199SYM (Bsp_cleanup):
200        cmpb    $0, SYM (_Do_Load_IDT)      # Was the new IDT loaded?
201        je      SYM (no_idt_restore)        # NO, then branch
202        lidt    SYM (_Original_IDTR)        # restore the new IDT
203SYM (no_idt_restore):
204
205        cmpb    $0, SYM (_Do_Load_GDT)      # Was the new GDT loaded?
206        je      SYM (no_gdt_restore)        # NO, then branch
207        lgdt    SYM (_Original_GDTR)        # restore the new GDT
208SYM (no_gdt_restore):
209        jmp     SYM (_return_to_monitor)
210
211END_CODE
212
213BEGIN_DATA
214
215        .align  2
216        PUBLIC (start_frame)
217SYM (start_frame):
218        .long  0
219
220        PUBLIC (stack_start)
221SYM (stack_start):
222        .long  0
223
224END_DATA
225
226BEGIN_BSS
227
228        PUBLIC(heap_size)
229        .set  heap_size,0x2000
230
231        PUBLIC(stack_size)
232        .set  stack_size,0x1000
233
234        PUBLIC (Interrupt_descriptor_table)
235SYM (Interrupt_descriptor_table):
236        .space 256*8
237
238        PUBLIC (_Original_IDTR)
239SYM (_Original_IDTR):
240        .space DTR_SIZE
241
242        PUBLIC (_New_IDTR)
243SYM (_New_IDTR):
244        .space DTR_SIZE
245
246        PUBLIC (_Global_descriptor_table)
247SYM (_Global_descriptor_table):
248        .space 8192*8
249
250        PUBLIC (_Original_GDTR)
251SYM (_Original_GDTR):
252        .space DTR_SIZE
253
254        PUBLIC (_New_GDTR)
255SYM (_New_GDTR):
256        .space DTR_SIZE
257
258        PUBLIC (_Physical_base_of_ds)
259SYM (_Physical_base_of_ds):
260        .space 4
261
262        PUBLIC (_Physical_base_of_cs)
263SYM (_Physical_base_of_cs):
264        .space 4
265
266END_BSS
267END
Note: See TracBrowser for help on using the repository browser.