summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/i386ex/startup
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1998-03-30 13:42:13 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1998-03-30 13:42:13 +0000
commit334427722c30d1086786e37bca2ff33752bb5aa0 (patch)
tree5a82e159853bca24e2092ce8662f5f50d2e8f919 /c/src/lib/libbsp/i386/i386ex/startup
parentGO32 does not have sockets. (diff)
downloadrtems-334427722c30d1086786e37bca2ff33752bb5aa0.tar.bz2
Update from "erik.ivanenko" <erik.ivanenko@utoronto.ca>.
Also removed bsp_postdriver_hook() from every bsp possible and moved to shared version.
Diffstat (limited to 'c/src/lib/libbsp/i386/i386ex/startup')
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/Makefile.in6
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/README26
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/bspstart.c114
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/linkcmds160
4 files changed, 179 insertions, 127 deletions
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/Makefile.in b/c/src/lib/libbsp/i386/i386ex/startup/Makefile.in
index 8042d83b24..b62746f5bd 100644
--- a/c/src/lib/libbsp/i386/i386ex/startup/Makefile.in
+++ b/c/src/lib/libbsp/i386/i386ex/startup/Makefile.in
@@ -11,17 +11,15 @@ PROJECT_ROOT = @PROJECT_ROOT@
PGM=${ARCH}/startup.rel
# C source names, if any, go here -- minus the .c
-C_PIECES=bspclean bspstart main sbrk setvec
+C_PIECES=bspclean bsppost bspstart main sbrk setvec
C_FILES=$(C_PIECES:%=%.c)
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
H_FILES=
-
# Assembly source names, if any, go here -- minus the .s
# removed initcsu piece, ldsegs piece and flush
-S_PIECES= gdt idt interrupts interns reset_jmp
-
+S_PIECES=
S_FILES=$(S_PIECES:%=%.s)
S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/README b/c/src/lib/libbsp/i386/i386ex/startup/README
index 6a61b9f3c3..17fde76a91 100644
--- a/c/src/lib/libbsp/i386/i386ex/startup/README
+++ b/c/src/lib/libbsp/i386/i386ex/startup/README
@@ -3,25 +3,15 @@
#
- The doit shell file cd's to $H, which refers to the directory
-that contains the hello world test. The console is a raw com port.
-Certain test programs behave differently with different com port speeds.
-To test the programs, it is required that you hook up a terminal
-( or minicom or procomm it doesn't really matter ) to the comm port of
-the target hardware. You must ensure that the baud rate, parity etc
-is set properly. This is done on the target hardware within interns.s .
-( Set your terminal emulator to match. ) Currently, the settings
-are 9600,8,n,1 .
+The requirements for this BSP are only that the GAS used supports the
+.code16 directive. The GAS released with any GCC version 2.8.0 or better
+is required. The BSP was built with an egcs snapshot pre-1.0.2 and
+post-1.0.1. However, any egcs should work.
-The format and layout of the file interns.s is taken from the
-intel ApBuilder software, freely distributed by Intel. Some
-easy macros ( SetExRegByte and SetExRegWord ) are basically lifted
-from the Intel macros. Similarly for the names of the IO ports.
-This "port" begain with the forceCPU bsp. Hence I am sure that
-there is some real trash that is not appropriate. For example
-the act of copying the Interrupt Descriptor tables and Global
-descriptor tables "into our space". ( in start.s I think )
+The only "real" differences are in bspstart.c, where the initialization now
+configures all available RAM, (after setting up the Workspaces) as heap.
+The location of the stack was changed so that the heap was not trapped
+between low memory and the stack; the stack comes before the heap.
-Erik
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/bspstart.c b/c/src/lib/libbsp/i386/i386ex/startup/bspstart.c
index 77bba61cf3..5022148c06 100644
--- a/c/src/lib/libbsp/i386/i386ex/startup/bspstart.c
+++ b/c/src/lib/libbsp/i386/i386ex/startup/bspstart.c
@@ -1,14 +1,9 @@
-/* bsp_start()
- *
+/*
* This routine starts the application. It includes application,
* board, and monitor specific initialization and configuration.
* The generic CPU dependent initialization has been performed
* before this routine is invoked.
*
- * INPUT: NONE
- *
- * OUTPUT: NONE
- *
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
@@ -17,6 +12,12 @@
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
+ * Ported to the i386ex and submitted by:
+ *
+ * Erik Ivanenko
+ * University of Toronto
+ * erik.ivanenko@utoronto.ca
+ *
* $Id$
*/
@@ -24,12 +25,9 @@
#include <rtems/libio.h>
#include <libcsupport.h>
-
-#include <fcntl.h>
-#ifdef PRINTON
-extern char inbyte(void);
-extern void outbyte(char);
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
#endif
/*
@@ -42,23 +40,35 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
-char *rtems_progname;
+/*
+ * Tells us where to put the workspace in case remote debugger is present.
+ */
+
+extern rtems_unsigned32 rdb_start;
-/* Initialize whatever libc we are using
- * called from postdriver hook
+/*
+ * bsp_libc_init
+ *
+ * Initialize whatever libc we are using called from bsp_postdriver_hook.
*/
+
void bsp_libc_init()
{
- extern int end;
- rtems_unsigned32 heap_start;
-
- heap_start = (rtems_unsigned32) &end;
+ extern int heap_bottom;
+ rtems_unsigned32 heap_start;
+ rtems_unsigned32 heap_size;
+
+ heap_start = (rtems_unsigned32) &heap_bottom;
if (heap_start & (CPU_ALIGNMENT-1))
- heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
-
- RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
-
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ heap_size = BSP_Configuration.work_space_start -(void *) heap_start ;
+ heap_size &= 0xfffffff0; /* keep it as a multiple of 16 bytes */
+
+ heap_size &= 0xfffffff0; /* keep it as a multiple of 16 bytes */
+ RTEMS_Malloc_Initialize((void *) heap_start, heap_size, 0);
+
/*
* Init the RTEMS libio facility to provide UNIX-like system
* calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
@@ -104,7 +114,7 @@ bsp_pretasking_hook(void)
Stack_check_Initialize();
#endif
-
+
#ifdef RTEMS_DEBUG
rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
#endif
@@ -112,45 +122,13 @@ bsp_pretasking_hook(void)
/*
- * After drivers are setup, register some "filenames"
- * and open stdin, stdout, stderr files
- *
- * Newlib will automatically associate the files with these
- * (it hardcodes the numbers)
+ * Use the shared bsp_postdriver_hook() implementation
*/
-void
-bsp_postdriver_hook(void)
-{
- int stdin_fd, stdout_fd, stderr_fd;
- int error_code;
-
- error_code = 'S' << 24 | 'T' << 16;
-
- if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
- rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
-
- if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
- rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
-
- if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
- rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
-
- if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
- rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
-}
-
+void bsp_postdriver_hook(void);
void bsp_start( void )
{
-
-#ifdef PRINTON
- outbyte('a');
- outbyte('b');
- outbyte('c');
- outbyte ('S');
-#endif
-
/*
* we do not use the pretasking_hook.
*/
@@ -169,7 +147,7 @@ void bsp_start( void )
Cpu_table.interrupt_table_offset = (void *)Interrupt_descriptor_table;
- Cpu_table.interrupt_stack_size = 4096;
+ Cpu_table.interrupt_stack_size = 4096; /* STACK_MINIMUM_SIZE */
Cpu_table.extra_mpci_receive_server_stack = 0;
@@ -179,18 +157,13 @@ void bsp_start( void )
BSP_Configuration = Configuration;
+#if defined(RTEMS_POSIX_API)
+ BSP_Configuration.work_space_size *= 3;
+#endif
+
BSP_Configuration.work_space_start = (void *)
RAM_END - BSP_Configuration.work_space_size;
-
-#ifdef SPRINTON
- sprintf( x_buffer, "ram end : %u, work_space_size: %d\n",
- RAM_END , BSP_Configuration.work_space_size );
- do {
- outbyte ( x_buffer[i] );
- } while ( x_buffer[i++] != '\n');
-#endif
-
/*
* Add 1 region for Malloc in libc_low
*/
@@ -198,6 +171,13 @@ void bsp_start( void )
BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
/*
+ * Account for the console's resources
+ */
+
+ /* console_reserve_resources( &BSP_Configuration ); */
+
+
+ /*
* Add 1 extension for newlib libc
*/
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/linkcmds b/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
index 2834cbeafb..24202aa59c 100644
--- a/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
+++ b/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
@@ -17,60 +17,112 @@
ENTRY(reset) ;
SECTIONS
{
- _rom_ints = 0x3fb0000;
- .ints 0x0100 :
- AT ( _rom_ints ) /* was 0x3fb3300 */
+
+/*******************************************************************************
+ * Interrupts section:
+ *
+ * This section defines the layout of the interrupts in ROM ( VMA ) as well as their
+ * location in RAM (LMA). The _rom_ and _ram_ variables are used in start.s
+ * in order for the code to move the interrupt vector tables from ROM to RAM
+ * while still running in real-mode. The tables are moved from ROM, as the IDT
+ * is initialized with only 16-bit offsets for the interrupt handlers.
+ * This is purely an implementation issue. If you prefer the interrupt handlers
+ * to be resident in flash, then you must provide the code to create the interrupt
+ * gates with full 32bit offsets. The code in the current start.s does NOT support
+ * interrupts in ROM by merely redefining their location.
+ ******************************************************************************/
+ _rom_ints = 0x3ff0000; /* was 0x3fb0000 */
+ _rom_ints_segment = 0xF000 ;
+ _rom_ints_offset = 0x0000 ;
+
+ _ram_ints_segment = 0x0000 ;
+ _ram_ints_offset = 0x0100 ;
+
+
+ .ints _ram_ints_offset :
+ AT ( _rom_ints )
{
_sints = .;
*(.ints);
_eints = ALIGN (0x010);
}
- _cs4_ints_segment = 0x0010 ;
- _cs4_ints_offset = 0x0000 ;
- _cs6_t_ints_segment = 0xF000 ; /* was 0xF000 */
- _cs6_t_ints_offset = 0x0000 ; /* was 0x3300 */
- _cs6_t_ints_size = _eints - _sints ;
-
- _rom_gdt = _rom_ints + _cs6_t_ints_size;
- .gdt 0x1000 :
+
+ _ints_size = _eints - _sints ;
+/**************************************************************************************
+ * GDT section:
+ *
+ * This section defines the locations of the GDT in ROM as well as in RAM. The _rom_ and
+ * _ram_ variables are used by start.s to copy the GDT from ROM to RAM when still in
+ * real-mode. The move from ROM to RAM is made as a writeable GDT is required for the
+ * jump to protected mode to be successful.
+ **************************************************************************************/
+
+ _rom_gdt = _rom_ints + _ints_size;
+ _rom_gdt_segment = 0xF000;
+ _rom_gdt_offset = _rom_ints_offset + _ints_size;
+
+ _ram_gdt_segment = 0x0000 ;
+ _ram_gdt_offset = _ram_ints_offset + _ints_size;
+
+ .gdt _ram_gdt_offset :
AT ( _rom_gdt )
{
_sgdt = .;
*(.gdt);
_egdt = ALIGN (0x10);
}
- _cs4_gdt_segment = 0x0100 ; /* evaluates to 0x1000 */
- _cs4_gdt_offset = 0x0000 ;
- _cs6_t_gdt_segment = 0xF000;
- _cs6_t_gdt_offset = _cs6_t_ints_size; /* was 0x0 */
- _cs6_t_gdt_size = _egdt - _sgdt;
-
- _rom_idt = _rom_gdt + _cs6_t_gdt_size + _cs6_t_ints_size ;
- .idt 0x1200 :
+ _gdt_size = _egdt - _sgdt;
+
+/*****************************************************************************************
+ * IDT section:
+ *
+ * This section defines the locations of the IDT in ROM as well as in RAM. The _rom_ and
+ * _ram_ variables are used by start.s to copy the IDT from ROM to RAM when still in real-mode.
+ * The move from ROM to RAM is required to enable RTEMS to hook the interrupts, however,
+ * this move could be made when in protected mode.
+ ****************************************************************************************/
+
+ _rom_idt = _rom_gdt + _gdt_size ;
+ _rom_idt_segment = 0xF000 ;
+ _rom_idt_offset = _rom_gdt_offset + _gdt_size ;
+
+ _ram_idt_segment = 0x0000 ;
+ _ram_idt_offset = _ram_gdt_offset + _gdt_size ;
+
+ .idt _ram_idt_offset :
AT ( _rom_idt )
{
_sidt = .;
*(.idt);
_eidt = ALIGN (0x10);
}
- _cs4_idt_segment = 0x0120;
- _cs4_idt_offset = 0x0000 ;
- _cs6_t_idt_segment = 0xF000 ;
- _cs6_t_idt_offset = _cs6_t_ints_size + _cs6_t_gdt_size ; /* was 0x1000 */
- _cs6_t_idt_size = _eidt - _sidt;
-
- _rom_data_start = _rom_idt + _cs6_t_idt_size ;
- .data :
- AT ( _rom_data_start ) /* was 0x3fd0000 */
+ _idt_size = _eidt - _sidt;
+
+/****************************************************************************************
+ * data section:
+ *
+ * This section defines the locations of the data section in ROM as well as in RAM.
+ * start.s copies the data section to RAM when in protected mode.
+ ***********************************************************************************/
+
+ _rom_data_start = _rom_idt + _idt_size ;
+
+ .data :
+ AT ( _rom_data_start )
{
_sdata = .;
*(.data);
_edata = ALIGN( 0x10 ) ;
}
_data_start = ADDR(.data) ;
+ data_start = _data_start ;
_data_size = _edata - _sdata ;
- _edata = _data_start + _data_size ;
+/**************************************************************************************
+ * bss section:
+ *
+ * The bss section is the last section in RAM.
+ *************************************************************************************/
.bss :
{
_bss_start = .;
@@ -81,11 +133,29 @@ SECTIONS
_end = end;
__end = end;
}
- _bss_size = _ebss - _bss_start ;
+ _bss_size = _ebss - _bss_start ;
-
+/**************************************************************************************
+ * General variables:
+ *
+ * The stack_size variable is customizable here. The heap is located directly after
+ * The stack in RAM. A routine within bspstart.c uses these variables to ensure that
+ * the heap used by RTEMS is as large as the RAM remaining after all workspace configurations
+ * are complete.
+ *************************************************************************************/
+ stack_size = 0x1000 ;
+ stack_origin = end + stack_size ;
+ heap_bottom = stack_origin + 4 ;
+
+/***************************************************************************************
+ * text section:
+ *
+ * This section is NOT copied into RAM. It is left in ROM, as the flash ROM is quick enough.
+ ***************************************************************************************/
.text ( 0x3f80000 ):
{
+ CREATE_OBJECT_SYMBOLS
+ text_start = . ;
_text_start = . ;
*(.text ) ;
. = ALIGN (16);
@@ -101,24 +171,38 @@ SECTIONS
*(.ctors)
LONG(0)
__CTOR_END__ = .;
+ . = ALIGN (4) ;
__DTOR_LIST__ = .;
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
*(.dtors)
LONG(0)
__DTOR_END__ = .;
- _etext = ALIGN( 0x10 );
+ _etext = ALIGN( 0x10 );
+ _endtext = . ;
}
- .initial 0x3ff1000:
+/*******************************************************************************************
+ * initial section:
+ *
+ * This section is defined after the data section. It must be in the top 64K of memory
+ * to enable the initial short jmp from the reset section while still in real-mode. It
+ * contains ALL initialization and data movement directives.
+ ******************************************************************************************/
+
+ .initial _rom_data_start + _data_size :
{
*(.initial);
}
- .reset 0x3fffff0:
+/*******************************************************************************************
+ * reset section:
+ *
+ * This section contains the short jmp from the reset section to the initial section. It is
+ * the first code executed on reset/power on.
+ ******************************************************************************************/
+
+ .reset 0x3fffff0:
{
*(.reset);
}
-}
-
-
-
+} \ No newline at end of file