diff --git a/arch/avr/include/avr32/irq.h b/arch/avr/include/avr32/irq.h
index caa6e9f5a9838b0f452f5ed979ffbe394bb73b60..a9d0d862645f273ccb005d3b7ca96cd834521f53 100644
--- a/arch/avr/include/avr32/irq.h
+++ b/arch/avr/include/avr32/irq.h
@@ -98,7 +98,6 @@
 #define INTCONTEXT_REGS   8 /* r8-r12, lr, pc, sr */
 #define XCPTCONTEXT_REGS 17 /* Plus r0-r7, sp */
 
-
 /****************************************************************************
  * Public Types
  ****************************************************************************/
diff --git a/arch/avr/src/avr32/up_fullcontextrestore.S b/arch/avr/src/avr32/up_fullcontextrestore.S
index c4023930743dd1b9b9e3eb825ce9826d20369695..c883c58c7eba238a3cc60d2fb15961f48b701136 100755
--- a/arch/avr/src/avr32/up_fullcontextrestore.S
+++ b/arch/avr/src/avr32/up_fullcontextrestore.S
@@ -53,6 +53,28 @@
 /****************************************************************************
  * Name: up_fullcontextrestore
  *
+ * Descripion:
+ *   Restore the full-running contex of a thread.
+ *
+ *   NOTE: Thus function must handle one very strange case.  That is when
+ *   this function is called with up_sigdeliver().  That case is strange in
+ *   two ways:
+ *
+ *   1. It is not a context switch between threads.  Rather, up_fullcontextrestore
+ *      must behave more it more like a longjmp within the same task, using the
+ *      same stack.
+ *   2. In this case, this function is called with r12 pointing to a register
+ *      save area on the stack to be destroyed.  This is dangerous for two
+ *      reasons: (a) there is a period of time where the stack contents still
+ *      contain valid data, but are outside of range protected by the stack
+ *      pointer (hence, interrupts must be disabled), and (b) there is the
+ *      very real possibility that the new stack pointer might overlap with
+ *      the register save area and stack usage in this function might corrupt
+ *      the register save data before the state is restored.
+ *
+ * Input Parameters:
+ *   r12 = A pointer to the register save area of the thread to be restored.
+ *
  * C Prototype:
  *  void up_fullcontextrestore(uint32_t *regs);
  *
diff --git a/arch/avr/src/avr32/up_sigdeliver.c b/arch/avr/src/avr32/up_sigdeliver.c
index aa3940b79818b3841c37ba81b8ba77133dab8f22..b000f118a81013f7695f34953e3aab9f7d297967 100644
--- a/arch/avr/src/avr32/up_sigdeliver.c
+++ b/arch/avr/src/avr32/up_sigdeliver.c
@@ -82,7 +82,7 @@
 void up_sigdeliver(void)
 {
   _TCB  *rtcb = (_TCB*)g_readytorun.head;
-  uint32_t regs[XCPTCONTEXT_REGS];
+  uint32_t regs[XCPTCONTEXT_REGS+3];  /* Why +3? See below */
   sig_deliver_t sigdeliver;
 
   /* Save the errno.  This must be preserved throughout the signal handling
@@ -128,7 +128,20 @@ void up_sigdeliver(void)
   (void)irqsave();
   rtcb->pterrno = saved_errno;
 
-  /* Then restore the correct state for this thread of execution. */
+  /* Then restore the correct state for this thread of execution. This is an
+   * unusual case that must be handled by up_fullcontextresore. This case is
+   * unusal in two ways:
+   *
+   *   1. It is not a context switch between threads.  Rather, up_fullcontextrestore
+   *      must behave more it more like a longjmp within the same task, using
+   *      he same stack.
+   *   2. In this case, up_fullcontextrestore is called with r12 pointing to
+   *      a register save area on the stack to be destroyed.  This is
+   *      dangerous because there is the very real possibility that the new
+   *      stack pointer might overlap with the register save area and hat stack
+   *      usage in up_fullcontextrestore might corrupt the register save data
+   *      before the state is restored.
+   */
 
   up_ledoff(LED_SIGNAL);
   up_fullcontextrestore(regs);