summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-09-27 14:43:05 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-09-27 14:43:05 +0000
commiteb04e53f6dd24efc86473c6264fc2d8c0d562c90 (patch)
tree61b1eeb6e80394230069cb096315593246acaf6d
parent2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadada-examples-eb04e53f6dd24efc86473c6264fc2d8c0d562c90.tar.bz2
2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com>
* ChangeLog: New tests. Clean up. Rework so all tests use the same shared Makefile for the hard logic of producing an executable. * Makefile, Makefile.shared, README.Makefiles, networkconfig.h, rtems_init.c: New files.
-rw-r--r--ChangeLog26
-rw-r--r--Makefile14
-rw-r--r--Makefile.shared71
-rw-r--r--README.Makefiles45
-rw-r--r--networkconfig.h77
-rw-r--r--rtems_init.c230
6 files changed, 463 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index b3cd5f5..e993cd2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * ChangeLog: New tests. Clean up. Rework so all tests use the same
+ shared Makefile for the hard logic of producing an executable.
+ * Makefile, Makefile.shared, README.Makefiles, networkconfig.h,
+ rtems_init.c: New files.
+
+2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * ChangeLog: New tests. Clean up. Rework so all tests use the same
+ shared Makefile for the hard logic of producing an executable.
+ * Makefile, Makefile.shared, README.Makefiles, networkconfig.h,
+ rtems_init.c: New files.
+
+2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * ChangeLog: New tests. Clean up. Rework so all tests use the same
+ shared Makefile for the hard logic of producing an executable.
+ * Makefile, Makefile.shared, README.Makefiles, networkconfig.h,
+ rtems_init.c: New files.
+
+2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * Makefile, Makefile.shared, README.Makefiles, networkconfig.h,
+ rtems_init.c: New files.
+
2007-07-23 Joel Sherrill <joel.sherrill@oarcorp.com>
* hello_world_ada/Makefile.anybsp, hello_world_ada/Makefile.pc386,
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..7dac10e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+include $(RTEMS_MAKEFILE_PATH)/Makefile.inc
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/directory.cfg
+
+SUBDIRS=hello_world_ada delay_until
+
+ifeq ($(HAS_NETWORKING),yes)
+ SUBDIRS += dumpwebpage pingpong gen-soconn
+endif
+
diff --git a/Makefile.shared b/Makefile.shared
new file mode 100644
index 0000000..505c2ef
--- /dev/null
+++ b/Makefile.shared
@@ -0,0 +1,71 @@
+#
+# Subdirectory makefiles do some setup, then we get here
+#
+
+# Tool helpers
+CARGS =-B${RTEMS_MAKEFILE_PATH}/lib/ -specs bsp_specs -qrtems $(CPU_CFLAGS)
+
+# GEN5200 Specific Information
+ifeq ($(RTEMS_BSP_FAMILY),gen5200)
+ LINKARGS+=-qnolinkcmds -T$(RTEMS_LINKCMDS)
+endif
+
+# PC386 Specific Information
+ifeq ($(RTEMS_BSP_FAMILY),pc386)
+ HEADERADDR=0x00097E00
+ START16FILE=$(RTEMS_MAKEFILE_PATH)/lib/start16.bin
+ START16ADDR=0x00097C00
+ RELOCADDR=0x00100000
+ LINKARGS+= -Wl,-Ttext,$(RELOCADDR)
+endif
+
+# Some tests need to be able to do a gethostbyname
+ifeq ($(NEED_ROOTFS_FOR_HOST_INFO),yes)
+ CLEAN_ADDITIONS += FilesystemImage FilesystemImage.c FilesystemImage.h
+ FILESYSTEM_OBJS = FilesystemImage.o
+ FILESYSTEM_SRCS = FilesystemImage.h
+ CFLAGS += -DENABLE_UNTAR_ROOT_FILESYSTEM -I.
+endif
+
+all: $(PROGRAM)
+
+$(PROGRAM): rtems_init.o $(FILESYSTEM_OBJS) $(PROGRAM).adb
+ $(AS:as=gnatmake) -v -O -gnata -gnatE -gnato $(@) -g \
+ -I../src \
+ -bargs -Mgnat_main \
+ -largs $(CARGS) $(LINKARGS) rtems_init.o $(FILESYSTEM_OBJS)
+ $(SIZE) $(@)
+ifeq ($(RTEMS_BSP_FAMILY),pc386)
+ mv $(@) $(@).obj
+ $(OBJCOPY) -O elf32-i386 \
+ --remove-section=.rodata \
+ --remove-section=.comment \
+ --remove-section=.note \
+ --strip-unneeded $(@).obj $(@)
+ $(OBJCOPY) -O binary $(@).obj $(@).bin
+ $(RTEMS_MAKEFILE_PATH)/build-tools/bin2boot -v $(@).bt $(HEADERADDR) \
+ $(START16FILE) $(START16ADDR) 0 $(@).bin $(RELOCADDR) 0
+else
+endif
+
+joel:
+ echo $(NEED_ROOTFS_FOR_HOST_INFO)
+
+rtems_init.o: ../rtems_init.c $(FILESYSTEM_SRCS)
+ $(CC) $(CFLAGS) $(CPU_CFLAGS) -c $<
+
+ifeq ($(NEED_ROOTFS_FOR_HOST_INFO),yes)
+FilesystemImage: ../rootfs/etc/host.conf ../rootfs/etc/hosts
+ (cd ../rootfs ; tar cf - --exclude CVS --exclude .cvsignore .) >$(@)
+
+FilesystemImage.c FilesystemImage.h: FilesystemImage
+ $(PROJECT_ROOT)/bin/bin2c FilesystemImage FilesystemImage
+
+FilesystemImage.o: FilesystemImage.c
+ $(CC) $(CFLAGS) $(CPU_CFLAGS) -c $<
+endif
+
+clean:
+ rm -f b~*.* *.o *.ali $(PROGRAM)
+ rm -f *.num *.exe *.obj *.bin *.bt *.gba
+
diff --git a/README.Makefiles b/README.Makefiles
new file mode 100644
index 0000000..7d79cea
--- /dev/null
+++ b/README.Makefiles
@@ -0,0 +1,45 @@
+#
+# $Id$
+#
+
+The following is an example of how to build these Ada examples:
+
+export RTEMS_MAKEFILE_PATH=/home/joel/rtems-4.8-work/bsp-install/CPU-rtems4.8/BSP/
+make clean all
+
+This procedure has been used on the following BSPs:
+
+ arm/edb7312
+ bfin/eZKit533
+ i386/pc386
+ m68k/mcf5206elite
+ mips/jmr3904
+ powerpc/gen5200
+ powerpc/psim
+ sparc/erc32
+ sparc/leon2
+ sparc/leon3
+ sparc/sis
+
+The Makefile directly produces an executable for a BSP which directly runs
+the format (usually ELF) produced by just linking an application.
+There are a couple of BSP families which require just a bit of
+assistance that this Makefile knows about -- gen5200 and pc386.
+The executables produced by this Makefile should run on at least the
+following BSPs:
+
++ arm/edb7312
++ i386/pc386
++ mips/jmr3904
++ powerpc/icecube
++ powerpc/psim
++ powerpc/score603e
++ sparc/erc32
++ sparc/leon2
++ sparc/leon3
+
+Some BSPs require even more manipulation of the ELF file before it can
+be run on the target hardware. For example, the Freescale IceCube
+variant of the gen5200 BSP uses U-Boot and you have to run mkimage
+to get a bootable file.
+
diff --git a/networkconfig.h b/networkconfig.h
new file mode 100644
index 0000000..0333393
--- /dev/null
+++ b/networkconfig.h
@@ -0,0 +1,77 @@
+/*
+ * Network configuration -- LOOPBACK ONLY!!!
+ *
+ * See one of the other networkconfig.h files for an
+ * example of a system that includes a real NIC and
+ * the loopback interface.
+ *
+ ************************************************************
+ * EDIT THIS FILE TO REFLECT YOUR NETWORK CONFIGURATION *
+ * BEFORE RUNNING ANY RTEMS PROGRAMS WHICH USE THE NETWORK! *
+ ************************************************************
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_NETWORKCONFIG_H_
+#define _RTEMS_NETWORKCONFIG_H_
+
+
+/* #define RTEMS_USE_BOOTP */
+
+#include <bsp.h>
+
+/*
+ * Loopback interface
+ */
+extern int rtems_bsdnet_loopattach();
+
+/*
+ * Default network interface
+ */
+static struct rtems_bsdnet_ifconfig netdriver_config = {
+ "lo0", /* name */
+ rtems_bsdnet_loopattach, /* attach function */
+ NULL, /* No more interfaces */
+ "127.0.0.1", /* IP address */
+ "255.0.0.0", /* IP net mask */
+ NULL, /* Driver supplies hardware address */
+ 0 /* Use default driver parameters */
+};
+
+/*
+ * Network configuration
+ */
+struct rtems_bsdnet_config rtems_bsdnet_config = {
+ &netdriver_config,
+ NULL, /* do not use bootp */
+ 0, /* Default network task priority */
+ 0, /* Default mbuf capacity */
+ 0, /* Default mbuf cluster capacity */
+ "localhost", /* Host name -- match expectations for 127.0.0.1 */
+ "nodomain.com", /* Domain name */
+ "127.0.0.1", /* Gateway */
+ "127.0.0.1", /* Log host */
+ {"127.0.0.1" }, /* Name server(s) */
+};
+
+/*
+ * For TFTP test application
+ */
+#if (defined (RTEMS_USE_BOOTP))
+#define RTEMS_TFTP_TEST_HOST_NAME "BOOTP_HOST"
+#define RTEMS_TFTP_TEST_FILE_NAME "BOOTP_FILE"
+#else
+#define RTEMS_TFTP_TEST_HOST_NAME "XXX.YYY.ZZZ.XYZ"
+#define RTEMS_TFTP_TEST_FILE_NAME "tftptest"
+#endif
+
+/*
+ * For NFS test application
+ *
+ * NFS server/path to mount and a directory to ls once mounted
+ */
+#define RTEMS_NFS_SERVER "192.168.1.210"
+#define RTEMS_NFS_SERVER_PATH "/home"
+#define RTEMS_NFS_LS_PATH "/mnt/nfstest"
+#endif /* _RTEMS_NETWORKCONFIG_H_ */
diff --git a/rtems_init.c b/rtems_init.c
new file mode 100644
index 0000000..f0dd833
--- /dev/null
+++ b/rtems_init.c
@@ -0,0 +1,230 @@
+/*
+ * COPYRIGHT (c) 1989-2007.
+ * 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.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdlib.h>
+
+#if defined(MAIN_USE_NETWORKING)
+ #include <rtems/rtems_bsdnet.h>
+ #include "networkconfig.h"
+#endif
+#if defined(ENABLE_UNTAR_ROOT_FILESYSTEM)
+ #include <rtems/untar.h>
+ /*
+ * The tarfile image is built automatically externally.
+ */
+ #include "FilesystemImage.h"
+#endif
+
+
+extern rtems_configuration_table BSP_Configuration;
+
+/*
+ * Using GNAT's Distributed Systems Annex support requires
+ * each node in the system to have different pid's. In a
+ * single CPU RTEMS system, it is always one. This lets the
+ * user override the RTEMS default.
+ */
+#ifdef GNAT_PID
+ #include <unistd.h>
+
+ pid_t getpid()
+ {
+ return GNAT_PID;
+ }
+#endif
+
+/*
+ * Set up first argument
+ */
+static int argc = 1;
+static char arg0[20] = "rtems";
+static char *argv[20] = { arg0 };
+
+#if defined(MAIN_USE_REQUIRES_COMMAND_LINE)
+
+#define COMMAND_LINE_MAXIMUM 200
+
+#include <stdio.h>
+#include <ctype.h>
+
+void parse_arguments(
+ char *buffer,
+ size_t maximum_length
+)
+{
+ char *cp;
+ char *linebuf = buffer;
+ size_t length;
+
+ for (;;) {
+
+ #if defined(MAIN_COMMAND_LINE)
+ strncpy (linebuf, MAIN_COMMAND_LINE, maximum_length);
+ #else
+ /*
+ * Read a line
+ */
+ printf (">>> %s ", argv[0]);
+ fflush (stdout);
+ fgets (linebuf, maximum_length, stdin);
+
+ length = strnlen( linebuf, maximum_length );
+ if ( linebuf[length - 1] == '\n' || linebuf[length - 1] == '\r' ) {
+ linebuf[length - 1] = '\0';
+ }
+ #endif
+
+ /*
+ * Break line into arguments
+ */
+ cp = linebuf;
+ for (;;) {
+ while (isspace (*cp))
+ *cp++ = '\0';
+ if (*cp == '\0')
+ break;
+ if (argc >= ((sizeof argv / sizeof argv[0]) - 1)) {
+ printf ("Too many arguments.\n");
+ argc = 0;
+ break;
+ }
+ argv[argc++] = cp;
+ while (!isspace (*cp)) {
+ if (*cp == '\0')
+ break;
+ cp++;
+ }
+ }
+ if (argc > 1) {
+ argv[argc] = NULL;
+ break;
+ }
+ printf ("You must give some arguments!\n");
+ }
+
+ #if defined(DEBUG_COMMAND_LINE_ARGUMENTS)
+ {
+ int i;
+ for (i=0; i<argc ; i++ ) {
+ printf( "argv[%d] = ***%s***\n", i, argv[i] );
+ }
+ printf( "\n" );
+ }
+ #endif
+}
+
+
+#endif
+
+/*
+ * By having the POSIX_Init thread create a second thread just
+ * to invoke gnat_main, we can override all default attributes
+ * of the "Ada environment task". Otherwise, we would be
+ * stuck with the defaults set by RTEMS.
+ */
+
+void *start_gnat_main( void * argument )
+{
+ extern int gnat_main ( int argc, char **argv, char **envp );
+
+ #if defined(MAIN_USE_REQUIRES_COMMAND_LINE)
+ /*
+ * This is scoped to match the Ada program.
+ */
+ char command_line[ COMMAND_LINE_MAXIMUM ];
+
+ parse_arguments( command_line, COMMAND_LINE_MAXIMUM );
+ #endif
+
+ (void) gnat_main ( argc, argv, 0 );
+
+ exit( 0 );
+
+ return 0;
+}
+
+#ifndef GNAT_MAIN_STACKSPACE
+ #define GNAT_MAIN_STACKSPACE 0
+#endif
+
+void *POSIX_Init( void *argument )
+{
+ pthread_t thread_id;
+ pthread_attr_t attr;
+ size_t stacksize;
+ int status;
+ extern size_t _ada_pthread_minimum_stack_size();
+
+ #if defined(ENABLE_UNTAR_ROOT_FILESYSTEM)
+ printk("Loading filesystem image\n");
+ status = Untar_FromMemory( (char *)FilesystemImage, FilesystemImage_size );
+ #endif
+
+ #if defined(MAIN_USE_NETWORKING)
+ printk("Initializing Network\n");
+ rtems_bsdnet_initialize_network ();
+ #endif
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ stacksize = GNAT_MAIN_STACKSPACE * 1024;
+ if ( stacksize < _ada_pthread_minimum_stack_size() )
+ stacksize = _ada_pthread_minimum_stack_size();
+
+ status = pthread_attr_setstacksize( &attr, stacksize );
+ assert( !status );
+
+ status = pthread_create( &thread_id, &attr, start_gnat_main, NULL );
+ assert( !status );
+
+ pthread_exit( 0 );
+ return 0;
+}
+
+/* configuration information */
+
+/* Standard output and a clock tick so time passes */
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+/* We need to be able to create sockets */
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 20
+
+/* We need the full IMFS to pass the full ACATS */
+#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
+
+/* This is overkill but is definitely enough to run the network stack */
+#define CONFIGURE_MAXIMUM_TASKS 20
+#define CONFIGURE_MAXIMUM_SEMAPHORES 20
+
+/* We want a clock tick every millisecond */
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(1)
+
+/* The initialization task is a POSIX Initialization thread with default attributes */
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+/* We are using GNAT/RTEMS with a maximum of 20 Ada tasks and no fake Ada tasks. */
+/* A fake Ada task is a task created outside the Ada run-time that calls into Ada. */
+#define CONFIGURE_GNAT_RTEMS
+#define CONFIGURE_MAXIMUM_ADA_TASKS 20
+#define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
+
+/* Account for any extra task stack size */
+#define CONFIGURE_MEMORY_OVERHEAD (GNAT_MAIN_STACKSPACE)
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>