source: rtems/c/src/lib/libbsp/i386/go32/startup/bspstart.c @ 3652ad35

4.104.114.84.95
Last change on this file since 3652ad35 was 3652ad35, checked in by Joel Sherrill <joel.sherrill@…>, on Sep 19, 1995 at 2:53:29 PM

Minor bug fixes to get all targets compilable and running. The
single biggest changes were the expansion of the workspace size
macro to include other types of objects and the increase in the
minimum stack size for most CPUs.

  • Property mode set to 100644
File size: 5.4 KB
Line 
1/*  bsp_start()
2 *
3 *  This routine starts the application.  It includes application,
4 *  board, and monitor specific initialization and configuration.
5 *  The generic CPU dependent initialization has been performed
6 *  before this routine is invoked.
7 *
8 *  INPUT:  NONE
9 *
10 *  OUTPUT: NONE
11 *
12 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
13 *  On-Line Applications Research Corporation (OAR).
14 *  All rights assigned to U.S. Government, 1994.
15 *
16 *  This material may be reproduced by or for the U.S. Government pursuant
17 *  to the copyright license under the clause at DFARS 252.227-7013.  This
18 *  notice must appear in all copies of this file and its derivatives.
19 *
20 *  $Id$
21 */
22
23#include <bsp.h>
24#include <rtems/libio.h>
25 
26#include <libcsupport.h>
27#include <z8036.h>
28 
29#include <string.h>
30#include <fcntl.h>
31 
32#ifdef STACK_CHECKER_ON
33#include <stackchk.h>
34#endif
35
36/*
37 *  The original table from the application and our copy of it with
38 *  some changes.
39 */
40
41extern rtems_configuration_table  Configuration;
42rtems_configuration_table  BSP_Configuration;
43
44rtems_cpu_table Cpu_table;
45
46char *rtems_progname;
47
48/*      Initialize whatever libc we are using
49 *      called from postdriver hook
50 */
51
52void bsp_libc_init()
53{
54    rtems_unsigned32        heap_start;
55
56#if 0
57    extern int end;
58    heap_start = (rtems_unsigned32) &end;
59#else
60    void * sbrk( int );
61    heap_start = (rtems_unsigned32) sbrk( 64 * 1024 + CPU_ALIGNMENT );
62#endif
63    if (heap_start & (CPU_ALIGNMENT-1))
64        heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
65
66    RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
67
68    /*
69     *  Init the RTEMS libio facility to provide UNIX-like system
70     *  calls for use by newlib (ie: provide __open, __close, etc)
71     *  Uses malloc() to get area for the iops, so must be after malloc init
72     */
73
74    rtems_libio_init();
75
76    /*
77     * Set up for the libc handling.
78     */
79
80    if (BSP_Configuration.ticks_per_timeslice > 0)
81        libc_init(1);                /* reentrant if possible */
82    else
83        libc_init(0);                /* non-reentrant */
84}
85 
86/*
87 *  Function:   bsp_pretasking_hook
88 *  Created:    95/03/10
89 *
90 *  Description:
91 *      BSP pretasking hook.  Called just before drivers are initialized.
92 *      Used to setup libc and install any BSP extensions.
93 *
94 *  NOTES:
95 *      Must not use libc (to do io) from here, since drivers are
96 *      not yet initialized.
97 *
98 */
99 
100void
101bsp_pretasking_hook(void)
102{
103    bsp_libc_init();
104 
105#ifdef STACK_CHECKER_ON
106    /*
107     *  Initialize the stack bounds checker
108     *  We can either turn it on here or from the app.
109     */
110 
111    Stack_check_Initialize();
112#endif
113 
114#ifdef RTEMS_DEBUG
115    rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
116#endif
117}
118 
119
120/*
121 * After drivers are setup, register some "filenames"
122 * and open stdin, stdout, stderr files
123 *
124 * Newlib will automatically associate the files with these
125 * (it hardcodes the numbers)
126 */
127 
128void
129bsp_postdriver_hook(void)
130{
131  int stdin_fd, stdout_fd, stderr_fd;
132 
133  if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
134    rtems_fatal_error_occurred('STD0');
135 
136  if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
137    rtems_fatal_error_occurred('STD1');
138 
139  if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
140    rtems_fatal_error_occurred('STD2');
141 
142  if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
143    rtems_fatal_error_occurred('STIO');
144}
145
146/* This is the original command line passed from DOS */
147char ** Go32_Argv;
148
149int main(
150  int argc,
151  char **argv,
152  char **environp
153)
154{
155  extern void * sbrk( int );
156  extern volatile void _exit( int );
157
158  /* Set up arguments that we can access later */
159  Go32_Argv = argv;
160
161  if ((argc > 0) && argv && argv[0])
162    rtems_progname = argv[0];
163  else
164    rtems_progname = "RTEMS";
165
166  Cpu_table.pretasking_hook = bsp_pretasking_hook;  /* init libc, etc. */
167  Cpu_table.predriver_hook = NULL;
168  Cpu_table.postdriver_hook = bsp_postdriver_hook;
169  Cpu_table.idle_task = NULL;  /* do not override system IDLE task */
170  Cpu_table.do_zero_of_workspace = TRUE;
171  Cpu_table.interrupt_table_segment = 0;/* get_ds(); */
172  Cpu_table.interrupt_table_offset = (void *)0;
173  Cpu_table.interrupt_stack_size = 4096;
174  Cpu_table.extra_system_initialization_stack = 0;
175
176  /*
177   *  Copy the table
178   */
179  BSP_Configuration = Configuration;
180
181  BSP_Configuration.work_space_start = sbrk( Configuration.work_space_size );
182  if ( BSP_Configuration.work_space_start == 0 )  {
183    /* Big trouble */
184    int write( int, void *, int );
185    char msg[] = "bsp_start() couldn't sbrk() RTEMS work space\n";
186    write( 2, msg, sizeof msg - 1 );
187    _exit( 1 );
188  }
189
190  /*
191   * Add 1 region for Malloc in libc_low
192   */
193
194  BSP_Configuration.maximum_regions++;
195
196  /*
197   * Add 1 extension for newlib libc
198   */
199
200#ifdef RTEMS_NEWLIB
201  BSP_Configuration.maximum_extensions++;
202#endif
203
204  /*
205   * Add another extension if using the stack checker
206   */
207
208#ifdef STACK_CHECKER_ON
209  BSP_Configuration.maximum_extensions++;
210#endif
211
212  /*
213   * Tell libio how many fd's we want and allow it to tweak config
214   */
215
216  rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
217
218  rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
219  /* does not return */
220
221  /* We only return here if the executive has finished.  This happens   */
222  /* when the task has called exit().                                   */
223  /* At this point we call _exit() which resides in djgcc.              */
224   
225  for (;;)
226          _exit( 0 );
227
228  /* no cleanup necessary for GO32 */
229
230  return 0;
231}
Note: See TracBrowser for help on using the repository browser.