Index: cpukit/Makefile.am
===================================================================
--- cpukit/Makefile.am	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ cpukit/Makefile.am	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -251,4 +251,5 @@
 librtemscpu_a_SOURCES += libcsupport/src/termiosinitialize.c
 librtemscpu_a_SOURCES += libcsupport/src/termios_num2baud.c
+librtemscpu_a_SOURCES += libcsupport/src/termios_posix_isig_handler.c
 librtemscpu_a_SOURCES += libcsupport/src/termios_setbestbaud.c
 librtemscpu_a_SOURCES += libcsupport/src/termios_setinitialbaud.c
Index: cpukit/include/rtems/libio.h
===================================================================
--- cpukit/include/rtems/libio.h	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ cpukit/include/rtems/libio.h	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -1881,4 +1881,6 @@
 /**@{**/
 
+struct rtems_termios_tty;
+
 typedef struct rtems_termios_callbacks {
   int    (*firstOpen)(int major, int minor, void *arg);
@@ -1908,4 +1910,112 @@
 );
 
+/**
+ * @brief Type returned by all input processing (isig) methods
+ */ 
+typedef enum {
+  /**
+   * This indicates that the input character was processed
+   * and possibly placed into the buffer.
+   */
+  RTEMS_TERMIOS_ISIG_WAS_PROCESSED,
+  /**
+   * This indicates that the input character was not processed and
+   * subsequent processing is required.
+   */
+  RTEMS_TERMIOS_ISIG_WAS_NOT_PROCESSED,
+  /**
+   * This indicates that the character was processed and determined
+   * to be one that requires a signal to be raised (e.g. VINTR or
+   * VKILL). The tty must be in the right termios mode for this to
+   * occur. There is no further processing of this character required and
+   * the pending read() operation should be interrupted.
+   */
+  RTEMS_TERMIOS_ISIG_INTERRUPT_READ
+} rtems_termios_isig_status_code;
+
+/**
+ * @brief Type for ISIG (VINTR/VKILL) handler
+ *
+ * This type defines the interface to a method which will process
+ * VKILL and VINTR characters. The user can register a handler to
+ * override the default behavior which is to take no special action
+ * on these characters. The POSIX required behavior is to
+ * generate a SIGINTR or SIGQUIT signal. This behavior is implemented if
+ * the user registers the @ref rtems_termios_posix_isig_handler().
+ *
+ * @param c     character that was input
+ * @param tty   termios structure pointer for this input tty
+ *
+ * @return The value returned is according to that documented
+ *         for @ref rtems_termios_isig_status_code.
+ */
+typedef rtems_termios_isig_status_code (*rtems_termios_isig_handler)(
+  unsigned char             c,
+  struct rtems_termios_tty *tty
+);
+
+/**
+ * @brief Default handler for ISIG (VINTR/VKILL)
+ *
+ * This handler is installed by default by termios. It performs
+ * no actions on receiving the VINTR and VKILL characters. This is
+ * not POSIX conformant behavior but is the historical RTEMS behavior
+ * and avoid any default dependency on signal processing code.
+ *
+ * @param c     character that was input
+ * @param tty   termios structure pointer for this input tty
+ *
+ * The installed ISIG handler is only invoked if the character is
+ * (VKILL or VINTR) and ISIG is enabled. Thus the handler need only
+ * check the character and perform the appropriate action.
+ *
+ * @return The value returned is according to that documented
+ *         for all methods adhering to @ref rtems_termios_isig_handler.
+ */
+rtems_termios_isig_status_code rtems_termios_default_isig_handler(
+  unsigned char             c,
+  struct rtems_termios_tty *tty
+);
+
+/**
+ * @brief POSIX handler for ISIG (VINTR/VKILL)
+ *
+ * This handler is installed by the used to obtain POSIX behavior
+ * upon receiving the VINTR and VKILL characters.  The POSIX required
+ * behavior is to generate a SIGINTR or SIGQUIT signal if ISIG is enabled.
+ *
+ * @param c     character that was input
+ * @param tty   termios structure pointer for this input tty
+ *
+ * @return The value returned is according to that documented
+ *         for all methods adhering to @ref rtems_termios_isig_handler.
+ */
+rtems_termios_isig_status_code rtems_termios_posix_isig_handler(
+  unsigned char             c,
+  struct rtems_termios_tty *tty
+);
+
+/**
+ * @brief Register handler for ISIG (VINTR/VKILL)
+ *
+ * This method is invoked to install an ISIG handler. This may be used
+ * to install @ref rtems_termios_posix_isig_handler() to obtain POSIX
+ * behavior or a custom handler. The handler
+ * @ref rtems_termios_default_isig_handler() is installed by default.
+ *
+ * @param handler entry point of the new ISIG handler
+ *
+ * @retval RTEMS_SUCCESSFUL if successful or error code if unsuccessful.
+ */
+rtems_status_code rtems_termios_register_isig_handler(
+  rtems_termios_isig_handler handler
+);
+
+int rtems_termios_enqueue_raw_characters(
+  void *ttyp,
+  const char *buf,
+  int   len
+);
+
 rtems_status_code rtems_termios_open (
   rtems_device_major_number      major,
@@ -1931,10 +2041,4 @@
 );
 
-int rtems_termios_enqueue_raw_characters(
-  void *ttyp,
-  const char *buf,
-  int   len
-);
-
 int rtems_termios_dequeue_characters(
   void *ttyp,
Index: cpukit/include/rtems/rtems/status.h
===================================================================
--- cpukit/include/rtems/rtems/status.h	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ cpukit/include/rtems/rtems/status.h	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -167,4 +167,10 @@
    */
   RTEMS_IO_ERROR                 = 27,
+  /**
+   *  This is the status used internally to indicate a blocking device
+   *  driver call has been interrupted and should be reflected to the
+   *  called as an INTERRUPTED.
+   */
+  RTEMS_INTERRUPTED              = 28,
   /**
    *  This is the status is used internally to RTEMS when performing
@@ -175,5 +181,5 @@
    *  @note This status will @b NOT be returned to the user.
    */
-  RTEMS_PROXY_BLOCKING           = 28
+  RTEMS_PROXY_BLOCKING           = 29
 } rtems_status_code;
 
@@ -236,4 +242,5 @@
  *  @retval ENOSYS RTEMS_NOT_IMPLEMENTED, RTEMS_NOT_CONFIGURED
  *  @retval ENOMEM RTEMS_NO_MEMORY
+ *  @retval EINTR RTEMS_INTERRUPTED
  */
 int rtems_status_code_to_errno(rtems_status_code sc);
Index: cpukit/libcsupport/src/termios.c
===================================================================
--- cpukit/libcsupport/src/termios.c	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ cpukit/libcsupport/src/termios.c	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -1302,25 +1302,110 @@
 
 /*
+ * This points to the currently registered method to perform
+ * ISIG processing of VKILL and VQUIT characters.
+ */
+static rtems_termios_isig_handler termios_isig_handler =
+   rtems_termios_default_isig_handler;
+
+/*
+ * This is the default method to process VKILL or VQUIT characters if
+ * ISIG processing is enabled. Note that it does nothing.
+ */
+rtems_termios_isig_status_code rtems_termios_default_isig_handler(
+  unsigned char c,
+  struct rtems_termios_tty *tty
+)
+{
+  return RTEMS_TERMIOS_ISIG_WAS_NOT_PROCESSED;
+}
+
+/*
+ * Register a method to process VKILL or VQUIT characters if
+ * ISIG processing is enabled.
+ */
+rtems_status_code rtems_termios_register_isig_handler(
+  rtems_termios_isig_handler handler
+)
+{
+  if (handler == NULL) {
+    return RTEMS_INVALID_ADDRESS;
+  }
+
+  termios_isig_handler = handler;
+  return RTEMS_SUCCESSFUL;
+}
+
+/**
+ * @brief Type returned by all input processing (iproc) methods
+ */ 
+typedef enum {
+  /**
+   * This indicates that the input character was processed
+   * and the results were placed into the buffer.
+   */
+  RTEMS_TERMIOS_IPROC_IN_BUFFER,
+  /**
+   * This indicates that the input character was processed
+   * and the result did not go into the buffer.
+   */
+  RTEMS_TERMIOS_IPROC_WAS_PROCESSED,
+  /**
+   * This indicates that the input character was not processed and
+   * subsequent processing is required.
+   */
+  RTEMS_TERMIOS_IPROC_WAS_NOT_PROCESSED,
+  /**
+   * This indicates that the character was processed and determined
+   * to be one that requires a signal to be raised (e.g. VINTR or
+   * VKILL). The tty must be in the right termios mode for this to
+   * occur. There is no further processing of this character required and
+   * the pending read() operation should be interrupted.
+   */
+  RTEMS_TERMIOS_IPROC_INTERRUPT_READ
+} rtems_termios_iproc_status_code;
+
+/*
  * Process a single input character
  */
-static int
+static rtems_termios_iproc_status_code
 iproc (unsigned char c, struct rtems_termios_tty *tty)
 {
+  /*
+   * If signals are enabled, then allow possibility of VINTR causing
+   * SIGINTR and VQUIT causing SIGQUIT. Invoke user provided isig handler.
+   */
+  if ((tty->termios.c_lflag & ISIG)) {
+    if ((c == tty->termios.c_cc[VINTR]) || (c == tty->termios.c_cc[VQUIT])) {
+      rtems_termios_isig_status_code rc;
+      rc = (*termios_isig_handler)(c, tty);
+      if (rc == RTEMS_TERMIOS_ISIG_INTERRUPT_READ) {
+         return RTEMS_TERMIOS_IPROC_INTERRUPT_READ;
+      }
+      if (rc == RTEMS_TERMIOS_ISIG_WAS_PROCESSED) {
+         return RTEMS_TERMIOS_IPROC_IN_BUFFER;
+      }
+      _Assert(rc == RTEMS_TERMIOS_ISIG_WAS_NOT_PROCESSED);
+    }
+  }
+
+  /*
+   * Perform canonical character processing.
+   */
   if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
     if (c == tty->termios.c_cc[VERASE]) {
       erase (tty, 0);
-      return 0;
+      return RTEMS_TERMIOS_IPROC_WAS_PROCESSED;
     }
     else if (c == tty->termios.c_cc[VKILL]) {
       erase (tty, 1);
-      return 0;
+      return RTEMS_TERMIOS_IPROC_WAS_PROCESSED;
     }
     else if (c == tty->termios.c_cc[VEOF]) {
-      return 1;
+      return RTEMS_TERMIOS_IPROC_IN_BUFFER;
     } else if (c == '\n') {
       if (tty->termios.c_lflag & (ECHO | ECHONL))
         echo (c, tty);
       tty->cbuf[tty->ccount++] = c;
-      return 1;
+      return RTEMS_TERMIOS_IPROC_IN_BUFFER;
     } else if ((c == tty->termios.c_cc[VEOL]) ||
                (c == tty->termios.c_cc[VEOL2])) {
@@ -1328,9 +1413,11 @@
         echo (c, tty);
       tty->cbuf[tty->ccount++] = c;
-      return 1;
+      return RTEMS_TERMIOS_IPROC_IN_BUFFER;
     }
   }
 
   /*
+   * Perform non-canonical character processing.
+   *
    * FIXME: Should do IMAXBEL handling somehow
    */
@@ -1339,6 +1426,7 @@
       echo (c, tty);
     tty->cbuf[tty->ccount++] = c;
-  }
-  return 0;
+    return RTEMS_TERMIOS_IPROC_IN_BUFFER;
+  }
+  return RTEMS_TERMIOS_IPROC_WAS_NOT_PROCESSED;
 }
 
@@ -1346,8 +1434,8 @@
  * Process input character, with semaphore.
  */
-static int
+static rtems_termios_iproc_status_code
 siproc (unsigned char c, struct rtems_termios_tty *tty)
 {
-  int i;
+  rtems_termios_iproc_status_code rc;
 
   /*
@@ -1356,20 +1444,25 @@
   if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
     rtems_mutex_lock (&tty->osem);
-    i = iproc (c, tty);
+    rc = iproc (c, tty);
     rtems_mutex_unlock (&tty->osem);
   }
   else {
-    i = iproc (c, tty);
-  }
-  return i;
-}
-
-static int
+    rc = iproc (c, tty);
+  }
+  return rc;
+}
+
+static rtems_termios_iproc_status_code
 siprocPoll (unsigned char c, rtems_termios_tty *tty)
 {
   if (c == '\r' && (tty->termios.c_iflag & IGNCR) != 0) {
-    return 0;
-  }
-
+    return RTEMS_TERMIOS_IPROC_WAS_NOT_PROCESSED;
+  }
+
+  /*
+   * iprocEarly is done at the interrupt level for interrupt driven
+   * devices so we need to perform those actions before processing
+   * the character.
+   */
   c = iprocEarly (c, tty);
   return siproc (c, tty);
@@ -1379,8 +1472,10 @@
  * Fill the input buffer by polling the device
  */
-static void
+static rtems_termios_iproc_status_code
 fillBufferPoll (struct rtems_termios_tty *tty)
 {
-  int n;
+  int                             n;
+  rtems_termios_iproc_status_code rc;
+  rtems_termios_iproc_status_code retval = RTEMS_TERMIOS_IPROC_WAS_PROCESSED;
 
   if (tty->termios.c_lflag & ICANON) {
@@ -1390,6 +1485,12 @@
         rtems_task_wake_after (1);
       } else {
-        if  (siprocPoll (n, tty))
+        rc = siprocPoll (n, tty);
+        if (rc == RTEMS_TERMIOS_IPROC_IN_BUFFER) {
           break;
+        }
+        if (rc == RTEMS_TERMIOS_IPROC_INTERRUPT_READ) {
+          retval = RTEMS_TERMIOS_IPROC_INTERRUPT_READ;
+          break;
+        }
       }
     }
@@ -1418,5 +1519,9 @@
         rtems_task_wake_after (1);
       } else {
-        siprocPoll (n, tty);
+        rc = siprocPoll (n, tty);
+        if (rc == RTEMS_TERMIOS_IPROC_INTERRUPT_READ) {
+          retval = RTEMS_TERMIOS_IPROC_INTERRUPT_READ;
+          break;
+        }
         if (tty->ccount >= tty->termios.c_cc[VMIN])
           break;
@@ -1426,4 +1531,5 @@
     }
   }
+  return retval;
 }
 
@@ -1431,5 +1537,5 @@
  * Fill the input buffer from the raw input queue
  */
-static void
+static rtems_termios_iproc_status_code
 fillBufferQueue (struct rtems_termios_tty *tty)
 {
@@ -1449,6 +1555,7 @@
     while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
                        (tty->ccount < (CBUFSIZE-1))) {
-      unsigned char c;
-      unsigned int newHead;
+      unsigned char                    c;
+      unsigned int                     newHead;
+      rtems_termios_iproc_status_code  rc;
 
       newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
@@ -1480,10 +1587,19 @@
       /* continue processing new character */
       if (tty->termios.c_lflag & ICANON) {
-        if (siproc (c, tty)) {
-          /* In canonical mode, input is made available line by line */
-          return;
+        rc = siproc (c, tty);
+        /* If the read() should be interrupted, return */
+        if (rc == RTEMS_TERMIOS_IPROC_INTERRUPT_READ) {
+          return RTEMS_TERMIOS_IPROC_INTERRUPT_READ;
+        }
+	/* In canonical mode, input is made available line by line */
+        if (rc == RTEMS_TERMIOS_IPROC_IN_BUFFER) {
+          return RTEMS_TERMIOS_IPROC_IN_BUFFER;
         }
       } else {
-        siproc (c, tty);
+        rc = siproc (c, tty);
+        /* If the read() should be interrupted, return */
+        if (rc == RTEMS_TERMIOS_IPROC_INTERRUPT_READ) {
+          return RTEMS_TERMIOS_IPROC_INTERRUPT_READ;
+        }
         if (tty->ccount >= tty->termios.c_cc[VMIN])
           wait = false;
@@ -1520,11 +1636,17 @@
     }
   }
-}
-
-static uint32_t
-rtems_termios_read_tty (struct rtems_termios_tty *tty, char *buffer,
-  uint32_t initial_count)
-{
-  uint32_t count;
+  return RTEMS_TERMIOS_IPROC_WAS_PROCESSED;
+}
+
+static rtems_status_code
+rtems_termios_read_tty (
+  struct rtems_termios_tty *tty,
+  char                     *buffer,
+  uint32_t                  initial_count,
+  uint32_t                 *count_read
+)
+{
+  uint32_t                         count;
+  rtems_termios_iproc_status_code  rc = RTEMS_TERMIOS_IPROC_WAS_PROCESSED;
 
   count = initial_count;
@@ -1534,14 +1656,29 @@
     tty->read_start_column = tty->column;
     if (tty->handler.poll_read != NULL && tty->handler.mode == TERMIOS_POLLED)
-      fillBufferPoll (tty);
+      rc = fillBufferPoll (tty);
     else
-      fillBufferQueue (tty);
-  }
+      rc = fillBufferQueue (tty);
+  }
+
+  /*
+   * If there are characters in the buffer, then copy them to the caller.
+   */
   while (count && (tty->cindex < tty->ccount)) {
     *buffer++ = tty->cbuf[tty->cindex++];
     count--;
-  }
+   }
   tty->tty_rcvwakeup = false;
-  return initial_count - count;
+  *count_read = initial_count - count;
+
+  /*
+   * fillBufferPoll and fillBufferQueue can indicate that the operation
+   * was interrupted. The isig handler can do nothing, have POSIX behavior
+   * and cause a signal, or a user defined action.
+   */
+  if (rc == RTEMS_TERMIOS_IPROC_INTERRUPT_READ) {
+    return RTEMS_INTERRUPTED;
+  }
+
+  return RTEMS_SUCCESSFUL;
 }
 
@@ -1549,11 +1686,11 @@
 rtems_termios_read (void *arg)
 {
-  rtems_libio_rw_args_t *args = arg;
+  rtems_libio_rw_args_t    *args = arg;
   struct rtems_termios_tty *tty = args->iop->data1;
+  rtems_status_code         sc;
 
   rtems_mutex_lock (&tty->isem);
 
   if (rtems_termios_linesw[tty->t_line].l_read != NULL) {
-    rtems_status_code sc;
 
     sc = rtems_termios_linesw[tty->t_line].l_read(tty,args);
@@ -1563,7 +1700,12 @@
   }
 
-  args->bytes_moved = rtems_termios_read_tty (tty, args->buffer, args->count);
+  sc = rtems_termios_read_tty(
+    tty,
+    args->buffer,
+    args->count,
+    &args->bytes_moved
+  );
   rtems_mutex_unlock (&tty->isem);
-  return RTEMS_SUCCESSFUL;
+  return sc;
 }
 
@@ -2023,5 +2165,6 @@
 {
   struct rtems_termios_tty *tty;
-  uint32_t bytes_moved;
+  uint32_t                  bytes_moved;
+  rtems_status_code         sc;
 
   tty = iop->data1;
@@ -2050,7 +2193,11 @@
   }
 
-  bytes_moved = rtems_termios_read_tty (tty, buffer, count);
+  sc = rtems_termios_read_tty(tty, buffer, count, &bytes_moved);
   rtems_mutex_unlock (&tty->isem);
+  if (sc != RTEMS_SUCCESSFUL) {
+     return rtems_status_code_to_errno (sc);
+  }
   return (ssize_t) bytes_moved;
+  
 }
 
Index: cpukit/libcsupport/src/termios_posix_isig_handler.c
===================================================================
--- cpukit/libcsupport/src/termios_posix_isig_handler.c	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
+++ cpukit/libcsupport/src/termios_posix_isig_handler.c	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -0,0 +1,39 @@
+/**
+ * @file
+ * TERMIOS POSIX behavior on INTR and QUIT characters
+ */
+
+/*
+ *  COPYRIGHT (c) 1989-2012,2019.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ *  SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <rtems/termiostypes.h>
+
+#include <signal.h>
+
+rtems_termios_isig_status_code rtems_termios_posix_isig_handler(
+  unsigned char             c,
+  struct rtems_termios_tty *tty
+)
+{
+  if (c == tty->termios.c_cc[VINTR]) {
+    raise(SIGINT);
+    return RTEMS_TERMIOS_ISIG_INTERRUPT_READ;
+  }
+
+  if (c == tty->termios.c_cc[VQUIT]) {
+    raise(SIGQUIT);
+    return RTEMS_TERMIOS_ISIG_INTERRUPT_READ;
+  }
+
+  return RTEMS_TERMIOS_ISIG_WAS_NOT_PROCESSED;
+}
Index: cpukit/rtems/src/statustext.c
===================================================================
--- cpukit/rtems/src/statustext.c	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ cpukit/rtems/src/statustext.c	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -54,4 +54,5 @@
   "RTEMS_NO_MEMORY",
   "RTEMS_IO_ERROR",
+  "RTEMS_INTERRUPTED",
   "RTEMS_PROXY_BLOCKING"
 };
Index: cpukit/rtems/src/statustoerrno.c
===================================================================
--- cpukit/rtems/src/statustoerrno.c	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ cpukit/rtems/src/statustoerrno.c	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -46,4 +46,5 @@
   [RTEMS_NO_MEMORY]                = ENOMEM,
   [RTEMS_IO_ERROR]                 = EIO,
+  [RTEMS_INTERRUPTED]              = EINTR,
   [RTEMS_PROXY_BLOCKING]           = EIO
 };
Index: testsuites/libtests/Makefile.am
===================================================================
--- testsuites/libtests/Makefile.am	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ testsuites/libtests/Makefile.am	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -1490,5 +1490,25 @@
 termios09_SOURCES = termios09/init.c
 termios09_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_termios09) \
-	$(support_includes)
+	$(support_includes) 
+endif
+
+if TEST_termios10
+lib_tests += termios10
+lib_screens += termios10/termios10.scn
+lib_docs += termios10/termios10.doc
+termios10_SOURCES  = termios10/init.c
+termios10_SOURCES += termios03/termios_testdriver_polled.c
+termios10_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_termios10) \
+	$(support_includes) -I$(top_srcdir)/termios03
+endif
+
+if TEST_termios11
+lib_tests += termios11
+lib_screens += termios11/termios11.scn
+lib_docs += termios11/termios11.doc
+termios11_SOURCES  = termios10/init.c
+termios11_SOURCES += termios04/termios_testdriver_intr.c
+termios11_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_termios11) \
+	$(support_includes) -I$(top_srcdir)/termios04 -DINTERRUPT_DRIVEN
 endif
 
Index: testsuites/libtests/configure.ac
===================================================================
--- testsuites/libtests/configure.ac	(revision ff4a4a862bc631936aa4fd1c17f181197b91db29)
+++ testsuites/libtests/configure.ac	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -226,4 +226,6 @@
 RTEMS_TEST_CHECK([termios08])
 RTEMS_TEST_CHECK([termios09])
+RTEMS_TEST_CHECK([termios10])
+RTEMS_TEST_CHECK([termios11])
 RTEMS_TEST_CHECK([top])
 RTEMS_TEST_CHECK([ttest01])
Index: testsuites/libtests/termios10/init.c
===================================================================
--- testsuites/libtests/termios10/init.c	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
+++ testsuites/libtests/termios10/init.c	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -0,0 +1,191 @@
+/*
+ *  COPYRIGHT (c) 1989-2012,2019.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ *  SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tmacros.h>
+#include "test_support.h"
+
+#ifdef INTERRUPT_DRIVEN
+#include "termios_testdriver_intr.h"
+const char rtems_test_name[] = "TERMIOS 11 -- Interrupt driven";
+#else
+#include "termios_testdriver_polled.h"
+const char rtems_test_name[] = "TERMIOS 10 -- Polled";
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <termios.h>
+#include <rtems/dumpbuf.h>
+#include <rtems/libio.h>
+
+int Test_fd;
+
+static void open_it(void)
+{
+  Test_fd = open( TERMIOS_TEST_DRIVER_DEVICE_NAME, O_RDWR );
+  rtems_test_assert( Test_fd != -1 );
+}
+
+static void change_lflag( const char *desc, int mask, int new )
+{ 
+  int            rc;
+  struct termios attr;
+  
+  if (desc) {
+    printf( "Changing c_lflag to: %s\n", desc );
+  }
+
+  rc = tcgetattr( Test_fd, &attr );
+  rtems_test_assert( rc == 0 );
+  
+  attr.c_lflag &= ~mask;
+  attr.c_lflag |= new;
+  
+  rc = tcsetattr( Test_fd, TCSANOW, &attr );
+  rtems_test_assert( rc == 0 );
+}
+
+
+static void read_it(ssize_t expected, int expected_intr)
+{
+  ssize_t rc;
+  char    buf[32];
+
+  rtems_test_assert( expected <= sizeof(buf) );
+
+  rc = read( Test_fd, buf, expected ); 
+  if (expected_intr) {
+    rtems_test_assert( rc == -1 );
+    rtems_test_assert( errno == EINTR );
+  } else {
+    if ( expected != rc )
+      printf( "ERROR - expected=%zd rc=%zd\n", expected, rc );
+    rtems_test_assert( expected == rc );
+  }
+}
+
+static void close_it(void)
+{
+  int rc;
+
+  rc = close( Test_fd );
+  rtems_test_assert( rc == 0 );
+}
+
+volatile int sigint_occurred = 0;
+volatile int sigquit_occurred = 0;
+
+static void sigint_handler(int signo)
+{
+  rtems_test_assert(signo == SIGINT);
+  sigint_occurred = 1; 
+}
+
+static void sigquit_handler(int signo)
+{
+  rtems_test_assert(signo == SIGQUIT);
+  sigquit_occurred = 1; 
+}
+
+static void test_read_for_signal(
+  const char *description,
+  int         isig_value,
+  char        c,
+  int         sigint_expected,
+  int         sigquit_expected
+)
+{
+  char expected[3];
+
+  printf("Test read for %s\n", description);
+
+  expected[0] = c;
+  expected[1] = '\n'; /* in canonical mode, so need \n for read to return */
+  expected[2] = '\0';
+
+  sigint_occurred  = 0;
+  sigquit_occurred = 0;
+
+  open_it();
+
+  change_lflag(NULL, ISIG, isig_value);
+
+  termios_test_driver_set_rx( expected, 2 );
+
+  read_it(1, (sigint_expected || sigquit_expected));
+
+  rtems_test_assert(sigint_occurred == sigint_expected);
+  rtems_test_assert(sigquit_occurred == sigquit_expected);
+  close_it();
+}
+
+/*
+ * Use a POSIX init thread so signals are enabled.
+ */
+static void *POSIX_Init(void *argument)
+{
+  int rc;
+
+  TEST_BEGIN();
+
+  signal(SIGINT, sigint_handler);
+  signal(SIGQUIT, sigquit_handler);
+
+  puts( "Exercise default ISIG handler with ISIG enabled");
+  test_read_for_signal("VKILL - no signals", ISIG, '\003', 0, 0);
+  test_read_for_signal("VQUIT - no signals", ISIG, '\034', 0, 0);
+
+  puts( "Exercise POSIX ISIG handler with ISIG enabled");
+  rc = rtems_termios_register_isig_handler(rtems_termios_posix_isig_handler);
+  rtems_test_assert( rc == 0 );
+  test_read_for_signal("VKILL - signal caught", ISIG, '\003', 1, 0);
+  test_read_for_signal("VQUIT - signal caught", ISIG, '\034', 0, 1);
+
+  puts( "Exercise default ISIG handler with ISIG enabled");
+  rc = rtems_termios_register_isig_handler(rtems_termios_default_isig_handler);
+  rtems_test_assert( rc == 0 );
+  test_read_for_signal("VKILL - signal caught", ISIG, '\003', 0, 0);
+  test_read_for_signal("VQUIT - signal caught", ISIG, '\034', 0, 0);
+
+  puts( "Exercise POSIX ISIG handler with ISIG disabled");
+  rc = rtems_termios_register_isig_handler(rtems_termios_posix_isig_handler);
+  rtems_test_assert( rc == 0 );
+  test_read_for_signal("VKILL - signal caught", 0, '\003', 0, 0);
+  test_read_for_signal("VQUIT - signal caught", 0, '\034', 0, 0);
+
+  TEST_END();
+
+  rtems_test_exit(0);
+}
+
+/* configuration information */
+
+#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_EXTRA_DRIVERS \
+  TERMIOS_TEST_DRIVER_TABLE_ENTRY
+
+/* we need to be able to open the test device */
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
+#define CONFIGURE_MAXIMUM_POSIX_THREADS     1
+#define CONFIGURE_MAXIMUM_TIMERS            2
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>
+/* end of file */
Index: testsuites/libtests/termios10/termios10.scn
===================================================================
--- testsuites/libtests/termios10/termios10.scn	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
+++ testsuites/libtests/termios10/termios10.scn	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -0,0 +1,14 @@
+*** BEGIN OF TEST TERMIOS 10 -- Polled ***
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - no signals
+Test read for VQUIT - no signals
+Exercise POSIX ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise POSIX ISIG handler with ISIG disabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+*** END OF TEST TERMIOS 10 -- Polled ***
Index: testsuites/libtests/termios11/termios11.scn
===================================================================
--- testsuites/libtests/termios11/termios11.scn	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
+++ testsuites/libtests/termios11/termios11.scn	(revision 667501a314ba75f80f1c13c6b43dd35d0a00efd1)
@@ -0,0 +1,14 @@
+*** BEGIN OF TEST TERMIOS 11 -- Interrupt driven ***
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - no signals
+Test read for VQUIT - no signals
+Exercise POSIX ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise POSIX ISIG handler with ISIG disabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+*** END OF TEST TERMIOS 11 -- Interrupt driven ***
