diff options
Diffstat (limited to 'c/src/lib/libbsp/i386/ts_386ex/startup')
-rw-r--r-- | c/src/lib/libbsp/i386/ts_386ex/startup/Makefile.in | 79 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/ts_386ex/startup/README | 17 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/ts_386ex/startup/bspstart.c | 161 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/ts_386ex/startup/linkcmds | 124 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/ts_386ex/startup/setvec.c | 55 |
5 files changed, 436 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/ts_386ex/startup/Makefile.in b/c/src/lib/libbsp/i386/ts_386ex/startup/Makefile.in new file mode 100644 index 0000000000..89e2fce951 --- /dev/null +++ b/c/src/lib/libbsp/i386/ts_386ex/startup/Makefile.in @@ -0,0 +1,79 @@ +# +# $Id$ +# + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = ../../../../../../.. +subdir = c/src/lib/libbsp/i386/ts_386ex/startup + +INSTALL = @INSTALL@ + +RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@ +PROJECT_ROOT = @PROJECT_ROOT@ + +VPATH = @srcdir@:@srcdir@/../../../shared:@srcdir@/../../shared/comm:@srcdir@/../../shared/irq:@srcdir@/../../shared/io + +PGM=${ARCH}/startup.rel + +# C source names, if any, go here -- minus the .c +C_PIECES=bspclean bsplibc bsppost bspstart main sbrk irq irq_init i386-stub-glue uart i386-stub + +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=irq_asm +S_FILES=$(S_PIECES:%=%.S) +S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o) + +SRCS=$(srcdir)/linkcmds $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) +OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES) + +include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg +include $(RTEMS_ROOT)/make/leaf.cfg + +# +# (OPTIONAL) Add local stuff here using += +# + +#DEFINES += -DPRINTON + +DEFINES += -I$(srcdir) +CPPFLAGS += +CFLAGS += + +LD_PATHS += +LD_LIBS += +LDFLAGS += + +# +# Add your list of files to delete here. The config files +# already know how to delete some stuff, so you may want +# to just run 'make clean' first to see what gets missed. +# 'make clobber' already includes 'make clean' +# + +CLEAN_ADDITIONS += +CLOBBER_ADDITIONS += + +preinstall: + $(INSTALL_CHANGE) ${IMPORT_SRC} . + +# ${CP} ${IMPORT_SRC} . + +${PGM}: ${SRCS} ${OBJS} + $(make-rel) +all: ${ARCH} preinstall $(SRCS) $(PGM) + $(INSTALL_CHANGE) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile +install: all + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status diff --git a/c/src/lib/libbsp/i386/ts_386ex/startup/README b/c/src/lib/libbsp/i386/ts_386ex/startup/README new file mode 100644 index 0000000000..17fde76a91 --- /dev/null +++ b/c/src/lib/libbsp/i386/ts_386ex/startup/README @@ -0,0 +1,17 @@ +# +# $Id$ +# + + +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 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. + + diff --git a/c/src/lib/libbsp/i386/ts_386ex/startup/bspstart.c b/c/src/lib/libbsp/i386/ts_386ex/startup/bspstart.c new file mode 100644 index 0000000000..c0e92617e8 --- /dev/null +++ b/c/src/lib/libbsp/i386/ts_386ex/startup/bspstart.c @@ -0,0 +1,161 @@ +/* + * 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. + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * 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$ + */ + +void bsp_clean_up(void); + +#include <bsp.h> +#include <rtems/libio.h> + +#include <libcsupport.h> + +/* + * The original table from the application and our copy of it with + * some changes. + */ + +extern rtems_configuration_table Configuration; +rtems_configuration_table BSP_Configuration; + +rtems_cpu_table Cpu_table; + +/* + * Tells us where to put the workspace in case remote debugger is present. + */ + +extern rtems_unsigned32 rdb_start; + +/* + * Use the shared implementations of the following routines + */ + +void bsp_postdriver_hook(void); +void bsp_libc_init( void *, unsigned32, int ); + +/* + * Function: bsp_pretasking_hook + * Created: 95/03/10 + * + * Description: + * BSP pretasking hook. Called just before drivers are initialized. + * Used to setup libc and install any BSP extensions. + * + * NOTES: + * Must not use libc (to do io) from here, since drivers are + * not yet initialized. + * + */ + +void bsp_pretasking_hook(void) +{ + 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); + + 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 */ + bsp_libc_init((void *) heap_start, heap_size, 0); + + +#ifdef RTEMS_DEBUG + rtems_debug_enable( RTEMS_DEBUG_ALL_MASK ); +#endif +} + +/* + * bsp_start + * + * This routine does the bulk of the system initialization. + */ + +void bsp_start( void ) +{ + /* + * we do not use the pretasking_hook. + */ + + Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */ + Cpu_table.postdriver_hook = bsp_postdriver_hook; + Cpu_table.interrupt_table_segment = get_ds(); + Cpu_table.interrupt_table_offset = (void *)Interrupt_descriptor_table; + Cpu_table.interrupt_stack_size = 8192; + /* +#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; + + /* + * Account for the console's resources + */ + console_reserve_resources( &BSP_Configuration ); + + /* + * Init rtems_interrupt_management + */ + rtems_irq_mngt_init(); + + /* + * Init rtems exceptions management + */ + rtems_exception_init_mngt(); + + /* + * The following information is very useful when debugging. + */ + +#ifdef BSP_DEBUG + printk( "RAM_START = 0x%x\nRAM_END = 0x%x\n", RAM_START, RAM_END ); + printk( "work_space_start = 0x%x\n", + BSP_Configuration.work_space_start ); + printk( "work_space_size = 0x%x\n", + BSP_Configuration.work_space_size ); + printk( "maximum_extensions = 0x%x\n", + BSP_Configuration.maximum_extensions ); + printk( "microseconds_per_tick = 0x%x\n", + BSP_Configuration.microseconds_per_tick ); + printk( "ticks_per_timeslice = 0x%x\n", + BSP_Configuration.ticks_per_timeslice ); + printk( "maximum_devices = 0x%x\n", + BSP_Configuration.maximum_devices ); + printk( "number_of_device_drivers = 0x%x\n", + BSP_Configuration.number_of_device_drivers ); + printk( "Device_driver_table = 0x%x\n", + BSP_Configuration.Device_driver_table ); + + /* printk( "_heap_size = 0x%x\n", _heap_size ); + printk( "_stack_size = 0x%x\n", _stack_size ); */ +#endif +} + +void bsp_clean_up(void) { + printk("bsp_cleanup called\n"); +} + diff --git a/c/src/lib/libbsp/i386/ts_386ex/startup/linkcmds b/c/src/lib/libbsp/i386/ts_386ex/startup/linkcmds new file mode 100644 index 0000000000..99911126bb --- /dev/null +++ b/c/src/lib/libbsp/i386/ts_386ex/startup/linkcmds @@ -0,0 +1,124 @@ +/* + * This file contains directives for the GNU linker which are specific + * to the Technologic Systems TS-1325 (i386ex) board. + * + * Copyright (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + * + * Memory layout: + * + * 0x0008000 -> ... : initial section ( init 386ex, goto protected mode) + * ... -> ... : text section ( executable code ) + * ... -> 0x00A0000 : data section ( initialized storage ) + * 0x0100000 -> 0x0200000 : bss section, stack space, heap storage + */ + + ENTRY(_init_i386ex) ; +SECTIONS +{ + +/*************************************************************************** + * initial section: + * + * This section is the first in memory, preceding the text and data sections. + * It initializes the i386ex, sets up the gdt in RAM, loads the gdt, + * jumps to protected mode, loads the idt, zeros the bss section, sets up + * the stack and calls the rest of the RTEMS initialization. + ***************************************************************************/ + + _DOS_ld_addr = 0x0008000 ; + + .initial _DOS_ld_addr : + { + *(.initial); + } + +/*************************************************************************** + * text section: + * + * Nobody here but us opcodes. + ***************************************************************************/ + + .text BLOCK(0x10) : + { + CREATE_OBJECT_SYMBOLS + text_start = . ; + _text_start = . ; + *(.text ) ; + . = ALIGN (16); + + *(.eh_fram) + . = ALIGN (16); + + /* + * C++ constructors + */ + __CTOR_LIST__ = .; + LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) + *(.ctors) + LONG(0) + __CTOR_END__ = .; + . = ALIGN (4) ; + __DTOR_LIST__ = .; + LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) + *(.dtors) + LONG(0) + __DTOR_END__ = .; + _rodata_start = . ; + *(.rodata) + *(.gnu.linkonce.r*) + _erodata = ALIGN( 0x10 ) ; + _etext = ALIGN( 0x10 ); + _endtext = . ; + } + +/*************************************************************************** + * data section: + * + * This section defines the location of the data section in RAM. + ***************************************************************************/ + + .data BLOCK(0x10) : + { + _sdata = .; + *(.data); + _edata = .; + } + _data_size = _edata - _sdata ; + +/*************************************************************************** + * bss section: + * + * The bss section is the first section in extended RAM ( > 1MB). + ***************************************************************************/ + + .bss 0x100000 (NOLOAD) : + { + _bss_start = .; + *(.bss); + *(COMMON); + _ebss = ALIGN(0x10); + } + _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 = 0x8000 ; + stack_origin = _ebss + stack_size ; + heap_bottom = stack_origin + 4 ; + +} diff --git a/c/src/lib/libbsp/i386/ts_386ex/startup/setvec.c b/c/src/lib/libbsp/i386/ts_386ex/startup/setvec.c new file mode 100644 index 0000000000..9e7a0e758d --- /dev/null +++ b/c/src/lib/libbsp/i386/ts_386ex/startup/setvec.c @@ -0,0 +1,55 @@ +/* set_vector + * + * This routine installs an interrupt vector on the Force CPU-386. + * + * INPUT: + * handler - interrupt handler entry point + * vector - vector number + * type - 0 indicates raw hardware connect + * 1 indicates RTEMS interrupt connect + * + * RETURNS: + * address of previous interrupt handler + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include <rtems.h> +#include <bsp.h> + +i386_isr_entry set_vector( /* returns old vector */ + rtems_isr_entry handler, /* isr routine */ + rtems_vector_number vector, /* vector number */ + int type /* RTEMS or RAW intr */ +) +{ + i386_isr_entry previous_isr; + interrupt_gate_descriptor idt; + + if ( type ) + rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr ); + else { + /* get the address of the old handler */ + + idt = Interrupt_descriptor_table[ vector ]; + + previous_isr = (i386_isr_entry) + ((idt.offset_16_31 << 16) | idt.offset_0_15); + + /* build the IDT entry */ + create_interrupt_gate_descriptor( &idt, handler ); + + /* install the IDT entry */ + Interrupt_descriptor_table[ vector ] = idt; + } + return previous_isr; +} + |