On 1/6/2014 11:13 AM, Philipp Eppelt wrote: > Where are we on this? I think I was OK on it. If Gedare is also, then it should be merged.
--joel > On 12/06/2013 03:40 PM, Gedare Bloom wrote: >> I'm generally OK with these 2 patches. >> >> On Thu, Dec 5, 2013 at 10:59 AM, Philipp Eppelt >> <philipp.epp...@mailbox.tu-dresden.de> wrote: >>> --- >>> c/src/lib/libbsp/i386/acinclude.m4 | 2 + >>> c/src/lib/libbsp/i386/virtualpok/Makefile.am | 87 +++++++ >>> c/src/lib/libbsp/i386/virtualpok/README.virt | 23 ++ >>> c/src/lib/libbsp/i386/virtualpok/bsp_specs | 14 ++ >>> c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c | 139 ++++++++++++ >>> c/src/lib/libbsp/i386/virtualpok/configure.ac | 23 ++ >>> c/src/lib/libbsp/i386/virtualpok/console/console.c | 184 +++++++++++++++ >>> c/src/lib/libbsp/i386/virtualpok/include/bsp.h | 53 +++++ >>> .../virtualpok/include/virtualizationlayerbsp.h | 62 +++++ >>> c/src/lib/libbsp/i386/virtualpok/irq/irq.c | 85 +++++++ >>> c/src/lib/libbsp/i386/virtualpok/irq/irq.h | 79 +++++++ >>> .../i386/virtualpok/make/custom/virtualpok.cfg | 17 ++ >>> c/src/lib/libbsp/i386/virtualpok/preinstall.am | 79 +++++++ >>> c/src/lib/libbsp/i386/virtualpok/start/start.S | 37 +++ >>> .../i386/virtualpok/startup/bspgetworkarea.c | 102 +++++++++ >>> .../lib/libbsp/i386/virtualpok/startup/bspstart.c | 41 ++++ >>> c/src/lib/libbsp/i386/virtualpok/startup/linkcmds | 251 >>> +++++++++++++++++++++ >>> 17 files changed, 1278 insertions(+) >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/Makefile.am >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/README.virt >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/bsp_specs >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/configure.ac >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/console/console.c >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/include/bsp.h >>> create mode 100644 >>> c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/irq/irq.c >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/irq/irq.h >>> create mode 100644 >>> c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/preinstall.am >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/start/start.S >>> create mode 100644 >>> c/src/lib/libbsp/i386/virtualpok/startup/bspgetworkarea.c >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c >>> create mode 100644 c/src/lib/libbsp/i386/virtualpok/startup/linkcmds >>> >>> diff --git a/c/src/lib/libbsp/i386/acinclude.m4 >>> b/c/src/lib/libbsp/i386/acinclude.m4 >>> index a2f2384..2d60714 100644 >>> --- a/c/src/lib/libbsp/i386/acinclude.m4 >>> +++ b/c/src/lib/libbsp/i386/acinclude.m4 >>> @@ -4,6 +4,8 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR], >>> case "$1" in >>> pc386 ) >>> AC_CONFIG_SUBDIRS([pc386]);; >>> + virtualpok ) >>> + AC_CONFIG_SUBDIRS([virtualpok]);; >>> *) >>> AC_MSG_ERROR([Invalid BSP]);; >>> esac >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/Makefile.am >>> b/c/src/lib/libbsp/i386/virtualpok/Makefile.am >>> new file mode 100644 >>> index 0000000..e545962 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/Makefile.am >>> @@ -0,0 +1,87 @@ >>> +## >>> + >>> +ACLOCAL_AMFLAGS = -I ../../../../aclocal >>> + >>> +include $(top_srcdir)/../../../../automake/compile.am >>> +include $(top_srcdir)/../../bsp.am >>> + >>> +include_bspdir = $(includedir)/bsp >>> + >>> +dist_project_lib_DATA = bsp_specs >>> + >>> +include_HEADERS = include/bsp.h >>> +include_HEADERS += ../../shared/include/tm27.h >>> +include_HEADERS += include/virtualizationlayerbsp.h >>> +#include_HEADERS += include/virtualizationlayercpu.h >>> + >>> +nodist_include_HEADERS = include/bspopts.h >>> +nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h >>> +DISTCLEANFILES = include/bspopts.h >>> +noinst_PROGRAMS = >>> + >>> +include_bsp_HEADERS = irq/irq.h >>> +include_bsp_HEADERS += ../../shared/include/irq-generic.h >>> +#include_bsp_HEADERS += >>> + >>> +nodist_include_HEADERS += ../../shared/include/coverhd.h >>> + >>> +#noinst_LIBRARIES = libbspstart.a >>> +#libbspstart_a_SOURCES = start/_start.S >>> + >>> +dist_project_lib_DATA += startup/linkcmds >>> + >>> +noinst_LIBRARIES = libbsp.a >>> +libbsp_a_SOURCES = >>> + >>> +# startup >>> +libbsp_a_SOURCES += start/start.S >>> +project_lib_DATA = start.$(OBJEXT) >>> +libbsp_a_SOURCES += ../../shared/bspclean.c >>> +libbsp_a_SOURCES += ../../shared/bsplibc.c >>> +libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c >>> +libbsp_a_SOURCES += ../../shared/bsppredriverhook.c >>> +libbsp_a_SOURCES += startup/bspgetworkarea.c >>> +libbsp_a_SOURCES += ../../shared/bsppost.c >>> +libbsp_a_SOURCES += startup/bspstart.c >>> +libbsp_a_SOURCES += ../../shared/bootcard.c >>> +libbsp_a_SOURCES += ../../shared/sbrk.c >>> +libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c >>> +libbsp_a_SOURCES += ../../shared/bspreset_loop.c >>> +libbsp_a_SOURCES += irq/irq.c >>> +libbsp_a_SOURCES += ../../shared/src/irq-generic.c >>> +# TODO I don't really need an IDT, don't I? >>> +libbsp_a_SOURCES += ../../i386/shared/irq/idt.c >>> + >>> +# clock >>> +libbsp_a_SOURCES += clock/ckinit.c >>> +# console >>> +libbsp_a_SOURCES += console/console.c >>> +# timer >>> +#libbsp_a_SOURCES += timer/timer.c timer/timerisr.c >>> + >>> +libbsp_a_LIBADD = ../../../libcpu/@RTEMS_CPU@/cache.rel >>> +libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/page.rel >>> +libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/score.rel >>> + >>> +noinst_LIBRARIES += libpokpart.a >>> + >>> +libpokpart.a : >>> + cp -u $(top_srcdir)/libpart.a . >>> + ar t libpart.a > libpart.list >>> + sed -e "s/\.lo/\.o/g" libpart.list > libpart.o.list >>> + ar x libpart.a >>> + rename .lo .o `cat libpart.list` >>> + ar q libbsp.a `cat libpart.o.list` >>> +# ar cru libpokpart.a `cat libpart.o.list` >>> +# rm `cat libpart.o.list` is optional as all files get overwritten with new >>> +# ones by 'ar x'. But I think it's bad style to remove object files during >>> +# compilation. >>> + >>> + >>> +#libpokpart_a_LIBADD = libpart.a >>> + >>> + >>> +EXTRA_DIST = times >>> + >>> +include $(srcdir)/preinstall.am >>> +include $(top_srcdir)/../../../../automake/local.am >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/README.virt >>> b/c/src/lib/libbsp/i386/virtualpok/README.virt >>> new file mode 100644 >>> index 0000000..47382ca >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/README.virt >>> @@ -0,0 +1,23 @@ >>> +Author: Philipp Eppelt >>> + philipp.epp...@mailbox.tu-dresden.de >>> + >>> +This BSP is intended to be used with POK. Other hosts are currently not >>> +supported. >>> + >>> +The BSP uses functions from the virtualization layer. The host system has >>> to >>> +provide a library implementing the function specified in the virtualization >>> +layer. Otherwise the compilation process will fail. >>> + >>> +Further information on the project can be obtained in the RTEMS Wiki: >>> +wiki.rtems.org/wiki/index.php/GSOC_2013_-_Paravirtualization_of_RTEMS >>> + >>> + >>> +== ATTENTION == >>> +In order to build this BSP you need a library file called "libpart.a". This >>> +file is produced by POK after you compiled the rtems-guest example found >>> here: >>> +https://github.com/phipse/pok >>> + >>> +Then you have to copy libpart.a to this folder. Now you should be able to >>> +compile. >>> +Further information can be found here: >>> +http://phipse.github.io/rtems/blog/2013/07/08/HelloWorld/ >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/bsp_specs >>> b/c/src/lib/libbsp/i386/virtualpok/bsp_specs >>> new file mode 100644 >>> index 0000000..861b21e >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/bsp_specs >>> @@ -0,0 +1,14 @@ >>> +%rename lib old_lib >>> + >>> +*endfile: >>> +crtend.o%s crtn.o%s >>> + >>> +*startfile: >>> +%{!qrtems: %(old_startfile)} \ >>> +%{!nostdlib: %{qrtems: crti.o%s crtbegin.o%s }} >>> + >>> +*lib: >>> +%{!qrtems: %(old_lib)} \ >>> +%{!nostdlib: %{qrtems: --start-group -lrtemsbsp -lrtemscpu -lc -lgcc >>> --end-group \ >>> +%{!qnolinkcmds: -T linkcmds%s}}} >>> + >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c >>> b/c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c >>> new file mode 100644 >>> index 0000000..d36eb3d >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/clock/ckinit.c >>> @@ -0,0 +1,139 @@ >>> +/* ckinit.c >>> + * >>> + * This file provides a clock device driver to be used with the >>> + * virtualizationlayer. >>> + * >>> + * COPYRIGHT (c) 2013. >>> + * Philipp Eppelt. >>> + * >>> + * COPYRIGHT (c) 1989-1999. >>> + * On-Line Applications Research Corporation (OAR). >>> + * >>> + * The license and distribution terms for this file may be >>> + * found in the file LICENSE in this distribution or at >>> + * http://www.rtems.com/license/LICENSE. >>> + * >>> + */ >>> + >>> +#include <stdlib.h> >>> +#include <stdio.h> >>> + >>> +#include <bsp.h> >>> +#include <bsp/irq.h> >>> + >>> +#include <rtems.h> >>> +#include <rtems/config.h> >>> +#include <rtems/score/tod.h> >>> +#include <rtems/score/watchdog.h> >>> +#include <rtems/score/timestamp.h> >>> +#include <assert.h> >>> +#include <rtems/score/virtualizationlayercpu.h> >>> +#include <virtualizationlayerbsp.h> >>> + >>> + >>> +void Clock_isr(void *param); >>> +static void Clock_isr_handler(void *param); >>> +/* >>> + * The interrupt vector number associated with the clock tick device >>> + * driver. >>> + */ >>> + >>> +#define CLOCK_VECTOR 0x0 >>> + >>> +/* >>> + * Clock_driver_ticks is a monotonically increasing counter of the >>> + * number of clock ticks since the driver was initialized. >>> + */ >>> + >>> +volatile uint32_t pc386_microseconds_per_isr; >>> +volatile uint32_t pc386_isrs_per_tick; >>> +volatile uint32_t Clock_driver_ticks; >>> + >>> +void (*Clock_driver_support_at_tick)(void) = NULL; >>> + >>> +#define Clock_driver_support_install_isr( _new, _old ) \ >>> + do { \ >>> + _old = NULL; \ >>> + } while(0) >>> + >>> +bool Clock_isr_enabled = false; >>> + >>> +static void Clock_isr_handler(void *param) >>> +{ >>> + if ( Clock_isr_enabled ) >>> + Clock_isr( param ); >>> +} // Clock_isr_handler >>> + >>> +static void Clock_driver_support_at_tick_empty(void) >>> +{ >>> +} >>> + >>> +/** >>> + * @brief Enable clock device; start receiving clock interrupts. >>> + */ >>> +static void clockOn(void) >>> +{ >>> + pc386_isrs_per_tick = 1; >>> + pc386_microseconds_per_isr = >>> rtems_configuration_get_microseconds_per_tick(); >>> + >>> + _CPU_Virtual_Irq_request( CLOCK_VECTOR ); >>> +} // clockOn >>> + >>> +/** >>> + * @brief Disable clock device; stop receiving clock interrupts. >>> + */ >>> +static void clockOff(void) >>> +{ >>> + _CPU_Virtual_Irq_detach( CLOCK_VECTOR ); >>> +} // clockOff >>> + >>> +/** >>> + * @brief Install the clock ISR in the RTEMS interrupt table. >>> + */ >>> +void Clock_driver_install_handler(void); >>> +void Clock_driver_install_handler(void) >>> +{ >>> + rtems_status_code status; >>> + >>> + status = rtems_interrupt_handler_install( >>> + BSP_PERIODIC_TIMER, >>> + "ckinit", >>> + RTEMS_INTERRUPT_UNIQUE, >>> + Clock_isr_handler, >>> + NULL >>> + ); >>> + if(status != RTEMS_SUCCESSFUL) >>> + printf( "ERROR: During clock interrupt handler install: %i\n", status); >>> + else >>> + printf( "CLOCK DRIVER installed successfully\n"); >>> + >>> + clockOn(); >>> +} // Clock_driver_install_handler >>> + >>> +uint32_t (*Clock_driver_nanoseconds_since_last_tick)(void) = NULL; >>> + >>> +/** >>> + * @brief Setup the clock driver. >>> + */ >>> +void Clock_driver_support_initialize_hardware(void); >>> +void Clock_driver_support_initialize_hardware(void) >>> +{ >>> + Clock_driver_support_at_tick = Clock_driver_support_at_tick_empty; >>> + >>> + Clock_isr_enabled = true; >>> +} // Clock_driver_support_initialize_hardware >>> + >>> +#define Clock_driver_support_shutdown_hardware() \ >>> + do { \ >>> + rtems_status_code status; \ >>> + clockOff(); \ >>> + status = rtems_interrupt_handler_remove( \ >>> + BSP_PERIODIC_TIMER, \ >>> + Clock_isr_handler, \ >>> + NULL \ >>> + ); \ >>> + assert(status == RTEMS_SUCCESSFUL); \ >>> + } while (0) >>> + >>> + >>> +#include "../../../shared/clockdrv_shell.h" >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/configure.ac >>> b/c/src/lib/libbsp/i386/virtualpok/configure.ac >>> new file mode 100644 >>> index 0000000..eca01cc >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/configure.ac >>> @@ -0,0 +1,23 @@ >>> +## Process this file with autoconf to produce a configure script. >>> +## >>> + >>> +AC_PREREQ([2.68]) >>> +AC_INIT([rtems-c-src-lib-libbsp-i386-virtualpok],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla]) >>> +AC_CONFIG_SRCDIR([bsp_specs]) >>> +RTEMS_TOP(../../../../../..) >>> + >>> +RTEMS_CANONICAL_TARGET_CPU >>> +AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2]) >>> +RTEMS_BSP_CONFIGURE >>> + >>> +RTEMS_PROG_CC_FOR_TARGET >>> +RTEMS_CANONICALIZE_TOOLS >>> +RTEMS_PROG_CCAS >>> + >>> +AC_SUBST([RTEMS_ROOT],[${rtems_updir}'$(top_builddir)']) >>> + >>> +RTEMS_BSP_CLEANUP_OPTIONS(0, 0) >>> + >>> +# Explicitly list all Makefiles here >>> +AC_CONFIG_FILES([Makefile]) >>> +AC_OUTPUT >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/console/console.c >>> b/c/src/lib/libbsp/i386/virtualpok/console/console.c >>> new file mode 100644 >>> index 0000000..51ff319 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/console/console.c >>> @@ -0,0 +1,184 @@ >>> +/* >>> + * This file contains the template for a console IO package. >>> + * >>> + * COPYRIGHT (c) 2013 Philipp Eppelt. >>> + * >>> + * COPYRIGHT (c) 1989-1999. >>> + * On-Line Applications Research Corporation (OAR). >>> + * >>> + * The license and distribution terms for this file may be >>> + * found in the file LICENSE in this distribution or at >>> + * http://www.rtems.com/license/LICENSE. >>> + * >>> + */ >>> + >>> +#define NO_BSP_INIT >>> + >>> +#include <bsp.h> >>> +#include <rtems/libio.h> >>> +#include <virtualizationlayerbsp.h> >>> + >>> +/** >>> + * @brief Initializes the console. >>> + */ >>> +rtems_device_driver console_initialize( >>> + rtems_device_major_number major, >>> + rtems_device_minor_number minor, >>> + void *arg >>> +) >>> +{ >>> + rtems_status_code status; >>> + >>> + status = rtems_io_register_name( >>> + "/dev/console", >>> + major, >>> + (rtems_device_minor_number) 0 >>> + ); >>> + >>> + if (status != RTEMS_SUCCESSFUL) >>> + { >>> + rtems_fatal_error_occurred(status); >>> + } >>> + >>> +// Virtual console init >>> + status = _BSP_Virtual_Console_init(); >>> + >>> + if( status != 0 ) >>> + { >>> + rtems_fatal_error_occurred(status); >>> + } >>> + >>> + return RTEMS_SUCCESSFUL; >>> +} >>> + >>> +/** >>> + * @brief Read a char from the virtual console (if supported). >>> + */ >>> +char inbyte( void ) >>> +{ >>> + return _BSP_Virtual_Char_read(); >>> +} >>> + >>> + >>> +/** >>> + * @brief Write a char to the virtual console. >>> + */ >>> +void outbyte( >>> + char ch >>> +) >>> +{ >>> + _BSP_Virtual_Char_write(&ch); >>> +} >>> + >>> +/* printk support */ >>> +BSP_output_char_function_type BSP_output_char = outbyte; >>> +BSP_polling_getchar_function_type BSP_poll_char = inbyte; >>> + >>> + >>> +/* Console support */ >>> + >>> +/* >>> + * It is mostly a translation of termios intended calls to the char by char >>> + * printk interface. >>> + */ >>> + >>> +/** >>> + * @brief Does nothing. >>> + */ >>> +rtems_device_driver console_open( >>> + rtems_device_major_number major, >>> + rtems_device_minor_number minor, >>> + void * arg >>> +) >>> +{ >>> + return RTEMS_SUCCESSFUL; >>> +} >>> + >>> +/** >>> + * @brief Does nothing. >>> + */ >>> +rtems_device_driver console_close( >>> + rtems_device_major_number major, >>> + rtems_device_minor_number minor, >>> + void * arg >>> +) >>> +{ >>> + return RTEMS_SUCCESSFUL; >>> +} >>> + >>> +/* >>> + * read bytes from the serial port. We only have stdin. >>> + */ >>> + >>> +/** >>> + * @brief Looks like termios, but reads through inbyte() function. >>> + */ >>> +rtems_device_driver console_read( >>> + rtems_device_major_number major, >>> + rtems_device_minor_number minor, >>> + void * arg >>> +) >>> +{ >>> + rtems_libio_rw_args_t *rw_args; >>> + char *buffer; >>> + int maximum; >>> + int count = 0; >>> + >>> + rw_args = (rtems_libio_rw_args_t *) arg; >>> + >>> + buffer = rw_args->buffer; >>> + maximum = rw_args->count; >>> + >>> + for (count = 0; count < maximum; count++) { >>> + buffer[ count ] = inbyte(); >>> + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { >>> + buffer[ count++ ] = '\n'; >>> + break; >>> + } >>> + } >>> + >>> + rw_args->bytes_moved = count; >>> + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; >>> +} >>> + >>> +/** >>> + * @brief Looks like termios, but writes through outbyte() function. >>> + */ >>> +rtems_device_driver console_write( >>> + rtems_device_major_number major, >>> + rtems_device_minor_number minor, >>> + void * arg >>> +) >>> +{ >>> + int count; >>> + int maximum; >>> + rtems_libio_rw_args_t *rw_args; >>> + char *buffer; >>> + >>> + rw_args = (rtems_libio_rw_args_t *) arg; >>> + >>> + buffer = rw_args->buffer; >>> + maximum = rw_args->count; >>> + >>> + for (count = 0; count < maximum; count++) { >>> + if ( buffer[ count ] == '\n') { >>> + outbyte('\r'); >>> + } >>> + outbyte( buffer[ count ] ); >>> + } >>> + >>> + rw_args->bytes_moved = maximum; >>> + return 0; >>> +} >>> + >>> +/** >>> + * @brief Does nothing! >>> + */ >>> +rtems_device_driver console_control( >>> + rtems_device_major_number major, >>> + rtems_device_minor_number minor, >>> + void * arg >>> +) >>> +{ >>> + return RTEMS_SUCCESSFUL; >>> +} >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/include/bsp.h >>> b/c/src/lib/libbsp/i386/virtualpok/include/bsp.h >>> new file mode 100644 >>> index 0000000..1d781ba >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/include/bsp.h >>> @@ -0,0 +1,53 @@ >>> +/* bsp.h >>> + * >>> + * This include file contains all board IO definitions. >>> + * >>> + * COPYRIGHT (c) 2013 Philipp Eppelt. >>> + * >>> + * COPYRIGHT (c) 1989-1999. >>> + * On-Line Applications Research Corporation (OAR). >>> + * >>> + * The license and distribution terms for this file may be >>> + * found in the file LICENSE in this distribution or at >>> + * http://www.rtems.com/license/LICENSE. >>> + * >>> + */ >>> + >>> +#ifndef _BSP_H >>> +#define _BSP_H >>> + >>> +#include <bspopts.h> >>> + >>> +#include <rtems.h> >>> +#include <rtems/console.h> >>> +#include <rtems/clockdrv.h> >>> + >>> +#ifdef __cplusplus >>> +extern "C" { >>> +#endif >>> + >>> +/* >>> + * Simple spin delay in microsecond units for device drivers. >>> + * This is very dependent on the clock speed of the target. >>> + */ >>> + >>> +#define rtems_bsp_delay( microseconds ) \ >>> + { \ >>> + } >>> + >>> + >>> + >>> +#define BSP_DEFAULT_UNIFIED_WORK_AREAS 1 >>> +/* functions */ >>> + >>> +rtems_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 */ >>> +); >>> + >>> +#ifdef __cplusplus >>> +} >>> +#endif >>> + >>> +#endif >>> diff --git >>> a/c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h >>> b/c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h >>> new file mode 100644 >>> index 0000000..a329610 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/include/virtualizationlayerbsp.h >>> @@ -0,0 +1,62 @@ >>> +/* >>> + * >>> + * COPYRIGHT (c) 2013 Philipp Eppelt. >>> + * philipp.epp...@mailbox.tu-dresden.de >>> + * >>> + * Purpose: BSP part of the virtualization layer. >>> + * >>> + * The license and distribution terms for this file may be >>> + * found in the file LICENSE in this distribution or at >>> + * http://www.rtems.com/license/LICENSE. >>> + */ >>> + >>> +#ifndef RTEMS_VIRT_LAYER_BSP_H >>> +#define RTEMS_VIRT_LAYER_BSP_H >>> + >>> +/** >>> + * \brief Initializes the console. >>> + * >>> + */ >>> +int >>> +_BSP_Virtual_Console_init(void); >>> + >>> +/** >>> + * \brief Reads a character from the console. >>> + */ >>> +char >>> +_BSP_Virtual_Char_read(void); >>> + >>> +/** >>> + * \brief Writes a character to the console. >>> + */ >>> +void >>> +_BSP_Virtual_Char_write(char* c); >>> + >>> +/** >>> + * \brief Initializes the clock. >>> + */ >>> +int >>> +_BSP_Virtual_Clock_init(void); >>> + >>> +/** >>> + * \brief Reads the clock. >>> + */ >>> +int >>> +_BSP_Virtual_Clock_read(void); >>> + >>> +/** >>> + * \brief Handles faults delivered by the host system. >>> + * >>> + * POK will forward occuring faults to this handler. >>> + */ >>> +int >>> +_BSP_Virtual_faulthandler(void); >>> + >>> + >>> +/* Startup functions >>> + */ >>> + >>> +int >>> +_BSP_Virtual_getworkspacearea( void ); >>> + >>> +#endif /* RTEMS_VIRT_LAYER_BSP_H */ >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/irq/irq.c >>> b/c/src/lib/libbsp/i386/virtualpok/irq/irq.c >>> new file mode 100644 >>> index 0000000..a095e26 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/irq/irq.c >>> @@ -0,0 +1,85 @@ >>> +#include <bsp/irq-generic.h> >>> +#include <stdlib.h> >>> +#include <stdio.h> >>> +#include <inttypes.h> /* PRIu32 */ >>> +#include <virtualizationlayerbsp.h> >>> + >>> +uint32_t irq_count[BSP_IRQ_LINES_NUMBER] = {0}; >>> + >>> +uint32_t >>> +BSP_irq_count_dump(FILE *f) >>> +{ >>> + uint32_t tot = 0; >>> + int i; >>> + if ( !f ) >>> + f = stdout; >>> + for ( i=0; i<BSP_IRQ_LINES_NUMBER; i++ ) { >>> + tot += irq_count[i]; >>> + fprintf(f,"IRQ %2u: %9"PRIu32"\n", i, irq_count[i]); >>> + } >>> + return tot; >>> +} >>> + >>> +/** >>> + * @brief Enable vector line at interrupt source. See description! >>> + * >>> + * Currently this is only a dummy function, as registering the vector on >>> POK >>> + * will deliver interrupts before the handler is installed. So the driver >>> + * needing the interrupt needs to call _CPU_Virtual_Irq_attach(). >>> + */ >>> +rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) >>> +{ >>> + >>> + return RTEMS_SUCCESSFUL; >>> +} >>> + >>> +/** >>> + * @brief Disabling vector line at interrupt source. >>> + */ >>> +rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector) >>> +{ >>> + _CPU_Virtual_Irq_detach( vector ); >>> + >>> + return RTEMS_SUCCESSFUL; >>> +} >>> + >>> +/** >>> + * @brief Dummy function; necessary for a normal startup. >>> + */ >>> +rtems_status_code bsp_interrupt_facility_initialize(void) >>> +{ >>> + return RTEMS_SUCCESSFUL; >>> +} >>> + >>> +/** >>> + * @brief If no interrupt handler is installed for a specified vector >>> number, >>> + * this is called and will output a warning. >>> + */ >>> +void bsp_interrupt_handler_default(rtems_vector_number vector) >>> +{ >>> + printk( "WARNING: Somebody forgot to register a handler for this >>> interrupt: %x \n", vector ); >>> +} >>> + >>> +/** >>> + * @brief Forwards the interrupt to bsp_interrupt_handler_dispatch to look >>> for >>> + * the right handler. >>> + */ >>> +void C_dispatch_isr(int vector) >>> +{ >>> + irq_count[vector]++; >>> + bsp_interrupt_handler_dispatch(vector); >>> +} >>> + >>> +/** >>> + * @brief Initializes interrupts management. >>> + * >>> + * Called by bsp_start(), does all necessary IRQ initialization. >>> + */ >>> +void rtems_irq_mngt_init(void) >>> +{ >>> + /* >>> + * Init initial Interrupt management config >>> + */ >>> + bsp_interrupt_initialize(); >>> + printf("bsp_interrupt_initialize successful\n"); >>> +} >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/irq/irq.h >>> b/c/src/lib/libbsp/i386/virtualpok/irq/irq.h >>> new file mode 100644 >>> index 0000000..83aa109 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/irq/irq.h >>> @@ -0,0 +1,79 @@ >>> +/* irq.h >>> + * >>> + * This include file describe the data structure and the functions >>> implemented >>> + * by rtems to write interrupt handlers. >>> + * >>> + * CopyRight (C) 1998 vale...@crf.canon.fr >>> + * >>> + * This code is heavilly inspired by the public specification of STREAM V2 >>> + * that can be found at : >>> + * >>> + * <http://www.chorus.com/Documentation/index.html> by following >>> + * the STREAM API Specification Document link. >>> + * >>> + * The license and distribution terms for this file may be >>> + * found in the file LICENSE in this distribution or at >>> + * http://www.rtems.com/license/LICENSE. >>> + */ >>> + >>> +/* >>> + * The code here is to accomodate some drivers from the i386 shared >>> directory, >>> + * for the POK BSP they are useless but removing will break compilation. >>> + * >>> + * Leaving this to be here is harmless, this code can be thrown when the >>> POK >>> + * BSP gets its own architecture directory. >>> + */ >>> +#ifndef _IRQ_H_ >>> +#define _IRQ_H_ >>> + >>> +#ifdef __cplusplus >>> +extern "C" { >>> +#endif >>> + >>> +/* >>> + * Include some preprocessor value also used by assember code >>> + */ >>> + >>> +#include <rtems.h> >>> +#define BSP_SHARED_HANDLER_SUPPORT 1 >>> +#include <rtems/irq.h> >>> +#include <rtems/irq-extension.h> >>> + >>> +/*-------------------------------------------------------------------------+ >>> +| Constants >>> ++--------------------------------------------------------------------------*/ >>> + >>> + /* Base vector for our IRQ handlers. */ >>> +#define BSP_IRQ_LINES_NUMBER 16 >>> +#define BSP_LOWEST_OFFSET 0 >>> +#define BSP_MAX_OFFSET (BSP_IRQ_LINES_NUMBER - 1) >>> + /* >>> + * Interrupt offset in comparison to BSP_ASM_IRQ_VECTOR_BASE >>> + * NB : 1) Interrupt vector number in IDT = offset + >>> BSP_ASM_IRQ_VECTOR_BASE >>> + * 2) The same name should be defined on all architecture >>> + * so that handler connection can be unchanged. >>> + */ >>> +#define BSP_PERIODIC_TIMER 0 >>> +#define BSP_KEYBOARD 1 /* can't be used, as POK doesn't support >>> keyboards */ >>> +#define BSP_UART_COM2_IRQ 3 >>> +#define BSP_UART_COM1_IRQ 4 >>> +#define BSP_UART_COM3_IRQ 5 >>> +#define BSP_UART_COM4_IRQ 6 >>> +#define BSP_RT_TIMER1 8 >>> +#define BSP_RT_TIMER3 10 >>> +#define BSP_SMP_IPI 16 >>> + >>> +#define BSP_INTERRUPT_VECTOR_MIN BSP_LOWEST_OFFSET >>> +#define BSP_INTERRUPT_VECTOR_MAX BSP_MAX_OFFSET >>> + >>> +/*-------------------------------------------------------------------------+ >>> +| Function Prototypes. >>> ++--------------------------------------------------------------------------*/ >>> + >>> +void C_dispatch_isr(int vector); >>> + >>> +#ifdef __cplusplus >>> +} >>> +#endif >>> + >>> +#endif /* _IRQ_H_ */ >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg >>> b/c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg >>> new file mode 100644 >>> index 0000000..a280b9d >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/make/custom/virtualpok.cfg >>> @@ -0,0 +1,17 @@ >>> +# >>> +# Configuration file for the "virtualpok" board >>> +# >>> + >>> +include $(RTEMS_ROOT)/make/custom/default.cfg >>> + >>> +RTEMS_CPU=i386 >>> +RTEMS_CPU_MODEL=pentium >>> + >>> +#CPU_CFLAGS = >>> + >>> +# debug info >>> +CFLAGS_OPTIMIZE_V = -g >>> + >>> +# Miscellaneous additions go here >>> + >>> +#see pc386/make/custom/ for more information >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/preinstall.am >>> b/c/src/lib/libbsp/i386/virtualpok/preinstall.am >>> new file mode 100644 >>> index 0000000..698ede6 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/preinstall.am >>> @@ -0,0 +1,79 @@ >>> +## Automatically generated by ampolish3 - Do not edit >>> + >>> +if AMPOLISH3 >>> +$(srcdir)/preinstall.am: Makefile.am >>> + $(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am >>> +endif >>> + >>> +PREINSTALL_DIRS = >>> +DISTCLEANFILES += $(PREINSTALL_DIRS) >>> + >>> +all-local: $(TMPINSTALL_FILES) >>> + >>> +TMPINSTALL_FILES = >>> +CLEANFILES = $(TMPINSTALL_FILES) >>> + >>> +all-am: $(PREINSTALL_FILES) >>> + >>> +PREINSTALL_FILES = >>> +CLEANFILES += $(PREINSTALL_FILES) >>> + >>> +$(PROJECT_LIB)/$(dirstamp): >>> + @$(MKDIR_P) $(PROJECT_LIB) >>> + @: > $(PROJECT_LIB)/$(dirstamp) >>> +PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp) >>> + >>> +$(PROJECT_INCLUDE)/$(dirstamp): >>> + @$(MKDIR_P) $(PROJECT_INCLUDE) >>> + @: > $(PROJECT_INCLUDE)/$(dirstamp) >>> +PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp) >>> + >>> +$(PROJECT_INCLUDE)/bsp/$(dirstamp): >>> + @$(MKDIR_P) $(PROJECT_INCLUDE)/bsp >>> + @: > $(PROJECT_INCLUDE)/bsp/$(dirstamp) >>> +PREINSTALL_DIRS += $(PROJECT_INCLUDE)/bsp/$(dirstamp) >>> + >>> +$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs >>> +PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs >>> + >>> +$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h >>> + >>> +$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h >>> $(PROJECT_INCLUDE)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h >>> + >>> +$(PROJECT_INCLUDE)/virtualizationlayerbsp.h: >>> include/virtualizationlayerbsp.h $(PROJECT_INCLUDE)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/virtualizationlayerbsp.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/virtualizationlayerbsp.h >>> + >>> +$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h >>> $(PROJECT_INCLUDE)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h >>> + >>> +$(PROJECT_INCLUDE)/bsp/bootcard.h: ../../shared/include/bootcard.h >>> $(PROJECT_INCLUDE)/bsp/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h >>> + >>> +$(PROJECT_INCLUDE)/bsp/irq.h: irq/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h >>> + >>> +$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h >>> $(PROJECT_INCLUDE)/bsp/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h >>> + >>> +$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h >>> $(PROJECT_INCLUDE)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h >>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h >>> + >>> +$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds >>> +PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds >>> + >>> +$(PROJECT_LIB)/start.$(OBJEXT): start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp) >>> + $(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT) >>> +TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT) >>> + >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/start/start.S >>> b/c/src/lib/libbsp/i386/virtualpok/start/start.S >>> new file mode 100644 >>> index 0000000..5048586 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/start/start.S >>> @@ -0,0 +1,37 @@ >>> +/* >>> + * COPYRIGHT (c) 2013/ >>> + * Philipp Eppelt. >>> + * >>> + * Contact: philipp.epp...@mailbox.tu-dresden.de >>> + * >>> + * Purpose: Provides GNU entry point and directly go to bootcard. >>> + */ >>> + >>> +#include <rtems/asm.h> >>> +#include <rtems/score/cpu.h> >>> + >>> + >>> +#ifndef CPU_STACK_ALIGNMENT >>> +#error "Missing header ? CPU_STACK_ALIGNMENT NOT DEFINED" >>> +#endif >>> + >>> +.set STACK_SIZE, 0x1000 >>> + >>> +/*----------------------------------------------------------------------------+ >>> +| CODE section >>> ++----------------------------------------------------------------------------*/ >>> + >>> +BEGIN_CODE >>> + >>> + PUBLIC (start) # GNU default entry point >>> + >>> + EXTERN (boot_card) >>> + EXTERN (bsp_reset) >>> + >>> + >>> +SYM (start): >>> + >>> + call SYM (boot_card) >>> + >>> + # TODO when this returns there should be some shut down handling >>> + call SYM (bsp_reset) >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/startup/bspgetworkarea.c >>> b/c/src/lib/libbsp/i386/virtualpok/startup/bspgetworkarea.c >>> new file mode 100644 >>> index 0000000..562a8e9 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/startup/bspgetworkarea.c >>> @@ -0,0 +1,102 @@ >>> +/* >>> + * This routine is an implementation of the bsp_get_work_area() >>> + * that can be used by all BSPs following linkcmds conventions >>> + * regarding heap, stack, and workspace allocation. >>> + * >>> + * COPYRIGHT (c) 1989-2008. >>> + * On-Line Applications Research Corporation (OAR). >>> + * >>> + * Copyright (c) 2011 embedded brains GmbH. >>> + * >>> + * The license and distribution terms for this file may be >>> + * found in the file LICENSE in this distribution or at >>> + * http://www.rtems.com/license/LICENSE. >>> + */ >>> + >>> +/* #define BSP_GET_WORK_AREA_DEBUG */ >>> + >>> +#include <bsp.h> >>> +#include <bsp/bootcard.h> >>> +#ifdef BSP_GET_WORK_AREA_DEBUG >>> + #include <rtems/bspIo.h> >>> +#endif >>> + >>> + >>> +/* >>> + * These are provided by the linkcmds for ALL of the BSPs which use this >>> file. >>> + */ >>> +extern char WorkAreaBase[]; >>> +extern char HeapSize[]; >>> + >>> +extern char ELFBase[]; >>> +extern char textBase[]; >>> +extern char rodataBase[]; >>> +extern char dataBase[]; >>> + >>> +unsigned long _Global_descriptor_table = 0; >>> + >>> +/* >>> + * This method returns the base address and size of the area which >>> + * is to be allocated between the RTEMS Workspace and the C Program >>> + * Heap. >>> + */ >>> +void bsp_work_area_initialize( void ) >>> +{ >>> +/* uintptr_t ELF_Base = (uintptr_t) ELFBase; >>> + uintptr_t text_Base = (uintptr_t) textBase; >>> + uintptr_t rodata_Base = (uintptr_t) rodataBase; >>> + uintptr_t data_Base = (uintptr_t) dataBase; >>> +*/ >>> + uintptr_t work_base = (uintptr_t) WorkAreaBase; >>> + uint32_t work_size = 0x100000 * 4; >>> +// uint32_t base_addr = 0; >>> +// uint32_t pok_stack_size = 0; >>> + >>> + // TODO add call to virtlayer to get space >>> + bsp_work_area_initialize_default( work_base, work_size ); >>> +/* >>> + *work_area_start = (void *) work_base + pok_stack_size; >>> + *work_area_size = size - work_base - pok_stack_size; >>> + *heap_start = 0; >>> + *heap_size = (uintptr_t) HeapSize; >>> +*/ >>> + /* >>> + * The following may be helpful in debugging what goes wrong when >>> + * you are allocating the Work Area in a new BSP. >>> + */ >>> + #ifdef BSP_GET_WORK_AREA_DEBUG >>> + { >>> + void *sp = __builtin_frame_address(0); >>> + void *end = *work_area_start + *work_area_size; >>> + printk( >>> + "ELFBase = 0x%p\n" >>> + "textBase = 0x%p\n" >>> + "rodataBase = 0x%p\n" >>> + "dataBase = 0x%p\n" >>> + "work_area_start (base_addr) = 0x%p\n" >>> + "WorkAreaBase = 0x%p\n" >>> + "work_area_size = %d 0x%08x\n" >>> + "end = 0x%p\n" >>> + "heap_start = 0x%p\n" >>> + "heap_size = %d\n" >>> + "pok stack size = 0x%p\n" >>> + "current stack pointer = 0x%p%s\n", >>> + ELF_Base, >>> + text_Base, >>> + rodata_Base, >>> + data_Base, >>> + *work_area_start, >>> + work_base, >>> + *work_area_size, /* decimal */ >>> + *work_area_size, /* hexadecimal */ >>> + end, >>> + *heap_start, >>> + *heap_size, >>> + pok_stack_size, >>> + sp, >>> + ((sp >= *work_area_start && sp <= end) ? " OVERLAPS!" : "") >>> + ); >>> + } >>> + #endif >>> + >>> +} >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c >>> b/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c >>> new file mode 100644 >>> index 0000000..e787f96 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c >>> @@ -0,0 +1,41 @@ >>> +/* >>> + * 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-1999. >>> + * On-Line Applications Research Corporation (OAR). >>> + * >>> + * The license and distribution terms for this file may be >>> + * found in the file LICENSE in this distribution or at >>> + * http://www.rtems.com/license/LICENSE. >>> + * >>> + */ >>> + >>> +#include <string.h> >>> + >>> +#include <bsp.h> >>> +#include <rtems.h> >>> +#include <rtems/bspIo.h> >>> +#include <virtualizationlayerbsp.h> >>> + >>> + >>> +extern void rtems_irq_mngt_init(void); >>> + >>> +/* >>> + * bsp_start >>> + * >>> + * This routine does the bulk of the system initialization. >>> + */ >>> +void bsp_start( void ) >>> +{ >>> + >>> + _BSP_Virtual_Char_write( "Hello RTEMS World\n" ); >>> + >>> + // Initialize IRQ management >>> + rtems_irq_mngt_init(); >>> + >>> + // Register clock driver >>> + Clock_driver_install_handler(); >>> +} >>> diff --git a/c/src/lib/libbsp/i386/virtualpok/startup/linkcmds >>> b/c/src/lib/libbsp/i386/virtualpok/startup/linkcmds >>> new file mode 100644 >>> index 0000000..a425a94 >>> --- /dev/null >>> +++ b/c/src/lib/libbsp/i386/virtualpok/startup/linkcmds >>> @@ -0,0 +1,251 @@ >>> +/* >>> + * Copy of default "default linker script, for normal executables" >>> + * provided with binutils 2.18 with minor modifications for use >>> + * as pc386 linkcmds. These changes include: >>> + * >>> + * + sections commented out marked with "XXX commented out --joel" >>> + * + addition of m_hdr section >>> + * + addition of FreeBSD sysctl sections >>> + */ >>> + >>> +/* >>> + * XXX commented out --joel >>> +OUTPUT_FORMAT("elf32-i386", "elf32-i386", >>> + "elf32-i386") >>> +OUTPUT_ARCH(i386) >>> +*/ >>> +ENTRY(start) >>> +HeapSize = DEFINED(HeapSize) ? HeapSize : >>> + DEFINED(_HeapSize) ? _HeapSize : 0x0; >>> +RamBase = DEFINED(_RamBase) ? RamBase : 0x0; >>> +RamSize = DEFINED(RamSize) ? RamSize : >>> + DEFINED(_RamSize) ? _RamSize : 0xFFFFFFFF; >>> + >>> +SECTIONS >>> +{ >>> + . = 0x1000; >>> + /* Read-only sections, merged into text segment: */ >>> +/* >>> + * XXX commented out --joel >>> + PROVIDE (__executable_start = 0x08048000); . = 0x08048000 + >>> SIZEOF_HEADERS; >>> +*/ >>> + .interp : { *(.interp) } >>> + .note.gnu.build-id : { *(.note.gnu.build-id) } >>> + .hash : { *(.hash) } >>> + .gnu.hash : { *(.gnu.hash) } >>> + .dynsym : { *(.dynsym) } >>> + .dynstr : { *(.dynstr) } >>> + .gnu.version : { *(.gnu.version) } >>> + .gnu.version_d : { *(.gnu.version_d) } >>> + .gnu.version_r : { *(.gnu.version_r) } >>> + .rel.init : { *(.rel.init) } >>> + .rela.init : { *(.rela.init) } >>> + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >>> + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >>> + .rel.fini : { *(.rel.fini) } >>> + .rela.fini : { *(.rela.fini) } >>> + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >>> + .rela.rodata : { *(.rela.rodata .rela.rodata.* >>> .rela.gnu.linkonce.r.*) } >>> + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) >>> } >>> + .rela.data.rel.ro : { *(.rela.data.rel.ro* >>> .rela.gnu.linkonce.d.rel.ro.*) } >>> + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >>> + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >>> + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >>> + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >>> + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >>> + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >>> + .rel.ctors : { *(.rel.ctors) } >>> + .rela.ctors : { *(.rela.ctors) } >>> + .rel.dtors : { *(.rel.dtors) } >>> + .rela.dtors : { *(.rela.dtors) } >>> + .rel.got : { *(.rel.got) } >>> + .rela.got : { *(.rela.got) } >>> + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >>> + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >>> + .rel.plt : { *(.rel.plt) } >>> + .rela.plt : { *(.rela.plt) } >>> + .plt : { *(.plt) } >>> + .text : >>> + { >>> + *(.m_hdr) >>> + *(.text .stub .text.* .gnu.linkonce.t.*) >>> + KEEP (*(.text.*personality*)) >>> + /* .gnu.warning sections are handled specially by elf32.em. */ >>> + *(.gnu.warning) >>> + >>> + } =0x90909090 >>> + >>> + .robsdsets : { >>> + /* for pre rtems-libbsd FreeBSD code */ >>> + __start_set_sysctl_set = .; >>> + *(set_sysctl_*); >>> + __stop_set_sysctl_set = .; >>> + *(set_domain_*); >>> + *(set_pseudo_*); >>> + >>> + /* for rtems-libbsd FreeBSD code */ >>> + _bsd__start_set_modmetadata_set = .; >>> + *(_bsd_set_modmetadata_set); >>> + _bsd__stop_set_modmetadata_set = .; >>> + >>> + _bsd__start_set_sysctl_set = .; >>> + *(_bsd_set_sysctl_set); >>> + _bsd__stop_set_sysctl_set = .; >>> + >>> + _bsd__start_set_sysinit_set = .; >>> + *(_bsd_set_sysinit_*); >>> + _bsd__stop_set_sysinit_set = .; >>> + >>> + bsp_section_rodata_end = .; >>> + >>> + } =0x90909090 >>> + >>> + .init : >>> + { >>> + KEEP (*(.init)) >>> + } =0x90909090 >>> + .fini : >>> + { >>> + KEEP (*(.fini)) >>> + } =0x90909090 >>> + PROVIDE (__etext = .); >>> + PROVIDE (_etext = .); >>> + PROVIDE (etext = .); >>> + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >>> + .rodata1 : { *(.rodata1) } >>> + .eh_frame_hdr : { *(.eh_frame_hdr) } >>> + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >>> + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table >>> .gcc_except_table.*) } >>> + /* Adjust the address for the data segment. We want to adjust up to >>> + the same address within the page on the next page up. */ >>> + . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & >>> (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT >>> (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); >>> + /* Exception handling */ >>> + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >>> + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table >>> .gcc_except_table.*) } >>> + /* Thread Local Storage sections */ >>> + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >>> + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) >>> *(.tcommon) } >>> + .preinit_array : >>> + { >>> + PROVIDE_HIDDEN (__preinit_array_start = .); >>> + KEEP (*(.preinit_array)) >>> + PROVIDE_HIDDEN (__preinit_array_end = .); >>> + } >>> + .init_array : >>> + { >>> + PROVIDE_HIDDEN (__init_array_start = .); >>> + KEEP (*(SORT(.init_array.*))) >>> + KEEP (*(.init_array)) >>> + PROVIDE_HIDDEN (__init_array_end = .); >>> + } >>> + .fini_array : >>> + { >>> + PROVIDE_HIDDEN (__fini_array_start = .); >>> + KEEP (*(.fini_array)) >>> + KEEP (*(SORT(.fini_array.*))) >>> + PROVIDE_HIDDEN (__fini_array_end = .); >>> + } >>> + .ctors : >>> + { >>> + /* gcc uses crtbegin.o to find the start of >>> + the constructors, so we make sure it is >>> + first. Because this is a wildcard, it >>> + doesn't matter if the user does not >>> + actually link against crtbegin.o; the >>> + linker won't look for a file to match a >>> + wildcard. The wildcard also means that it >>> + doesn't matter which directory crtbegin.o >>> + is in. */ >>> + KEEP (*crtbegin.o(.ctors)) >>> + KEEP (*crtbegin?.o(.ctors)) >>> + /* We don't want to include the .ctor section from >>> + the crtend.o file until after the sorted ctors. >>> + The .ctor section from the crtend file contains the >>> + end of ctors marker and it must be last */ >>> + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) >>> + KEEP (*(SORT(.ctors.*))) >>> + KEEP (*(.ctors)) >>> + } >>> + .dtors : >>> + { >>> + KEEP (*crtbegin.o(.dtors)) >>> + KEEP (*crtbegin?.o(.dtors)) >>> + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) >>> + KEEP (*(SORT(.dtors.*))) >>> + KEEP (*(.dtors)) >>> + } >>> + .jcr : { KEEP (*(.jcr)) } >>> + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) >>> *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >>> + .dynamic : { *(.dynamic) } >>> + .got : { *(.got) } >>> + . = DATA_SEGMENT_RELRO_END (12, .); >>> + .got.plt : { *(.got.plt) } >>> + .data : >>> + { >>> + *(.data .data.* .gnu.linkonce.d.*) >>> + KEEP (*(.gnu.linkonce.d.*personality*)) >>> + SORT(CONSTRUCTORS) >>> + } >>> + .data1 : { *(.data1) } >>> + _edata = .; PROVIDE (edata = .); >>> + __bss_start = .; >>> + .bss : >>> + { >>> + *(.dynbss) >>> + *(.bss .bss.* .gnu.linkonce.b.*) >>> + *(COMMON) >>> + /* Align here to ensure that the .bss section occupies space up to >>> + _end. Align after .bss to ensure correct alignment even if the >>> + .bss section disappears because there are no input sections. >>> + FIXME: Why do we need it? When there is no .bss section, we don't >>> + pad the .data section. */ >>> + . = ALIGN(. != 0 ? 32 / 8 : 1); >>> + } >>> + . = ALIGN(32 / 8); >>> + . = ALIGN(32 / 8); >>> + _end = .; PROVIDE (end = .); >>> + . = ALIGN(0x10); >>> + WorkAreaBase = .; >>> + . = DATA_SEGMENT_END (.); >>> + >>> + /* Stabs debugging sections. */ >>> + .stab 0 : { *(.stab) } >>> + .stabstr 0 : { *(.stabstr) } >>> + .stab.excl 0 : { *(.stab.excl) } >>> + .stab.exclstr 0 : { *(.stab.exclstr) } >>> + .stab.index 0 : { *(.stab.index) } >>> + .stab.indexstr 0 : { *(.stab.indexstr) } >>> + .comment 0 : { *(.comment) } >>> + /* DWARF debug sections. >>> + Symbols in the DWARF debugging sections are relative to the beginning >>> + of the section so we begin them at 0. */ >>> + /* DWARF 1 */ >>> + .debug 0 : { *(.debug) } >>> + .line 0 : { *(.line) } >>> + /* GNU DWARF 1 extensions */ >>> + .debug_srcinfo 0 : { *(.debug_srcinfo) } >>> + .debug_sfnames 0 : { *(.debug_sfnames) } >>> + /* DWARF 1.1 and DWARF 2 */ >>> + .debug_aranges 0 : { *(.debug_aranges) } >>> + .debug_pubnames 0 : { *(.debug_pubnames) } >>> + /* DWARF 2 */ >>> + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } >>> + .debug_abbrev 0 : { *(.debug_abbrev) } >>> + .debug_line 0 : { *(.debug_line) } >>> + .debug_frame 0 : { *(.debug_frame) } >>> + .debug_str 0 : { *(.debug_str) } >>> + .debug_loc 0 : { *(.debug_loc) } >>> + .debug_macinfo 0 : { *(.debug_macinfo) } >>> + /* SGI/MIPS DWARF 2 extensions */ >>> + .debug_weaknames 0 : { *(.debug_weaknames) } >>> + .debug_funcnames 0 : { *(.debug_funcnames) } >>> + .debug_typenames 0 : { *(.debug_typenames) } >>> + .debug_varnames 0 : { *(.debug_varnames) } >>> + /* DWARF 3 */ >>> + .debug_pubtypes 0 : { *(.debug_pubtypes) } >>> + .debug_ranges 0 : { *(.debug_ranges) } >>> + /* DWARF extension */ >>> + .debug_macro 0 : { *(.debug_macro) } >>> + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } >>> + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) } >>> +} >>> -- >>> 1.8.1.4 >>> >>> _______________________________________________ >>> rtems-devel mailing list >>> rtems-devel@rtems.org >>> http://www.rtems.org/mailman/listinfo/rtems-devel > _______________________________________________ > rtems-devel mailing list > rtems-devel@rtems.org > http://www.rtems.org/mailman/listinfo/rtems-devel -- Joel Sherrill, Ph.D. Director of Research & Development joel.sherr...@oarcorp.com On-Line Applications Research Ask me about RTEMS: a free RTOS Huntsville AL 35805 Support Available (256) 722-9985 _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel