Index: testsuites/sptests/ChangeLog
===================================================================
--- testsuites/sptests/ChangeLog	(revision 7cb7a5ef09718f8efab7fb67aa04618ec5f39d92)
+++ testsuites/sptests/ChangeLog	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
@@ -1,2 +1,10 @@
+2009-10-10	Joel Sherrill <joel.sherrill@oarcorp.com>
+
+	* Makefile.am, configure.ac: Add new test to exercise when the ticks
+	since boot wraps around 0 and the timer server must deal with that
+	condition.
+	* sp67/.cvsignore, sp67/Makefile.am, sp67/init.c, sp67/sp67.doc,
+	sp67/sp67.scn: New files.
+
 2009-10-09	Sebastian Huber <Sebastian.Huber@embedded-brains.de>
 
Index: testsuites/sptests/Makefile.am
===================================================================
--- testsuites/sptests/Makefile.am	(revision 7cb7a5ef09718f8efab7fb67aa04618ec5f39d92)
+++ testsuites/sptests/Makefile.am	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
@@ -14,5 +14,5 @@
     sp40 sp41 sp42 sp43 sp44 sp45 sp46 sp47 sp48 sp49 \
     sp50 sp51 sp52 sp53 sp54 sp55 sp56 sp57 sp58 sp59 \
-    sp60 sp61 sp62 sp63 sp64 sp65 sp66 \
+    sp60 sp61 sp62 sp63 sp64 sp65 sp66 sp67 \
     spchain spclockget spcoverage spobjgetnext spnotepad01 spprintk spsize \
     spstkalloc spthreadq01 spwatchdog spwkspace \
Index: testsuites/sptests/configure.ac
===================================================================
--- testsuites/sptests/configure.ac	(revision 7cb7a5ef09718f8efab7fb67aa04618ec5f39d92)
+++ testsuites/sptests/configure.ac	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
@@ -93,4 +93,5 @@
 sp65/Makefile
 sp66/Makefile
+sp67/Makefile
 spchain/Makefile
 spclockget/Makefile
Index: testsuites/sptests/sp67/.cvsignore
===================================================================
--- testsuites/sptests/sp67/.cvsignore	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
+++ testsuites/sptests/sp67/.cvsignore	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
Index: testsuites/sptests/sp67/Makefile.am
===================================================================
--- testsuites/sptests/sp67/Makefile.am	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
+++ testsuites/sptests/sp67/Makefile.am	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
@@ -0,0 +1,28 @@
+##
+## $Id$
+##
+
+MANAGERS = all
+
+rtems_tests_PROGRAMS = sp67
+sp67_SOURCES = init.c
+
+dist_rtems_tests_DATA = sp67.scn
+dist_rtems_tests_DATA += sp67.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+sp67_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+
+LINK_OBJS = $(sp67_OBJECTS) $(sp67_LDADD)
+LINK_LIBS = $(sp67_LDLIBS)
+
+sp67$(EXEEXT): $(sp67_OBJECTS) $(sp67_DEPENDENCIES)
+	@rm -f sp67$(EXEEXT)
+	$(make-exe)
+
+include $(top_srcdir)/../automake/local.am
Index: testsuites/sptests/sp67/init.c
===================================================================
--- testsuites/sptests/sp67/init.c	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
+++ testsuites/sptests/sp67/init.c	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
@@ -0,0 +1,124 @@
+/*
+ *  Based upon test code posted on the RTEMS User's Mailing List
+ *  by Sergio Faustino <sergio.faustino@edisoft.pt>:
+ *
+ *    http://www.rtems.org/pipermail/rtems-users/2009-June/005540.html
+ *
+ *  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 <tmacros.h>
+
+/*
+ *  We have to extern this rather than use __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+ *  because this variable isn't actually in any .h.
+ */
+extern Watchdog_Interval _Timer_Server_ticks_last_time;
+
+volatile bool _timer_passage_1 = FALSE;
+volatile bool _timer_passage_2 = FALSE;
+
+/*timer Routine*/
+rtems_timer_service_routine TIMER_service_routine(
+  rtems_id  ignored_id,
+  void     *user_data
+)
+{
+  bool *passed = (bool *)user_data;
+  *passed = TRUE;
+}
+
+rtems_task Init(
+  rtems_task_argument argument
+)
+{
+  rtems_status_code status;
+  rtems_id          timer1;
+  rtems_id          timer2;
+  rtems_name        timer_name;
+
+  puts( "\n\n*** TEST 67 ***" );
+
+  /* build timer name*/
+
+  /* create Timer */
+  puts( "Init - create timer 1" );
+  status = rtems_timer_create( rtems_build_name('T', 'M', '1', ' '), &timer1 );
+  directive_failed( status, "rtems_timer_create #1" );
+
+  puts( "Init - create timer 2" );
+  status = rtems_timer_create( rtems_build_name('T', 'M', '2', ' '), &timer2 );
+  directive_failed( status, "rtems_timer_create #1" );
+
+  /* initiate timer server */
+  puts( "Init - Initiate the timer server" );
+  status = rtems_timer_initiate_server(
+    RTEMS_MINIMUM_PRIORITY,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_ATTRIBUTES
+  );
+  directive_failed( status, "rtems_timer_initiate_server" );
+
+  status = rtems_task_wake_after( 10 );
+  directive_failed( status, "task wake_after" );
+
+  status = rtems_timer_server_fire_after(
+    timer1,
+    0xffff,
+    TIMER_service_routine,
+    (void*) &_timer_passage_1
+  );
+  directive_failed( status, "rtems_timer_server_fire_after" );
+
+  /* Make the timer server think that the ticks has wrapped */
+  _Timer_Server_ticks_last_time = 100;
+
+  status = rtems_task_wake_after( 10 );
+  directive_failed( status, "task wake_after" );
+
+  /* Make the timer server think that the ticks has wrapped */
+  _Timer_Server_ticks_last_time = 200;
+
+  status = rtems_timer_server_fire_after(
+    timer2,
+    0xffff,
+    TIMER_service_routine,
+    (void*) &_timer_passage_2
+  );
+  directive_failed( status, "rtems_timer_server_fire_after" );
+
+  status = rtems_task_wake_after( 10 );
+  directive_failed( status, "task wake_after" );
+
+  if (!_timer_passage_1) {
+    puts( "Timer 1 FAILED to fire after wrapping time");
+    rtems_test_exit(0);
+  }
+  puts( "Server Timer 1 fired after wrapping ticks since boot-- OK");
+
+  if (_timer_passage_2) {
+    puts( "Timer 2 fired and should not have after wrapping time");
+    rtems_test_exit(0);
+  }
+
+  puts( "*** END OF TEST 67 ***" );
+  rtems_test_exit(0);
+}
+
+/* configuration stuff */
+
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS              2
+#define CONFIGURE_MAXIMUM_TIMERS             2
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT
+#include <rtems/confdefs.h>
Index: testsuites/sptests/sp67/sp67.scn
===================================================================
--- testsuites/sptests/sp67/sp67.scn	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
+++ testsuites/sptests/sp67/sp67.scn	(revision c257fb9ed5310b06d85dee2cf0ffb98b42acd3a1)
@@ -0,0 +1,8 @@
+*** TEST 67 ***
+Init - create timer 1
+Init - create timer 2
+Init - Initiate the timer server
+hit snapshot=10 ticks=-91
+hit snapshot=20 ticks=-181
+Server Timer 1 fired after wrapping ticks since boot-- OK
+*** END OF TEST 67 ***
