This is an automated email from the ASF dual-hosted git repository.

davids5 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit bf7399a982b15708bdddcb351390ddb4bfac7eb9
Author: Xiang Xiao <xiaoxi...@xiaomi.com>
AuthorDate: Sun Jul 5 13:37:48 2020 +0800

    arch: Initialize idle thread stack information
    
    and remove the special handling in the stack dump
    
    Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com>
    Change-Id: Ia1ef9a427bd4c7f6cee9838d0445f29cfaca3998
---
 TODO                                               | 55 ++++------------------
 arch/arm/src/arm/arm_assert.c                      | 12 +----
 arch/arm/src/arm/arm_initialstate.c                | 20 ++++----
 arch/arm/src/armv6-m/arm_assert.c                  | 12 +----
 arch/arm/src/armv6-m/arm_initialstate.c            | 20 ++++----
 arch/arm/src/armv7-a/arm_assert.c                  | 12 +----
 arch/arm/src/armv7-a/arm_initialstate.c            |  8 ++++
 arch/arm/src/armv7-m/arm_assert.c                  | 12 +----
 arch/arm/src/armv7-m/arm_initialstate.c            |  8 ++++
 arch/arm/src/armv7-r/arm_assert.c                  | 12 +----
 arch/arm/src/armv7-r/arm_initialstate.c            | 20 ++++----
 arch/arm/src/armv8-m/arm_assert.c                  | 12 +----
 arch/arm/src/armv8-m/arm_initialstate.c            |  8 ++++
 arch/arm/src/common/arm_usestack.c                 |  7 ++-
 arch/arm/src/efm32/efm32_start.h                   | 16 -------
 arch/arm/src/imxrt/imxrt_start.h                   | 11 -----
 arch/arm/src/kinetis/kinetis_start.h               | 16 -------
 arch/arm/src/lc823450/lc823450_start.h             | 16 -------
 arch/arm/src/lpc17xx_40xx/lpc17_40_start.h         | 16 -------
 arch/arm/src/lpc54xx/lpc54_start.h                 | 15 ------
 arch/arm/src/max326xx/max326_start.h               | 15 ------
 arch/arm/src/nrf52/nrf52_start.h                   | 15 ------
 arch/arm/src/s32k1xx/s32k1xx_start.h               | 11 -----
 arch/arm/src/sam34/sam_start.h                     | 16 -------
 arch/arm/src/samd5e5/sam_start.h                   | 16 -------
 arch/arm/src/samv7/sam_start.h                     | 27 -----------
 arch/arm/src/stm32/stm32_start.h                   | 16 -------
 arch/arm/src/stm32f7/stm32_start.h                 | 15 ------
 arch/arm/src/stm32h7/stm32_start.h                 | 15 ------
 arch/arm/src/tiva/tiva_start.h                     | 16 -------
 arch/arm/src/tms570/tms570_boot.h                  | 27 -----------
 arch/avr/src/avr/up_dumpstate.c                    | 12 +----
 arch/avr/src/avr/up_initialstate.c                 |  8 ++++
 arch/avr/src/avr/up_usestack.c                     | 13 ++---
 arch/avr/src/avr32/up_dumpstate.c                  | 12 +----
 arch/avr/src/avr32/up_initialstate.c               | 20 ++++----
 arch/avr/src/avr32/up_usestack.c                   | 13 ++---
 arch/hc/src/common/up_usestack.c                   | 19 ++++----
 arch/hc/src/m9s12/m9s12_assert.c                   | 12 +----
 arch/hc/src/m9s12/m9s12_initialstate.c             | 20 ++++----
 arch/mips/src/common/mips_usestack.c               | 19 ++++----
 arch/mips/src/mips32/mips_dumpstate.c              | 12 +----
 arch/mips/src/mips32/mips_initialstate.c           |  8 ++++
 arch/misoc/src/lm32/Make.defs                      |  2 +-
 arch/misoc/src/lm32/lm32_dumpstate.c               | 12 +----
 arch/misoc/src/lm32/lm32_initialstate.c            | 20 ++++----
 .../src/lm32/lm32_usestack.c}                      | 38 ++++++++-------
 arch/misoc/src/minerva/Make.defs                   |  2 +-
 arch/misoc/src/minerva/minerva_dumpstate.c         | 12 +----
 arch/misoc/src/minerva/minerva_initialstate.c      |  8 ++++
 .../src/minerva/minerva_usestack.c}                | 38 ++++++++-------
 arch/or1k/src/common/up_assert.c                   | 12 +----
 arch/or1k/src/common/up_initialstate.c             |  8 ++++
 .../src/common/up_usestack.c}                      | 38 ++++++++-------
 arch/or1k/src/mor1kx/Make.defs                     |  1 +
 arch/renesas/src/common/up_usestack.c              | 19 ++++----
 arch/renesas/src/m16c/chip.h                       |  1 -
 arch/renesas/src/m16c/m16c_dumpstate.c             | 12 +----
 arch/renesas/src/m16c/m16c_initialstate.c          |  8 ++++
 arch/renesas/src/rx65n/rx65n_dumpstate.c           | 12 +----
 arch/renesas/src/rx65n/rx65n_initialstate.c        |  8 ++++
 arch/renesas/src/sh1/sh1_dumpstate.c               | 12 +----
 arch/renesas/src/sh1/sh1_initialstate.c            | 16 +++----
 arch/risc-v/src/common/riscv_initialize.c          |  9 ----
 arch/risc-v/src/common/riscv_usestack.c            | 17 +++----
 arch/risc-v/src/rv32im/riscv_assert.c              | 12 +----
 arch/risc-v/src/rv32im/riscv_initialstate.c        |  8 ++++
 arch/risc-v/src/rv64gc/riscv_assert.c              | 12 +----
 arch/risc-v/src/rv64gc/riscv_initialstate.c        |  8 ++++
 arch/sim/src/sim/up_initialstate.c                 |  6 +++
 arch/sim/src/sim/up_usestack.c                     |  9 ++--
 arch/x86/src/common/up_assert.c                    | 12 +----
 arch/x86/src/i486/up_initialstate.c                | 20 ++++----
 arch/x86/src/i486/up_usestack.c                    | 19 ++++----
 arch/x86_64/src/common/up_assert.c                 | 14 ++----
 arch/x86_64/src/common/up_initialize.c             |  6 ---
 arch/x86_64/src/intel64/up_initialstate.c          | 20 ++++----
 arch/x86_64/src/intel64/up_usestack.c              | 19 ++++----
 arch/xtensa/src/common/xtensa_dumpstate.c          | 12 +----
 arch/xtensa/src/common/xtensa_initialstate.c       |  7 +++
 arch/xtensa/src/common/xtensa_usestack.c           |  9 ++--
 arch/z16/src/common/z16_usestack.c                 | 19 ++++----
 arch/z80/src/common/z80_stackframe.c               |  4 +-
 arch/z80/src/common/z80_usestack.c                 | 19 ++++----
 arch/z80/src/z180/z180_initialstate.c              | 20 ++++----
 arch/z80/src/z80/z80_initialstate.c                | 20 ++++----
 boards/arm/cxd56xx/common/src/cxd56_crashdump.c    | 12 +----
 boards/arm/stm32/nucleo-f429zi/src/stm32_bbsram.c  | 12 +----
 boards/arm/stm32f7/nucleo-144/src/stm32_bbsram.c   | 12 +----
 .../renesas/rx65n/rx65n-grrose/src/rx65n_sbram.c   | 12 +----
 .../renesas/rx65n/rx65n-rsk2mb/src/rx65n_sbram.c   | 12 +----
 91 files changed, 423 insertions(+), 882 deletions(-)

diff --git a/TODO b/TODO
index 8fd88f0..e03e408 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-NuttX TODO List (Last updated July 2, 2020)
+NuttX TODO List (Last updated July 19, 2020)
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 This file summarizes known NuttX bugs, limitations, inconsistencies with
@@ -295,49 +295,10 @@ o Task/Scheduler (sched/)
   Task:        IDLE THREAD TCB SETUP
   Description: There are issues with setting IDLE thread stacks:
 
-               1. One problem is stack-related data in the IDLE threads TCB.
-                  A solution might be to standardize the use of 
g_idle_topstack.
-                  That you could add initialization like this in nx_start:
-
-                  @@ -344,6 +347,11 @@ void nx_start(void)
-                     g_idleargv[1]  = NULL;
-                     g_idletcb.argv = g_idleargv;
-
-                  +  /* Set the IDLE task stack size */
-                  +
-                  +  g_idletcb.cmn.adj_stack_size = 
CONFIG_IDLETHREAD_STACKSIZE;
-                  +  g_idletcb.cmn.stack_alloc_ptr = (void *)(g_idle_topstack 
- CONFIG_IDLETHREAD_STACKSIZE);
-                  +
-                     /* Then add the idle task's TCB to the head of the ready 
to run list */
-
-                     dq_addfirst((FAR dq_entry_t *)&g_idletcb, (FAR dq_queue_t 
*)&g_readytorun);
-
-                  The g_idle_topstack variable is available for almost all 
architectures:
-
-                  $ find . -name *.h | xargs grep g_idle_top
-                  ./arm/src/common/up_internal.h:EXTERN const uint32_t 
g_idle_topstack;
-                  ./avr/src/avr/avr.h:extern uint16_t g_idle_topstack;
-                  ./avr/src/avr32/avr32.h:extern uint32_t g_idle_topstack;
-                  ./hc/src/common/up_internal.h:extern uint16_t 
g_idle_topstack;
-                  ./mips/src/common/up_internal.h:extern uint32_t 
g_idle_topstack;
-                  ./misoc/src/lm32/lm32.h:extern uint32_t g_idle_topstack;
-                  ./renesas/src/common/up_internal.h:extern uint32_t 
g_idle_topstack;
-                  ./renesas/src/m16c/chip.h:extern uint32_t g_idle_topstack; 
/* Start of the heap */
-                  ./risc-v/src/common/up_internal.h:EXTERN uint32_t 
g_idle_topstack;
-                  ./x86/src/common/up_internal.h:extern uint32_t 
g_idle_topstack;
-
-                  That omits these architectures: sh1, sim, xtensa, z16, z80,
-                  ez80, and z8.  All would have to support this common
-                  global variable.
-
-                  Also, the stack itself may be 8-, 16-, or 32-bits wide,
-                  depending upon the architecture and do have differing
-                  alignment requirements.
-
-               2. Another problem is colorizing that stack to use with
-                 stack usage monitoring logic.  There is logic in some
-                 start functions to do this in a function called go_nx_start.
-                 It is available in these architectures:
+               The problem is colorizing that stack to use with stack usage
+               monitoring logic.  There is logic in some start functions to
+               do this in a function called go_nx_start.
+               It is available in these architectures:
 
                  ./arm/src/efm32/efm32_start.c:static void go_nx_start(void 
*pv, unsigned int nbytes)
                  ./arm/src/kinetis/kinetis_start.c:static void 
go_nx_start(void *pv, unsigned int nbytes)
@@ -349,9 +310,9 @@ o Task/Scheduler (sched/)
                  ./arm/src/tms570/tms570_boot.c:static void go_nx_start(void 
*pv, unsigned int nbytes)
                  ./arm/src/xmc4/xmc4_start.c:static void go_nx_start(void *pv, 
unsigned int nbytes)
 
-                 But no others.
-  Status:     Open
-  Priority:   Low, only needed for more complete debug.
+               But no others.
+  Status:      Open
+  Priority:    Low, only needed for more complete debug.
 
   Title:       PRIORITY INHERITANCE WITH SPORADIC SCHEDULER
   Description: The sporadic scheduler manages CPU utilization by a task by
diff --git a/arch/arm/src/arm/arm_assert.c b/arch/arm/src/arm/arm_assert.c
index 71e1512..e4f445b 100644
--- a/arch/arm/src/arm/arm_assert.c
+++ b/arch/arm/src/arm/arm_assert.c
@@ -187,16 +187,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/arm/src/arm/arm_initialstate.c 
b/arch/arm/src/arm/arm_initialstate.c
index d18aa6b..13c9c92 100644
--- a/arch/arm/src/arm/arm_initialstate.c
+++ b/arch/arm/src/arm/arm_initialstate.c
@@ -49,18 +49,6 @@
 #include "arm_arch.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -83,6 +71,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   uint32_t cpsr;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/arm/src/armv6-m/arm_assert.c 
b/arch/arm/src/armv6-m/arm_assert.c
index bbc1e41..382a039 100644
--- a/arch/arm/src/armv6-m/arm_assert.c
+++ b/arch/arm/src/armv6-m/arm_assert.c
@@ -224,16 +224,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/arm/src/armv6-m/arm_initialstate.c 
b/arch/arm/src/armv6-m/arm_initialstate.c
index 263d502..25ccafa 100644
--- a/arch/arm/src/armv6-m/arm_initialstate.c
+++ b/arch/arm/src/armv6-m/arm_initialstate.c
@@ -52,18 +52,6 @@
 #include "exc_return.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -85,6 +73,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/arm/src/armv7-a/arm_assert.c 
b/arch/arm/src/armv7-a/arm_assert.c
index 3e5e48a..683264e 100644
--- a/arch/arm/src/armv7-a/arm_assert.c
+++ b/arch/arm/src/armv7-a/arm_assert.c
@@ -212,16 +212,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   _alert("Current sp: %08x\n", sp);
 
diff --git a/arch/arm/src/armv7-a/arm_initialstate.c 
b/arch/arm/src/armv7-a/arm_initialstate.c
index 97b3c0a..65af4b0 100644
--- a/arch/arm/src/armv7-a/arm_initialstate.c
+++ b/arch/arm/src/armv7-a/arm_initialstate.c
@@ -71,6 +71,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   uint32_t cpsr;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/arm/src/armv7-m/arm_assert.c 
b/arch/arm/src/armv7-m/arm_assert.c
index aae1da4..382297f 100644
--- a/arch/arm/src/armv7-m/arm_assert.c
+++ b/arch/arm/src/armv7-m/arm_assert.c
@@ -217,16 +217,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 7
   /* Get the limits on the interrupt stack memory */
diff --git a/arch/arm/src/armv7-m/arm_initialstate.c 
b/arch/arm/src/armv7-m/arm_initialstate.c
index b014b18..0a02a4c 100644
--- a/arch/arm/src/armv7-m/arm_initialstate.c
+++ b/arch/arm/src/armv7-m/arm_initialstate.c
@@ -59,6 +59,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/arm/src/armv7-r/arm_assert.c 
b/arch/arm/src/armv7-r/arm_assert.c
index ae4c719..4c65ad5 100644
--- a/arch/arm/src/armv7-r/arm_assert.c
+++ b/arch/arm/src/armv7-r/arm_assert.c
@@ -209,16 +209,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   _alert("Current sp: %08x\n", sp);
 
diff --git a/arch/arm/src/armv7-r/arm_initialstate.c 
b/arch/arm/src/armv7-r/arm_initialstate.c
index edd7c6d..edbf811 100644
--- a/arch/arm/src/armv7-r/arm_initialstate.c
+++ b/arch/arm/src/armv7-r/arm_initialstate.c
@@ -49,18 +49,6 @@
 #include "arm_arch.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -83,6 +71,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   uint32_t cpsr;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/arm/src/armv8-m/arm_assert.c 
b/arch/arm/src/armv8-m/arm_assert.c
index 4477964..ac0b9b7 100644
--- a/arch/arm/src/armv8-m/arm_assert.c
+++ b/arch/arm/src/armv8-m/arm_assert.c
@@ -217,16 +217,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 7
   /* Get the limits on the interrupt stack memory */
diff --git a/arch/arm/src/armv8-m/arm_initialstate.c 
b/arch/arm/src/armv8-m/arm_initialstate.c
index 969c9be..4593039 100644
--- a/arch/arm/src/armv8-m/arm_initialstate.c
+++ b/arch/arm/src/armv8-m/arm_initialstate.c
@@ -59,6 +59,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/arm/src/common/arm_usestack.c 
b/arch/arm/src/common/arm_usestack.c
index 2fda891..e0e03b4 100644
--- a/arch/arm/src/common/arm_usestack.c
+++ b/arch/arm/src/common/arm_usestack.c
@@ -146,8 +146,11 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
    * water marks.
    */
 
-  arm_stack_color((FAR void *)((uintptr_t)tcb->adj_stack_ptr -
-      tcb->adj_stack_size), tcb->adj_stack_size);
+  if (tcb->pid != 0)
+    {
+      arm_stack_color((FAR void *)((uintptr_t)tcb->adj_stack_ptr -
+          tcb->adj_stack_size), tcb->adj_stack_size);
+    }
 #endif /* CONFIG_STACK_COLORATION */
 
   return OK;
diff --git a/arch/arm/src/efm32/efm32_start.h b/arch/arm/src/efm32/efm32_start.h
index f63ff36..693f3a4 100644
--- a/arch/arm/src/efm32/efm32_start.h
+++ b/arch/arm/src/efm32/efm32_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 /****************************************************************************
- * Public Data
- ****************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
diff --git a/arch/arm/src/imxrt/imxrt_start.h b/arch/arm/src/imxrt/imxrt_start.h
index b8e0b51..59e19af 100644
--- a/arch/arm/src/imxrt/imxrt_start.h
+++ b/arch/arm/src/imxrt/imxrt_start.h
@@ -77,17 +77,6 @@ extern "C"
 #define EXTERN extern
 #endif
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-EXTERN const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/arm/src/kinetis/kinetis_start.h 
b/arch/arm/src/kinetis/kinetis_start.h
index e37361b..6c2eb7b 100644
--- a/arch/arm/src/kinetis/kinetis_start.h
+++ b/arch/arm/src/kinetis/kinetis_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 
/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
 
diff --git a/arch/arm/src/lc823450/lc823450_start.h 
b/arch/arm/src/lc823450/lc823450_start.h
index a3836c8..9f7d2d2 100644
--- a/arch/arm/src/lc823450/lc823450_start.h
+++ b/arch/arm/src/lc823450/lc823450_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 
/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
 
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_start.h 
b/arch/arm/src/lpc17xx_40xx/lpc17_40_start.h
index 3bcbf3a..94f29aa 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_start.h
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 
/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
 
diff --git a/arch/arm/src/lpc54xx/lpc54_start.h 
b/arch/arm/src/lpc54xx/lpc54_start.h
index 00e0cfa..5933205 100644
--- a/arch/arm/src/lpc54xx/lpc54_start.h
+++ b/arch/arm/src/lpc54xx/lpc54_start.h
@@ -50,23 +50,8 @@
 #include "arm_internal.h"
 #include "chip.h"
 
-/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
 #ifndef __ASSEMBLY__
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/arm/src/max326xx/max326_start.h 
b/arch/arm/src/max326xx/max326_start.h
index feb0be7..0c2c297 100644
--- a/arch/arm/src/max326xx/max326_start.h
+++ b/arch/arm/src/max326xx/max326_start.h
@@ -50,23 +50,8 @@
 #include "arm_internal.h"
 #include "chip.h"
 
-/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
 #ifndef __ASSEMBLY__
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/arm/src/nrf52/nrf52_start.h b/arch/arm/src/nrf52/nrf52_start.h
index 4b26bdc..519a3af 100644
--- a/arch/arm/src/nrf52/nrf52_start.h
+++ b/arch/arm/src/nrf52/nrf52_start.h
@@ -50,23 +50,8 @@
 #include "arm_internal.h"
 #include "chip.h"
 
-/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
 #ifndef __ASSEMBLY__
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/arm/src/s32k1xx/s32k1xx_start.h 
b/arch/arm/src/s32k1xx/s32k1xx_start.h
index cc708d7..45d212e 100644
--- a/arch/arm/src/s32k1xx/s32k1xx_start.h
+++ b/arch/arm/src/s32k1xx/s32k1xx_start.h
@@ -56,17 +56,6 @@
 
 #ifndef __ASSEMBLY__
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
 /* Each S32K1xx board must provide the following initialized structure.  This 
is
  * needed to establish the initial board clocking.
  */
diff --git a/arch/arm/src/sam34/sam_start.h b/arch/arm/src/sam34/sam_start.h
index 05644ef..b39cbbb 100644
--- a/arch/arm/src/sam34/sam_start.h
+++ b/arch/arm/src/sam34/sam_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 
/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
 
diff --git a/arch/arm/src/samd5e5/sam_start.h b/arch/arm/src/samd5e5/sam_start.h
index 3e44fb3..96ed7ac 100644
--- a/arch/arm/src/samd5e5/sam_start.h
+++ b/arch/arm/src/samd5e5/sam_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 
/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
 
diff --git a/arch/arm/src/samv7/sam_start.h b/arch/arm/src/samv7/sam_start.h
index 2ca8804..4a33cf4 100644
--- a/arch/arm/src/samv7/sam_start.h
+++ b/arch/arm/src/samv7/sam_start.h
@@ -50,24 +50,8 @@
 #include "arm_internal.h"
 #include "chip.h"
 
-/************************************************************************************
- * Pre-processor Definitions
- 
************************************************************************************/
-
-/************************************************************************************
- * Public Types
- 
************************************************************************************/
-
-/************************************************************************************
- * Inline Functions
- 
************************************************************************************/
-
 #ifndef __ASSEMBLY__
 
-/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
 #undef EXTERN
 #if defined(__cplusplus)
 #define EXTERN extern "C"
@@ -77,17 +61,6 @@ extern "C"
 #define EXTERN extern
 #endif
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-EXTERN const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/arm/src/stm32/stm32_start.h b/arch/arm/src/stm32/stm32_start.h
index ac6b90b..9111426 100644
--- a/arch/arm/src/stm32/stm32_start.h
+++ b/arch/arm/src/stm32/stm32_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 
/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
 
diff --git a/arch/arm/src/stm32f7/stm32_start.h 
b/arch/arm/src/stm32f7/stm32_start.h
index df85f59..35c2802 100644
--- a/arch/arm/src/stm32f7/stm32_start.h
+++ b/arch/arm/src/stm32f7/stm32_start.h
@@ -50,10 +50,6 @@
 #include "arm_internal.h"
 #include "chip.h"
 
-/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
 #ifndef __ASSEMBLY__
 
 #undef EXTERN
@@ -65,17 +61,6 @@ extern "C"
 #define EXTERN extern
 #endif
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-EXTERN const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/arm/src/stm32h7/stm32_start.h 
b/arch/arm/src/stm32h7/stm32_start.h
index afae133..7972586 100644
--- a/arch/arm/src/stm32h7/stm32_start.h
+++ b/arch/arm/src/stm32h7/stm32_start.h
@@ -50,10 +50,6 @@
 #include "arm_internal.h"
 #include "chip.h"
 
-/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
 #ifndef __ASSEMBLY__
 
 #undef EXTERN
@@ -65,17 +61,6 @@ extern "C"
 #define EXTERN extern
 #endif
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-EXTERN const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/arm/src/tiva/tiva_start.h b/arch/arm/src/tiva/tiva_start.h
index 64c449d..1a2bb83 100644
--- a/arch/arm/src/tiva/tiva_start.h
+++ b/arch/arm/src/tiva/tiva_start.h
@@ -43,22 +43,6 @@
 #include <nuttx/config.h>
 
 /****************************************************************************
- * Public Data
- ****************************************************************************/
-
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
- * linker script. _ebss lies at the end of the BSS region. The idle task
- * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
- * The IDLE thread is the thread that the system boots on and, eventually,
- * becomes the IDLE, do nothing task that runs only when there is nothing
- * else to run.  The heap continues from there until the end of memory.
- * g_idle_topstack is a read-only variable the provides this computed
- * address.
- */
-
-extern const uintptr_t g_idle_topstack;
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
diff --git a/arch/arm/src/tms570/tms570_boot.h 
b/arch/arm/src/tms570/tms570_boot.h
index 83ead3d..9f4307c 100644
--- a/arch/arm/src/tms570/tms570_boot.h
+++ b/arch/arm/src/tms570/tms570_boot.h
@@ -50,24 +50,8 @@
 #include "arm_internal.h"
 #include "chip.h"
 
-/************************************************************************************
- * Pre-processor Definitions
- 
************************************************************************************/
-
-/************************************************************************************
- * Public Types
- 
************************************************************************************/
-
-/************************************************************************************
- * Inline Functions
- 
************************************************************************************/
-
 #ifndef __ASSEMBLY__
 
-/************************************************************************************
- * Public Data
- 
************************************************************************************/
-
 #undef EXTERN
 #if defined(__cplusplus)
 #define EXTERN extern "C"
@@ -77,17 +61,6 @@ extern "C"
 #define EXTERN extern
 #endif
 
-/* g_idle_topstack: _sbss is the start of the BSS region as defined by the 
linker
- * script. _ebss lies at the end of the BSS region. The idle task stack starts 
at
- * the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.  The IDLE thread 
is
- * the thread that the system boots on and, eventually, becomes the IDLE, do
- * nothing task that runs only when there is nothing else to run.  The heap
- * continues from there until the end of memory.  g_idle_topstack is a 
read-only
- * variable the provides this computed address.
- */
-
-EXTERN const uintptr_t g_idle_topstack;
-
 
/************************************************************************************
  * Public Function Prototypes
  
************************************************************************************/
diff --git a/arch/avr/src/avr/up_dumpstate.c b/arch/avr/src/avr/up_dumpstate.c
index 0dc4c69..def4699 100644
--- a/arch/avr/src/avr/up_dumpstate.c
+++ b/arch/avr/src/avr/up_dumpstate.c
@@ -154,16 +154,8 @@ void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 1;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint16_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint16_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint16_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint16_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/avr/src/avr/up_initialstate.c 
b/arch/avr/src/avr/up_initialstate.c
index 5c63f23..9f97513 100644
--- a/arch/avr/src/avr/up_initialstate.c
+++ b/arch/avr/src/avr/up_initialstate.c
@@ -71,6 +71,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure.  Zeroing
    * all registers is a good debug helper, but should not be necessary.
    */
diff --git a/arch/avr/src/avr/up_usestack.c b/arch/avr/src/avr/up_usestack.c
index 0721160..6a4eee6 100644
--- a/arch/avr/src/avr/up_usestack.c
+++ b/arch/avr/src/avr/up_usestack.c
@@ -52,14 +52,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -119,7 +111,10 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
    */
 
 #ifdef CONFIG_STACK_COLORATION
-  memset(tcb->stack_alloc_ptr, STACK_COLOR, stack_size);
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, STACK_COLOR, stack_size);
+    }
 #endif
 
   /* The AVR uses a push-down stack:  the stack grows toward loweraddresses
diff --git a/arch/avr/src/avr32/up_dumpstate.c 
b/arch/avr/src/avr32/up_dumpstate.c
index f818041..c98d912 100644
--- a/arch/avr/src/avr32/up_dumpstate.c
+++ b/arch/avr/src/avr32/up_dumpstate.c
@@ -124,16 +124,8 @@ void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/avr/src/avr32/up_initialstate.c 
b/arch/avr/src/avr32/up_initialstate.c
index 2d47382..4383a2f 100644
--- a/arch/avr/src/avr32/up_initialstate.c
+++ b/arch/avr/src/avr32/up_initialstate.c
@@ -49,18 +49,6 @@
 #include "up_arch.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -81,6 +69,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure.  Zeroing
    * all registers is a good debug helper, but should not be necessary.
    */
diff --git a/arch/avr/src/avr32/up_usestack.c b/arch/avr/src/avr32/up_usestack.c
index 19d8137..c30163e 100644
--- a/arch/avr/src/avr32/up_usestack.c
+++ b/arch/avr/src/avr32/up_usestack.c
@@ -51,14 +51,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -119,7 +111,10 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
    */
 
 #ifdef CONFIG_STACK_COLORATION
-  memset(tcb->stack_alloc_ptr, STACK_COLOR, stack_size);
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, STACK_COLOR, stack_size);
+    }
 #endif
 
   /* The AVR32 uses a push-down stack:  the stack grows
diff --git a/arch/hc/src/common/up_usestack.c b/arch/hc/src/common/up_usestack.c
index 59b0188..beaf299 100644
--- a/arch/hc/src/common/up_usestack.c
+++ b/arch/hc/src/common/up_usestack.c
@@ -50,14 +50,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -113,6 +105,17 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
   /* The CPU12 uses a push-down stack: the stack grows
    * toward lower addresses in memory. Because the CPU12 stack
    * operates as a decrement then store stack, the value assigned
diff --git a/arch/hc/src/m9s12/m9s12_assert.c b/arch/hc/src/m9s12/m9s12_assert.c
index 487031c..7e1696b 100644
--- a/arch/hc/src/m9s12/m9s12_assert.c
+++ b/arch/hc/src/m9s12/m9s12_assert.c
@@ -199,16 +199,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint16_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint16_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint16_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint16_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/hc/src/m9s12/m9s12_initialstate.c 
b/arch/hc/src/m9s12/m9s12_initialstate.c
index 89e2ac9..2bd6931 100644
--- a/arch/hc/src/m9s12/m9s12_initialstate.c
+++ b/arch/hc/src/m9s12/m9s12_initialstate.c
@@ -47,18 +47,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -80,6 +68,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/mips/src/common/mips_usestack.c 
b/arch/mips/src/common/mips_usestack.c
index 30a6a7e..aa7071d 100644
--- a/arch/mips/src/common/mips_usestack.c
+++ b/arch/mips/src/common/mips_usestack.c
@@ -71,14 +71,6 @@
 #define STACK_ALIGN_UP(a)   (((a) + STACK_ALIGN_MASK) & ~STACK_ALIGN_MASK)
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -134,6 +126,17 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
   /* MIPS uses a push-down stack:  the stack grows toward loweraddresses in
    * memory.  The stack pointer register, points to the lowest, valid work
    * address (the "top" of the stack).  Items on the stack are referenced
diff --git a/arch/mips/src/mips32/mips_dumpstate.c 
b/arch/mips/src/mips32/mips_dumpstate.c
index 58c3da6..9005001 100644
--- a/arch/mips/src/mips32/mips_dumpstate.c
+++ b/arch/mips/src/mips32/mips_dumpstate.c
@@ -144,16 +144,8 @@ void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/mips/src/mips32/mips_initialstate.c 
b/arch/mips/src/mips32/mips_initialstate.c
index 7a7c242..9b02f5b 100644
--- a/arch/mips/src/mips32/mips_initialstate.c
+++ b/arch/mips/src/mips32/mips_initialstate.c
@@ -73,6 +73,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   uint32_t regval;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/misoc/src/lm32/Make.defs b/arch/misoc/src/lm32/Make.defs
index b8f21a0..15ec51f 100644
--- a/arch/misoc/src/lm32/Make.defs
+++ b/arch/misoc/src/lm32/Make.defs
@@ -50,4 +50,4 @@ CHIP_CSRCS += lm32_initialize.c lm32_initialstate.c 
lm32_interruptcontext.c
 CHIP_CSRCS += lm32_irq.c lm32_releasepending.c lm32_releasestack.c
 CHIP_CSRCS += lm32_stackframe.c lm32_swint.c lm32_unblocktask.c
 CHIP_CSRCS += lm32_reprioritizertr.c lm32_schedulesigaction.c lm32_sigdeliver.c
-CHIP_CSRCS += lm32_flushcache.c
+CHIP_CSRCS += lm32_flushcache.c  lm32_usetack.c
diff --git a/arch/misoc/src/lm32/lm32_dumpstate.c 
b/arch/misoc/src/lm32/lm32_dumpstate.c
index f6ff679..9274b2a 100644
--- a/arch/misoc/src/lm32/lm32_dumpstate.c
+++ b/arch/misoc/src/lm32/lm32_dumpstate.c
@@ -141,16 +141,8 @@ void lm32_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/misoc/src/lm32/lm32_initialstate.c 
b/arch/misoc/src/lm32/lm32_initialstate.c
index f76c82e..9a9c000 100644
--- a/arch/misoc/src/lm32/lm32_initialstate.c
+++ b/arch/misoc/src/lm32/lm32_initialstate.c
@@ -50,18 +50,6 @@
 #include "lm32.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -83,6 +71,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/z80/src/common/z80_usestack.c 
b/arch/misoc/src/lm32/lm32_usestack.c
similarity index 81%
copy from arch/z80/src/common/z80_usestack.c
copy to arch/misoc/src/lm32/lm32_usestack.c
index 2ce1829..ee4189c 100644
--- a/arch/z80/src/common/z80_usestack.c
+++ b/arch/misoc/src/lm32/lm32_usestack.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/z80/src/common/z80_usestack.c
+ * arch/misoc/src/lm32/lm32_usestack.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -28,20 +28,11 @@
 #include <stdint.h>
 #include <sched.h>
 #include <debug.h>
+
 #include <nuttx/kmalloc.h>
 #include <nuttx/arch.h>
 #include <nuttx/tls.h>
 
-#include "z80_internal.h"
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -98,16 +89,27 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
-  /* The Z80 uses a push-down stack:  the stack grows toward lower
-   * addresses in memory.  The stack pointer register, points to the
-   * lowest, valid work address (the "top" of the stack).  Items on
-   * the stack are* referenced as positive word offsets from sp.
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
+  /* The i486 uses a push-down stack:  the stack grows toward loweraddresses
+   * in memory.  The stack pointer register, points to the lowest, valid work
+   * address (the "top" of the stack).  Items on the stack are referenced as
+   * positive word offsets from sp.
    */
 
   top_of_stack = (uint32_t)tcb->stack_alloc_ptr + stack_size - 4;
 
-  /* The Z80 stack does not need to be aligned.  Here is is aligned at
-   * word (4 byte) boundary.
+  /* The i486 stack must be aligned at word (4 byte) boundaries. If necessary
+   * top_of_stack must be rounded down to the next boundary
    */
 
   top_of_stack &= ~3;
@@ -115,7 +117,7 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   /* Save the adjusted stack values in the struct tcb_s */
 
-  tcb->adj_stack_size = top_of_stack;
+  tcb->adj_stack_ptr  = (uint32_t *)top_of_stack;
   tcb->adj_stack_size = size_of_stack;
 
   /* Initialize the TLS data structure */
diff --git a/arch/misoc/src/minerva/Make.defs b/arch/misoc/src/minerva/Make.defs
index ed7fdcf..dd80adf 100644
--- a/arch/misoc/src/minerva/Make.defs
+++ b/arch/misoc/src/minerva/Make.defs
@@ -50,4 +50,4 @@ CHIP_CSRCS += minerva_initialize.c minerva_initialstate.c 
minerva_interruptconte
 CHIP_CSRCS += minerva_irq.c minerva_releasepending.c minerva_releasestack.c
 CHIP_CSRCS += minerva_stackframe.c minerva_swint.c minerva_unblocktask.c
 CHIP_CSRCS += minerva_reprioritizertr.c minerva_schedulesigaction.c 
minerva_sigdeliver.c
-CHIP_CSRCS += minerva_flushcache.c minerva_doexceptions.c
+CHIP_CSRCS += minerva_flushcache.c minerva_doexceptions.c minerva_usetack.c
diff --git a/arch/misoc/src/minerva/minerva_dumpstate.c 
b/arch/misoc/src/minerva/minerva_dumpstate.c
index 6bd5548..99228e7 100644
--- a/arch/misoc/src/minerva/minerva_dumpstate.c
+++ b/arch/misoc/src/minerva/minerva_dumpstate.c
@@ -148,16 +148,8 @@ void minerva_dumpstate(void)
    * == NULL)
    */
 
-  if (rtcb->flink == NULL)
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t) rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t) rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t) rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t) rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/misoc/src/minerva/minerva_initialstate.c 
b/arch/misoc/src/minerva/minerva_initialstate.c
index b4ae097..bcc0621 100644
--- a/arch/misoc/src/minerva/minerva_initialstate.c
+++ b/arch/misoc/src/minerva/minerva_initialstate.c
@@ -75,6 +75,14 @@ void up_initial_state(struct tcb_s *tcb)
   uint32_t regval;
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/z80/src/common/z80_usestack.c 
b/arch/misoc/src/minerva/minerva_usestack.c
similarity index 81%
copy from arch/z80/src/common/z80_usestack.c
copy to arch/misoc/src/minerva/minerva_usestack.c
index 2ce1829..782177d 100644
--- a/arch/z80/src/common/z80_usestack.c
+++ b/arch/misoc/src/minerva/minerva_usestack.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/z80/src/common/z80_usestack.c
+ * arch/misoc/src/minerva/minerva_usestack.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -28,20 +28,11 @@
 #include <stdint.h>
 #include <sched.h>
 #include <debug.h>
+
 #include <nuttx/kmalloc.h>
 #include <nuttx/arch.h>
 #include <nuttx/tls.h>
 
-#include "z80_internal.h"
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -98,16 +89,27 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
-  /* The Z80 uses a push-down stack:  the stack grows toward lower
-   * addresses in memory.  The stack pointer register, points to the
-   * lowest, valid work address (the "top" of the stack).  Items on
-   * the stack are* referenced as positive word offsets from sp.
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
+  /* The i486 uses a push-down stack:  the stack grows toward loweraddresses
+   * in memory.  The stack pointer register, points to the lowest, valid work
+   * address (the "top" of the stack).  Items on the stack are referenced as
+   * positive word offsets from sp.
    */
 
   top_of_stack = (uint32_t)tcb->stack_alloc_ptr + stack_size - 4;
 
-  /* The Z80 stack does not need to be aligned.  Here is is aligned at
-   * word (4 byte) boundary.
+  /* The i486 stack must be aligned at word (4 byte) boundaries. If necessary
+   * top_of_stack must be rounded down to the next boundary
    */
 
   top_of_stack &= ~3;
@@ -115,7 +117,7 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   /* Save the adjusted stack values in the struct tcb_s */
 
-  tcb->adj_stack_size = top_of_stack;
+  tcb->adj_stack_ptr  = (uint32_t *)top_of_stack;
   tcb->adj_stack_size = size_of_stack;
 
   /* Initialize the TLS data structure */
diff --git a/arch/or1k/src/common/up_assert.c b/arch/or1k/src/common/up_assert.c
index d7abb50..6a81ae8 100644
--- a/arch/or1k/src/common/up_assert.c
+++ b/arch/or1k/src/common/up_assert.c
@@ -224,16 +224,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/or1k/src/common/up_initialstate.c 
b/arch/or1k/src/common/up_initialstate.c
index 8754b3f..667a7cf 100644
--- a/arch/or1k/src/common/up_initialstate.c
+++ b/arch/or1k/src/common/up_initialstate.c
@@ -73,6 +73,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   uint32_t sr;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/z80/src/common/z80_usestack.c 
b/arch/or1k/src/common/up_usestack.c
similarity index 81%
copy from arch/z80/src/common/z80_usestack.c
copy to arch/or1k/src/common/up_usestack.c
index 2ce1829..782177d 100644
--- a/arch/z80/src/common/z80_usestack.c
+++ b/arch/or1k/src/common/up_usestack.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/z80/src/common/z80_usestack.c
+ * arch/misoc/src/minerva/minerva_usestack.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -28,20 +28,11 @@
 #include <stdint.h>
 #include <sched.h>
 #include <debug.h>
+
 #include <nuttx/kmalloc.h>
 #include <nuttx/arch.h>
 #include <nuttx/tls.h>
 
-#include "z80_internal.h"
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -98,16 +89,27 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
-  /* The Z80 uses a push-down stack:  the stack grows toward lower
-   * addresses in memory.  The stack pointer register, points to the
-   * lowest, valid work address (the "top" of the stack).  Items on
-   * the stack are* referenced as positive word offsets from sp.
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
+  /* The i486 uses a push-down stack:  the stack grows toward loweraddresses
+   * in memory.  The stack pointer register, points to the lowest, valid work
+   * address (the "top" of the stack).  Items on the stack are referenced as
+   * positive word offsets from sp.
    */
 
   top_of_stack = (uint32_t)tcb->stack_alloc_ptr + stack_size - 4;
 
-  /* The Z80 stack does not need to be aligned.  Here is is aligned at
-   * word (4 byte) boundary.
+  /* The i486 stack must be aligned at word (4 byte) boundaries. If necessary
+   * top_of_stack must be rounded down to the next boundary
    */
 
   top_of_stack &= ~3;
@@ -115,7 +117,7 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   /* Save the adjusted stack values in the struct tcb_s */
 
-  tcb->adj_stack_size = top_of_stack;
+  tcb->adj_stack_ptr  = (uint32_t *)top_of_stack;
   tcb->adj_stack_size = size_of_stack;
 
   /* Initialize the TLS data structure */
diff --git a/arch/or1k/src/mor1kx/Make.defs b/arch/or1k/src/mor1kx/Make.defs
index 1210b53..d272b4d 100644
--- a/arch/or1k/src/mor1kx/Make.defs
+++ b/arch/or1k/src/mor1kx/Make.defs
@@ -41,6 +41,7 @@ CMN_CSRCS  = up_initialize.c \
              up_interruptcontext.c \
              up_allocateheap.c \
              up_createstack.c \
+             up_usestack.c \
              up_releasestack.c \
              up_stackframe.c \
              up_initialstate.c \
diff --git a/arch/renesas/src/common/up_usestack.c 
b/arch/renesas/src/common/up_usestack.c
index aa44e61..e11f7cc 100644
--- a/arch/renesas/src/common/up_usestack.c
+++ b/arch/renesas/src/common/up_usestack.c
@@ -51,14 +51,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -114,6 +106,17 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
   /* The SH family uses a push-down stack:  the stack grows toward lower
    * addresses in memory.  The stack pointer register, points to the
    * lowest, valid work address (the "top" of the stack).  Items on the
diff --git a/arch/renesas/src/m16c/chip.h b/arch/renesas/src/m16c/chip.h
index 292e956..cc08d4c 100644
--- a/arch/renesas/src/m16c/chip.h
+++ b/arch/renesas/src/m16c/chip.h
@@ -266,7 +266,6 @@ extern uint32_t g_enronly;       /* Start of relocated 
read-only data in FLASH *
   extern uint32_t g_efronly;     /* Start of relocated read-only data in FLASH 
*/
 #endif
 extern uint32_t g_svarvect;      /* Start of variable vectors */
-extern uint32_t g_idle_topstack; /* Start of the heap */
 
 /* Address of the saved user stack pointer */
 
diff --git a/arch/renesas/src/m16c/m16c_dumpstate.c 
b/arch/renesas/src/m16c/m16c_dumpstate.c
index f76e566..f5f6c11 100644
--- a/arch/renesas/src/m16c/m16c_dumpstate.c
+++ b/arch/renesas/src/m16c/m16c_dumpstate.c
@@ -151,16 +151,8 @@ void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 1;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint16_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint16_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint16_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint16_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory.
    * The near RAM memory map is as follows:
diff --git a/arch/renesas/src/m16c/m16c_initialstate.c 
b/arch/renesas/src/m16c/m16c_initialstate.c
index ac64f95..03953b0 100644
--- a/arch/renesas/src/m16c/m16c_initialstate.c
+++ b/arch/renesas/src/m16c/m16c_initialstate.c
@@ -70,6 +70,14 @@ void up_initial_state(FAR struct tcb_s *tcb)
   FAR struct xcptcontext *xcp  = &tcb->xcp;
   FAR uint8_t            *regs = xcp->regs;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (FAR void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/renesas/src/rx65n/rx65n_dumpstate.c 
b/arch/renesas/src/rx65n/rx65n_dumpstate.c
index ed4d4a6..a17896c 100644
--- a/arch/renesas/src/rx65n/rx65n_dumpstate.c
+++ b/arch/renesas/src/rx65n/rx65n_dumpstate.c
@@ -142,16 +142,8 @@ void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 1;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint16_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint16_t)rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 3
   istackbase = ebss; /* check how to declare ebss, as of now declared in 
chip.h */
diff --git a/arch/renesas/src/rx65n/rx65n_initialstate.c 
b/arch/renesas/src/rx65n/rx65n_initialstate.c
index 98d66ae..6bb18cd 100644
--- a/arch/renesas/src/rx65n/rx65n_initialstate.c
+++ b/arch/renesas/src/rx65n/rx65n_initialstate.c
@@ -61,6 +61,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/renesas/src/sh1/sh1_dumpstate.c 
b/arch/renesas/src/sh1/sh1_dumpstate.c
index 1028202..55b53ed 100644
--- a/arch/renesas/src/sh1/sh1_dumpstate.c
+++ b/arch/renesas/src/sh1/sh1_dumpstate.c
@@ -138,16 +138,8 @@ void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/renesas/src/sh1/sh1_initialstate.c 
b/arch/renesas/src/sh1/sh1_initialstate.c
index 552db9f..045a997 100644
--- a/arch/renesas/src/sh1/sh1_initialstate.c
+++ b/arch/renesas/src/sh1/sh1_initialstate.c
@@ -45,14 +45,6 @@
 #include "up_arch.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
  * Private Functions
  ****************************************************************************/
 
@@ -96,6 +88,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/risc-v/src/common/riscv_initialize.c 
b/arch/risc-v/src/common/riscv_initialize.c
index aefee0c..1fb5bc1 100644
--- a/arch/risc-v/src/common/riscv_initialize.c
+++ b/arch/risc-v/src/common/riscv_initialize.c
@@ -108,8 +108,6 @@ static inline void up_color_intstack(void)
 
 void up_initialize(void)
 {
-  FAR struct tcb_s *idle;
-
   /* Colorize the interrupt stack */
 
   up_color_intstack();
@@ -118,13 +116,6 @@ void up_initialize(void)
 
   up_addregion();
 
-  /* Initialize the idle task stack info */
-
-  idle = this_task(); /* It should be idle task */
-  idle->stack_alloc_ptr = _END_BSS;
-  idle->adj_stack_ptr   = (FAR void *)g_idle_topstack;
-  idle->adj_stack_size  = CONFIG_IDLETHREAD_STACKSIZE;
-
 #ifdef CONFIG_PM
   /* Initialize the power management subsystem.  This MCU-specific function
    * must be called *very* early in the initialization sequence *before* any
diff --git a/arch/risc-v/src/common/riscv_usestack.c 
b/arch/risc-v/src/common/riscv_usestack.c
index a0bc0d0..81dffd0 100644
--- a/arch/risc-v/src/common/riscv_usestack.c
+++ b/arch/risc-v/src/common/riscv_usestack.c
@@ -71,14 +71,6 @@
 #define STACK_ALIGN_UP(a)   (((a) + STACK_ALIGN_MASK) & ~STACK_ALIGN_MASK)
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -165,9 +157,12 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
    * water marks.
    */
 
-  up_stack_color((FAR void *)((uintptr_t)tcb->stack_alloc_ptr +
-                 sizeof(struct tls_info_s)),
-                 tcb->adj_stack_size - sizeof(struct tls_info_s));
+  if (tcb->pid != 0)
+    {
+      up_stack_color((FAR void *)((uintptr_t)tcb->stack_alloc_ptr +
+                     sizeof(struct tls_info_s)),
+                     size_of_stack - sizeof(struct tls_info_s));
+    }
 #endif
 
   return OK;
diff --git a/arch/risc-v/src/rv32im/riscv_assert.c 
b/arch/risc-v/src/rv32im/riscv_assert.c
index bcf85b3..2dfe3c5 100644
--- a/arch/risc-v/src/rv32im/riscv_assert.c
+++ b/arch/risc-v/src/rv32im/riscv_assert.c
@@ -199,16 +199,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/risc-v/src/rv32im/riscv_initialstate.c 
b/arch/risc-v/src/rv32im/riscv_initialstate.c
index 5f0ae55..0aad94d 100644
--- a/arch/risc-v/src/rv32im/riscv_initialstate.c
+++ b/arch/risc-v/src/rv32im/riscv_initialstate.c
@@ -72,6 +72,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   uint32_t regval;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/risc-v/src/rv64gc/riscv_assert.c 
b/arch/risc-v/src/rv64gc/riscv_assert.c
index b23db62..67071da 100644
--- a/arch/risc-v/src/rv64gc/riscv_assert.c
+++ b/arch/risc-v/src/rv64gc/riscv_assert.c
@@ -210,16 +210,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 8;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uintptr_t)rtcb->adj_stack_ptr;
-      ustacksize = (uintptr_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uintptr_t)rtcb->adj_stack_ptr;
+  ustacksize = (uintptr_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/risc-v/src/rv64gc/riscv_initialstate.c 
b/arch/risc-v/src/rv64gc/riscv_initialstate.c
index caa0c37..b0ebd1d 100644
--- a/arch/risc-v/src/rv64gc/riscv_initialstate.c
+++ b/arch/risc-v/src/rv64gc/riscv_initialstate.c
@@ -72,6 +72,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   uint64_t regval;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/sim/src/sim/up_initialstate.c 
b/arch/sim/src/sim/up_initialstate.c
index 129d3be..03e5a35 100644
--- a/arch/sim/src/sim/up_initialstate.c
+++ b/arch/sim/src/sim/up_initialstate.c
@@ -66,6 +66,12 @@
 
 void up_initial_state(struct tcb_s *tcb)
 {
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(sim_getsp() -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   memset(&tcb->xcp, 0, sizeof(struct xcptcontext));
   tcb->xcp.regs[JB_SP] = (xcpt_reg_t)tcb->adj_stack_ptr - sizeof(xcpt_reg_t);
   tcb->xcp.regs[JB_PC] = (xcpt_reg_t)tcb->start;
diff --git a/arch/sim/src/sim/up_usestack.c b/arch/sim/src/sim/up_usestack.c
index 1c21d81..b6e8480 100644
--- a/arch/sim/src/sim/up_usestack.c
+++ b/arch/sim/src/sim/up_usestack.c
@@ -136,9 +136,12 @@ int up_use_stack(FAR struct tcb_s *tcb, FAR void *stack, 
size_t stack_size)
    * water marks.
    */
 
-  up_stack_color((FAR void *)((uintptr_t)tcb->stack_alloc_ptr +
-                 sizeof(struct tls_info_s)),
-                 tcb->adj_stack_size - sizeof(struct tls_info_s));
+  if (tcb->pid != 0)
+    {
+      up_stack_color((FAR void *)((uintptr_t)tcb->stack_alloc_ptr +
+                     sizeof(struct tls_info_s)),
+                     adj_stack_size - sizeof(struct tls_info_s));
+    }
 #endif
 
   return OK;
diff --git a/arch/x86/src/common/up_assert.c b/arch/x86/src/common/up_assert.c
index 7dcb30f..620b55c 100644
--- a/arch/x86/src/common/up_assert.c
+++ b/arch/x86/src/common/up_assert.c
@@ -160,16 +160,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = g_idle_topstack - 4;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/x86/src/i486/up_initialstate.c 
b/arch/x86/src/i486/up_initialstate.c
index d1c94b32..2a78809 100644
--- a/arch/x86/src/i486/up_initialstate.c
+++ b/arch/x86/src/i486/up_initialstate.c
@@ -49,18 +49,6 @@
 #include "up_arch.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -81,6 +69,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/x86/src/i486/up_usestack.c b/arch/x86/src/i486/up_usestack.c
index 71f94cc..89760e8 100644
--- a/arch/x86/src/i486/up_usestack.c
+++ b/arch/x86/src/i486/up_usestack.c
@@ -51,14 +51,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -114,6 +106,17 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
   /* The i486 uses a push-down stack:  the stack grows toward loweraddresses
    * in memory.  The stack pointer register, points to the lowest, valid work
    * address (the "top" of the stack).  Items on the stack are referenced as
diff --git a/arch/x86_64/src/common/up_assert.c 
b/arch/x86_64/src/common/up_assert.c
index b092a27..8e76edc 100644
--- a/arch/x86_64/src/common/up_assert.c
+++ b/arch/x86_64/src/common/up_assert.c
@@ -123,16 +123,8 @@ static void up_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0)
-    {
-      ustackbase = g_idle_topstack - 8;
-      ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint64_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint64_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint64_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint64_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
@@ -216,7 +208,7 @@ static void _up_assert(void)
 {
   /* Are we in an interrupt handler or the idle task? */
 
-  if (g_current_regs || (this_task())->pid == 0)
+  if (g_current_regs || (running_task())->flink == NULL)
     {
       (void)up_irq_save();
       for (; ; )
diff --git a/arch/x86_64/src/common/up_initialize.c 
b/arch/x86_64/src/common/up_initialize.c
index 6e0759c..8d29988 100644
--- a/arch/x86_64/src/common/up_initialize.c
+++ b/arch/x86_64/src/common/up_initialize.c
@@ -101,12 +101,6 @@ static void up_calibratedelay(void)
 
 void up_initialize(void)
 {
-  struct tcb_s *rtcb = this_task();
-
-  rtcb->adj_stack_size = CONFIG_IDLETHREAD_STACKSIZE;
-  rtcb->stack_alloc_ptr =
-    (void *)(g_idle_topstack - CONFIG_IDLETHREAD_STACKSIZE);
-
   /* Initialize global variables */
 
   g_current_regs = NULL;
diff --git a/arch/x86_64/src/intel64/up_initialstate.c 
b/arch/x86_64/src/intel64/up_initialstate.c
index a727b9b..caa7de3 100644
--- a/arch/x86_64/src/intel64/up_initialstate.c
+++ b/arch/x86_64/src/intel64/up_initialstate.c
@@ -35,18 +35,6 @@
 #include "sched/sched.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -70,6 +58,14 @@ void up_initial_state(struct tcb_s *tcb)
   struct xcptcontext *xcp = &tcb->xcp;
   struct tcb_s *rtcb;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, (void *)(g_idle_topstack -
+        CONFIG_IDLETHREAD_STACKSIZE), CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/x86_64/src/intel64/up_usestack.c 
b/arch/x86_64/src/intel64/up_usestack.c
index bf3977f..eb5d727 100644
--- a/arch/x86_64/src/intel64/up_usestack.c
+++ b/arch/x86_64/src/intel64/up_usestack.c
@@ -36,14 +36,6 @@
 #include "up_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -99,6 +91,17 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
   /* The intel64 uses a push-down stack:  the stack grows toward lower
    * addresses in memory.  The stack pointer register, points to the lowest,
    * valid work address (the "top" of the stack).  Items on the stack are
diff --git a/arch/xtensa/src/common/xtensa_dumpstate.c 
b/arch/xtensa/src/common/xtensa_dumpstate.c
index cc21343..04109a0 100644
--- a/arch/xtensa/src/common/xtensa_dumpstate.c
+++ b/arch/xtensa/src/common/xtensa_dumpstate.c
@@ -180,16 +180,8 @@ void xtensa_dumpstate(void)
 
   /* Get the limits on the user stack memory */
 
-  if (rtcb->pid == 0) /* Check for CPU0 IDLE thread */
-    {
-      ustackbase = (uint32_t)&g_idlestack[IDLETHREAD_STACKWORDS - 1];
-      ustacksize = IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      ustackbase = (uint32_t)rtcb->adj_stack_ptr;
-      ustacksize = (uint32_t)rtcb->adj_stack_size;
-    }
+  ustackbase = (uint32_t)rtcb->adj_stack_ptr;
+  ustacksize = (uint32_t)rtcb->adj_stack_size;
 
   /* Get the limits on the interrupt stack memory */
 
diff --git a/arch/xtensa/src/common/xtensa_initialstate.c 
b/arch/xtensa/src/common/xtensa_initialstate.c
index be63bb9..a6cc3c7 100644
--- a/arch/xtensa/src/common/xtensa_initialstate.c
+++ b/arch/xtensa/src/common/xtensa_initialstate.c
@@ -73,6 +73,13 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb, g_idlestack, IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/xtensa/src/common/xtensa_usestack.c 
b/arch/xtensa/src/common/xtensa_usestack.c
index f599004..c43d78b 100644
--- a/arch/xtensa/src/common/xtensa_usestack.c
+++ b/arch/xtensa/src/common/xtensa_usestack.c
@@ -157,9 +157,12 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
    * water marks.
    */
 
-  up_stack_color((FAR void *)((uintptr_t)tcb->stack_alloc_ptr +
-                 sizeof(struct tls_info_s)),
-                 tcb->adj_stack_size - sizeof(struct tls_info_s));
+  if (tcb->pid != 0)
+    {
+      up_stack_color((FAR void *)((uintptr_t)tcb->stack_alloc_ptr +
+                     sizeof(struct tls_info_s)),
+                     size_of_stack - sizeof(struct tls_info_s));
+    }
 #endif
 
   return OK;
diff --git a/arch/z16/src/common/z16_usestack.c 
b/arch/z16/src/common/z16_usestack.c
index 7553e43..3c56125 100644
--- a/arch/z16/src/common/z16_usestack.c
+++ b/arch/z16/src/common/z16_usestack.c
@@ -36,14 +36,6 @@
 #include "z16_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -99,6 +91,17 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
   /* The ZNEO uses a push-down stack:  the stack grows toward lower
    * addresses in memory.  The stack pointer register, points to the
    * lowest, valid work address (the "top" of the stack).  Items on
diff --git a/arch/z80/src/common/z80_stackframe.c 
b/arch/z80/src/common/z80_stackframe.c
index d01d937..25d6ba4 100644
--- a/arch/z80/src/common/z80_stackframe.c
+++ b/arch/z80/src/common/z80_stackframe.c
@@ -103,9 +103,9 @@ FAR void *up_stack_frame(FAR struct tcb_s *tcb, size_t 
frame_size)
   tcb->adj_stack_ptr   = (uint8_t *)tcb->adj_stack_ptr - frame_size;
   tcb->adj_stack_size -= frame_size;
 
-  /* Reset the initial state */
+  /* Reset the initial stack pointer */
 
-  up_initial_state(tcb);
+  tcb->xcp.regs[REG_RSP] = (chipreg_t)tcb->adj_stack_ptr;
 
   /* And return a pointer to the allocated memory */
 
diff --git a/arch/z80/src/common/z80_usestack.c 
b/arch/z80/src/common/z80_usestack.c
index 2ce1829..a3fb4eb 100644
--- a/arch/z80/src/common/z80_usestack.c
+++ b/arch/z80/src/common/z80_usestack.c
@@ -35,14 +35,6 @@
 #include "z80_internal.h"
 
 /****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -98,6 +90,17 @@ int up_use_stack(struct tcb_s *tcb, void *stack, size_t 
stack_size)
 
   tcb->stack_alloc_ptr = stack;
 
+  /* If stack debug is enabled, then fill the stack with a recognizable value
+   * that we can use later to test for high water marks.
+   */
+
+#ifdef CONFIG_STACK_COLORATION
+  if (tcb->pid != 0)
+    {
+      memset(tcb->stack_alloc_ptr, 0xaa, stack_size);
+    }
+#endif
+
   /* The Z80 uses a push-down stack:  the stack grows toward lower
    * addresses in memory.  The stack pointer register, points to the
    * lowest, valid work address (the "top" of the stack).  Items on
diff --git a/arch/z80/src/z180/z180_initialstate.c 
b/arch/z80/src/z180/z180_initialstate.c
index bafae8a..fb883fb 100644
--- a/arch/z80/src/z180/z180_initialstate.c
+++ b/arch/z80/src/z180/z180_initialstate.c
@@ -32,18 +32,6 @@
 #include "z80_arch.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -65,6 +53,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb,
+        (void *)CONFIG_STACK_BASE, CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/arch/z80/src/z80/z80_initialstate.c 
b/arch/z80/src/z80/z80_initialstate.c
index 1507f6f..a068a39 100644
--- a/arch/z80/src/z80/z80_initialstate.c
+++ b/arch/z80/src/z80/z80_initialstate.c
@@ -32,18 +32,6 @@
 #include "z80_arch.h"
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -65,6 +53,14 @@ void up_initial_state(struct tcb_s *tcb)
 {
   struct xcptcontext *xcp = &tcb->xcp;
 
+  /* Initialize the idle thread stack */
+
+  if (tcb->pid == 0)
+    {
+      up_use_stack(tcb,
+        (void *)CONFIG_STACK_BASE, CONFIG_IDLETHREAD_STACKSIZE);
+    }
+
   /* Initialize the initial exception register context structure */
 
   memset(xcp, 0, sizeof(struct xcptcontext));
diff --git a/boards/arm/cxd56xx/common/src/cxd56_crashdump.c 
b/boards/arm/cxd56xx/common/src/cxd56_crashdump.c
index 3ff34e6..7139cc7 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_crashdump.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_crashdump.c
@@ -197,16 +197,8 @@ void board_crashdump(uintptr_t currentsp, FAR void *tcb,
       pdump->info.stacks.user.sp = currentsp;
     }
 
-  if (pdump->info.pid == 0)
-    {
-      pdump->info.stacks.user.top = g_idle_topstack - 4;
-      pdump->info.stacks.user.size = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      pdump->info.stacks.user.top = (uint32_t)rtcb->adj_stack_ptr;
-      pdump->info.stacks.user.size = (uint32_t)rtcb->adj_stack_size;
-    }
+  pdump->info.stacks.user.top = (uint32_t)rtcb->adj_stack_ptr;
+  pdump->info.stacks.user.size = (uint32_t)rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 3
   /* Get the limits on the interrupt stack memory */
diff --git a/boards/arm/stm32/nucleo-f429zi/src/stm32_bbsram.c 
b/boards/arm/stm32/nucleo-f429zi/src/stm32_bbsram.c
index 0b51b21..6c8c324 100644
--- a/boards/arm/stm32/nucleo-f429zi/src/stm32_bbsram.c
+++ b/boards/arm/stm32/nucleo-f429zi/src/stm32_bbsram.c
@@ -449,16 +449,8 @@ void board_crashdump(uintptr_t currentsp, FAR void *tcb,
       pdump->info.stacks.user.sp = currentsp;
     }
 
-  if (pdump->info.pid == 0)
-    {
-      pdump->info.stacks.user.top = g_idle_topstack - 4;
-      pdump->info.stacks.user.size = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
-      pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
-    }
+  pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
+  pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 3
   /* Get the limits on the interrupt stack memory */
diff --git a/boards/arm/stm32f7/nucleo-144/src/stm32_bbsram.c 
b/boards/arm/stm32f7/nucleo-144/src/stm32_bbsram.c
index 2c8dd0e..51589ad 100644
--- a/boards/arm/stm32f7/nucleo-144/src/stm32_bbsram.c
+++ b/boards/arm/stm32f7/nucleo-144/src/stm32_bbsram.c
@@ -464,16 +464,8 @@ void board_crashdump(uintptr_t currentsp, FAR void *tcb,
       pdump->info.stacks.user.sp = currentsp;
     }
 
-  if (pdump->info.pid == 0)
-    {
-      pdump->info.stacks.user.top = g_idle_topstack - 4;
-      pdump->info.stacks.user.size = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
-      pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
-    }
+  pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
+  pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 3
   /* Get the limits on the interrupt stack memory */
diff --git a/boards/renesas/rx65n/rx65n-grrose/src/rx65n_sbram.c 
b/boards/renesas/rx65n/rx65n-grrose/src/rx65n_sbram.c
index 90094c7..80d1d89 100644
--- a/boards/renesas/rx65n/rx65n-grrose/src/rx65n_sbram.c
+++ b/boards/renesas/rx65n/rx65n-grrose/src/rx65n_sbram.c
@@ -403,16 +403,8 @@ void board_crashdump(uintptr_t currentsp, FAR void *tcb,
       pdump->info.stacks.user.sp = currentsp;
     }
 
-  if (pdump->info.pid == 0)
-    {
-      pdump->info.stacks.user.top = g_idle_topstack - 4;
-      pdump->info.stacks.user.size = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
-      pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
-    }
+  pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
+  pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 3
   /* Get the limits on the interrupt stack memory */
diff --git a/boards/renesas/rx65n/rx65n-rsk2mb/src/rx65n_sbram.c 
b/boards/renesas/rx65n/rx65n-rsk2mb/src/rx65n_sbram.c
index 10a69bd..98f03d6 100644
--- a/boards/renesas/rx65n/rx65n-rsk2mb/src/rx65n_sbram.c
+++ b/boards/renesas/rx65n/rx65n-rsk2mb/src/rx65n_sbram.c
@@ -401,16 +401,8 @@ void board_crashdump(uintptr_t currentsp, FAR void *tcb,
       pdump->info.stacks.user.sp = currentsp;
     }
 
-  if (pdump->info.pid == 0)
-    {
-      pdump->info.stacks.user.top = g_idle_topstack - 4;
-      pdump->info.stacks.user.size = CONFIG_IDLETHREAD_STACKSIZE;
-    }
-  else
-    {
-      pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
-      pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
-    }
+  pdump->info.stacks.user.top = (uint32_t) rtcb->adj_stack_ptr;
+  pdump->info.stacks.user.size = (uint32_t) rtcb->adj_stack_size;
 
 #if CONFIG_ARCH_INTERRUPTSTACK > 3
   /* Get the limits on the interrupt stack memory */

Reply via email to