diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1998-03-30 13:42:13 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1998-03-30 13:42:13 +0000 |
commit | 334427722c30d1086786e37bca2ff33752bb5aa0 (patch) | |
tree | 5a82e159853bca24e2092ce8662f5f50d2e8f919 /c/src/lib/libbsp/i386/i386ex/startup | |
parent | GO32 does not have sockets. (diff) | |
download | rtems-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.in | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/i386ex/startup/README | 26 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/i386ex/startup/bspstart.c | 114 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/i386ex/startup/linkcmds | 160 |
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 |