Index: cpukit/rtems/Makefile.am
===================================================================
--- cpukit/rtems/Makefile.am	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ cpukit/rtems/Makefile.am	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -152,4 +152,5 @@
 librtems_a_SOURCES += src/clockgetuptimetimeval.c
 librtems_a_SOURCES += src/clockgetuptimeseconds.c
+librtems_a_SOURCES += src/clockgetuptimenanoseconds.c
 librtems_a_SOURCES += src/clockset.c
 librtems_a_SOURCES += src/clocksetnsecshandler.c
Index: cpukit/rtems/include/rtems/rtems/clock.h
===================================================================
--- cpukit/rtems/include/rtems/rtems/clock.h	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ cpukit/rtems/include/rtems/rtems/clock.h	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -258,4 +258,11 @@
 
 /**
+ * @brief Returns the system uptime in nanoseconds.
+ *
+ * @retval The system uptime in nanoseconds.
+ */
+uint64_t rtems_clock_get_uptime_nanoseconds( void );
+
+/**
  * @brief TOD Validate
  *
Index: cpukit/rtems/src/clockgetuptimenanoseconds.c
===================================================================
--- cpukit/rtems/src/clockgetuptimenanoseconds.c	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
+++ cpukit/rtems/src/clockgetuptimenanoseconds.c	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -0,0 +1,35 @@
+/**
+ * @file
+ *
+ * @brief Returns the system uptime in seconds.
+ * @ingroup ClassicClock Clocks
+ */
+
+/*
+ * Copyright (c) 2013 Chris Johns <chrisj@rtems.org>.  All rights reserved.
+ *
+ * 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.
+ */
+
+#if HAVE_CONFIG_H
+  #include "config.h"
+#endif
+
+#include <rtems/rtems/clock.h>
+#include <rtems/score/todimpl.h>
+
+uint64_t rtems_clock_get_uptime_nanoseconds( void )
+{
+  Timestamp_Control  snapshot_as_timestamp;
+  uint32_t           nanoseconds;
+  ISR_Level          level;
+
+  _TOD_Acquire( &_TOD, level );
+    snapshot_as_timestamp = _TOD.uptime;
+    nanoseconds = ( *_TOD.nanoseconds_since_last_tick )();
+  _TOD_Release( &_TOD, level );
+
+  return _Timestamp_Get_As_nanoseconds( &snapshot_as_timestamp, nanoseconds );
+}
Index: cpukit/score/Makefile.am
===================================================================
--- cpukit/score/Makefile.am	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ cpukit/score/Makefile.am	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -216,5 +216,5 @@
     src/schedulersimpleschedule.c \
     src/schedulersimpleunblock.c \
-    src/schedulersimpleyield.c 
+    src/schedulersimpleyield.c
 
 ## SCHEDULEREDF_C_FILES
@@ -276,5 +276,5 @@
     src/threadstartmultitasking.c src/iterateoverthreads.c \
     src/threadblockingoperationcancel.c
-    
+
 if HAS_SMP
 libscore_a_SOURCES += src/threaddispatchdisablelevel.c
@@ -295,5 +295,5 @@
     src/timespecisvalid.c src/timespeclessthan.c \
     src/timespecsubtract.c src/timespectoticks.c src/timespecdivide.c \
-    src/timespecdividebyinteger.c
+    src/timespecdividebyinteger.c src/timespecgetasnanoseconds.c
 
 ## TIMESTAMP_INT64_C_FILES
Index: cpukit/score/include/rtems/score/timespec.h
===================================================================
--- cpukit/score/include/rtems/score/timespec.h	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ cpukit/score/include/rtems/score/timespec.h	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -90,4 +90,19 @@
 
 /**
+ *  @brief Get the timestamp as nanoseconds.
+ *
+ *  This method returns the timestamp as nanoseconds.
+ *
+ *  @param[in] time points to the timestamp.
+ *  @param[in] nanoseconds the nanoseconds since the last tick.
+ *
+ *  @retval The time in nanoseconds.
+ */
+uint64_t _Timespec_Get_As_nanoseconds(
+  const struct timespec *time,
+  const uint32_t nanoseconds
+);
+
+/**
  * @brief Check if timespec is valid.
  *
Index: cpukit/score/include/rtems/score/timestamp.h
===================================================================
--- cpukit/score/include/rtems/score/timestamp.h	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ cpukit/score/include/rtems/score/timestamp.h	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -331,4 +331,21 @@
 
 /**
+ *  @brief Get the timestamp as nanoseconds.
+ *
+ *  This method returns the timestamp as nanoseconds.
+ *
+ *  @param[in] _time points to the timestamp
+ *
+ *  @retval The time in nanoseconds.
+ */
+#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
+  #define _Timestamp_Get_As_nanoseconds( _timestamp, _nanoseconds ) \
+          _Timespec_Get_As_nanoseconds( _timestamp, _nanoseconds )
+#else
+  #define _Timestamp_Get_As_nanoseconds( _timestamp, _nanoseconds ) \
+	  _Timestamp64_Get_As_nanoseconds( _timestamp, _nanoseconds )
+#endif
+
+/**
  *  @brief Convert timestamp to struct timespec.
  *
Index: cpukit/score/include/rtems/score/timestamp64.h
===================================================================
--- cpukit/score/include/rtems/score/timestamp64.h	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ cpukit/score/include/rtems/score/timestamp64.h	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -368,4 +368,24 @@
 #endif
 
+static inline uint64_t _Timestamp64_implementation_Get_As_nanoseconds(
+  const Timestamp64_Control *_time,
+  const uint32_t nanoseconds
+)
+{
+  return *_time + (uint64_t) nanoseconds;
+}
+
+/**
+ *  @brief Get the 64-bit timestamp as nanoseconds.
+ *
+ *  This method returns the 64-bit timestamp as it is already in nanoseconds.
+ *
+ *  @param[in] _time points to the timestamp
+ *
+ *  @retval The nanoseconds portion of @a _time.
+ */
+#define _Timestamp64_Get_As_nanoseconds( _time, _nanoseconds ) \
+  _Timestamp64_implementation_Get_As_nanoseconds( _time, _nanoseconds )
+
 static inline void _Timestamp64_implementation_To_timespec(
   const Timestamp64_Control *_timestamp,
Index: cpukit/score/src/timespecgetasnanoseconds.c
===================================================================
--- cpukit/score/src/timespecgetasnanoseconds.c	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
+++ cpukit/score/src/timespecgetasnanoseconds.c	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -0,0 +1,29 @@
+/**
+ *  @file
+ *
+ *  @brief Get As Nanoseconds
+ *  @ingroup Timespec
+ */
+
+/*
+ *  COPYRIGHT (c) 2013 Chris Johns <chrisj@rtems.org>
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/timespec.h>
+#include <rtems/score/todimpl.h>
+
+uint64_t _Timespec_Get_As_nanoseconds(
+  const struct timespec *time,
+  const uint32_t nanoseconds
+)
+{
+  return ( ((uint64_t) time->tv_sec) * 1000000000ULL ) + time->tv_nsec + nanoseconds;
+}
Index: doc/user/clock.t
===================================================================
--- doc/user/clock.t	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ doc/user/clock.t	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -19,5 +19,5 @@
 @item @code{@value{DIRPREFIX}clock_get_tod} - Get date and time in TOD format
 @item @code{@value{DIRPREFIX}clock_get_tod_timeval} - Get date and time in timeval format
-@item @code{@value{DIRPREFIX}clock_get_seconds_since_epoch} - Get seconds since epoch 
+@item @code{@value{DIRPREFIX}clock_get_seconds_since_epoch} - Get seconds since epoch
 @item @code{@value{DIRPREFIX}clock_get_ticks_per_second} - Get ticks per second
 @item @code{@value{DIRPREFIX}clock_get_ticks_since_boot} - Get ticks since boot
@@ -25,4 +25,5 @@
 @item @code{@value{DIRPREFIX}clock_get_uptime_timeval} - Get time since boot in timeval format
 @item @code{@value{DIRPREFIX}clock_get_uptime_seconds} - Get seconds since boot
+@item @code{@value{DIRPREFIX}clock_get_uptime_nanoseconds} - Get nanoseconds since boot
 @item @code{@value{DIRPREFIX}clock_set_nanoseconds_extension} - Install the nanoseconds since last tick handler
 @item @code{@value{DIRPREFIX}clock_tick} - Announce a clock tick
@@ -86,9 +87,9 @@
 supported when setting the system date and time using the
 @code{@value{DIRPREFIX}clock_set} directive.  Some applications
-expect to operate on a "UNIX-style" date and time data structure.  The 
+expect to operate on a "UNIX-style" date and time data structure.  The
 @code{@value{DIRPREFIX}clock_get_tod_timeval} always returns
-the date and time in @code{struct timeval} format.  The 
+the date and time in @code{struct timeval} format.  The
 @code{@value{DIRPREFIX}clock_get} directive can optionally return
-the current date and time in this format.  
+the current date and time in this format.
 
 The @code{struct timeval} data structure has two fields: @code{tv_sec}
@@ -143,6 +144,6 @@
 @code{@value{DIRPREFIX}event_receive},
 @code{@value{DIRPREFIX}semaphore_obtain} and
-@code{@value{DIRPREFIX}region_get_segment} directives.  
-Each task may have one and only one timeout active at a time.  
+@code{@value{DIRPREFIX}region_get_segment} directives.
+Each task may have one and only one timeout active at a time.
 When a timeout expires, it unblocks the task with a timeout status code.
 
@@ -193,5 +194,5 @@
 @code{@value{DIRPREFIX}clock_get_options}:
 
-@findex rtems_clock_get_options 
+@findex rtems_clock_get_options
 
 @itemize @bullet
@@ -323,5 +324,5 @@
 has not been set with a previous call to
 @code{@value{DIRPREFIX}clock_set}, then the
-@code{@value{RPREFIX}NOT_DEFINED} status code is returned. 
+@code{@value{RPREFIX}NOT_DEFINED} status code is returned.
 The caller can always obtain the number of ticks per second (option is
 @code{@value{RPREFIX}CLOCK_GET_TICKS_PER_SECOND}) and the number of
@@ -334,5 +335,5 @@
 indicated below:
 
-@findex rtems_clock_get_options 
+@findex rtems_clock_get_options
 @ifset is-C
 @itemize @bullet
@@ -418,5 +419,5 @@
 has not been set with a previous call to
 @code{@value{DIRPREFIX}clock_set}, then the
-@code{@value{RPREFIX}NOT_DEFINED} status code is returned. 
+@code{@value{RPREFIX}NOT_DEFINED} status code is returned.
 
 @subheading NOTES:
@@ -469,5 +470,5 @@
 has not been set with a previous call to
 @code{@value{DIRPREFIX}clock_set}, then the
-@code{@value{RPREFIX}NOT_DEFINED} status code is returned. 
+@code{@value{RPREFIX}NOT_DEFINED} status code is returned.
 
 @subheading NOTES:
@@ -520,5 +521,5 @@
 has not been set with a previous call to
 @code{@value{DIRPREFIX}clock_set}, then the
-@code{@value{RPREFIX}NOT_DEFINED} status code is returned. 
+@code{@value{RPREFIX}NOT_DEFINED} status code is returned.
 
 @subheading NOTES:
@@ -621,5 +622,5 @@
 
 This directive simply returns the number of times the dirivective
-@code{@value{DIRPREFIX}clock_tick} has been invoked since the 
+@code{@value{DIRPREFIX}clock_tick} has been invoked since the
 system was booted.
 
@@ -737,4 +738,34 @@
 @c
 @page
+@subsection CLOCK_GET_UPTIME_NANOSECONDS - Get the nanoseconds since boot
+
+@cindex clock get nanoseconds uptime
+@cindex uptime
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_clock_get_uptime_nanoseconds
+@example
+uint64_t rtems_clock_get_uptime_nanoseconds(void);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+The system uptime in nanoseconds.
+
+@subheading DESCRIPTION:
+
+This directive returns the nanoseconds since the system was booted.
+
+@subheading NOTES:
+
+This directive may be called from an ISR.
+
+@c
+@c
+@c
+@page
 @subsection CLOCK_SET_NANOSECONDS_EXTENSION - Install the nanoseconds since last tick handler
 
@@ -766,5 +797,5 @@
 @subheading DESCRIPTION:
 
-This directive is used by the Clock device driver to install the 
+This directive is used by the Clock device driver to install the
 @code{routine} which will be invoked by the internal RTEMS method used to
 obtain a highly accurate time of day.  It is usually called during
@@ -781,5 +812,5 @@
 This directive may be called from an ISR.
 
-This directive is called as part of every service to obtain the 
+This directive is called as part of every service to obtain the
 current date and time as well as timestamps.
 
@@ -829,3 +860,2 @@
 microseconds per tick and number of ticks per timeslice,
 respectively.
-
Index: testsuites/sptests/sp09/screen02.c
===================================================================
--- testsuites/sptests/sp09/screen02.c	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ testsuites/sptests/sp09/screen02.c	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -90,4 +90,7 @@
   rtems_clock_get_uptime_seconds();
 
+  puts( "TA1 - rtems_clock_get_uptime_nanoseconds" );
+  rtems_clock_get_uptime_nanoseconds();
+
   puts( "TA1 - rtems_clock_get_tod_timeval - RTEMS_INVALID_ADDRESS" );
   status = rtems_clock_get_tod_timeval( NULL );
Index: testsuites/sptests/sp09/sp09.scn
===================================================================
--- testsuites/sptests/sp09/sp09.scn	(revision c2b752881df62c870c395bb1f6c405bca33bec37)
+++ testsuites/sptests/sp09/sp09.scn	(revision 2d1bdc8f797db5ab6e3ba6945befaf73d9062798)
@@ -34,4 +34,5 @@
 TA1 - rtems_clock_get_uptime_timeval
 TA1 - rtems_clock_get_uptime_seconds
+TA1 - rtems_clock_get_uptime_nanoseconds
 TA1 - rtems_clock_get_tod_timeval - RTEMS_INVALID_ADDRESS
 TA1 - rtems_clock_get_tod_timeval - RTEMS_NOT_DEFINED
