[rtems commit] Rework initialization and interrupt stack support

Sebastian Huber sebh at rtems.org
Fri Jun 29 09:54:08 UTC 2018


Module:    rtems
Branch:    master
Commit:    511dc4b2bee78ce0714e83838644429a29d325b1
Changeset: http://git.rtems.org/rtems/commit/?id=511dc4b2bee78ce0714e83838644429a29d325b1

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jun 19 09:09:51 2018 +0200

Rework initialization and interrupt stack support

Statically initialize the interrupt stack area
(_Configuration_Interrupt_stack_area_begin,
_Configuration_Interrupt_stack_area_end, and
_Configuration_Interrupt_stack_size) via <rtems/confdefs.h>.  Place the
interrupt stack area in a special section ".rtemsstack.interrupt".  Let
BSPs define the optimal placement of this section in their linker
command files (e.g. in a fast on-chip memory).

This change makes makes the CPU_HAS_SOFTWARE_INTERRUPT_STACK and
CPU_HAS_HARDWARE_INTERRUPT_STACK CPU port defines superfluous, since the
low level initialization code has all information available via global
symbols.

This change makes the CPU_ALLOCATE_INTERRUPT_STACK CPU port define
superfluous, since the interrupt stacks are allocated by confdefs.h for
all architectures.  There is no need for BSP-specific linker command
file magic (except the section placement), see previous ARM linker
command file as a bad example.

Remove _CPU_Install_interrupt_stack().  Initialize the hardware
interrupt stack in _CPU_Initialize() if necessary (e.g.
m68k_install_interrupt_stack()).

The optional _CPU_Interrupt_stack_setup() is still useful to customize
the registration of the interrupt stack area in the per-CPU information.

The initialization stack can reuse the interrupt stack, since

  * interrupts are disabled during the sequential system initialization,
    and

  * the boot_card() function does not return.

This stack resuse saves memory.

Changes per architecture:

arm:

  * Mostly replace the linker symbol based configuration of stacks with
    the standard <rtems/confdefs.h> configuration via
    CONFIGURE_INTERRUPT_STACK_SIZE.  The size of the FIQ, ABT and UND
    mode stack is still defined via linker symbols.  These modes are
    rarely used in applications and the default values provided by the
    BSP should be sufficient in most cases.

  * Remove the bsp_processor_count linker symbol hack used for the SMP
    support. This is possible since the interrupt stack area is now
    allocated by the linker and not allocated from the heap.  This makes
    some configure.ac stuff obsolete.  Remove the now superfluous BSP
    variants altcycv_devkit_smp and realview_pbx_a9_qemu_smp.

bfin:

  * Remove unused magic linker command file allocation of initialization
    stack.  Maybe a previous linker command file copy and paste problem?
    In the start.S the initialization stack is set to a hard coded value.

lm32, m32c, mips, nios2, riscv, sh, v850:

  * Remove magic linker command file allocation of initialization stack.
    Reuse interrupt stack for initialization stack.

m68k:

  * Remove magic linker command file allocation of initialization stack.
    Reuse interrupt stack for initialization stack.

powerpc:

  * Remove magic linker command file allocation of initialization stack.
    Reuse interrupt stack for initialization stack.

  * Used dedicated memory region (REGION_RTEMSSTACK) for the interrupt
    stack on BSPs using the shared linkcmds.base (replacement for
    REGION_RWEXTRA).

sparc:

  * Remove the hard coded initialization stack.  Use the interrupt stack
    for the initialization stack on the boot processor.  This saves
    16KiB of RAM.

Update #3459.

---

 .../altera-cyclone-v/config/altcycv_devkit_smp.cfg |   1 -
 .../start/linkcmds.altcycv_devkit_smp              |   3 -
 bsps/arm/csb336/start/start.S                      |  90 ++++++--------
 bsps/arm/csb337/start/start.S                      |  89 +++++++-------
 bsps/arm/edb7312/start/start.S                     |  98 +++++++---------
 bsps/arm/gumstix/start/start.S                     |  87 +++++++-------
 bsps/arm/imx/start/linkcmds.imx7                   |   3 -
 bsps/arm/include/bsp/linker-symbols.h              |  23 +---
 bsps/arm/raspberrypi/start/bspsmp.c                |   7 +-
 .../raspberrypi/start/{linkcmds.in => linkcmds}    |   3 -
 .../config/realview_pbx_a9_qemu_smp.cfg            |   1 -
 .../start/linkcmds.realview_pbx_a9_qemu_smp        |   3 -
 bsps/arm/rtl22xx/start/start.S                     |  71 +++++-------
 bsps/arm/shared/start/arm-a9mpcore-smp.c           |   8 +-
 bsps/arm/shared/start/linkcmds.base                |  50 --------
 bsps/arm/shared/start/start.S                      | 129 ++++++++-------------
 bsps/arm/smdk2410/start/start.S                    |  67 +++++------
 bsps/arm/xilinx-zynq/start/linkcmds.in             |   3 -
 bsps/bfin/TLL6527M/start/linkcmds                  |   4 -
 bsps/bfin/bf537Stamp/start/linkcmds                |   4 -
 bsps/bfin/eZKit533/start/linkcmds                  |   4 -
 bsps/lm32/lm32_evr/start/linkcmds                  |   6 -
 bsps/lm32/milkymist/start/linkcmds                 |   6 -
 bsps/lm32/shared/start/start.S                     |   4 +-
 bsps/m32c/m32cbsp/start/linkcmds                   |  14 ---
 bsps/m32c/m32cbsp/start/start.S                    |   2 +-
 bsps/m68k/gen68340/start/linkcmds                  |   5 -
 bsps/m68k/gen68340/start/start.S                   |   2 +-
 bsps/m68k/gen68360/start/linkcmds                  |   5 -
 bsps/m68k/gen68360/start/linkcmds.bootp            |   5 -
 bsps/m68k/gen68360/start/linkcmds.prom             |   5 -
 bsps/m68k/gen68360/start/start.S                   |   2 +-
 bsps/m68k/genmcf548x/start/linkcmds.COBRA5475      |   2 -
 .../m68k/genmcf548x/start/linkcmds.m5484FireEngine |   2 -
 .../start/linkcmds.m5484FireEngine.flash           |   2 -
 bsps/m68k/genmcf548x/start/start.S                 |   4 +-
 bsps/m68k/mcf52235/start/linkcmds                  |  11 --
 bsps/m68k/mcf52235/start/start.S                   |   8 +-
 bsps/m68k/mcf5225x/start/linkcmds                  |  11 --
 bsps/m68k/mcf5225x/start/start.S                   |   8 +-
 bsps/m68k/mcf5329/start/linkcmds                   |  14 +--
 bsps/m68k/mcf5329/start/linkcmdsflash              |  14 +--
 bsps/m68k/mcf5329/start/start.S                    |   6 +-
 bsps/m68k/mrm332/start/linkcmds                    |   5 -
 bsps/m68k/mrm332/start/start.S                     |   8 +-
 bsps/m68k/shared/start/linkcmds.base               |  10 +-
 bsps/m68k/shared/start/start.S                     |   9 +-
 bsps/mips/csb350/start/linkcmds                    |   5 -
 bsps/mips/csb350/start/start.S                     |   2 +-
 bsps/mips/hurricane/start/linkcmds                 |   5 -
 bsps/mips/jmr3904/start/linkcmds                   |   8 --
 bsps/mips/jmr3904/start/start.S                    |   2 +-
 bsps/mips/malta/start/linkcmds                     |   8 --
 bsps/mips/malta/start/start.S                      |   2 +-
 bsps/mips/rbtx4925/start/linkcmds                  |   5 -
 bsps/mips/rbtx4938/start/linkcmds                  |   5 -
 bsps/mips/shared/irq/exception.S                   |  10 +-
 bsps/nios2/nios2_iss/start/linkcmds                |   6 +-
 bsps/powerpc/beatnik/start/bspstart.c              |   6 +-
 bsps/powerpc/gen5200/include/bsp.h                 |   4 -
 bsps/powerpc/gen5200/start/bspstart.c              |   4 +-
 bsps/powerpc/gen5200/start/linkcmds.gen5200_base   |   7 --
 bsps/powerpc/gen83xx/include/bsp.h                 |   4 -
 bsps/powerpc/gen83xx/start/start.S                 |   9 +-
 bsps/powerpc/haleakala/start/bspstart.c            |   7 +-
 bsps/powerpc/haleakala/start/dlentry.S             |   4 +-
 bsps/powerpc/haleakala/start/linkcmds              |  16 ---
 bsps/powerpc/motorola_powerpc/start/bspstart.c     |   2 +-
 bsps/powerpc/mpc55xxevb/start/start.S              |  10 +-
 bsps/powerpc/mpc8260ads/start/bspstart.c           |   8 +-
 bsps/powerpc/mpc8260ads/start/linkcmds             |  11 --
 bsps/powerpc/mvme3100/start/bspstart.c             |   2 +-
 bsps/powerpc/mvme5500/start/bspstart.c             |   2 +-
 bsps/powerpc/psim/start/start.S                    |  10 +-
 bsps/powerpc/qemuppc/start/bspstart.c              |   6 +-
 bsps/powerpc/qemuppc/start/start.S                 |  16 +--
 bsps/powerpc/qoriq/start/start.S                   |  18 +--
 bsps/powerpc/shared/start/linkcmds.base            |   1 -
 bsps/powerpc/ss555/start/bspstart.c                |   7 +-
 bsps/powerpc/ss555/start/linkcmds                  |  16 ---
 bsps/powerpc/ss555/start/start.S                   |   2 +-
 bsps/powerpc/t32mppc/start/start.S                 |   8 +-
 bsps/powerpc/tqm8xx/include/bsp.h                  |   4 -
 bsps/powerpc/tqm8xx/start/bspstart.c               |  10 +-
 bsps/powerpc/tqm8xx/start/start.S                  |  13 +--
 bsps/powerpc/virtex4/start/bspstart.c              |   7 +-
 bsps/powerpc/virtex4/start/linkcmds                |  11 --
 bsps/powerpc/virtex4/start/start.S                 |   4 +-
 bsps/powerpc/virtex5/start/bspstart.c              |   7 +-
 bsps/powerpc/virtex5/start/linkcmds                |  11 --
 bsps/powerpc/virtex5/start/start.S                 |   4 +-
 bsps/riscv/riscv_generic/start/start.S             |   2 +-
 bsps/sh/gensh1/include/bsp.h                       |   7 --
 bsps/sh/gensh1/start/cpu_asm.c                     |  10 +-
 bsps/sh/gensh1/start/linkcmds                      |   5 -
 bsps/sh/gensh1/start/start.S                       |  10 +-
 bsps/sh/gensh2/include/bsp.h                       |   6 -
 bsps/sh/gensh2/start/cpu_asm.c                     |  10 +-
 bsps/sh/gensh2/start/linkcmds                      |   5 -
 bsps/sh/gensh2/start/linkcmds.ram                  |   5 -
 bsps/sh/gensh2/start/linkcmds.rom                  |   5 -
 bsps/sh/gensh2/start/start.S                       |  10 +-
 bsps/sh/gensh2/start/start.ram                     |  10 +-
 bsps/sh/gensh2/start/start.rom                     |  10 +-
 bsps/sh/gensh4/include/bsp.h                       |   7 --
 bsps/sh/gensh4/start/cpu_asm.c                     |   9 +-
 bsps/sh/gensh4/start/linkcmds                      |   8 --
 bsps/sh/gensh4/start/linkcmds.rom                  |  12 --
 bsps/sh/gensh4/start/linkcmds.rom2ram              |  12 --
 bsps/sh/gensh4/start/start.S                       |  10 +-
 bsps/sh/shared/start/bspstart.c                    |   8 --
 bsps/sh/shsim/include/bsp.h                        |   6 -
 bsps/sh/shsim/start/cpu_asm.c                      |  10 +-
 bsps/sh/shsim/start/linkcmds                       |  14 ---
 bsps/sh/shsim/start/start.S                        |  12 +-
 bsps/sparc/shared/start/bspgetworkarea.c           |   6 +-
 bsps/sparc/shared/start/start.S                    |  12 +-
 bsps/v850/gdbv850sim/start/linkcmds                |  11 --
 bsps/v850/gdbv850sim/start/start.S                 |  11 +-
 c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am  |   1 -
 c/src/lib/libbsp/arm/raspberrypi/configure.ac      |  17 +--
 c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am   |   1 -
 c/src/lib/libbsp/arm/xilinx-zynq/configure.ac      |   5 -
 cpukit/include/rtems/confdefs.h                    |  54 ++++-----
 cpukit/include/rtems/config.h                      |  35 ++++--
 cpukit/include/rtems/score/percpu.h                |  53 +++------
 cpukit/libmisc/stackchk/check.c                    |   2 -
 cpukit/score/cpu/arm/include/rtems/score/cpu.h     |   6 -
 cpukit/score/cpu/bfin/cpu.c                        |  14 ---
 cpukit/score/cpu/bfin/include/rtems/score/cpu.h    |  91 ---------------
 cpukit/score/cpu/epiphany/cpu.c                    |   5 -
 .../score/cpu/epiphany/include/rtems/score/cpu.h   |  73 ------------
 cpukit/score/cpu/i386/include/rtems/score/cpu.h    |   8 --
 cpukit/score/cpu/lm32/cpu.c                        |  12 --
 cpukit/score/cpu/lm32/include/rtems/score/cpu.h    |  90 --------------
 cpukit/score/cpu/lm32/irq.c                        |   8 +-
 cpukit/score/cpu/m32c/cpu.c                        |  12 --
 cpukit/score/cpu/m32c/cpu_asm.c                    |  12 +-
 cpukit/score/cpu/m32c/include/rtems/score/cpu.h    |  93 ---------------
 cpukit/score/cpu/m68k/cpu.c                        |  26 ++---
 cpukit/score/cpu/m68k/cpu_asm.S                    |   8 +-
 cpukit/score/cpu/m68k/include/rtems/score/cpu.h    |  22 ----
 cpukit/score/cpu/mips/cpu.c                        |   5 -
 cpukit/score/cpu/mips/cpu_asm.S                    |  10 +-
 cpukit/score/cpu/mips/include/rtems/score/cpu.h    |  65 -----------
 cpukit/score/cpu/moxie/cpu.c                       |   7 --
 cpukit/score/cpu/moxie/include/rtems/score/cpu.h   |  77 ------------
 cpukit/score/cpu/nios2/include/rtems/score/cpu.h   |   6 -
 cpukit/score/cpu/nios2/nios2-iic-irq.c             |   8 +-
 cpukit/score/cpu/no_cpu/cpu.c                      |  12 --
 cpukit/score/cpu/no_cpu/cpu_asm.c                  |  12 +-
 cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h  |  93 ++-------------
 cpukit/score/cpu/or1k/cpu.c                        |   4 -
 cpukit/score/cpu/or1k/include/rtems/score/cpu.h    |  73 ------------
 cpukit/score/cpu/powerpc/include/rtems/score/cpu.h |  54 ---------
 cpukit/score/cpu/riscv/cpu.c                       |   5 -
 cpukit/score/cpu/riscv/include/rtems/score/cpu.h   |  15 ---
 cpukit/score/cpu/sh/include/rtems/score/cpu.h      |  43 -------
 cpukit/score/cpu/sparc/include/rtems/score/cpu.h   |  34 ------
 cpukit/score/cpu/sparc64/include/rtems/score/cpu.h |  32 -----
 cpukit/score/cpu/v850/cpu_asm.S                    |  73 ------------
 cpukit/score/cpu/v850/include/rtems/score/cpu.h    |  78 -------------
 cpukit/score/src/isr.c                             |  64 +++++-----
 cpukit/score/src/percpuasm.c                       |  23 ++--
 testsuites/sptests/spfatal07/testcase.h            |  37 +-----
 testsuites/sptests/spsize/size.c                   |   2 -
 166 files changed, 511 insertions(+), 2439 deletions(-)

diff --git a/bsps/arm/altera-cyclone-v/config/altcycv_devkit_smp.cfg b/bsps/arm/altera-cyclone-v/config/altcycv_devkit_smp.cfg
deleted file mode 100644
index ed54edf..0000000
--- a/bsps/arm/altera-cyclone-v/config/altcycv_devkit_smp.cfg
+++ /dev/null
@@ -1 +0,0 @@
-include $(RTEMS_ROOT)/make/custom/altcycv.inc
diff --git a/bsps/arm/altera-cyclone-v/start/linkcmds.altcycv_devkit_smp b/bsps/arm/altera-cyclone-v/start/linkcmds.altcycv_devkit_smp
deleted file mode 100644
index 2da0865..0000000
--- a/bsps/arm/altera-cyclone-v/start/linkcmds.altcycv_devkit_smp
+++ /dev/null
@@ -1,3 +0,0 @@
-bsp_processor_count = DEFINED (bsp_processor_count) ? bsp_processor_count : 2;
-
-INCLUDE linkcmds.altcycv_devkit
diff --git a/bsps/arm/csb336/start/start.S b/bsps/arm/csb336/start/start.S
index ce452f5..2ef4cb7 100644
--- a/bsps/arm/csb336/start/start.S
+++ b/bsps/arm/csb336/start/start.S
@@ -8,20 +8,8 @@
  * http://www.rtems.org/license/LICENSE.
  */
 
-#include <bsp/linker-symbols.h>
-
-/* Some standard definitions...*/
-.equ PSR_MODE_USR,       0x10
-.equ PSR_MODE_FIQ,       0x11
-.equ PSR_MODE_IRQ,       0x12
-.equ PSR_MODE_SVC,       0x13
-.equ PSR_MODE_ABT,       0x17
-.equ PSR_MODE_UNDEF,     0x1B
-.equ PSR_MODE_SYS,       0x1F
-
-.equ PSR_I,              0x80
-.equ PSR_F,              0x40
-.equ PSR_T,              0x20
+#include <rtems/asm.h>
+#include <rtems/score/cpu.h>
 
 .section .bsp_start_text,"ax"
          .code 32
@@ -36,60 +24,56 @@ _start:
         /*
          * Since I don't plan to return to the bootloader,
          * I don't have to save the registers.
-         *
-         * I'll just set the CPSR for SVC mode, interrupts
-         * off, and ARM instructions.
          */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
-        msr     cpsr, r0
-
-        /* zero the bss */
-        ldr     r1, =bsp_section_bss_end
-        ldr     r0, =bsp_section_bss_begin
-
-_bss_init:
-        mov     r2, #0
-        cmp     r0, r1
-        strlot  r2, [r0], #4
-        blo     _bss_init        /* loop while r0 < r1 */
-
 
-        /* --- Initialize stack pointer registers */
-        /* Enter IRQ mode and set up the IRQ stack pointer */
-        mov     r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)     /* No interrupts */
-        msr     cpsr, r0
-        ldr     r1, =bsp_stack_irq_size
-        ldr     sp, =bsp_stack_irq_begin
-        add     sp, sp, r1
+        /* Set end of interrupt stack area */
+        ldr     r7, =_Configuration_Interrupt_stack_area_end
 
         /* Enter FIQ mode and set up the FIQ stack pointer */
-        mov     r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_fiq_size
-        ldr     sp, =bsp_stack_fiq_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
         /* Enter ABT mode and set up the ABT stack pointer */
-        mov     r0, #(PSR_MODE_ABT | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_abt_size
-        ldr     sp, =bsp_stack_abt_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
-        /* Enter UNDEF mode and set up the UNDEF stack pointer */
-        mov     r0, #(PSR_MODE_UNDEF | PSR_I | PSR_F)     /* No interrupts */
+        /* Enter UND mode and set up the UND stack pointer */
+        mov     r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_und_size
-        ldr     sp, =bsp_stack_und_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
-        /* Set up the SVC stack pointer last and stay in SVC mode */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)     /* No interrupts */
+        /* Enter IRQ mode and set up the IRQ stack pointer */
+        mov     r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
+
+        /*
+         * Enter SVC mode and set up the SVC stack pointer, reuse IRQ stack
+         * (interrupts are disabled).
+         */
+        mov     r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
-        ldr     r1, =bsp_stack_svc_size
-        ldr     sp, =bsp_stack_svc_begin
-        add     sp, sp, r1
-        sub     sp, sp, #0x64
+        mov     sp, r7
+
+        /* Stay in SVC mode */
+
+        /* zero the bss */
+        ldr     r1, =bsp_section_bss_end
+        ldr     r0, =bsp_section_bss_begin
+
+_bss_init:
+        mov     r2, #0
+        cmp     r0, r1
+        strlot  r2, [r0], #4
+        blo     _bss_init        /* loop while r0 < r1 */
 
         /*
          * Initialize the MMU. After we return, the MMU is enabled,
diff --git a/bsps/arm/csb337/start/start.S b/bsps/arm/csb337/start/start.S
index f88cf41..a755864 100644
--- a/bsps/arm/csb337/start/start.S
+++ b/bsps/arm/csb337/start/start.S
@@ -8,20 +8,8 @@
  *  http://www.rtems.org/license/LICENSE.
 */
 
-#include <bsp/linker-symbols.h>
-
-/* Some standard definitions...*/
-.equ PSR_MODE_USR,       0x10
-.equ PSR_MODE_FIQ,       0x11
-.equ PSR_MODE_IRQ,       0x12
-.equ PSR_MODE_SVC,       0x13
-.equ PSR_MODE_ABT,       0x17
-.equ PSR_MODE_UNDEF,     0x1B
-.equ PSR_MODE_SYS,       0x1F
-
-.equ PSR_I,              0x80
-.equ PSR_F,              0x40
-.equ PSR_T,              0x20
+#include <rtems/asm.h>
+#include <rtems/score/cpu.h>
 
 .text
 .globl  _start
@@ -29,53 +17,56 @@ _start:
         /*
          * Since I don't plan to return to the bootloader,
          * I don't have to save the registers.
-         *
-         * I'll just set the CPSR for SVC mode, interrupts
-         * off, and ARM instructions.
          */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
-        msr     cpsr, r0
 
-        /* zero the bss */
-        ldr     r1, =bsp_section_bss_end
-        ldr     r0, =bsp_section_bss_begin
-
-_bss_init:
-        mov     r2, #0
-        cmp     r0, r1
-        strlot  r2, [r0], #4
-        blo     _bss_init        /* loop while r0 < r1 */
-
-
-        /* --- Initialize stack pointer registers */
-        /* Enter IRQ mode and set up the IRQ stack pointer */
-        mov     r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)     /* No interrupts */
-        msr     cpsr, r0
-        ldr     r1, =bsp_stack_irq_size
-        ldr     sp, =bsp_stack_irq_begin
-        add     sp, sp, r1
+        /* Set end of interrupt stack area */
+        ldr     r7, =_Configuration_Interrupt_stack_area_end
 
         /* Enter FIQ mode and set up the FIQ stack pointer */
-        mov     r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_fiq_size
-        ldr     sp, =bsp_stack_fiq_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
         /* Enter ABT mode and set up the ABT stack pointer */
-        mov     r0, #(PSR_MODE_ABT | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_abt_size
-        ldr     sp, =bsp_stack_abt_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter UND mode and set up the UND stack pointer */
+        mov     r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        ldr     r1, =bsp_stack_und_size
+        mov     sp, r7
+        sub     r7, r7, r1
 
-        /* Set up the SVC stack pointer last and stay in SVC mode */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)     /* No interrupts */
+        /* Enter IRQ mode and set up the IRQ stack pointer */
+        mov     r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
-        ldr     r1, =bsp_stack_svc_size
-        ldr     sp, =bsp_stack_svc_begin
-        add     sp, sp, r1
-        sub     sp, sp, #0x64
+        mov     sp, r7
+
+        /*
+         * Enter SVC mode and set up the SVC stack pointer, reuse IRQ stack
+         * (interrupts are disabled).
+         */
+        mov     r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
+
+        /* Stay in SVC mode */
+
+        /* zero the bss */
+        ldr     r1, =bsp_section_bss_end
+        ldr     r0, =bsp_section_bss_begin
+
+_bss_init:
+        mov     r2, #0
+        cmp     r0, r1
+        strlot  r2, [r0], #4
+        blo     _bss_init        /* loop while r0 < r1 */
 
         /*
          * Initialize the MMU. After we return, the MMU is enabled,
diff --git a/bsps/arm/edb7312/start/start.S b/bsps/arm/edb7312/start/start.S
index e03707b..5806d41 100644
--- a/bsps/arm/edb7312/start/start.S
+++ b/bsps/arm/edb7312/start/start.S
@@ -12,21 +12,8 @@
  *  http://www.rtems.org/license/LICENSE.
 */
 
-#include <bsp/linker-symbols.h>
-
-/* Some standard definitions...*/
-
-.equ Mode_USR,        	     0x10
-.equ Mode_FIQ,        	     0x11
-.equ Mode_IRQ,        	     0x12
-.equ Mode_SVC,        	     0x13
-.equ Mode_ABT,        	     0x17
-.equ Mode_ABORT,             0x17
-.equ Mode_UNDEF,      	     0x1B
-.equ Mode_SYS,        	     0x1F /*only available on ARM Arch. v4*/
-
-.equ I_Bit,           	     0x80
-.equ F_Bit,           	     0x40
+#include <rtems/asm.h>
+#include <rtems/score/cpu.h>
 
 .section ".bsp_start_text", "ax"
 .arm
@@ -72,8 +59,44 @@ handler_addr_fiq:
 
 	.globl	_start
 _start:
-	/* store the sp */
-	mov	r12, sp
+        /* Set end of interrupt stack area */
+        ldr     r7, =_Configuration_Interrupt_stack_area_end
+
+        /* Enter FIQ mode and set up the FIQ stack pointer */
+        mov     r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        ldr     r1, =bsp_stack_fiq_size
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter ABT mode and set up the ABT stack pointer */
+        mov     r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        ldr     r1, =bsp_stack_abt_size
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter UND mode and set up the UND stack pointer */
+        mov     r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        ldr     r1, =bsp_stack_und_size
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter IRQ mode and set up the IRQ stack pointer */
+        mov     r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
+
+        /*
+         * Enter SVC mode and set up the SVC stack pointer, reuse IRQ stack
+         * (interrupts are disabled).
+         */
+        mov     r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
+
+        /* Stay in SVC mode */
 /*
  * Here is the code to initialize the low-level BSP environment
  * (Chip Select, PLL, ....?)
@@ -89,48 +112,7 @@ zi_init:
         STRLOT   r2, [r0], #4
         BLO     zi_init
 
-/* --- Initialise stack pointer registers */
-
-/* Enter IRQ mode and set up the IRQ stack pointer */
-    MOV     r0, #Mode_IRQ | I_Bit | F_Bit     /* No interrupts */
-    MSR     cpsr, r0
-    ldr	    r1, =bsp_stack_irq_size
-    LDR     sp, =bsp_stack_irq_begin
-    add	    sp, sp, r1
-    sub     sp, sp, #0x64
-
-/* Enter FIQ mode and set up the FIQ stack pointer */
-    MOV     r0, #Mode_FIQ | I_Bit | F_Bit     /* No interrupts */
-    MSR     cpsr, r0
-    ldr	    r1, =bsp_stack_fiq_size
-    LDR     sp, =bsp_stack_fiq_begin
-    add	    sp, sp, r1
-    sub     sp, sp, #0x64
-
-/* Enter ABT mode and set up the ABT stack pointer */
-    MOV     r0, #Mode_ABT | I_Bit | F_Bit     /* No interrupts */
-    MSR     cpsr, r0
-    ldr	    r1, =bsp_stack_abt_size
-    LDR     sp, =bsp_stack_abt_begin
-    add	    sp, sp, r1
-    sub     sp, sp, #0x64
-
-/* Set up the SVC stack pointer last and stay in SVC mode */
-    MOV     r0, #Mode_SVC | I_Bit | F_Bit     /* No interrupts */
-    MSR     cpsr, r0
-    ldr	    r1, =bsp_stack_svc_size
-    LDR     sp, =bsp_stack_svc_begin
-    add	    sp, sp, r1
-    sub     sp, sp, #0x64
-
-	/* save the original registers */
-	stmdb	sp!, {r4-r12, lr}
-
 /* --- Now we enter the C code */
 
 	mov     r0, #0
 	bl	boot_card
-
-	ldmia	sp!, {r4-r12, lr}
-	mov	sp, r12
-	mov	pc, lr
diff --git a/bsps/arm/gumstix/start/start.S b/bsps/arm/gumstix/start/start.S
index dccc999..7c71bda 100644
--- a/bsps/arm/gumstix/start/start.S
+++ b/bsps/arm/gumstix/start/start.S
@@ -7,20 +7,8 @@
  *  http://www.rtems.org/license/LICENSE.
  */
 
-#include <bsp/linker-symbols.h>
-
-/* Some standard definitions...*/
-.equ PSR_MODE_USR,       0x10
-.equ PSR_MODE_FIQ,       0x11
-.equ PSR_MODE_IRQ,       0x12
-.equ PSR_MODE_SVC,       0x13
-.equ PSR_MODE_ABT,       0x17
-.equ PSR_MODE_UNDEF,     0x1B
-.equ PSR_MODE_SYS,       0x1F
-
-.equ PSR_I,              0x80
-.equ PSR_F,              0x40
-.equ PSR_T,              0x20
+#include <rtems/asm.h>
+#include <rtems/score/cpu.h>
 
 .text
 .globl  _start
@@ -28,53 +16,56 @@ _start:
         /*
          * Since I don't plan to return to the bootloader,
          * I don't have to save the registers.
-         *
-         * I'll just set the CPSR for SVC mode, interrupts
-         * off, and ARM instructions.
          */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
-        msr     cpsr, r0
 
-
-        /* zero the bss */
-        ldr     r1, =bsp_section_bss_end
-        ldr     r0, =bsp_section_bss_begin
-
-_bss_init:
-        mov     r2, #0
-        cmp     r0, r1
-        strlot  r2, [r0], #4
-        blo     _bss_init        /* loop while r0 < r1 */
-
-        /* --- Initialize stack pointer registers */
-        /* Enter IRQ mode and set up the IRQ stack pointer */
-        mov     r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)     /* No interrupts */
-        msr     cpsr, r0
-        ldr     r1, =bsp_stack_irq_size
-        ldr     sp, =bsp_stack_irq_begin
-        add     sp, sp, r1
+        /* Set end of interrupt stack area */
+        ldr     r7, =_Configuration_Interrupt_stack_area_end
 
         /* Enter FIQ mode and set up the FIQ stack pointer */
-        mov     r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_fiq_size
-        ldr     sp, =bsp_stack_fiq_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
         /* Enter ABT mode and set up the ABT stack pointer */
-        mov     r0, #(PSR_MODE_ABT | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_abt_size
-        ldr     sp, =bsp_stack_abt_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
-        /* Set up the SVC stack pointer last and stay in SVC mode */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)     /* No interrupts */
+        /* Enter UND mode and set up the UND stack pointer */
+        mov     r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_und_size
-        ldr     sp, =bsp_stack_und_begin
-        add     sp, sp, r1
-        sub     sp, sp, #0x64
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter IRQ mode and set up the IRQ stack pointer */
+        mov     r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
+
+        /*
+         * Enter SVC mode and set up the SVC stack pointer, reuse IRQ stack
+         * (interrupts are disabled).
+         */
+        mov     r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
+
+        /* Stay in SVC mode */
+
+        /* zero the bss */
+        ldr     r1, =bsp_section_bss_end
+        ldr     r0, =bsp_section_bss_begin
+
+_bss_init:
+        mov     r2, #0
+        cmp     r0, r1
+        strlot  r2, [r0], #4
+        blo     _bss_init        /* loop while r0 < r1 */
 
         /*
          * Initialize the MMU. After we return, the MMU is enabled,
diff --git a/bsps/arm/imx/start/linkcmds.imx7 b/bsps/arm/imx/start/linkcmds.imx7
index 750e1de..0d9fe48 100644
--- a/bsps/arm/imx/start/linkcmds.imx7
+++ b/bsps/arm/imx/start/linkcmds.imx7
@@ -22,9 +22,6 @@ REGION_ALIAS ("REGION_STACK", RAM);
 REGION_ALIAS ("REGION_NOCACHE", NOCACHE);
 REGION_ALIAS ("REGION_NOCACHE_LOAD", NOCACHE);
 
-bsp_processor_count = DEFINED (bsp_processor_count) ? bsp_processor_count : 2;
-
-bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
 
 bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1M;
diff --git a/bsps/arm/include/bsp/linker-symbols.h b/bsps/arm/include/bsp/linker-symbols.h
index 1a996f5..135c85f 100644
--- a/bsps/arm/include/bsp/linker-symbols.h
+++ b/bsps/arm/include/bsp/linker-symbols.h
@@ -43,30 +43,11 @@ extern "C" {
   #define LINKER_SYMBOL(sym) .extern sym
 #endif
 
-LINKER_SYMBOL(bsp_stack_irq_begin)
-LINKER_SYMBOL(bsp_stack_irq_end)
-LINKER_SYMBOL(bsp_stack_irq_size)
-
-LINKER_SYMBOL(bsp_stack_fiq_begin)
-LINKER_SYMBOL(bsp_stack_fiq_end)
-LINKER_SYMBOL(bsp_stack_irq_size)
-
-LINKER_SYMBOL(bsp_stack_abt_begin)
-LINKER_SYMBOL(bsp_stack_abt_end)
+LINKER_SYMBOL(bsp_stack_fiq_size)
 LINKER_SYMBOL(bsp_stack_abt_size)
-
-LINKER_SYMBOL(bsp_stack_und_begin)
-LINKER_SYMBOL(bsp_stack_und_end)
 LINKER_SYMBOL(bsp_stack_und_size)
-
-LINKER_SYMBOL(bsp_stack_hyp_begin)
-LINKER_SYMBOL(bsp_stack_hyp_end)
 LINKER_SYMBOL(bsp_stack_hyp_size)
 
-LINKER_SYMBOL(bsp_stack_svc_begin)
-LINKER_SYMBOL(bsp_stack_svc_end)
-LINKER_SYMBOL(bsp_stack_svc_size)
-
 LINKER_SYMBOL(bsp_section_start_begin)
 LINKER_SYMBOL(bsp_section_start_end)
 LINKER_SYMBOL(bsp_section_start_size)
@@ -156,8 +137,6 @@ LINKER_SYMBOL(bsp_translation_table_end)
 #define BSP_NOCACHENOLOAD_SUBSECTION(subsection) \
   __attribute__((section(".bsp_noload_nocache." # subsection)))
 
-LINKER_SYMBOL(bsp_processor_count)
-
 /** @} */
 
 #ifdef __cplusplus
diff --git a/bsps/arm/raspberrypi/start/bspsmp.c b/bsps/arm/raspberrypi/start/bspsmp.c
index c3e5451..44f7a1d 100644
--- a/bsps/arm/raspberrypi/start/bspsmp.c
+++ b/bsps/arm/raspberrypi/start/bspsmp.c
@@ -57,12 +57,7 @@ bool _CPU_SMP_Start_processor( uint32_t cpu_index )
 
 uint32_t _CPU_SMP_Initialize(void)
 {
-  uint32_t cpu_count = (uint32_t)bsp_processor_count;
-
-  if ( cpu_count > 4 )
-    cpu_count = 4;
-
-  return cpu_count;
+  return 4;
 }
 
 void _CPU_SMP_Finalize_initialization( uint32_t cpu_count )
diff --git a/bsps/arm/raspberrypi/start/linkcmds.in b/bsps/arm/raspberrypi/start/linkcmds
similarity index 92%
rename from bsps/arm/raspberrypi/start/linkcmds.in
rename to bsps/arm/raspberrypi/start/linkcmds
index 829716c..58423ab 100644
--- a/bsps/arm/raspberrypi/start/linkcmds.in
+++ b/bsps/arm/raspberrypi/start/linkcmds
@@ -41,8 +41,6 @@ MEMORY {
         RAM            (AIW) : ORIGIN = 0x00008000, LENGTH = 128M - 32k
 }
 
-bsp_processor_count = DEFINED (bsp_processor_count) ? bsp_processor_count : @RASPBERRYPI_CPUS@;
-
 REGION_ALIAS ("REGION_START", RAM);
 REGION_ALIAS ("REGION_VECTOR", VECTOR_RAM);
 REGION_ALIAS ("REGION_TEXT", RAM);
@@ -61,7 +59,6 @@ REGION_ALIAS ("REGION_STACK", RAM);
 REGION_ALIAS ("REGION_NOCACHE", RAM);
 REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM);
 
-bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 3008;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
 
 bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1M;
diff --git a/bsps/arm/realview-pbx-a9/config/realview_pbx_a9_qemu_smp.cfg b/bsps/arm/realview-pbx-a9/config/realview_pbx_a9_qemu_smp.cfg
deleted file mode 100644
index fd51a18..0000000
--- a/bsps/arm/realview-pbx-a9/config/realview_pbx_a9_qemu_smp.cfg
+++ /dev/null
@@ -1 +0,0 @@
-include $(RTEMS_ROOT)/make/custom/realview_pbx_a9_qemu.cfg
diff --git a/bsps/arm/realview-pbx-a9/start/linkcmds.realview_pbx_a9_qemu_smp b/bsps/arm/realview-pbx-a9/start/linkcmds.realview_pbx_a9_qemu_smp
deleted file mode 100644
index d31c4f0..0000000
--- a/bsps/arm/realview-pbx-a9/start/linkcmds.realview_pbx_a9_qemu_smp
+++ /dev/null
@@ -1,3 +0,0 @@
-bsp_processor_count = DEFINED (bsp_processor_count) ? bsp_processor_count : 8;
-
-INCLUDE linkcmds.realview_pbx_a9_qemu
diff --git a/bsps/arm/rtl22xx/start/start.S b/bsps/arm/rtl22xx/start/start.S
index c038198..0fc2654 100644
--- a/bsps/arm/rtl22xx/start/start.S
+++ b/bsps/arm/rtl22xx/start/start.S
@@ -8,20 +8,8 @@
  *  http://www.rtems.org/license/LICENSE.
 */
 
-#include <bsp/linker-symbols.h>
-
-/* Some standard definitions...*/
-.equ PSR_MODE_USR,       0x10
-.equ PSR_MODE_FIQ,       0x11
-.equ PSR_MODE_IRQ,       0x12
-.equ PSR_MODE_SVC,       0x13
-.equ PSR_MODE_ABT,       0x17
-.equ PSR_MODE_UNDEF,     0x1B
-.equ PSR_MODE_SYS,       0x1F
-
-.equ PSR_I,              0x80
-.equ PSR_F,              0x40
-.equ PSR_T,              0x20
+#include <rtems/asm.h>
+#include <rtems/score/cpu.h>
 
 .text
 .code	32
@@ -30,45 +18,46 @@ _start:
         /*
          * Since I don't plan to return to the bootloader,
          * I don't have to save the registers.
-         *
-         * I'll just set the CPSR for SVC mode, interrupts
-         * off, and ARM instructions.
          */
 
-        /* --- Initialize stack pointer registers */
-        /* Enter IRQ mode and set up the IRQ stack pointer */
-        mov     r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)     /* No interrupts */
-        bic	r0, r0, #PSR_T
-        msr     cpsr, r0
-        ldr     r1, =bsp_stack_irq_size
-        ldr     sp, =bsp_stack_irq_begin
-        add     sp, sp, r1
+        /* Set end of interrupt stack area */
+        ldr     r7, =_Configuration_Interrupt_stack_area_end
 
         /* Enter FIQ mode and set up the FIQ stack pointer */
-        mov     r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)     /* No interrupts */
-        bic	r0, r0, #PSR_T
+        mov     r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_fiq_size
-        ldr     sp, =bsp_stack_fiq_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
         /* Enter ABT mode and set up the ABT stack pointer */
-        mov     r0, #(PSR_MODE_ABT | PSR_I | PSR_F)     /* No interrupts */
-        bic	r0, r0, #PSR_T
+        mov     r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
-        bic	r0, r0, #PSR_T
         ldr     r1, =bsp_stack_abt_size
-        ldr     sp, =bsp_stack_abt_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter UND mode and set up the UND stack pointer */
+        mov     r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        ldr     r1, =bsp_stack_und_size
+        mov     sp, r7
+        sub     r7, r7, r1
 
-        /* Set up the SVC stack pointer last and stay in SVC mode */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)     /* No interrupts */
-        bic	r0, r0, #PSR_T
+        /* Enter IRQ mode and set up the IRQ stack pointer */
+        mov     r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
+
+        /*
+         * Enter SVC mode and set up the SVC stack pointer, reuse IRQ stack
+         * (interrupts are disabled).
+         */
+        mov     r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
-        ldr     r1, =bsp_stack_svc_size
-        ldr     sp, =bsp_stack_svc_begin
-        add     sp, sp, r1
-        sub     sp, sp, #0x64
+        mov     sp, r7
+
+        /* Stay in SVC mode */
 
         /*
          * Initialize the exception vectors. This includes the
diff --git a/bsps/arm/shared/start/arm-a9mpcore-smp.c b/bsps/arm/shared/start/arm-a9mpcore-smp.c
index a3a95f4..a8d3a54 100644
--- a/bsps/arm/shared/start/arm-a9mpcore-smp.c
+++ b/bsps/arm/shared/start/arm-a9mpcore-smp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2015 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2013, 2018 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -19,7 +19,6 @@
 #include <libcpu/arm-cp15.h>
 
 #include <bsp/irq.h>
-#include <bsp/linker-symbols.h>
 
 static void bsp_inter_processor_interrupt(void *arg)
 {
@@ -28,10 +27,7 @@ static void bsp_inter_processor_interrupt(void *arg)
 
 uint32_t _CPU_SMP_Initialize(void)
 {
-  uint32_t hardware_count = arm_gic_irq_processor_count();
-  uint32_t linker_count = (uint32_t) bsp_processor_count;
-
-  return hardware_count <= linker_count ? hardware_count : linker_count;
+  return arm_gic_irq_processor_count();
 }
 
 void _CPU_SMP_Finalize_initialization(uint32_t cpu_count)
diff --git a/bsps/arm/shared/start/linkcmds.base b/bsps/arm/shared/start/linkcmds.base
index 5a669d8..cab8e85 100644
--- a/bsps/arm/shared/start/linkcmds.base
+++ b/bsps/arm/shared/start/linkcmds.base
@@ -45,25 +45,12 @@ bsp_stack_abt_size = ALIGN (bsp_stack_abt_size, bsp_stack_align);
 bsp_stack_fiq_size = DEFINED (bsp_stack_fiq_size) ? bsp_stack_fiq_size : 0;
 bsp_stack_fiq_size = ALIGN (bsp_stack_fiq_size, bsp_stack_align);
 
-bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 0;
-bsp_stack_irq_size = ALIGN (bsp_stack_irq_size, bsp_stack_align);
-
-bsp_stack_svc_size = DEFINED (bsp_stack_svc_size) ? bsp_stack_svc_size : 0;
-bsp_stack_svc_size = ALIGN (bsp_stack_svc_size, bsp_stack_align);
-
 bsp_stack_und_size = DEFINED (bsp_stack_und_size) ? bsp_stack_und_size : 0;
 bsp_stack_und_size = ALIGN (bsp_stack_und_size, bsp_stack_align);
 
 bsp_stack_hyp_size = DEFINED (bsp_stack_hyp_size) ? bsp_stack_hyp_size : 0;
 bsp_stack_hyp_size = ALIGN (bsp_stack_hyp_size, bsp_stack_align);
 
-bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 0;
-bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
-
-bsp_stack_all_size = bsp_stack_abt_size + bsp_stack_fiq_size + bsp_stack_irq_size + bsp_stack_svc_size + bsp_stack_und_size + bsp_stack_hyp_size + bsp_stack_main_size;
-
-bsp_processor_count = DEFINED (bsp_processor_count) ? bsp_processor_count : 1;
-
 MEMORY {
 	UNEXPECTED_SECTIONS : ORIGIN = 0xffffffff, LENGTH = 0
 }
@@ -297,44 +284,7 @@ SECTIONS {
 
 	.vector : ALIGN_WITH_INPUT {
 		bsp_section_vector_begin = .;
-
 		. = . + DEFINED (bsp_vector_table_in_start_section) ? 0 : bsp_vector_table_size;
-
-		. = ALIGN (bsp_stack_align);
-
-		bsp_stack_irq_begin = .;
-		. = . + bsp_stack_irq_size;
-		bsp_stack_irq_end = .;
-
-		bsp_stack_svc_begin = .;
-		. = . + bsp_stack_svc_size;
-		bsp_stack_svc_end = .;
-
-		bsp_stack_fiq_begin = .;
-		. = . + bsp_stack_fiq_size;
-		bsp_stack_fiq_end = .;
-
-		bsp_stack_und_begin = .;
-		. = . + bsp_stack_und_size;
-		bsp_stack_und_end = .;
-
-		bsp_stack_hyp_begin = .;
-		. = . + bsp_stack_hyp_size;
-		bsp_stack_hyp_end = .;
-
-		bsp_stack_abt_begin = .;
-		. = . + bsp_stack_abt_size;
-		bsp_stack_abt_end = .;
-
-		bsp_stack_main_begin = .;
-		. = . + bsp_stack_main_size;
-		bsp_stack_main_end = .;
-
-		bsp_stack_secondary_processors_begin = .;
-		. = . + (bsp_processor_count - 1) * bsp_stack_all_size;
-		bsp_stack_secondary_processors_end = .;
-
-		*(.bsp_vector)
 	} > REGION_VECTOR AT > REGION_VECTOR
 	.rtemsstack (NOLOAD) : {
 		*(SORT(.rtemsstack.*))
diff --git a/bsps/arm/shared/start/start.S b/bsps/arm/shared/start/start.S
index aa0f378..148625f 100644
--- a/bsps/arm/shared/start/start.S
+++ b/bsps/arm/shared/start/start.S
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2008, 2016 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2008, 2018 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -19,45 +19,10 @@
  */
 
 #include <rtems/asm.h>
-#include <rtems/system.h>	
 #include <rtems/score/percpu.h>
-	
+
 #include <bspopts.h>
 #include <bsp/irq.h>
-#include <bsp/linker-symbols.h>
-
-	/* External symbols */
-	.extern	bsp_reset
-	.extern	boot_card
-	.extern	bsp_start_hook_0
-	.extern	bsp_start_hook_1
-	.extern bsp_stack_irq_end
-	.extern bsp_stack_fiq_end
-	.extern bsp_stack_abt_end
-	.extern bsp_stack_und_end
-	.extern bsp_stack_svc_end
-#ifdef RTEMS_SMP
-	.extern bsp_stack_all_size
-#endif
-	.extern	_ARMV4_Exception_undef_default
-	.extern	_ARMV4_Exception_swi_default
-	.extern	_ARMV4_Exception_data_abort_default
-	.extern	_ARMV4_Exception_pref_abort_default
-	.extern	_ARMV4_Exception_reserved_default
-	.extern	_ARMV4_Exception_interrupt
-	.extern	_ARMV4_Exception_fiq_default
-	.extern	_ARMV7M_Exception_default
-
-#ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
-	.extern bsp_start_init_registers_core
-	.extern bsp_start_init_registers_banked_fiq
-	.extern bsp_start_init_registers_vfp
-#endif
-
-#ifdef BSP_START_IN_HYP_SUPPORT
-	.extern	bsp_start_arm_drop_hyp_mode
-	.globl	bsp_start_hyp_vector_table_begin
-#endif
 
 	/* Global symbols */
 	.globl	_start
@@ -65,12 +30,17 @@
 	.globl	bsp_start_vector_table_end
 	.globl	bsp_start_vector_table_size
 	.globl	bsp_vector_table_size
-	.globl	bsp_start_hook_0_done
 
 	.section	".bsp_start_text", "ax"
 
 #if defined(ARM_MULTILIB_ARCH_V4)
 
+	.globl	bsp_start_hook_0_done
+
+#ifdef BSP_START_IN_HYP_SUPPORT
+	.globl	bsp_start_hyp_vector_table_begin
+#endif
+
 	.arm
 
 /*
@@ -208,12 +178,20 @@ _start:
 	add	r1, r1, r7, asl #PER_CPU_CONTROL_SIZE_LOG2
 	mcr	p15, 0, r1, c13, c0, 4
 
-	/* Calculate stack offset */
-	ldr	r1, =bsp_stack_all_size
-	mul	r1, r7
 #endif
 
-	mrs	r4, cpsr	/* save original procesor status value  */
+	/* Calculate interrupt stack area end for current processor */
+	ldr	r1, =_Configuration_Interrupt_stack_size
+#ifdef RTEMS_SMP
+	add	r7, #1
+	mul	r1, r1, r7
+#endif
+	ldr	r2, =_Configuration_Interrupt_stack_area_begin
+	add	r7, r1, r2
+
+	/* Save original CPSR value */
+	mrs	r4, cpsr
+
 #ifdef BSP_START_IN_HYP_SUPPORT
 	orr	r0, r4, #(ARM_PSR_I | ARM_PSR_F)
 	msr	cpsr, r4
@@ -222,38 +200,22 @@ _start:
 	cmp	r0, #ARM_PSR_M_HYP
 	bne	bsp_start_skip_hyp_svc_switch
 
-	/* Boot loader stats kernel in HYP mode, switch to SVC necessary */
-	ldr	sp, =bsp_stack_hyp_end
-#ifdef RTEMS_SMP
-	add	sp, r1
-#endif
+	/* Boot loader starts kernel in HYP mode, switch to SVC necessary */
+	ldr	r1, =bsp_stack_hyp_size
+	mov	sp, r7
+	sub	r7, r7, r1
 	bl	bsp_start_arm_drop_hyp_mode
 
 bsp_start_skip_hyp_svc_switch:
 #endif
-	/*
-	 * Set SVC mode, disable interrupts and enable ARM instructions.
-	 */
-	mov	r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
-	msr	cpsr, r0
-
 	/* Initialize stack pointer registers for the various modes */
 
-	/* Enter IRQ mode and set up the IRQ stack pointer */
-	mov	r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
-	msr	cpsr, r0
-	ldr	sp, =bsp_stack_irq_end
-#ifdef RTEMS_SMP
-	add	sp, r1
-#endif
-
 	/* Enter FIQ mode and set up the FIQ stack pointer */
 	mov	r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
 	msr	cpsr, r0
-	ldr	sp, =bsp_stack_fiq_end
-#ifdef RTEMS_SMP
-	add	sp, r1
-#endif
+	ldr	r1, =bsp_stack_fiq_size
+	mov	sp, r7
+	sub	r7, r7, r1
 
 #ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
 	bl bsp_start_init_registers_banked_fiq
@@ -262,26 +224,29 @@ bsp_start_skip_hyp_svc_switch:
 	/* Enter ABT mode and set up the ABT stack pointer */
 	mov	r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
 	msr	cpsr, r0
-	ldr	sp, =bsp_stack_abt_end
-#ifdef RTEMS_SMP
-	add	sp, r1
-#endif
+	ldr	r1, =bsp_stack_abt_size
+	mov	sp, r7
+	sub	r7, r7, r1
 
 	/* Enter UND mode and set up the UND stack pointer */
 	mov	r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
 	msr	cpsr, r0
-	ldr	sp, =bsp_stack_und_end
-#ifdef RTEMS_SMP
-	add	sp, r1
-#endif
+	ldr	r1, =bsp_stack_und_size
+	mov	sp, r7
+	sub	r7, r7, r1
+
+	/* Enter IRQ mode and set up the IRQ stack pointer */
+	mov	r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
+	msr	cpsr, r0
+	mov	sp, r7
 
-	/* Enter SVC mode and set up the SVC stack pointer */
+	/*
+	 * Enter SVC mode and set up the SVC stack pointer, reuse IRQ stack
+	 * (interrupts are disabled).
+	 */
 	mov	r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
 	msr	cpsr, r0
-	ldr	sp, =bsp_stack_svc_end
-#ifdef RTEMS_SMP
-	add	sp, r1
-#endif
+	mov	sp, r7
 
 	/* Stay in SVC mode */
 
@@ -333,7 +298,7 @@ bsp_start_skip_hyp_svc_switch:
 
 	SWITCH_FROM_ARM_TO_THUMB	r0
 
-	mov	r0, r4		/* original cpsr value */
+	mov	r0, r4		/* original CPSR value */
 	mov	r1, r5		/* machine type number or ~0 for DT boot */
 	mov	r2, r6		/* physical address of ATAGs or DTB */
 
@@ -385,13 +350,11 @@ twiddle:
 
 	.syntax	unified
 
-	.extern	bsp_stack_main_end
-
 	.thumb
 
 bsp_start_vector_table_begin:
 
-	.word	bsp_stack_main_end
+	.word	_Configuration_Interrupt_stack_area_end
 	.word	_start /* Reset */
 	.word	_ARMV7M_Exception_default /* NMI */
 	.word	_ARMV7M_Exception_default /* Hard Fault */
@@ -441,7 +404,7 @@ _start:
 
 #endif /* ARM_MULTILIB_VFP */
 
-	ldr	sp, =bsp_stack_main_end
+	ldr	sp, =_Configuration_Interrupt_stack_area_end
 	ldr	lr, =bsp_start_hook_0_done + 1
 	b	bsp_start_hook_0
 
diff --git a/bsps/arm/smdk2410/start/start.S b/bsps/arm/smdk2410/start/start.S
index 95d781c..b8d1dde 100644
--- a/bsps/arm/smdk2410/start/start.S
+++ b/bsps/arm/smdk2410/start/start.S
@@ -8,20 +8,8 @@
  *  http://www.rtems.org/license/LICENSE.
  */
 
-#include <bsp/linker-symbols.h>
-
-/* Some standard definitions...*/
-.equ PSR_MODE_USR,       0x10
-.equ PSR_MODE_FIQ,       0x11
-.equ PSR_MODE_IRQ,       0x12
-.equ PSR_MODE_SVC,       0x13
-.equ PSR_MODE_ABT,       0x17
-.equ PSR_MODE_UNDEF,     0x1B
-.equ PSR_MODE_SYS,       0x1F
-
-.equ PSR_I,              0x80
-.equ PSR_F,              0x40
-.equ PSR_T,              0x20
+#include <rtems/asm.h>
+#include <rtems/score/cpu.h>
 
 .text
 .globl  _start
@@ -65,43 +53,46 @@ _start2:
         /*
          * Since I don't plan to return to the bootloader,
          * I don't have to save the registers.
-         *
-         * I'll just set the CPSR for SVC mode, interrupts
-         * off, and ARM instructions.
          */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
-        msr     cpsr, r0
 
-        /* --- Initialize stack pointer registers */
-        /* Enter IRQ mode and set up the IRQ stack pointer */
-        mov     r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)     /* No interrupts */
-        msr     cpsr, r0
-        ldr     r1, =bsp_stack_irq_size
-        ldr     sp, =bsp_stack_irq_begin
-        add     sp, sp, r1
+        /* Set end of interrupt stack area */
+        ldr     r7, =_Configuration_Interrupt_stack_area_end
 
         /* Enter FIQ mode and set up the FIQ stack pointer */
-        mov     r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_FIQ | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_fiq_size
-        ldr     sp, =bsp_stack_fiq_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
 
         /* Enter ABT mode and set up the ABT stack pointer */
-        mov     r0, #(PSR_MODE_ABT | PSR_I | PSR_F)     /* No interrupts */
+        mov     r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
         ldr     r1, =bsp_stack_abt_size
-        ldr     sp, =bsp_stack_abt_begin
-        add     sp, sp, r1
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter UND mode and set up the UND stack pointer */
+        mov     r0, #(ARM_PSR_M_UND | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        ldr     r1, =bsp_stack_und_size
+        mov     sp, r7
+        sub     r7, r7, r1
+
+        /* Enter IRQ mode and set up the IRQ stack pointer */
+        mov     r0, #(ARM_PSR_M_IRQ | ARM_PSR_I | ARM_PSR_F)
+        msr     cpsr, r0
+        mov     sp, r7
 
-        /* Set up the SVC stack pointer last and stay in SVC mode */
-        mov     r0, #(PSR_MODE_SVC | PSR_I | PSR_F)     /* No interrupts */
+        /*
+         * Enter SVC mode and set up the SVC stack pointer, reuse IRQ stack
+         * (interrupts are disabled).
+         */
+        mov     r0, #(ARM_PSR_M_SVC | ARM_PSR_I | ARM_PSR_F)
         msr     cpsr, r0
-        ldr     r1, =bsp_stack_svc_size
-        ldr     sp, =bsp_stack_svc_begin
-        add     sp, sp, r1
-        sub     sp, sp, #0x64
+        mov     sp, r7
 
+        /* Stay in SVC mode */
 
 	/* disable mmu, I and D caches*/
 	nop
diff --git a/bsps/arm/xilinx-zynq/start/linkcmds.in b/bsps/arm/xilinx-zynq/start/linkcmds.in
index 7fd6e27..b56309b 100644
--- a/bsps/arm/xilinx-zynq/start/linkcmds.in
+++ b/bsps/arm/xilinx-zynq/start/linkcmds.in
@@ -6,8 +6,6 @@ MEMORY {
    NOCACHE   : ORIGIN = @ZYNQ_RAM_ORIGIN_AVAILABLE@ + @ZYNQ_RAM_LENGTH_AVAILABLE@ - @ZYNQ_RAM_NOCACHE_LENGTH@, LENGTH = @ZYNQ_RAM_NOCACHE_LENGTH@
 }
 
-bsp_processor_count = DEFINED (bsp_processor_count) ? bsp_processor_count : @ZYNQ_CPUS@;
-
 REGION_ALIAS ("REGION_START",          RAM);
 REGION_ALIAS ("REGION_VECTOR",         RAM);
 REGION_ALIAS ("REGION_TEXT",           RAM);
@@ -26,7 +24,6 @@ REGION_ALIAS ("REGION_STACK",          RAM);
 REGION_ALIAS ("REGION_NOCACHE",        NOCACHE);
 REGION_ALIAS ("REGION_NOCACHE_LOAD",   NOCACHE);
 
-bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
 
 bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1M;
diff --git a/bsps/bfin/TLL6527M/start/linkcmds b/bsps/bfin/TLL6527M/start/linkcmds
index 8c7b373..17b9e24 100644
--- a/bsps/bfin/TLL6527M/start/linkcmds
+++ b/bsps/bfin/TLL6527M/start/linkcmds
@@ -11,7 +11,6 @@ STARTUP(start.o)
 _RamBase    = DEFINED(_RamBase)   ? _RamBase : 0x0;
 _RamSize    = DEFINED(_RamSize)   ? _RamSize : 0x04000000;
 _HeapSize   = DEFINED(_HeapSize)  ? _HeapSize : 0x10000;
-_StackSize  = DEFINED(_StackSize) ? _StackSize : 0x10000;
 
 MEMORY
 {
@@ -123,8 +122,6 @@ SECTIONS
         *(.gnu.linkonce.b.*)
         *(COMMON)
         . = ALIGN (64);
-        _stack_init = .;
-        . += _StackSize;
         _clear_end = .;
          _end = .;
          __end = .;
@@ -170,7 +167,6 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) } 
-  /*.stack 0x80000 : { _stack = .; *(.stack) }*/
   /* These must appear regardless of  .  */   
 }
 
diff --git a/bsps/bfin/bf537Stamp/start/linkcmds b/bsps/bfin/bf537Stamp/start/linkcmds
index c992552..1492da0 100644
--- a/bsps/bfin/bf537Stamp/start/linkcmds
+++ b/bsps/bfin/bf537Stamp/start/linkcmds
@@ -15,7 +15,6 @@ _RamBase = DEFINED(_RamBase) ? _RamBase : 0x0;
    to free up mmu entries. */
 _RamSize = DEFINED(_RamSize) ? _RamSize : 0x03400000;
 _HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 MEMORY
 {
@@ -131,8 +130,6 @@ SECTIONS
         *(.gnu.linkonce.b.*)
         *(COMMON)
         . = ALIGN (64);
-        _stack_init = .;
-        . += _StackSize;
         _clear_end = .;
          _end = .;
          __end = .;
@@ -178,7 +175,6 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) } 
-  /*.stack 0x80000 : { _stack = .; *(.stack) }*/
   /* These must appear regardless of  .  */   
 }
 
diff --git a/bsps/bfin/eZKit533/start/linkcmds b/bsps/bfin/eZKit533/start/linkcmds
index 0fc2da1..90451bd 100644
--- a/bsps/bfin/eZKit533/start/linkcmds
+++ b/bsps/bfin/eZKit533/start/linkcmds
@@ -11,7 +11,6 @@ STARTUP(start.o)
 _RamBase = DEFINED(_RamBase) ? _RamBase : 0x0;
 _RamSize = DEFINED(_RamSize) ? _RamSize : 0x01000000;
 _HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 MEMORY
 {
@@ -120,8 +119,6 @@ SECTIONS
         *(.gnu.linkonce.b.*)
         *(COMMON)
         . = ALIGN (64);
-        _stack_init = .;
-        . += _StackSize;
         _clear_end = .;
          _end = .;
          __end = .;
@@ -167,7 +164,6 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) } 
-  /*.stack 0x80000 : { _stack = .; *(.stack) }*/
   /* These must appear regardless of  .  */   
 }
 
diff --git a/bsps/lm32/lm32_evr/start/linkcmds b/bsps/lm32/lm32_evr/start/linkcmds
index d4b3147..c89940d 100644
--- a/bsps/lm32/lm32_evr/start/linkcmds
+++ b/bsps/lm32/lm32_evr/start/linkcmds
@@ -12,9 +12,7 @@ STARTUP(start.o)
 RamBase = DEFINED(RamBase) ? RamBase : 0x08000000;
 RamSize = DEFINED(RamSize) ? RamSize : 32M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 2M;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x2000;
 
-PROVIDE (__stack = 0);
 MEMORY {
 	ebr	: ORIGIN = 0x04000000 , LENGTH = 32k
 	sdram   : ORIGIN = 0x08000000 , LENGTH = 32M
@@ -249,11 +247,7 @@ SECTIONS
   __rtems_end = . ;
   PROVIDE (end = .);
 
-  . += _StackSize;
-  _fstack = .;
-
     . = ALIGN (16);
-    _stack_init = .;
     _clear_end = .;
 
   } > sdram
diff --git a/bsps/lm32/milkymist/start/linkcmds b/bsps/lm32/milkymist/start/linkcmds
index 6a27210..28779a8 100644
--- a/bsps/lm32/milkymist/start/linkcmds
+++ b/bsps/lm32/milkymist/start/linkcmds
@@ -12,9 +12,7 @@ STARTUP(start.o)
 RamBase = DEFINED(RamBase) ? RamBase : 0x40000000;
 RamSize = DEFINED(RamSize) ? RamSize : 128M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 92M;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x2000;
 
-PROVIDE (__stack = 0);
 MEMORY {
 	sdram   : ORIGIN = 0x40000000 , LENGTH = 128M
 }
@@ -248,11 +246,7 @@ SECTIONS
   __rtems_end = . ;
   PROVIDE (end = .);
 
-  . += _StackSize;
-  _fstack = .;
-
     . = ALIGN (16);
-    _stack_init = .;
     _clear_end = .;
   } > sdram
 
diff --git a/bsps/lm32/shared/start/start.S b/bsps/lm32/shared/start/start.S
index 71cbb54..3f4a6c6 100644
--- a/bsps/lm32/shared/start/start.S
+++ b/bsps/lm32/shared/start/start.S
@@ -126,8 +126,8 @@ crt0:
 	nop
 	nop
 	/* Initialize stack pointer */
-	mvhi	sp, hi(_fstack-4)
-	ori	sp, sp, lo(_fstack-4)
+	mvhi	sp, hi(_Configuration_Interrupt_stack_area_end-4)
+	ori	sp, sp, lo(_Configuration_Interrupt_stack_area_end-4)
 	/* Initialize global pointer */
 	mvhi	gp, hi(_edata)
 	ori	gp, gp, lo(_edata)
diff --git a/bsps/m32c/m32cbsp/start/linkcmds b/bsps/m32c/m32cbsp/start/linkcmds
index 201b26f..9863f36 100644
--- a/bsps/m32c/m32cbsp/start/linkcmds
+++ b/bsps/m32c/m32cbsp/start/linkcmds
@@ -4,8 +4,6 @@
 _RamBase = DEFINED(_RamBase) ? _RamBase : 0x200000;
 _RamSize = DEFINED(_RamSize) ? _RamSize : 0x800000;
 _HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
-
 
 /* Default linker script, for normal executables */
 OUTPUT_FORMAT("elf32-m32c", "elf32-m32c",
@@ -153,10 +151,6 @@ SECTIONS
     PROVIDE (end = .);
   } > RAM
   PROVIDE (__bsssize = 0);
-  . = ALIGN(16);
-
-  . += _StackSize;
-  PROVIDE (__stack = .);
 
   .rtemsstack (NOLOAD) : {
     *(SORT(.rtemsstack.*))
@@ -167,14 +161,6 @@ SECTIONS
   PROVIDE (_WorkAreaEnd = .);
   PROVIDE (_WorkAreaSize = _WorkAreaEnd - _WorkAreaBase);
 
-/*
-  .stack (0x200000 + 0x800000 - 2) :
-  {
-    PROVIDE (__stack = .);
-    *(.stack)
-  }
-*/
-
   .vec : {
     *(.vec)
   } > VEC
diff --git a/bsps/m32c/m32cbsp/start/start.S b/bsps/m32c/m32cbsp/start/start.S
index e8268a7..029cc09 100644
--- a/bsps/m32c/m32cbsp/start/start.S
+++ b/bsps/m32c/m32cbsp/start/start.S
@@ -48,7 +48,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 _start:
 .LFB2:
 	fset	U	/* User stack */
-	ldc	#__stack,sp
+	ldc	#__Configuration_Interrupt_stack_area_end,sp
 
 #ifdef A16
 	mov.b	#%hi8(__romdatastart),r1h
diff --git a/bsps/m68k/gen68340/start/linkcmds b/bsps/m68k/gen68340/start/linkcmds
index 99eeb3b..3621474 100644
--- a/bsps/m68k/gen68340/start/linkcmds
+++ b/bsps/m68k/gen68340/start/linkcmds
@@ -21,7 +21,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x10000000;
 RamSize = DEFINED(RamSize) ? RamSize : 4M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 /*
  * Declare on-board memory.
@@ -186,10 +185,6 @@ SECTIONS {
                 *(COMMON)
                 . = ALIGN (16);
                 PROVIDE (end = .);
-
-                . += _StackSize;
-                . = ALIGN (16);
-                _stack_init = .;
                 _clear_end = .;
         } >ram
 
diff --git a/bsps/m68k/gen68340/start/start.S b/bsps/m68k/gen68340/start/start.S
index 794c6d7..85b9aa8 100644
--- a/bsps/m68k/gen68340/start/start.S
+++ b/bsps/m68k/gen68340/start/start.S
@@ -850,7 +850,7 @@ ZEROLOOPTEST:
 	cmpl	a1,a0						| Done?
 	bcs.s	ZEROLOOP					| No, skip
 
-	movel	#_stack_init,a7					| set master stack pointer
+	movel	#_Configuration_Interrupt_stack_area_end,a7		| set master stack pointer
 	movel	d0,a7 at -						| command line
 	jsr	SYM(boot_card)					| Call C main
 
diff --git a/bsps/m68k/gen68360/start/linkcmds b/bsps/m68k/gen68360/start/linkcmds
index f3d6712..f285813 100644
--- a/bsps/m68k/gen68360/start/linkcmds
+++ b/bsps/m68k/gen68360/start/linkcmds
@@ -16,7 +16,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x0;
 RamSize = DEFINED(RamSize) ? RamSize : 64M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 /*
  * Declare on-board memory.
@@ -150,10 +149,6 @@ SECTIONS {
                 *(COMMON)
                 . = ALIGN (16);
                 PROVIDE (end = .);
-
-                . += _StackSize;
-                . = ALIGN (16);
-                _stack_init = .;
                 _clear_end = .;
         } >ram
 
diff --git a/bsps/m68k/gen68360/start/linkcmds.bootp b/bsps/m68k/gen68360/start/linkcmds.bootp
index b97c66f..a05573c 100644
--- a/bsps/m68k/gen68360/start/linkcmds.bootp
+++ b/bsps/m68k/gen68360/start/linkcmds.bootp
@@ -20,7 +20,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x0;
 RamSize = DEFINED(RamSize) ? RamSize : 64M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 /*
  * Declare on-board memory.
@@ -152,10 +151,6 @@ SECTIONS {
                 *(COMMON)
                 . = ALIGN (16);
                 PROVIDE (end = .);
-
-                . += _StackSize;
-                . = ALIGN (16);
-                _stack_init = .;
                 _clear_end = .;
         } >myram
 
diff --git a/bsps/m68k/gen68360/start/linkcmds.prom b/bsps/m68k/gen68360/start/linkcmds.prom
index 6513ccd..0e68300 100644
--- a/bsps/m68k/gen68360/start/linkcmds.prom
+++ b/bsps/m68k/gen68360/start/linkcmds.prom
@@ -20,7 +20,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x0;
 RamSize = DEFINED(RamSize) ? RamSize : 64M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 /*
  * Declare on-board memory.
@@ -150,10 +149,6 @@ SECTIONS {
                 *(COMMON)
                 . = ALIGN (16);
                 PROVIDE (end = .);
-
-                . += _StackSize;
-                . = ALIGN (16);
-                _stack_init = .;
                 _clear_end = .;
         } >ram
 
diff --git a/bsps/m68k/gen68360/start/start.S b/bsps/m68k/gen68360/start/start.S
index 8511960..7549f08 100644
--- a/bsps/m68k/gen68360/start/start.S
+++ b/bsps/m68k/gen68360/start/start.S
@@ -390,7 +390,7 @@ ZEROLOOPTEST:
 	cmpl	a1,a0			| Done?
 	bcs.s	ZEROLOOP		| No, skip
 
-	movel	#_stack_init,a7		| set master stack pointer
+	movel	#_Configuration_Interrupt_stack_area_end,a7 | set master stack pointer
 	movel	d0,a7 at -			| command line
 	jsr	boot_card		| Call C main
 
diff --git a/bsps/m68k/genmcf548x/start/linkcmds.COBRA5475 b/bsps/m68k/genmcf548x/start/linkcmds.COBRA5475
index 52bca8d..1e817d0 100644
--- a/bsps/m68k/genmcf548x/start/linkcmds.COBRA5475
+++ b/bsps/m68k/genmcf548x/start/linkcmds.COBRA5475
@@ -62,8 +62,6 @@ _CoreSramSize1  = DEFINED(_CoreSramSize1)  ? _CoreSramSize1 : (4 * 1024);
 _BootFlashBase  = DEFINED(_BootFlashBase)  ? _BootFlashBase : 0xFC000000;
 _BootFlashSize  = DEFINED(_BootFlashSize)  ? _BootFlashSize : (32 * 1024*1024);
 
-bsp_initstack_size = DEFINED(StackSize)    ? StackSize  : 0x800;  /* 2 kB   */
-
 _VBR            = DEFINED(_VBR)            ? _VBR       : _SdramBase;
 
 __MBAR          = DEFINED(__MBAR)          ? __MBAR     : 0xFE000000;
diff --git a/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine b/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine
index be746af..ee873c4 100644
--- a/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine
+++ b/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine
@@ -63,8 +63,6 @@ _BootFlashSize  = DEFINED(_BootFlashSize)  ? _BootFlashSize : (2 * 1024*1024);
 _CodeFlashBase  = DEFINED(_CodeFlashBase)  ? _CodeFlashBase : 0xE0000000;
 _CodeFlashSize  = DEFINED(_CodeFlashSize)  ? _CodeFlashSize : (16 * 1024*1024);
 
-bsp_initstack_size = DEFINED(StackSize)    ? StackSize  : 0x800;  /* 2 kB   */
-
 _VBR            = DEFINED(_VBR)            ? _VBR       : _SdramBase;
 
 __MBAR          = DEFINED(__MBAR)          ? __MBAR     : 0x10000000;
diff --git a/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine.flash b/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine.flash
index 4db960f..30df1e4 100644
--- a/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine.flash
+++ b/bsps/m68k/genmcf548x/start/linkcmds.m5484FireEngine.flash
@@ -63,8 +63,6 @@ _BootFlashSize = DEFINED(_BootFlashSize)  ? _BootFlashSize : (2 * 1024 * 1024);
 _CodeFlashBase = DEFINED(_CodeFlashBase)  ? _CodeFlashBase : 0xE0000000;
 _CodeFlashSize = DEFINED(_CodeFlashSize)  ? _CodeFlashSize : (16 * 1024 * 1024);
 
-bsp_initstack_size = DEFINED(StackSize)    ? StackSize  : 0x800;  /* 2 kB   */
-
 _VBR            = DEFINED(_VBR)            ? _VBR       : _SdramBase;
 
 __MBAR          = DEFINED(__MBAR)          ? __MBAR     : 0x10000000;
diff --git a/bsps/m68k/genmcf548x/start/start.S b/bsps/m68k/genmcf548x/start/start.S
index d4d1d9b..1bc09a0 100644
--- a/bsps/m68k/genmcf548x/start/start.S
+++ b/bsps/m68k/genmcf548x/start/start.S
@@ -75,7 +75,7 @@
 .section ".vectors","ax"  	     /* begin of vectors section */
 PUBLIC (InterruptVectorTable)
 SYM(InterruptVectorTable):
-INITSP:		.long	bsp_initstack_end	/* Initial SP		  */
+INITSP:		.long	_Configuration_Interrupt_stack_area_end /* Initial SP		  */
 INITPC:		.long	start			/* Initial PC		  */
 vector002:	.long	asm_default_interrupt	/* Access Error		  */
 vector003:	.long	asm_default_interrupt	/* Address Error	  */
@@ -411,7 +411,7 @@ SYM(start_init):
 
     jsr	    mcf548x_init		/* Initialize mcf548x peripherals */
 
-    move.l  #bsp_initstack_end,sp	/* relocate sp */
+    move.l  #_Configuration_Interrupt_stack_area_end,sp /* relocate sp */
 
     clrl    d0          		/* clear d0 */
     movel   d0,a7 at -                     /* command line == 0 */
diff --git a/bsps/m68k/mcf52235/start/linkcmds b/bsps/m68k/mcf52235/start/linkcmds
index 3e912a2..0c4d15f 100644
--- a/bsps/m68k/mcf52235/start/linkcmds
+++ b/bsps/m68k/mcf52235/start/linkcmds
@@ -16,7 +16,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x20000000;
 RamSize = DEFINED(RamSize) ? RamSize : 32K;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x400;
 _FlashBase = DEFINED(_FlashBase) ? _FlashBase : 0x00000000;
 
 _VBR = 0x20000000;
@@ -171,16 +170,6 @@ SECTIONS
         PROVIDE (_clear_end = .);
     } >sram
 
-    .stack : 
-    {
-        /*
-         * Starting Stack
-         */ 
-        . += _StackSize;
-        . = ALIGN (16);
-        PROVIDE(_StackInit = .);
-    } >sram
-
     .rtemsstack (NOLOAD) : {
         *(SORT(.rtemsstack.*))
         PROVIDE(WorkAreaBase = .);
diff --git a/bsps/m68k/mcf52235/start/start.S b/bsps/m68k/mcf52235/start/start.S
index e1d837c..ecb2c5c 100644
--- a/bsps/m68k/mcf52235/start/start.S
+++ b/bsps/m68k/mcf52235/start/start.S
@@ -16,14 +16,12 @@
 
 #include <rtems/asm.h>
 
-.extern _StackInit
-
 BEGIN_CODE
 
     PUBLIC (_INTERRUPT_VECTOR)
 SYM(_INTERRUPT_VECTOR):
 
-    .long   _StackInit /* 00 Initial 'SSP' */
+    .long   _Configuration_Interrupt_stack_area_end /* 00 Initial 'SSP' */
     .long   SYM(start) /* 01 Initial PC */
     .long   SYM(_uhoh) /* 02 Access Error */
     .long   SYM(_uhoh) /* 03 Address Error */
@@ -357,7 +355,7 @@ SYM(start):
     movec   d0, %rambar
 
     /* Locate Stack Pointer */
-    move.l  #_StackInit, sp
+    move.l  #_Configuration_Interrupt_stack_area_end, sp
 
     /* Initialize FLASHBAR */
     move.l  #_FlashBase, d0
@@ -369,7 +367,7 @@ SYM(start):
 _continue_startup:
 
     /* Locate Stack Pointer */
-    move.l  #_StackInit, sp
+    move.l  #_Configuration_Interrupt_stack_area_end, sp
 
     /* Save off intial D0 and D1 to RAM */
     move.l  d6, SYM(_d0_reset)
diff --git a/bsps/m68k/mcf5225x/start/linkcmds b/bsps/m68k/mcf5225x/start/linkcmds
index a2ad1ec..563aede 100644
--- a/bsps/m68k/mcf5225x/start/linkcmds
+++ b/bsps/m68k/mcf5225x/start/linkcmds
@@ -16,7 +16,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x20000000;
 RamSize = DEFINED(RamSize) ? RamSize : 64K;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x400;
 _FlashBase = DEFINED(_FlashBase) ? _FlashBase : 0x00000000;
 
 _VBR = 0x20000000;
@@ -171,16 +170,6 @@ SECTIONS
         PROVIDE (_clear_end = .);
     } >sram
 
-    .stack : 
-    {
-        /*
-         * Starting Stack
-         */ 
-        . += _StackSize;
-        . = ALIGN (16);
-        PROVIDE(_StackInit = .);
-    } >sram
-
     .rtemsstack (NOLOAD) : {
         *(SORT(.rtemsstack.*))
         PROVIDE(WorkAreaBase = .);
diff --git a/bsps/m68k/mcf5225x/start/start.S b/bsps/m68k/mcf5225x/start/start.S
index abc7bb9..19d9038 100644
--- a/bsps/m68k/mcf5225x/start/start.S
+++ b/bsps/m68k/mcf5225x/start/start.S
@@ -16,14 +16,12 @@
 
 #include <rtems/asm.h>
 
-.extern _StackInit
-
 BEGIN_CODE
     
     PUBLIC (_INTERRUPT_VECTOR)
 SYM(_INTERRUPT_VECTOR):
 
-    .long   _StackInit /* 00 Initial 'SSP' */
+    .long   _Configuration_Interrupt_stack_area_end /* 00 Initial 'SSP' */
     .long   SYM(start) /* 01 Initial PC */
     .long   SYM(_uhoh) /* 02 Access Error */
     .long   SYM(_uhoh) /* 03 Address Error */
@@ -361,7 +359,7 @@ SYM(start):
     movec   d7, %rambar
 
     /* Locate Stack Pointer */ 
-    move.l  #_StackInit, sp
+    move.l  #_Configuration_Interrupt_stack_area_end, sp
 
     /* Initialize FLASHBAR */
     move.l  #_FlashBase, d7
@@ -373,7 +371,7 @@ SYM(start):
 _continue_startup:
 
     /* Locate Stack Pointer */ 
-//    move.l  #_StackInit, sp		//is done automatically by the CPU
+//    move.l  #_Configuration_Interrupt_stack_area_end, sp		//is done automatically by the CPU
 
     /*
      * Remainder of the startup code is handled by C code
diff --git a/bsps/m68k/mcf5329/start/linkcmds b/bsps/m68k/mcf5329/start/linkcmds
index bed8dfe..78fc50c 100644
--- a/bsps/m68k/mcf5329/start/linkcmds
+++ b/bsps/m68k/mcf5329/start/linkcmds
@@ -23,7 +23,6 @@ _BootFlashBase = DEFINED(_FlashBase) ? _FlashBase : 0x00000000;
 _BootFlashSize = DEFINED(_FlashBase) ? _FlashBase : 2M;
 
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x400;
 
 _VBR = 0x40000000;
 
@@ -178,23 +177,12 @@ SECTIONS
         *(COMMON)
         . = ALIGN (16);
         PROVIDE (_end = .);
-
         _clear_end = .;
+        WorkAreaBase = .;
     } > dram
 
     .rtemsstack (NOLOAD) : {
         *(SORT(.rtemsstack.*))
-        WorkAreaBase = .;
-    } > dram
-
-    .start_stack :
-    {
-        /*
-         * Starting Stack
-         */ 
-        . += _StackSize;
-        . = ALIGN (16);
-        PROVIDE(_StackInit = .);
     } > core_sram
 
     /* Stabs debugging sections.  */
diff --git a/bsps/m68k/mcf5329/start/linkcmdsflash b/bsps/m68k/mcf5329/start/linkcmdsflash
index 88a6f96..adfb3ba 100644
--- a/bsps/m68k/mcf5329/start/linkcmdsflash
+++ b/bsps/m68k/mcf5329/start/linkcmdsflash
@@ -23,7 +23,6 @@ _BootFlashBase = DEFINED(_FlashBase) ? _FlashBase : 0x00000000;
 _BootFlashSize = DEFINED(_FlashBase) ? _FlashBase : 2M;
 
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x400;
 
 _VBR = 0x40000000;
 
@@ -174,23 +173,12 @@ SECTIONS
         *(COMMON)
         . = ALIGN (16);
         PROVIDE (_end = .);
-
         _clear_end = .;
+        WorkAreaBase = .;
     } > dram
 
     .rtemsstack (NOLOAD) : {
         *(SORT(.rtemsstack.*))
-        WorkAreaBase = .;
-    } > dram
-
-    .start_stack :
-    {
-        /*
-         * Starting Stack
-         */ 
-        . += _StackSize;
-        . = ALIGN (16);
-        PROVIDE(_StackInit = .);
     } > core_sram
 
     /* Stabs debugging sections.  */
diff --git a/bsps/m68k/mcf5329/start/start.S b/bsps/m68k/mcf5329/start/start.S
index 6063fda..659c617 100644
--- a/bsps/m68k/mcf5329/start/start.S
+++ b/bsps/m68k/mcf5329/start/start.S
@@ -16,14 +16,12 @@
 
 #include <rtems/asm.h>
 
-.extern _StackInit
-
 BEGIN_CODE
 
     PUBLIC (_INTERRUPT_VECTOR)
 SYM(_INTERRUPT_VECTOR):
 
-    .long   _StackInit /* 00 Initial 'SSP' */
+    .long   _Configuration_Interrupt_stack_area_end /* 00 Initial 'SSP' */
     .long   SYM(start) /* 01 Initial PC */
     .long   SYM(_uhoh) /* 02 Access Error */
     .long   SYM(_uhoh) /* 03 Address Error */
@@ -346,7 +344,7 @@ SYM(start):
     move.l  d7, SYM(_d1_reset)
 
     /* Locate Stack Pointer */
-    move.l  #_StackInit,sp
+    move.l  #_Configuration_Interrupt_stack_area_end,sp
 
     /*
      * Remainder of the startup code is handled by C code
diff --git a/bsps/m68k/mrm332/start/linkcmds b/bsps/m68k/mrm332/start/linkcmds
index f86e80d..125538c 100644
--- a/bsps/m68k/mrm332/start/linkcmds
+++ b/bsps/m68k/mrm332/start/linkcmds
@@ -32,7 +32,6 @@ __DYNAMIC  =  0;
  * |    heap space      |
  * |        _ENDHEAP    |
  * |    stack space     | 
- * |        __stack     | top of stack
  * +--------------------+ <- high memory
  */
 
@@ -52,7 +51,6 @@ MEMORY
 
 _copy_data_from_rom = 1;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x2000;
 
 
 /*
@@ -194,9 +192,6 @@ SECTIONS
     *(COMMON)
     . = ALIGN (16);
     PROVIDE (end = .);
-    . += _StackSize;
-    . = ALIGN (16);
-    _stack_init = .;
     _clear_end = .;
   } > ram
   .rtemsstack (NOLOAD) : {
diff --git a/bsps/m68k/mrm332/start/start.S b/bsps/m68k/mrm332/start/start.S
index 5e2bbeb..300b74f 100644
--- a/bsps/m68k/mrm332/start/start.S
+++ b/bsps/m68k/mrm332/start/start.S
@@ -37,10 +37,10 @@ BEGIN_CODE
 	movel	#0x0,d0				/* Use the initial vectors until we get going */
 	movecl	d0,vbr
 
-	movel  #end, d0				/* Next 3 instructions set stack pointer    */
-	addl   #_StackSize,d0       /* sp = end + _StackSize from linker script */
-	movel  d0,sp
-	movel  d0,a6			
+	/* Set stack pointer */
+	movel	#_Configuration_Interrupt_stack_area_end,d0
+	movel	d0,sp
+	movel	d0,a6
 
   /* include in ram_init.S */
   /*
diff --git a/bsps/m68k/shared/start/linkcmds.base b/bsps/m68k/shared/start/linkcmds.base
index ee1d6ea..fc726b4 100644
--- a/bsps/m68k/shared/start/linkcmds.base
+++ b/bsps/m68k/shared/start/linkcmds.base
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008-2013 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2008, 2018 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -19,8 +19,6 @@ OUTPUT_ARCH(m68k)
 ENTRY(start)
 STARTUP(start.o)
 
-bsp_initstack_size = DEFINED (bsp_initstack_size) ? bsp_initstack_size : 2048;
-
 MEMORY {
 	UNEXPECTED_SECTIONS : ORIGIN = 0xffffffff, LENGTH = 0
 }
@@ -226,12 +224,6 @@ SECTIONS {
 	} > REGION_DATA AT > REGION_DATA
 	bsp_vector1_size = bsp_vector1_end - bsp_vector1_begin;
 
-	.initstack : ALIGN_WITH_INPUT {
-		bsp_initstack_begin = .;
-		. = . + bsp_initstack_size;
-		bsp_initstack_end = .;
-	} > REGION_DATA AT > REGION_DATA
-
 	.data : ALIGN_WITH_INPUT {
 		bsp_section_data_begin = .;
 		*(.data .data.* .gnu.linkonce.d.*)
diff --git a/bsps/m68k/shared/start/start.S b/bsps/m68k/shared/start/start.S
index b3a3c8b..9c40cbc 100644
--- a/bsps/m68k/shared/start/start.S
+++ b/bsps/m68k/shared/start/start.S
@@ -74,7 +74,7 @@ loop:   movel   #0,a1 at +                 | to zero out uninitialized
         cmpal   a0,a1
         jlt     loop                    | loop until _end reached
 
-        movel   # SYM (_stack_init),d0  | d0 = stop of stack
+        movel   # SYM (_Configuration_Interrupt_stack_area_end),d0 | d0 = stop of stack
         movw    #0x3700,sr              | SUPV MODE,INTERRUPTS OFF!!!
         movel   d0,a7                   | set master stack pointer
         movel   d0,a6                   | set base pointer
@@ -135,13 +135,6 @@ SYM (initial_usp):
 SYM (initial_sr):
         .space  2
 
-	.align 16
-         PUBLIC (starting_stack)
-SYM (starting_stack):
-        .space  0x1000
-         PUBLIC (_stack_init)
-SYM (_stack_init):
-
 END_DATA
 #endif
 END
diff --git a/bsps/mips/csb350/start/linkcmds b/bsps/mips/csb350/start/linkcmds
index d9d2d1c..961ada6 100644
--- a/bsps/mips/csb350/start/linkcmds
+++ b/bsps/mips/csb350/start/linkcmds
@@ -15,7 +15,6 @@ _sdram_size = DEFINED(_sdram_size) ? _sdram_size : 12M;
 RamBase = _sdram_base;
 RamSize = _sdram_size;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x4000;
 
 ENTRY(_start)
 STARTUP(start.o)
@@ -187,10 +186,6 @@ SECTIONS
     *(.bss .bss.* .gnu.linkonce.b.*)
     *(COMMON)
     . = ALIGN (64);
-    _stack_limit = .;
-    . += _StackSize;
-    __stack = .;
-    _stack_init = .;
     _clear_end = .;
     end = .;
     _end = .;
diff --git a/bsps/mips/csb350/start/start.S b/bsps/mips/csb350/start/start.S
index 9aea3f4..dc92f1a 100644
--- a/bsps/mips/csb350/start/start.S
+++ b/bsps/mips/csb350/start/start.S
@@ -67,7 +67,7 @@ zerobss:
 	bltu	v0,v1,3b
 	addiu	v0,v0,4			/* executed in delay slot */
 
-	la	t0, _stack_init		/* initialize stack so we */
+	la	t0, _Configuration_Interrupt_stack_area_end /* initialize stack so we */
 	/* We must subtract 24 bytes for the 3 8 byte arguments to main, in
 	   case main wants to write them back to the stack.  The caller is
 	   supposed to allocate stack space for parameters in registers in
diff --git a/bsps/mips/hurricane/start/linkcmds b/bsps/mips/hurricane/start/linkcmds
index 3ffaf52..51e4715 100644
--- a/bsps/mips/hurricane/start/linkcmds
+++ b/bsps/mips/hurricane/start/linkcmds
@@ -8,7 +8,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x80000000;
 RamSize = DEFINED(RamSize) ? RamSize : 4M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 ENTRY(start)
 STARTUP(start.o)
@@ -166,10 +165,6 @@ SECTIONS
     *(.bss)
     *(COMMON)
     . = ALIGN (64);
-    _stack_limit = .;
-    . += _StackSize;
-    __stack = .;
-    _stack_init = .;
      end = .;
     _end = .;
   }
diff --git a/bsps/mips/jmr3904/start/linkcmds b/bsps/mips/jmr3904/start/linkcmds
index a3d64a4..0becab1 100644
--- a/bsps/mips/jmr3904/start/linkcmds
+++ b/bsps/mips/jmr3904/start/linkcmds
@@ -8,7 +8,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x88000000;
 RamSize = DEFINED(RamSize) ? RamSize : 4M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 ENTRY(_start)
 STARTUP(start.o)
@@ -164,10 +163,6 @@ SECTIONS
     *(.bss*)
     *(COMMON)
     . = ALIGN (64);
-    _stack_limit = .;
-    . += _StackSize;
-    __stack = .;
-    _stack_init = .;
     _clear_end = .;
   }
 
@@ -181,9 +176,6 @@ SECTIONS
  _end = .;
 
 
-/* Put starting stack in SRAM (8 Kb); this size is the same as the stack from
-      the original script (when everything was in SRAM). */
-   /* __stack = 0x8000A000; */
   /* DWARF debug sections.
      Symbols in the DWARF debugging sections are relative to
      the beginning of the section so we begin them at 0.  */
diff --git a/bsps/mips/jmr3904/start/start.S b/bsps/mips/jmr3904/start/start.S
index 92c0ddd..9e1fa41 100644
--- a/bsps/mips/jmr3904/start/start.S
+++ b/bsps/mips/jmr3904/start/start.S
@@ -139,7 +139,7 @@ zerobss:
 	bltu	v0,v1,3b
 	addiu	v0,v0,4				# executed in delay slot
 
-	la	t0, _stack_init			# initialize stack so we
+	la	t0, _Configuration_Interrupt_stack_area_end # initialize stack so we
 	/* We must subtract 24 bytes for the 3 8 byte arguments to main, in
 	   case main wants to write them back to the stack.  The caller is
 	   supposed to allocate stack space for parameters in registers in
diff --git a/bsps/mips/malta/start/linkcmds b/bsps/mips/malta/start/linkcmds
index 4e44bce..1d6745c 100644
--- a/bsps/mips/malta/start/linkcmds
+++ b/bsps/mips/malta/start/linkcmds
@@ -8,7 +8,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x80000000;
 RamSize = DEFINED(RamSize) ? RamSize : 128M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x2000;
 
 ENTRY(_start)
 STARTUP(start.o)
@@ -165,10 +164,6 @@ SECTIONS
     *(.bss*)
     *(COMMON)
     . = ALIGN (64);
-    _stack_limit = .;
-    . += _StackSize;
-    __stack = .;
-    _stack_init = .;
     _clear_end = .;
   }
 
@@ -182,9 +177,6 @@ SECTIONS
  _end = .;
 
 
-/* Put starting stack in SRAM (8 Kb); this size is the same as the stack from
-      the original script (when everything was in SRAM). */
-   /* __stack = 0x8000A000; */
   /* DWARF debug sections.
      Symbols in the DWARF debugging sections are relative to
      the beginning of the section so we begin them at 0.  */
diff --git a/bsps/mips/malta/start/start.S b/bsps/mips/malta/start/start.S
index 8f5f964..d437575 100644
--- a/bsps/mips/malta/start/start.S
+++ b/bsps/mips/malta/start/start.S
@@ -166,7 +166,7 @@ zerobss:
 	bltu	v0,v1,3b
 	addiu	v0,v0,4				# executed in delay slot
 
-	la	t0, _stack_init			# initialize stack so we
+	la	t0, _Configuration_Interrupt_stack_area_end # initialize stack so we
 	/* We must subtract 24 bytes for the 3 8 byte arguments to main, in
 	   case main wants to write them back to the stack.  The caller is
 	   supposed to allocate stack space for parameters in registers in
diff --git a/bsps/mips/rbtx4925/start/linkcmds b/bsps/mips/rbtx4925/start/linkcmds
index 7c75cb5..3042176 100644
--- a/bsps/mips/rbtx4925/start/linkcmds
+++ b/bsps/mips/rbtx4925/start/linkcmds
@@ -8,7 +8,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x80000000;
 RamSize = DEFINED(RamSize) ? RamSize : 4M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 ENTRY(start)
 STARTUP(start.o)
@@ -166,10 +165,6 @@ SECTIONS
     *(.bss)
     *(COMMON)
     . = ALIGN (64);
-    _stack_limit = .;
-    . += _StackSize;
-    __stack = .;
-    _stack_init = .;
      end = .;
     _end = .;
   }
diff --git a/bsps/mips/rbtx4938/start/linkcmds b/bsps/mips/rbtx4938/start/linkcmds
index a9deef8..e11d1dc 100644
--- a/bsps/mips/rbtx4938/start/linkcmds
+++ b/bsps/mips/rbtx4938/start/linkcmds
@@ -8,7 +8,6 @@
 RamBase = DEFINED(RamBase) ? RamBase : 0x80000000;
 RamSize = DEFINED(RamSize) ? RamSize : 4M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 ENTRY(start)
 STARTUP(start.o)
@@ -166,10 +165,6 @@ SECTIONS
     *(.bss)
     *(COMMON)
     . = ALIGN (64);
-    _stack_limit = .;
-    . += _StackSize;
-    __stack = .;
-    _stack_init = .;
      end = .;
     _end = .;
   }
diff --git a/bsps/mips/shared/irq/exception.S b/bsps/mips/shared/irq/exception.S
index e916ae5..30c733b 100644
--- a/bsps/mips/shared/irq/exception.S
+++ b/bsps/mips/shared/irq/exception.S
@@ -214,10 +214,8 @@ _chk_int:
 
   /*
    *
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if ( _ISR_Nest_level == 0 )
-   *      switch to software interrupt stack
-   *  #endif
+   *  if ( _ISR_Nest_level == 0 )
+   *    switch to software interrupt stack
    */
 
   /*
@@ -307,9 +305,7 @@ _ISR_Handler_cleanup:
 
 
   /*
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    restore stack
-   *  #endif
+   *  restore stack
    *
    *  if ( !_Thread_Dispatch_necessary )
    *    goto the label "exit interrupt (simple case)"
diff --git a/bsps/nios2/nios2_iss/start/linkcmds b/bsps/nios2/nios2_iss/start/linkcmds
index b900718..bcbfeaf 100644
--- a/bsps/nios2/nios2_iss/start/linkcmds
+++ b/bsps/nios2/nios2_iss/start/linkcmds
@@ -24,7 +24,6 @@ DO NOT MODIFY THIS FILE
 RamBase = DEFINED(RamBase) ? RamBase : 0x00000000;
 RamSize = DEFINED(RamSize) ? RamSize : 0x00800000;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
-StackSize = DEFINED(StackSize) ? HeapSize : 1024;
 
 MEMORY
 {
@@ -265,13 +264,12 @@ SECTIONS
 
         . = ALIGN(32 / 8);
         __bss_end = ABSOLUTE(.);
-        _stack_low = ABSOLUTE(.);
-        . += StackSize;
-        _stack_high = ABSOLUTE(.);
     } > onchip_memory_0
 
     .rtemsstack (NOLOAD) : {
+        _stack_low = ABSOLUTE(.);
         *(SORT(.rtemsstack.*))
+        _stack_high = ABSOLUTE(.);
         WorkAreaBase = .;
     } > onchip_memory_0
 
diff --git a/bsps/powerpc/beatnik/start/bspstart.c b/bsps/powerpc/beatnik/start/bspstart.c
index 83c6d2e..91913cd 100644
--- a/bsps/powerpc/beatnik/start/bspstart.c
+++ b/bsps/powerpc/beatnik/start/bspstart.c
@@ -177,8 +177,8 @@ void bsp_start( void )
 {
   unsigned char  *stack;
   char           *chpt;
-  uint32_t       intrStackStart;
-  uint32_t       intrStackSize;
+  uintptr_t       intrStackStart;
+  uintptr_t       intrStackSize;
 
   Triv121PgTbl	pt=0;
 
@@ -239,7 +239,7 @@ void bsp_start( void )
    * This could be done latter (e.g in IRQ_INIT) but it helps to understand
    * some settings below...
    */
-  intrStackStart = (uint32_t)__rtems_end;
+  intrStackStart = (uintptr_t)_Configuration_Interrupt_stack_area_begin;
   intrStackSize  = rtems_configuration_get_interrupt_stack_size();
 
   /*
diff --git a/bsps/powerpc/gen5200/include/bsp.h b/bsps/powerpc/gen5200/include/bsp.h
index 40ac111..015a8b1 100644
--- a/bsps/powerpc/gen5200/include/bsp.h
+++ b/bsps/powerpc/gen5200/include/bsp.h
@@ -55,10 +55,6 @@ LINKER_SYMBOL(bsp_section_bss_start);
 LINKER_SYMBOL(bsp_section_bss_end);
 LINKER_SYMBOL(bsp_section_bss_size);
 
-LINKER_SYMBOL(bsp_interrupt_stack_start);
-LINKER_SYMBOL(bsp_interrupt_stack_end);
-LINKER_SYMBOL(bsp_interrupt_stack_size);
-
 LINKER_SYMBOL(bsp_work_area_start);
 
 LINKER_SYMBOL(MBAR);
diff --git a/bsps/powerpc/gen5200/start/bspstart.c b/bsps/powerpc/gen5200/start/bspstart.c
index 8b1558c..0f981ff 100644
--- a/bsps/powerpc/gen5200/start/bspstart.c
+++ b/bsps/powerpc/gen5200/start/bspstart.c
@@ -154,8 +154,8 @@ void bsp_start(void)
   /* Initialize exception handler */
   ppc_exc_cache_wb_check = 0;
   ppc_exc_initialize(
-    (uintptr_t) bsp_interrupt_stack_start,
-    (uintptr_t) bsp_interrupt_stack_size
+    (uintptr_t) _Configuration_Interrupt_stack_area_begin,
+    rtems_configuration_get_interrupt_stack_size()
   );
   ppc_exc_set_handler(ASM_ALIGN_VECTOR, ppc_exc_alignment_handler);
 
diff --git a/bsps/powerpc/gen5200/start/linkcmds.gen5200_base b/bsps/powerpc/gen5200/start/linkcmds.gen5200_base
index a8841d2..5ab3088 100644
--- a/bsps/powerpc/gen5200/start/linkcmds.gen5200_base
+++ b/bsps/powerpc/gen5200/start/linkcmds.gen5200_base
@@ -288,13 +288,6 @@ SECTIONS {
 	bsp_section_data_size = bsp_section_data_end - bsp_section_data_start;
 	bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_start;
 
-	/*
-	 * BSP: Interrupt stack
-	 */
-	bsp_interrupt_stack_start = bsp_section_bss_end;
-	bsp_interrupt_stack_end = bsp_interrupt_stack_start + 32k;
-	bsp_interrupt_stack_size = bsp_interrupt_stack_end - bsp_interrupt_stack_start;
-
 	.rtemsstack (NOLOAD) : {
 		*(SORT(.rtemsstack.*))
 	} > RAM
diff --git a/bsps/powerpc/gen83xx/include/bsp.h b/bsps/powerpc/gen83xx/include/bsp.h
index 59fd20d..682dfc2 100644
--- a/bsps/powerpc/gen83xx/include/bsp.h
+++ b/bsps/powerpc/gen83xx/include/bsp.h
@@ -53,10 +53,6 @@ LINKER_SYMBOL(bsp_section_bss_start);
 LINKER_SYMBOL(bsp_section_bss_end);
 LINKER_SYMBOL(bsp_section_bss_size);
 
-LINKER_SYMBOL(bsp_interrupt_stack_start);
-LINKER_SYMBOL(bsp_interrupt_stack_end);
-LINKER_SYMBOL(bsp_interrupt_stack_size);
-
 LINKER_SYMBOL(bsp_work_area_start);
 
 LINKER_SYMBOL(IMMRBAR);
diff --git a/bsps/powerpc/gen83xx/start/start.S b/bsps/powerpc/gen83xx/start/start.S
index b48a26b..9272702 100644
--- a/bsps/powerpc/gen83xx/start/start.S
+++ b/bsps/powerpc/gen83xx/start/start.S
@@ -417,7 +417,7 @@ start_code_in_ram:
 	li	r3, 0
 
 	/* Set start stack pointer */
-	LA	r1, start_stack_end
+	LA	r1, _Configuration_Interrupt_stack_area_end
 	stwu	r3, -4(r1)
 	stwu	r3, -4(r1)
 
@@ -520,10 +520,3 @@ mpc83xx_zero_4_tail:
 
 	/* Return */
 	blr
-
-.section ".bsp_rwextra", "aw", @nobits
-
-	/* Start stack area */
-.align 4
-.space 4096
-start_stack_end:
diff --git a/bsps/powerpc/haleakala/start/bspstart.c b/bsps/powerpc/haleakala/start/bspstart.c
index 5f7f5ef..9865829 100644
--- a/bsps/powerpc/haleakala/start/bspstart.c
+++ b/bsps/powerpc/haleakala/start/bspstart.c
@@ -66,9 +66,6 @@
 #include <ppc4xx/ppc405ex.h>
 
 #include <stdio.h>
-
-LINKER_SYMBOL(intrStack_start);
-LINKER_SYMBOL(intrStack_size);
 /*
  *  Driver configuration parameters
  */
@@ -188,8 +185,8 @@ void bsp_start( void )
    * Initialize default raw exception handlers.
    */
   ppc_exc_initialize(
-    (uintptr_t) intrStack_start,
-    (uintptr_t) intrStack_size
+    (uintptr_t) _Configuration_Interrupt_stack_area_begin,
+    rtems_configuration_get_interrupt_stack_size()
   );
 
   /*
diff --git a/bsps/powerpc/haleakala/start/dlentry.S b/bsps/powerpc/haleakala/start/dlentry.S
index 2395d89..54fbb76 100644
--- a/bsps/powerpc/haleakala/start/dlentry.S
+++ b/bsps/powerpc/haleakala/start/dlentry.S
@@ -54,7 +54,7 @@
  *    .bss
  * see linker command file for section placement
  *
- *  The initial stack is set to stack.end
+ *  The initial stack is set to _Configuration_Interrupt_stack_area_end.
  *
  *  All the entry veneer has to do is to clear the BSS.
  */
@@ -98,7 +98,7 @@ sbss_length:
 sbss_addr:
 		.long	sbss.start
 stack_top:
-		.long	stack.end
+		.long	_Configuration_Interrupt_stack_area_end
 PUBLIC_VAR (text_addr)
 text_addr:
         .long   text.start
diff --git a/bsps/powerpc/haleakala/start/linkcmds b/bsps/powerpc/haleakala/start/linkcmds
index 98fea7f..3bccc97 100644
--- a/bsps/powerpc/haleakala/start/linkcmds
+++ b/bsps/powerpc/haleakala/start/linkcmds
@@ -14,9 +14,6 @@ OUTPUT_ARCH(powerpc)
 ENTRY(download_entry)
 EXTERN(__vectors)
 
-kIntrStackSize = 16K;
-kMainStackSize = 64K;
-
 RamBase = DEFINED(RamBase) ? RamBase : 0;
 RamSize = DEFINED(RamSize) ? RamSize : 256M;
 HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
@@ -246,19 +243,6 @@ SECTIONS
 
     bss.size = bss.end - bss.start;
     sbss.size = sbss.end - sbss.start;
-	          	
-    /* Interrupt stack: align to a cache-line boundary */
-    IntrStack_start = ALIGN(0x20);
-    . += kIntrStackSize;
-    intrStack = .;
-    PROVIDE(intrStackPtr = intrStack);
-    PROVIDE(intrStack_start = IntrStack_start);
-    PROVIDE(intrStack_size = kIntrStackSize);
-
- 	/* Main stack: align to a cache-line boundary */
-	stack.start = ALIGN(0x20);
-	. += kMainStackSize;
-	stack.end   = .;
 
     .rtemsstack (NOLOAD) : {
         *(SORT(.rtemsstack.*))
diff --git a/bsps/powerpc/motorola_powerpc/start/bspstart.c b/bsps/powerpc/motorola_powerpc/start/bspstart.c
index 7fb684c..c420f6c 100644
--- a/bsps/powerpc/motorola_powerpc/start/bspstart.c
+++ b/bsps/powerpc/motorola_powerpc/start/bspstart.c
@@ -220,7 +220,7 @@ void bsp_start( void )
   /*
    * Initialize the interrupt related settings.
    */
-  intrStackStart = (uintptr_t) __rtems_end;
+  intrStackStart = (uintptr_t)_Configuration_Interrupt_stack_area_begin;
   intrStackSize = rtems_configuration_get_interrupt_stack_size();
 
   /*
diff --git a/bsps/powerpc/mpc55xxevb/start/start.S b/bsps/powerpc/mpc55xxevb/start/start.S
index 0a757e7..81893b6 100644
--- a/bsps/powerpc/mpc55xxevb/start/start.S
+++ b/bsps/powerpc/mpc55xxevb/start/start.S
@@ -228,7 +228,7 @@ zero_intermediate_stack_loop:
 	bl	mpc55xx_start_early
 
 	/* Initialize start stack */
-	LA	r1, start_stack_end
+	LA	r1, _Configuration_Interrupt_stack_area_end
 	subi	r1, r1, 16
 	li	r0, 0
 	stw	r0, 0(r1)
@@ -289,11 +289,3 @@ mpc55xx_start_load_section:
 	cmpw	cr7, r3, r4
 	beqlr	cr7
 	b	memcpy
-
-	/* Start stack area */
-
-	.section	".bsp_rwextra", "aw", @nobits
-	.align	4
-	.space	4096
-
-start_stack_end:
diff --git a/bsps/powerpc/mpc8260ads/start/bspstart.c b/bsps/powerpc/mpc8260ads/start/bspstart.c
index 6f1cc72..503d96b 100644
--- a/bsps/powerpc/mpc8260ads/start/bspstart.c
+++ b/bsps/powerpc/mpc8260ads/start/bspstart.c
@@ -69,9 +69,6 @@ bool       bsp_serial_xon_xoff;
 bool       bsp_serial_cts_rts;
 uint32_t   bsp_serial_rate;
 
-extern char IntrStack_start [];
-extern char intrStack [];
-
 static void _BSP_GPLED0_on(void)
 {
   BCSR *csr;
@@ -142,10 +139,9 @@ void bsp_start(void)
 */
 
   /* Initialize exception handler */
-  /* FIXME: Interrupt stack begin and size */
   ppc_exc_initialize(
-    (uintptr_t) IntrStack_start,
-    (uintptr_t) intrStack - (uintptr_t) IntrStack_start
+    (uintptr_t) _Configuration_Interrupt_stack_area_begin,
+    rtems_configuration_get_interrupt_stack_size()
   );
 
   /* Initalize interrupt support */
diff --git a/bsps/powerpc/mpc8260ads/start/linkcmds b/bsps/powerpc/mpc8260ads/start/linkcmds
index 34fb691..84933b4 100644
--- a/bsps/powerpc/mpc8260ads/start/linkcmds
+++ b/bsps/powerpc/mpc8260ads/start/linkcmds
@@ -17,7 +17,6 @@ EXTERN(__vectors)
  *      number used there is not constant.  If this happens to you, edit
  *      the lines marked XXX below to use a constant value.
  */
-StackSize   = DEFINED(StackSize) ? StackSize : 0x8000;
 RamBase     = DEFINED(RamBase) ? RamBase : 0x0;
 RamSize     = DEFINED(RamSize) ? RamDiskSize : 0x0800000; /* 8M program ram */
 HeapSize    = DEFINED(HeapSize) ? HeapSize : 0x0;
@@ -289,16 +288,6 @@ SECTIONS
         _startmalloc = .;
      } >ram
 
-
-    /*
-     * Interrupt stack setup
-     */
-    IntrStack_start = ALIGN(0x10);
-    . += 0x4000;
-    intrStack = .;
-    PROVIDE(intrStackPtr = intrStack);
-
-
     clear_end = .;
 
     .rtemsstack (NOLOAD) : {
diff --git a/bsps/powerpc/mvme3100/start/bspstart.c b/bsps/powerpc/mvme3100/start/bspstart.c
index a073baa..6f15b2d 100644
--- a/bsps/powerpc/mvme3100/start/bspstart.c
+++ b/bsps/powerpc/mvme3100/start/bspstart.c
@@ -255,7 +255,7 @@ VpdBufRec          vpdData [] = {
   /*
    * Initialize the interrupt related settings.
    */
-  intrStackStart = (uintptr_t) __rtems_end;
+  intrStackStart = (uintptr_t) _Configuration_Interrupt_stack_area_begin;
   intrStackSize = rtems_configuration_get_interrupt_stack_size();
 
   /*
diff --git a/bsps/powerpc/mvme5500/start/bspstart.c b/bsps/powerpc/mvme5500/start/bspstart.c
index fc70576..47d413b 100644
--- a/bsps/powerpc/mvme5500/start/bspstart.c
+++ b/bsps/powerpc/mvme5500/start/bspstart.c
@@ -225,7 +225,7 @@ void bsp_start( void )
   /*
    * Initialize the interrupt related settings.
    */
-  intrStackStart = (uintptr_t) __rtems_end;
+  intrStackStart = (uintptr_t) _Configuration_Interrupt_stack_area_begin;
   intrStackSize = rtems_configuration_get_interrupt_stack_size();
 
   /*
diff --git a/bsps/powerpc/psim/start/start.S b/bsps/powerpc/psim/start/start.S
index 918321a..03cbded 100644
--- a/bsps/powerpc/psim/start/start.S
+++ b/bsps/powerpc/psim/start/start.S
@@ -47,7 +47,7 @@ FUNC_NAME(__atexit):			/* tell C's eabi-ctor's we have an atexit function */
 	.long	bsp_section_bss_end
 
 .Lstack = .-.LCTOC1			/* stack address if set by user */
-	.long	__stack
+	.long	_Configuration_Interrupt_stack_area_end
 
 	.text
 .Lptr:
@@ -89,7 +89,7 @@ _start:
 
 .Ldone:
 
-	lwz	r0,.Lstack(r5)		/* stack address or 0 */
+	lwz	r0,.Lstack(r5)	/* stack area or 0 */
 	cmplwi	1,r0,0			/* equal to 0? */
 	bc	12,6,.Lnostack		/* use default stack if == 0 */
 	mr	sp,r0			/* use user defined stack */
@@ -133,9 +133,3 @@ FUNC_NAME(bsp_reset):
 
 .Lstart:
 	.size	_start,.Lstart-_start
-
-	/* Start stack area */
-.section ".bsp_rwextra", "aw", @nobits
-.align 4
-.space 4096
-__stack:
diff --git a/bsps/powerpc/qemuppc/start/bspstart.c b/bsps/powerpc/qemuppc/start/bspstart.c
index 15cf9d4..de3bba0 100644
--- a/bsps/powerpc/qemuppc/start/bspstart.c
+++ b/bsps/powerpc/qemuppc/start/bspstart.c
@@ -42,8 +42,6 @@ uint32_t bsp_clicks_per_usec;
  * Memory on this board.
  */
 extern char RamSize[];
-extern char bsp_interrupt_stack_start[];
-extern char bsp_interrupt_stack_end[];
 uint32_t BSP_mem_size = (uint32_t)RamSize;
 
 /* Default decrementer exception handler */
@@ -89,8 +87,8 @@ void bsp_start( void )
   /*
    * Initialize the interrupt related settings.
    */
-  intrStackStart = (uintptr_t) bsp_interrupt_stack_start;
-  intrStackSize =  (uintptr_t) bsp_interrupt_stack_end - intrStackStart;
+  intrStackStart = (uintptr_t) _Configuration_Interrupt_stack_area_begin;
+  intrStackSize = rtems_configuration_get_interrupt_stack_size();
 
   BSP_mem_size = (uint32_t )RamSize;
 
diff --git a/bsps/powerpc/qemuppc/start/start.S b/bsps/powerpc/qemuppc/start/start.S
index 1ef7a3a..66cedca 100644
--- a/bsps/powerpc/qemuppc/start/start.S
+++ b/bsps/powerpc/qemuppc/start/start.S
@@ -1,17 +1,13 @@
 #include <rtems/score/cpu.h>
 #include <rtems/powerpc/powerpc.h>
 
-#include <bspopts.h>
-
-	.global bsp_interrupt_stack_start
-	.global bsp_interrupt_stack_end
 	.global _start
 
 	.section .bsp_start_text,"awx", at progbits
 
 _start:
-	lis   %r1,bsp_interrupt_stack_start at h
-	ori   %r1,%r1,bsp_interrupt_stack_start at l
+	lis   %r1,_Configuration_Interrupt_stack_area_end at h
+	ori   %r1,%r1,_Configuration_Interrupt_stack_area_end at l
 	/* Make sure stack is properly aligned */
 	li    %r3, CPU_STACK_ALIGNMENT - 1
 	andc  %r1, %r1, %r3
@@ -42,11 +38,3 @@ __eabi:
 _reset:
 	b _start
 	.size _reset, . - _reset
-
-	/* Start stack area */
-	.section ".bsp_rwextra", "aw", @nobits
-	.align 4
-	.space 4096
-bsp_interrupt_stack_start:
-	.space 32768
-bsp_interrupt_stack_end:
diff --git a/bsps/powerpc/qoriq/start/start.S b/bsps/powerpc/qoriq/start/start.S
index 02505a6..96e00bf 100644
--- a/bsps/powerpc/qoriq/start/start.S
+++ b/bsps/powerpc/qoriq/start/start.S
@@ -55,7 +55,9 @@ _start:
 	bl	.Linitearly
 
 	/* Get start stack */
-	LA	START_STACK, start_stack_end
+	LA	START_STACK, _Configuration_Interrupt_stack_area_begin
+	LA	r3, _Configuration_Interrupt_stack_size
+	add	START_STACK, START_STACK, r3
 
 	bl	.Linitmore
 
@@ -226,12 +228,10 @@ _start:
 	isync
 
 	/*
-	 * Initialize start stack.  Make sure that we do not share a cache line
-	 * with the heap block management, since initial stacks for the
-	 * secondary processors are allocated from the workspace.
+	 * Initialize start stack.  The stacks are statically allocated and
+	 * properly aligned.
 	 */
-	subi	r1, START_STACK, 2 * PPC_DEFAULT_CACHE_LINE_SIZE
-	clrrwi	r1, r1, PPC_DEFAULT_CACHE_LINE_POWER
+	subi	r1, START_STACK, PPC_DEFAULT_CACHE_LINE_SIZE
 	li	r0, 0
 	PPC_REG_STORE	r0, 0(r1)
 
@@ -540,9 +540,3 @@ bsp_exc_vector_base:
 
 /* Symbol provided for debugging and tracing */
 bsp_exc_vector_end:
-
-	/* Start stack area */
-	.section ".bsp_rwextra", "aw", @nobits
-	.align 4
-	.space 4096
-start_stack_end:
diff --git a/bsps/powerpc/shared/start/linkcmds.base b/bsps/powerpc/shared/start/linkcmds.base
index fa49edf..4ad302e 100644
--- a/bsps/powerpc/shared/start/linkcmds.base
+++ b/bsps/powerpc/shared/start/linkcmds.base
@@ -321,7 +321,6 @@ SECTIONS {
 
 	.rtemsstack (NOLOAD) : ALIGN_WITH_INPUT {
 		bsp_section_rtemsstack_begin = .;
-		*(.bsp_rwextra)
 		*(SORT(.rtemsstack.*))
 		bsp_section_rtemsstack_end = .;
 	} > REGION_RTEMSSTACK AT > REGION_RTEMSSTACK
diff --git a/bsps/powerpc/ss555/start/bspstart.c b/bsps/powerpc/ss555/start/bspstart.c
index cf54d61..5943e2b 100644
--- a/bsps/powerpc/ss555/start/bspstart.c
+++ b/bsps/powerpc/ss555/start/bspstart.c
@@ -32,8 +32,6 @@
 
 SPR_RW(SPRG1)
 
-extern unsigned long intrStackPtr;
-
 /*
  *  Driver configuration parameters
  */
@@ -67,7 +65,7 @@ uint32_t _CPU_Counter_frequency(void)
  */
 void bsp_start(void)
 {
-  register unsigned char* intrStack;
+  char* intrStack;
 
   /*
    * Get CPU identification dynamically.  Note that the get_ppc_cpu_type()
@@ -80,7 +78,8 @@ void bsp_start(void)
   /*
    * Initialize some SPRG registers related to irq handling
    */
-  intrStack = (((unsigned char*)&intrStackPtr) - PPC_MINIMUM_STACK_FRAME_SIZE);
+  intrStack = (char *)_Configuration_Interrupt_stack_area_end -
+     PPC_MINIMUM_STACK_FRAME_SIZE;
   _write_SPRG1((unsigned int)intrStack);
 
   /*
diff --git a/bsps/powerpc/ss555/start/linkcmds b/bsps/powerpc/ss555/start/linkcmds
index 079dc84..f3a41dd 100644
--- a/bsps/powerpc/ss555/start/linkcmds
+++ b/bsps/powerpc/ss555/start/linkcmds
@@ -232,22 +232,6 @@ SECTIONS
 
   PROVIDE(_end = bss.end);
 
-  /*
-   * Initialization stack
-   */
-  InitStack_start = ALIGN(0x10);
-  . += 0x1000;
-  initStack = .;
-  PROVIDE(initStackPtr = initStack);
-
-  /*
-   * Interrupt stack
-   */
-  IntrStack_start = ALIGN(0x10);
-  . += 0x4000;
-  intrStack = .;
-  PROVIDE(intrStackPtr = intrStack);
-
   .rtemsstack (NOLOAD) : {
     *(SORT(.rtemsstack.*))
   }
diff --git a/bsps/powerpc/ss555/start/start.S b/bsps/powerpc/ss555/start/start.S
index 6a8ef85..f17c918 100644
--- a/bsps/powerpc/ss555/start/start.S
+++ b/bsps/powerpc/ss555/start/start.S
@@ -220,7 +220,7 @@ base_addr:
  * Parameters from linker
  */
 stack_top:
-	.long	initStackPtr
+	.long	_Configuration_Interrupt_stack_area_end
 
 toc_pointer:
         .long   __GOT_START__
diff --git a/bsps/powerpc/t32mppc/start/start.S b/bsps/powerpc/t32mppc/start/start.S
index 7c32343..e4066ad 100644
--- a/bsps/powerpc/t32mppc/start/start.S
+++ b/bsps/powerpc/t32mppc/start/start.S
@@ -34,7 +34,7 @@ _start:
 	mtspr	HID0, r0
 
 	/* Initialize start stack */
-	LWI	r1, start_stack_end
+	LA	r1, _Configuration_Interrupt_stack_area_end
 	subi	r1, r1, 16
 	li	r0, 0
 	stw	r0, 0(r1)
@@ -195,9 +195,3 @@ bsp_exc_vector_base:
 	PPC_REG_STORE	r3, GPR3_OFFSET(r1)
 	li	r3, 35
 	b	ppc_exc_fatal_normal
-
-	/* Start stack area */
-	.section ".bsp_rwextra", "aw", @nobits
-	.align 4
-	.space 4096
-start_stack_end:
diff --git a/bsps/powerpc/tqm8xx/include/bsp.h b/bsps/powerpc/tqm8xx/include/bsp.h
index 5c8eae8..8e84ee8 100644
--- a/bsps/powerpc/tqm8xx/include/bsp.h
+++ b/bsps/powerpc/tqm8xx/include/bsp.h
@@ -53,10 +53,6 @@ LINKER_SYMBOL( bsp_section_bss_start);
 LINKER_SYMBOL( bsp_section_bss_end);
 LINKER_SYMBOL( bsp_section_bss_size);
 
-LINKER_SYMBOL( bsp_interrupt_stack_start);
-LINKER_SYMBOL( bsp_interrupt_stack_end);
-LINKER_SYMBOL( bsp_interrupt_stack_size);
-
 LINKER_SYMBOL( bsp_work_area_start);
 
 #ifndef ASM
diff --git a/bsps/powerpc/tqm8xx/start/bspstart.c b/bsps/powerpc/tqm8xx/start/bspstart.c
index b2d765c..2d0b8e3 100644
--- a/bsps/powerpc/tqm8xx/start/bspstart.c
+++ b/bsps/powerpc/tqm8xx/start/bspstart.c
@@ -99,11 +99,6 @@ uint32_t _CPU_Counter_frequency(void)
 
 void bsp_start( void)
 {
-
-  uintptr_t interrupt_stack_start = (uintptr_t) bsp_interrupt_stack_start;
-  uintptr_t interrupt_stack_size = (uintptr_t) bsp_interrupt_stack_end
-    - interrupt_stack_start;
-
   /*
    * Get CPU identification dynamically. Note that the get_ppc_cpu_type()
    * function stores the result in global variables so that it can be used
@@ -149,7 +144,10 @@ void bsp_start( void)
   bsp_clicks_per_usec = bsp_time_base_frequency / 1000000;
 
   /* Initialize exception handler */
-  ppc_exc_initialize(interrupt_stack_start, interrupt_stack_size);
+  ppc_exc_initialize(
+    (uintptr_t) _Configuration_Interrupt_stack_area_begin,
+    rtems_configuration_get_interrupt_stack_size()
+  );
 
   /* Initalize interrupt support */
   bsp_interrupt_initialize();
diff --git a/bsps/powerpc/tqm8xx/start/start.S b/bsps/powerpc/tqm8xx/start/start.S
index 92bda3f..b16b92e 100644
--- a/bsps/powerpc/tqm8xx/start/start.S
+++ b/bsps/powerpc/tqm8xx/start/start.S
@@ -26,8 +26,6 @@
 .extern boot_card
 
 PUBLIC_VAR (_start)
-PUBLIC_VAR (bsp_interrupt_stack_start)
-PUBLIC_VAR (bsp_interrupt_stack_end)
 
 .section ".bsp_start_text", "ax"
 _start:
@@ -119,8 +117,8 @@ start_code_in_ram:
 	 */
 
 	/* Set stack pointer (common for RAM/ROM startup) */
-	LA	r1, bsp_section_text_begin
-        addi    r1, r1, -0x10 /* Set up stack pointer = beginning of text section - 0x10 */
+	LA	r1, _Configuration_Interrupt_stack_area_end
+        addi    r1, r1, -0x10
 
 	/* Create NULL */
 	li r0, 0
@@ -285,10 +283,3 @@ mpc8xx_zero_4_tail:
 	blr
 
 end_reloc_startup:
-
-	/* Interrupt stack */
-	.section ".bsp_rwextra", "aw", @nobits
-	.align 4
-bsp_interrupt_stack_start:
-	.space 32768
-bsp_interrupt_stack_end:
diff --git a/bsps/powerpc/virtex4/start/bspstart.c b/bsps/powerpc/virtex4/start/bspstart.c
index 40cd710..93890c1 100644
--- a/bsps/powerpc/virtex4/start/bspstart.c
+++ b/bsps/powerpc/virtex4/start/bspstart.c
@@ -85,9 +85,6 @@ LINKER_SYMBOL(RamSize);
 LINKER_SYMBOL(__bsp_ram_start);
 LINKER_SYMBOL(__bsp_ram_end);
 LINKER_SYMBOL(__rtems_end);
-LINKER_SYMBOL(_stack);
-LINKER_SYMBOL(StackSize);
-LINKER_SYMBOL(__stack_base);
 LINKER_SYMBOL(WorkAreaBase);
 LINKER_SYMBOL(MsgAreaBase);
 LINKER_SYMBOL(MsgAreaSize);
@@ -174,7 +171,7 @@ void bsp_start(void)
   /*
    * Initialize the interrupt related settings.
    */
-  intrStackStart = CPU_UP_ALIGN((uint32_t)__bsp_ram_start);
+  intrStackStart = (uintptr_t) _Configuration_Interrupt_stack_area_begin;
   intrStackSize  = rtems_configuration_get_interrupt_stack_size();
 
   ppc_exc_initialize(intrStackStart, intrStackSize);
@@ -184,14 +181,12 @@ void bsp_start(void)
          "RAM:              %p                    %p\n"
          "RTEMS:                           %p\n"
          "Interrupt Stack:  0x%08x              0x%x\n"
-         "Stack:            %p             %p          %p\n"
          "Workspace:        %p             %p\n"
          "MsgArea:          %p             %p\n"
          "Physical RAM                     %p\n",
          RamBase,        RamSize,
          __rtems_end,
          intrStackStart,                intrStackSize,
-         __stack_base,   _stack,        StackSize,
          WorkAreaBase,   __bsp_ram_end,
          MsgAreaBase,    MsgAreaSize,
          __phy_ram_end);
diff --git a/bsps/powerpc/virtex4/start/linkcmds b/bsps/powerpc/virtex4/start/linkcmds
index 472c797..6670516 100644
--- a/bsps/powerpc/virtex4/start/linkcmds
+++ b/bsps/powerpc/virtex4/start/linkcmds
@@ -15,8 +15,6 @@ EXTERN(__vectors)
 MsgAreaSize       = DEFINED(MsgAreaSize)   ? MsgAreaSize   : 1M;
 RamBase           = DEFINED(RamBase)       ? RamBase       : 0x0;
 RamSize           = DEFINED(RamSize)       ? RamSize       : 128M - MsgAreaSize;
-IntrStackSize     = DEFINED(IntrStackSize) ? IntrStackSize : 16K;
-StackSize         = DEFINED(StackSize)     ? StackSize     : 64K;
 HeapSize          = DEFINED(HeapSize)      ? HeapSize      : 0; /* 0=Use def */
 
 
@@ -251,15 +249,6 @@ SECTIONS
   .               = ALIGN(0x10);        /* Align to a cache-line boundary */
   PROVIDE(__bsp_ram_start = .);
 
-  /* Interrupt stack: aligned on a cache-line boundary */
-  .              += IntrStackSize;
-  __intrStack     = .;
-
-  /* Main stack lives here */
-  _stack          = ALIGN(0x10); 	/* Align to a cache-line boundary */
-  .              += StackSize;
-  __stack_base    = .;                  /* Initial stack builds downwards */
-
   .rtemsstack (NOLOAD) : {
     *(SORT(.rtemsstack.*))
   } >RAM
diff --git a/bsps/powerpc/virtex4/start/start.S b/bsps/powerpc/virtex4/start/start.S
index 2194840..d4b8419 100644
--- a/bsps/powerpc/virtex4/start/start.S
+++ b/bsps/powerpc/virtex4/start/start.S
@@ -82,7 +82,7 @@
  *    .bss
  *  see linker command file for section placement
  *
- *  The initial stack is set to __stack_base.
+ *  The initial stack is set to _Configuration_Interrupt_stack_area_end.
  *
  */
 
@@ -109,7 +109,7 @@ bss_length:
 bss_addr:
         .long   __bss_start
 stack_top:
-        .long   __stack_base
+        .long   _Configuration_Interrupt_stack_area_end
 dccr_contents:
         .long   __dccr
 iccr_contents:
diff --git a/bsps/powerpc/virtex5/start/bspstart.c b/bsps/powerpc/virtex5/start/bspstart.c
index 6457143..8297b16 100644
--- a/bsps/powerpc/virtex5/start/bspstart.c
+++ b/bsps/powerpc/virtex5/start/bspstart.c
@@ -86,9 +86,6 @@ LINKER_SYMBOL(RamSize);
 LINKER_SYMBOL(__bsp_ram_start);
 LINKER_SYMBOL(__bsp_ram_end);
 LINKER_SYMBOL(__rtems_end);
-LINKER_SYMBOL(_stack);
-LINKER_SYMBOL(StackSize);
-LINKER_SYMBOL(__stack_base);
 LINKER_SYMBOL(WorkAreaBase);
 LINKER_SYMBOL(MsgAreaBase);
 LINKER_SYMBOL(MsgAreaSize);
@@ -193,7 +190,7 @@ void bsp_start(void)
   /*
    * Initialize the interrupt related settings.
    */
-  intrStackStart = CPU_UP_ALIGN((uint32_t)__bsp_ram_start);
+  intrStackStart = (uintptr_t)_Configuration_Interrupt_stack_area_begin;
   intrStackSize  = rtems_configuration_get_interrupt_stack_size();
 
   ppc_exc_initialize(intrStackStart, intrStackSize);
@@ -203,14 +200,12 @@ void bsp_start(void)
          "RAM:              %p                    %p\n"
          "RTEMS:                           %p\n"
          "Interrupt Stack:  0x%08x              0x%x\n"
-         "Stack:            %p             %p          %p\n"
          "Workspace:        %p             %p\n"
          "MsgArea:          %p             %p\n"
          "Physical RAM                     %p\n",
          RamBase,        RamSize,
          __rtems_end,
          intrStackStart,                intrStackSize,
-         __stack_base,   _stack,        StackSize,
          WorkAreaBase,   __bsp_ram_end,
          MsgAreaBase,    MsgAreaSize,
          __phy_ram_end);
diff --git a/bsps/powerpc/virtex5/start/linkcmds b/bsps/powerpc/virtex5/start/linkcmds
index 4fd5243..0cb4b4e 100644
--- a/bsps/powerpc/virtex5/start/linkcmds
+++ b/bsps/powerpc/virtex5/start/linkcmds
@@ -15,8 +15,6 @@ EXTERN(__vectors)
 MsgAreaSize       = DEFINED(MsgAreaSize)   ? MsgAreaSize   : 1M;
 RamBase           = DEFINED(RamBase)       ? RamBase       : 0x0;
 RamSize           = DEFINED(RamSize)       ? RamSize       : 2048M - MsgAreaSize;
-IntrStackSize     = DEFINED(IntrStackSize) ? IntrStackSize : 16K;
-StackSize         = DEFINED(StackSize)     ? StackSize     : 64K;
 HeapSize          = DEFINED(HeapSize)      ? HeapSize      : 0; /* 0=Use def */
 
 
@@ -251,15 +249,6 @@ SECTIONS
   .               = ALIGN(0x20);        /* Align to a cache-line boundary */
   PROVIDE(__bsp_ram_start = .);
 
-  /* Interrupt stack: aligned on a cache-line boundary */
-  .              += IntrStackSize;
-  __intrStack     = .;
-
-  /* Main stack lives here */
-  _stack          = ALIGN(0x20); 	/* Align to a cache-line boundary */
-  .              += StackSize;
-  __stack_base    = .;                  /* Initial stack builds downwards */
-
   .rtemsstack (NOLOAD) : {
     *(SORT(.rtemsstack.*))
   } >RAM
diff --git a/bsps/powerpc/virtex5/start/start.S b/bsps/powerpc/virtex5/start/start.S
index 2b12c18..b63c103 100644
--- a/bsps/powerpc/virtex5/start/start.S
+++ b/bsps/powerpc/virtex5/start/start.S
@@ -86,7 +86,7 @@
  *    .bss
  *  see linker command file for section placement
  *
- *  The initial stack is set to __stack_base
+ *  The initial stack is set to _Configuration_Interrupt_stack_area_end.
  *
  *  All the entry veneer has to do is to clear the BSS.
  */
@@ -114,7 +114,7 @@ bss_length:
 bss_addr:
         .long   __bss_start
 stack_top:
-        .long   __stack_base
+        .long   _Configuration_Interrupt_stack_area_end
 
 
         .eject
diff --git a/bsps/riscv/riscv_generic/start/start.S b/bsps/riscv/riscv_generic/start/start.S
index ccefb81..8e2ac24 100644
--- a/bsps/riscv/riscv_generic/start/start.S
+++ b/bsps/riscv/riscv_generic/start/start.S
@@ -80,7 +80,7 @@ SYM(_start):
   csrw mtvec, t0
 
   /* load stack and frame pointers */
-  la sp, bsp_section_stack_begin
+  la sp, _Configuration_Interrupt_stack_area_end
 
   /* Clearing .bss */
   la t0, bsp_section_bss_begin
diff --git a/bsps/sh/gensh1/include/bsp.h b/bsps/sh/gensh1/include/bsp.h
index b757a01..b70e838 100644
--- a/bsps/sh/gensh1/include/bsp.h
+++ b/bsps/sh/gensh1/include/bsp.h
@@ -49,13 +49,6 @@ extern "C" {
 /* Constants */
 
 /*
- * Defined in the linker script 'linkcmds'
- */
-
-extern void *CPU_Interrupt_stack_low;
-extern void *CPU_Interrupt_stack_high;
-
-/*
  * BSP methods that cross file boundaries.
  */
 void bsp_hw_init(void);
diff --git a/bsps/sh/gensh1/start/cpu_asm.c b/bsps/sh/gensh1/start/cpu_asm.c
index 99d9cc9..57c5c11 100644
--- a/bsps/sh/gensh1/start/cpu_asm.c
+++ b/bsps/sh/gensh1/start/cpu_asm.c
@@ -44,9 +44,7 @@
 /* from cpu_isps.c */
 extern proc_ptr         _Hardware_isr_Table[];
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-  unsigned long    *_old_stack_ptr;
-#endif
+unsigned long *_old_stack_ptr;
 
 register unsigned long  *stack_ptr __asm__ ("r15");
 
@@ -135,7 +133,6 @@ void __ISR_Handler( uint32_t   vector)
 
   _Thread_Dispatch_disable();
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if ( _ISR_Nest_level == 0 )
     {
       /* Install irq stack */
@@ -143,8 +140,6 @@ void __ISR_Handler( uint32_t   vector)
       stack_ptr = _CPU_Interrupt_stack_high;
     }
 
-#endif
-
   _ISR_Nest_level++;
 
   _ISR_Local_enable( level );
@@ -159,12 +154,9 @@ void __ISR_Handler( uint32_t   vector)
 
   _ISR_Nest_level--;
 
-#if(CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-
   if ( _ISR_Nest_level == 0 )
     /* restore old stack pointer */
     stack_ptr = _old_stack_ptr;
-#endif
 
   _ISR_Local_enable( level );
 
diff --git a/bsps/sh/gensh1/start/linkcmds b/bsps/sh/gensh1/start/linkcmds
index bb190f8..1ede3a2 100644
--- a/bsps/sh/gensh1/start/linkcmds
+++ b/bsps/sh/gensh1/start/linkcmds
@@ -192,9 +192,6 @@ SECTIONS
     *(SORT(.rtemsstack.*))
   } > onchip_ram
 
-  _CPU_Interrupt_stack_low  = 0x0f000000 ;
-  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
@@ -228,7 +225,5 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
-
-  stack : { _stack = .; *(.stack) } > onchip_ram
   /* These must appear regardless of  .  */
 }
diff --git a/bsps/sh/gensh1/start/start.S b/bsps/sh/gensh1/start/start.S
index 66b1c4e..6a2941c 100644
--- a/bsps/sh/gensh1/start/start.S
+++ b/bsps/sh/gensh1/start/start.S
@@ -66,7 +66,7 @@ SYM (start):
 
 	.align 2
 stack_k:
-	.long	SYM(stack)
+	.long	SYM(_Configuration_Interrupt_stack_area_end)
 edata_k:
 	.long	SYM(edata)
 end_k:
@@ -80,11 +80,3 @@ vects_k:
 	.long	SYM(vectab)
 vects_size:
 	.word	255
-
-#ifdef __ELF__
-	.section .stack,"aw"
-#else
-	.section .stack
-#endif
-SYM(stack):
-	.long	0xdeaddead
diff --git a/bsps/sh/gensh2/include/bsp.h b/bsps/sh/gensh2/include/bsp.h
index 1a08df9..38e2c49 100644
--- a/bsps/sh/gensh2/include/bsp.h
+++ b/bsps/sh/gensh2/include/bsp.h
@@ -63,12 +63,6 @@ extern "C" {
 /* Constants */
 
 /*
- * Defined in the linker script 'linkcmds'
- */
-extern void *CPU_Interrupt_stack_low;
-extern void *CPU_Interrupt_stack_high;
-
-/*
  * BSP methods that cross file boundaries.
  */
 void bsp_hw_init(void);
diff --git a/bsps/sh/gensh2/start/cpu_asm.c b/bsps/sh/gensh2/start/cpu_asm.c
index 47bc859..7d6e09c 100644
--- a/bsps/sh/gensh2/start/cpu_asm.c
+++ b/bsps/sh/gensh2/start/cpu_asm.c
@@ -42,9 +42,7 @@
 /* from cpu_isps.c */
 extern proc_ptr         _Hardware_isr_Table[];
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-  unsigned long    *_old_stack_ptr;
-#endif
+unsigned long *_old_stack_ptr;
 
 register unsigned long  *stack_ptr __asm__ ("r15");
 
@@ -136,7 +134,6 @@ void __ISR_Handler( uint32_t   vector)
 
   _Thread_Dispatch_disable();
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if ( _ISR_Nest_level == 0 )
     {
       /* Install irq stack */
@@ -144,8 +141,6 @@ void __ISR_Handler( uint32_t   vector)
       stack_ptr = _CPU_Interrupt_stack_high;
     }
 
-#endif
-
   _ISR_Nest_level++;
 
   _ISR_Local_enable( level );
@@ -160,12 +155,9 @@ void __ISR_Handler( uint32_t   vector)
 
   _ISR_Nest_level--;
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-
   if ( _ISR_Nest_level == 0 )
     /* restore old stack pointer */
     stack_ptr = _old_stack_ptr;
-#endif
 
   _ISR_Local_enable( level );
 
diff --git a/bsps/sh/gensh2/start/linkcmds b/bsps/sh/gensh2/start/linkcmds
index e6db97e..d083d33 100644
--- a/bsps/sh/gensh2/start/linkcmds
+++ b/bsps/sh/gensh2/start/linkcmds
@@ -203,9 +203,6 @@ SECTIONS
     *(SORT(.rtemsstack.*))
   } > onchip_ram
 
-  _CPU_Interrupt_stack_low  = 0xFFFFF000;
-  _CPU_Interrupt_stack_high = 0xFFFFFFFF;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
@@ -239,7 +236,5 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
-
-  .stack 0xFFFFFEC0 : { _stack = .; *(.stack) } > onchip_ram
   /* These must appear regardless of  .  */
 }
diff --git a/bsps/sh/gensh2/start/linkcmds.ram b/bsps/sh/gensh2/start/linkcmds.ram
index 8b53cd4..01765f6 100644
--- a/bsps/sh/gensh2/start/linkcmds.ram
+++ b/bsps/sh/gensh2/start/linkcmds.ram
@@ -205,9 +205,6 @@ SECTIONS
     *(SORT(.rtemsstack.*))
   } > onchip_ram
 
-  _CPU_Interrupt_stack_low  = 0xFFFFF000;
-  _CPU_Interrupt_stack_high = 0xFFFFFFFF;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
@@ -241,7 +238,5 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
-
-  .stack 0xFFFFFEC0 : { _stack = .; *(.stack) } > onchip_ram
   /* These must appear regardless of  .  */
 }
diff --git a/bsps/sh/gensh2/start/linkcmds.rom b/bsps/sh/gensh2/start/linkcmds.rom
index 9f50cd7..d6a1bee 100644
--- a/bsps/sh/gensh2/start/linkcmds.rom
+++ b/bsps/sh/gensh2/start/linkcmds.rom
@@ -210,9 +210,6 @@ SECTIONS
     *(SORT(.rtemsstack.*))
   } > onchip_ram
 
-  _CPU_Interrupt_stack_low  = 0xFFFFF000;
-  _CPU_Interrupt_stack_high = 0xFFFFFFFF;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
@@ -246,7 +243,5 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
-
-  .stack 0xFFFFFEC0 : { _stack = .; *(.stack) } > onchip_ram
   /* These must appear regardless of  .  */
 }
diff --git a/bsps/sh/gensh2/start/start.S b/bsps/sh/gensh2/start/start.S
index cba17af..b8b3f50 100644
--- a/bsps/sh/gensh2/start/start.S
+++ b/bsps/sh/gensh2/start/start.S
@@ -155,7 +155,7 @@ SYM (start):
 
 	.align 2
 stack_k:
-	.long	SYM(stack)
+	.long	SYM(_Configuration_Interrupt_stack_area_end)
 edata_k:
 	.long	SYM(edata)
 end_k:
@@ -176,14 +176,6 @@ vects_size:
 	.word	255
 
 #ifdef __ELF__
-	.section .stack,"aw"
-#else
-	.section .stack
-#endif
-SYM(stack):
-	.long	0xdeaddead
-
-#ifdef __ELF__
 	.section .bss,"aw"
 #else
 	.section .bss
diff --git a/bsps/sh/gensh2/start/start.ram b/bsps/sh/gensh2/start/start.ram
index 04e6823..7f6b5fa 100644
--- a/bsps/sh/gensh2/start/start.ram
+++ b/bsps/sh/gensh2/start/start.ram
@@ -158,7 +158,7 @@ SYM (start):
 
 	.align 2
 stack_k:
-	.long	SYM(stack)	
+	.long	SYM(_Configuration_Interrupt_stack_area_end)
 edata_k:
 	.long	SYM(edata)
 end_k:
@@ -179,14 +179,6 @@ vects_size:
 	.word	255
 
 #ifdef __ELF__
-	.section .stack,"aw"
-#else
-	.section .stack
-#endif
-SYM(stack):
-	.long	0xdeaddead
-
-#ifdef __ELF__
 	.section .bss,"aw"
 #else
 	.section .bss
diff --git a/bsps/sh/gensh2/start/start.rom b/bsps/sh/gensh2/start/start.rom
index 87fadd5..79068da 100644
--- a/bsps/sh/gensh2/start/start.rom
+++ b/bsps/sh/gensh2/start/start.rom
@@ -67,7 +67,7 @@ SYM (start):
 
 	.align 2
 stack_k:
-	.long	SYM(stack)	
+	.long	SYM(_Configuration_Interrupt_stack_area_end)
 edata_k:
 	.long	SYM(edata)
 end_k:
@@ -81,11 +81,3 @@ vects_k:
 	.long	SYM(vectab)
 vects_size:
 	.word	255
-
-#ifdef __ELF__
-	.section .stack,"aw"
-#else
-	.section .stack
-#endif
-SYM(stack):
-	.long	0xdeaddead
diff --git a/bsps/sh/gensh4/include/bsp.h b/bsps/sh/gensh4/include/bsp.h
index b70c2ff..f29957c 100644
--- a/bsps/sh/gensh4/include/bsp.h
+++ b/bsps/sh/gensh4/include/bsp.h
@@ -53,13 +53,6 @@ extern "C" {
 /* Constants */
 
 /*
- * Defined in the linker script 'linkcmds'
- */
-
-extern void *CPU_Interrupt_stack_low;
-extern void *CPU_Interrupt_stack_high;
-
-/*
  * Defined in start.S
  */
 extern uint32_t   boot_mode;
diff --git a/bsps/sh/gensh4/start/cpu_asm.c b/bsps/sh/gensh4/start/cpu_asm.c
index 52a033b..7618db3 100644
--- a/bsps/sh/gensh4/start/cpu_asm.c
+++ b/bsps/sh/gensh4/start/cpu_asm.c
@@ -42,9 +42,7 @@
 /* from cpu_isps.c */
 extern proc_ptr         _Hardware_isr_Table[];
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-  unsigned long    *_old_stack_ptr;
-#endif
+unsigned long *_old_stack_ptr;
 
 register unsigned long  *stack_ptr __asm__ ("r15");
 
@@ -60,7 +58,6 @@ void __ISR_Handler( uint32_t   vector)
 
    _Thread_Dispatch_disable();
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if ( _ISR_Nest_level == 0 )
     {
       /* Install irq stack */
@@ -68,8 +65,6 @@ void __ISR_Handler( uint32_t   vector)
       stack_ptr = _CPU_Interrupt_stack_high;
     }
 
-#endif
-
   _ISR_Nest_level++;
 
   _ISR_Local_enable( level );
@@ -84,11 +79,9 @@ void __ISR_Handler( uint32_t   vector)
 
   _ISR_Nest_level--;
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if ( _ISR_Nest_level == 0 )
     /* restore old stack pointer */
     stack_ptr = _old_stack_ptr;
-#endif
 
   _ISR_Local_enable( level );
 
diff --git a/bsps/sh/gensh4/start/linkcmds b/bsps/sh/gensh4/start/linkcmds
index 21e0fdc..df1c157 100644
--- a/bsps/sh/gensh4/start/linkcmds
+++ b/bsps/sh/gensh4/start/linkcmds
@@ -144,20 +144,12 @@ SECTIONS
    __bss_end = .;
   } > ram
 
-  .stack : {
-    . = . + 4096;
-  } > ram
-
   .rtemsstack (NOLOAD) : {
     *(SORT(.rtemsstack.*))
   } > ram
 
   _WorkAreaBase = . ;
 
-  . = ALIGN(16);
-  _CPU_Interrupt_stack_low  = . ;
-  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
diff --git a/bsps/sh/gensh4/start/linkcmds.rom b/bsps/sh/gensh4/start/linkcmds.rom
index 5e37f06..49b5b08 100644
--- a/bsps/sh/gensh4/start/linkcmds.rom
+++ b/bsps/sh/gensh4/start/linkcmds.rom
@@ -193,17 +193,6 @@ SECTIONS
 
   _WorkAreaBase = . ;
 
-  . = ALIGN(16);
-  .stack . : {
-     stack_start = .;
-     . = . + 4096;
-     stack_end = .;
-  }
-
-  . = ALIGN(16);
-  _CPU_Interrupt_stack_low  = . ;
-  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
@@ -237,6 +226,5 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
-  .stack : { _stack = .; *(.stack) }
   /* These must appear regardless of  .  */
 }
diff --git a/bsps/sh/gensh4/start/linkcmds.rom2ram b/bsps/sh/gensh4/start/linkcmds.rom2ram
index 2fff0d1..99a4a89 100644
--- a/bsps/sh/gensh4/start/linkcmds.rom2ram
+++ b/bsps/sh/gensh4/start/linkcmds.rom2ram
@@ -197,17 +197,6 @@ SECTIONS
 
   _WorkAreaBase = . ;
 
-  . = ALIGN(16);
-  .stack . : {
-     stack_start = .;
-     . = . + 4096;
-     stack_end = .;
-  }
-
-  . = ALIGN(16);
-  _CPU_Interrupt_stack_low  = . ;
-  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
@@ -241,6 +230,5 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
-  .stack : { _stack = .; *(.stack) }
   /* These must appear regardless of  .  */
 }
diff --git a/bsps/sh/gensh4/start/start.S b/bsps/sh/gensh4/start/start.S
index a695daa..711583e 100644
--- a/bsps/sh/gensh4/start/start.S
+++ b/bsps/sh/gensh4/start/start.S
@@ -215,7 +215,7 @@ _vbr_base_k:
 __VBR_Saved_k:
         .long   SYM(_VBR_Saved)
 stack_k:
-        .long	SYM(stack)
+        .long	SYM(_Configuration_Interrupt_stack_area_end)
 __bss_start_k:
         .long   __bss_start
 __bss_end_k:
@@ -255,14 +255,6 @@ boot_mode_k:
         .long   _boot_mode
 
 #ifdef __ELF__
-        .section .stack,"aw"
-#else
-        .section .stack
-#endif
-SYM(stack):
-        .long	0xdeaddead
-
-#ifdef __ELF__
         .section .bss,"aw"
 #else
         .section .bss
diff --git a/bsps/sh/shared/start/bspstart.c b/bsps/sh/shared/start/bspstart.c
index 57b2c9e..a2b0110 100644
--- a/bsps/sh/shared/start/bspstart.c
+++ b/bsps/sh/shared/start/bspstart.c
@@ -49,14 +49,6 @@ void bsp_start( void )
   #endif
 
   /*
-   *  initialize the interrupt stack for this BSP
-   */
-  #if ( CPU_ALLOCATE_INTERRUPT_STACK == FALSE )
-    _CPU_Interrupt_stack_low = &CPU_Interrupt_stack_low;
-    _CPU_Interrupt_stack_high = &CPU_Interrupt_stack_high;
-  #endif
-
-  /*
    *  initialize the device driver parameters
    */
   bsp_clicks_per_second = CPU_CLOCK_RATE_HZ;
diff --git a/bsps/sh/shsim/include/bsp.h b/bsps/sh/shsim/include/bsp.h
index 7b8236b..ff63b38 100644
--- a/bsps/sh/shsim/include/bsp.h
+++ b/bsps/sh/shsim/include/bsp.h
@@ -46,12 +46,6 @@ void *clock_driver_sim_idle_body(uintptr_t);
 #define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
 
 /*
- * Defined in the linker script 'linkcmds'
- */
-extern void *CPU_Interrupt_stack_low;
-extern void *CPU_Interrupt_stack_high;
-
-/*
  * BSP methods that cross file boundaries.
  */
 int _sys_exit (int n);
diff --git a/bsps/sh/shsim/start/cpu_asm.c b/bsps/sh/shsim/start/cpu_asm.c
index 2ca8926..1b8135e 100644
--- a/bsps/sh/shsim/start/cpu_asm.c
+++ b/bsps/sh/shsim/start/cpu_asm.c
@@ -18,9 +18,7 @@
 #include <rtems/score/threaddispatch.h>
 #include <rtems/score/sh.h>
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-  unsigned long    *_old_stack_ptr;
-#endif
+unsigned long  *_old_stack_ptr;
 
 register unsigned long  *stack_ptr __asm__ ("r15");
 
@@ -37,7 +35,6 @@ void __ISR_Handler( uint32_t   vector)
 
   _Thread_Dispatch_disable();
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if ( _ISR_Nest_level == 0 )
     {
       /* Install irq stack */
@@ -45,8 +42,6 @@ void __ISR_Handler( uint32_t   vector)
       stack_ptr = _CPU_Interrupt_stack_high;
     }
 
-#endif
-
   _ISR_Nest_level++;
 
   _ISR_Local_enable( level );
@@ -61,12 +56,9 @@ void __ISR_Handler( uint32_t   vector)
 
   _ISR_Nest_level--;
 
-#if (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-
   if ( _ISR_Nest_level == 0 )
     /* restore old stack pointer */
     stack_ptr = _old_stack_ptr;
-#endif
 
   _ISR_Local_enable( level );
 
diff --git a/bsps/sh/shsim/start/linkcmds b/bsps/sh/shsim/start/linkcmds
index 932d941..c0381c0 100644
--- a/bsps/sh/shsim/start/linkcmds
+++ b/bsps/sh/shsim/start/linkcmds
@@ -202,22 +202,12 @@ SECTIONS
   _end = . ;
   PROVIDE (end = .);
 
-  .stack : { 
-    . += 0x1000;
-    *(.stack)
-    _stack = .;
-  } > ram
-  _stack = .;
-
   .rtemsstack (NOLOAD) : {
     *(SORT(.rtemsstack.*))
   } > ram
 
   _WorkAreaBase = . ;
 
-  _CPU_Interrupt_stack_low  = 0x00080000 ;
-  _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ;
-
   /* Stabs debugging sections.  */
   .stab 0 : { *(.stab) }
   .stabstr 0 : { *(.stabstr) }
@@ -251,9 +241,5 @@ SECTIONS
   .debug_funcnames 0 : { *(.debug_funcnames) }
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
-
-/*
-  .stack 0x00081ff0 : { _stack = .; *(.stack) } > onchip_ram
-*/
   /* These must appear regardless of  .  */
 }
diff --git a/bsps/sh/shsim/start/start.S b/bsps/sh/shsim/start/start.S
index cc4727b..e116704 100644
--- a/bsps/sh/shsim/start/start.S
+++ b/bsps/sh/shsim/start/start.S
@@ -68,7 +68,7 @@ SYM (start):
 
 	.align 2
 stack_k:
-	.long	SYM(stack)
+	.long	SYM(_Configuration_Interrupt_stack_area_end)
 edata_k:
 	.long	SYM(edata)
 end_k:
@@ -82,13 +82,3 @@ vects_k:
 	.long	SYM(vectab)
 vects_size:
 	.word	255
-
-#ifdef __ELF__
-	.section .stack,"aw"
-#else
-	.section .stack
-#endif
-SYM(stack):
-	.long	0xdeaddead
-monvects_k:
-	.long	SYM(monvects)
diff --git a/bsps/sparc/shared/start/bspgetworkarea.c b/bsps/sparc/shared/start/bspgetworkarea.c
index b05113d..512d223 100644
--- a/bsps/sparc/shared/start/bspgetworkarea.c
+++ b/bsps/sparc/shared/start/bspgetworkarea.c
@@ -27,13 +27,9 @@ extern uint32_t rdb_start;
  */
 void bsp_work_area_initialize(void)
 {
-  /* must be identical to STACK_SIZE in start.S */
-  #define STACK_SIZE (16 * 1024)
-
   /* Early dynamic memory allocator is placed just above _end  */
   void *work_area_start = (void *)&end;
-  uintptr_t work_area_size  =
-    (uintptr_t)rdb_start - (uintptr_t)&end - STACK_SIZE;
+  uintptr_t work_area_size = (uintptr_t)rdb_start - (uintptr_t)work_area_start;
 
   /*
    *  The following may be helpful in debugging what goes wrong when
diff --git a/bsps/sparc/shared/start/start.S b/bsps/sparc/shared/start/start.S
index 64498c6..5bd2937 100644
--- a/bsps/sparc/shared/start/start.S
+++ b/bsps/sparc/shared/start/start.S
@@ -265,7 +265,6 @@ SYM(CLOCK_SPEED):
 
 #define PSR_INIT   0x10c0       /* Disable traps, set s and ps */
 #define WIM_INIT   2
-#define STACK_SIZE 16 * 1024
 
         PUBLIC(hard_reset)
 SYM(hard_reset):
@@ -317,9 +316,16 @@ SYM(hard_reset):
 	st	%o0, [%o1]
 #endif
 
-	set	(SYM(rdb_start)), %g5	! End of RAM
+	set	SYM(rdb_start), %g5	! End of RAM
 	st	%sp, [%g5]
-	sub	%sp, 4, %sp		! stack starts at end of RAM - 4
+	set	SYM(_Configuration_Interrupt_stack_size), %g5
+#if defined(START_LEON3_ENABLE_SMP)
+	add	%o0, 1, %o0
+	smul	%o0, %g5, %g5
+#endif
+	set	SYM(_Configuration_Interrupt_stack_area_begin), %sp
+	add	%sp, %g5, %sp
+	sub	%sp, 4, %sp		! stack starts at end of area - 4
 	andn	%sp, 0x0f, %sp		! align stack on 16-byte boundary
         mov     %sp, %fp                ! Set frame pointer
         nop
diff --git a/bsps/v850/gdbv850sim/start/linkcmds b/bsps/v850/gdbv850sim/start/linkcmds
index 86613dd..c128a08 100644
--- a/bsps/v850/gdbv850sim/start/linkcmds
+++ b/bsps/v850/gdbv850sim/start/linkcmds
@@ -4,7 +4,6 @@
 _RamBase = DEFINED(_RamBase) ? _RamBase : 0x100000; /* RAM starts at 1MB */
 _RamSize = DEFINED(_RamSize) ? _RamSize : 0x100000; /* default is 1MB */
 _HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0;
-_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
 
 /* Default linker script, for normal executables */
 OUTPUT_FORMAT("elf32-v850-rh850", "elf32-v850-rh850",
@@ -192,8 +191,6 @@ SECTIONS
 	*(.bss)
 	*(COMMON)
   }
-  . += _StackSize;
-  _stack = .;
   .rtemsstack (NOLOAD) : {
     *(SORT(.rtemsstack.*))
   }
@@ -233,13 +230,5 @@ SECTIONS
   .debug_funcnames 0	: { *(.debug_funcnames) }
   .debug_typenames 0	: { *(.debug_typenames) }
   .debug_varnames  0	: { *(.debug_varnames) }
-  /* libgloss - User stack.  */
-/*
-  .stack 0x200000	:
-  {
-	__stack = .;
-	*(.stack)
-  }
-*/
 }
 
diff --git a/bsps/v850/gdbv850sim/start/start.S b/bsps/v850/gdbv850sim/start/start.S
index 419e635..82ae4eb 100644
--- a/bsps/v850/gdbv850sim/start/start.S
+++ b/bsps/v850/gdbv850sim/start/start.S
@@ -9,7 +9,7 @@ _start:
 
 	movea   255,		r0,	r20
 	mov     65535,		r21
-	mov     hilo(_stack),	sp
+	mov     hilo(__Configuration_Interrupt_stack_area_end),	sp
 	mov     hilo(__ep),	ep
 	mov     hilo(__gp),	gp
 	mov     hilo(__ctbp),	r6
@@ -36,8 +36,8 @@ _start:
 	movea   255,		r0,	r20
 	mov     r0,		r21
 	ori     65535,		r0,	r21
-	movhi   hi(_stack),	r0,	sp
-	movea   lo(_stack),	sp,	sp
+	movhi   hi(__Configuration_Interrupt_stack_area_end),	r0,	sp
+	movea   lo(__Configuration_Interrupt_stack_area_end),	sp,	sp
 	movhi   hi(__ep),	r0,	ep
 	movea   lo(__ep),	ep,	ep
 	movhi   hi(__gp),	r0,	gp
@@ -66,11 +66,6 @@ _start:
 	/* jarl    _exit,		r31 */
 # endif
 
-#if 0
-	.section .stack
-_stack:	.long 	1
-#endif
-
 	.section .data
 	.global ___dso_handle
 	.weak   ___dso_handle
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
index 3c5bea2..5f34001 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
@@ -19,7 +19,6 @@ project_lib_DATA = start.$(OBJEXT)
 project_lib_DATA += linkcmds
 dist_project_lib_DATA += ../../../../../../bsps/arm/altera-cyclone-v/start/linkcmds.altcycv
 dist_project_lib_DATA += ../../../../../../bsps/arm/altera-cyclone-v/start/linkcmds.altcycv_devkit
-dist_project_lib_DATA += ../../../../../../bsps/arm/altera-cyclone-v/start/linkcmds.altcycv_devkit_smp
 
 project_lib_LIBRARIES = librtemsbsp.a
 
diff --git a/c/src/lib/libbsp/arm/raspberrypi/configure.ac b/c/src/lib/libbsp/arm/raspberrypi/configure.ac
index c88ce82..0f3a399 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/configure.ac
+++ b/c/src/lib/libbsp/arm/raspberrypi/configure.ac
@@ -10,6 +10,7 @@ AC_INIT([rtems-c-src-lib-libbsp-arm-raspberrypi],[_RTEMS_VERSION],[https://devel
 RTEMS_TOP(../../../../../..)
 RTEMS_SOURCE_TOP
 RTEMS_BUILD_TOP
+RTEMS_BSP_LINKCMDS
 
 RTEMS_CANONICAL_TARGET_CPU
 AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2])
@@ -36,21 +37,7 @@ RTEMS_BSPOPTS_SET([BSP_IS_RPI2],[*],[0])
 RTEMS_BSPOPTS_HELP([BSP_IS_RPI2],[Set if the BSP variant is Raspberry Pi 2.])
 AM_CONDITIONAL(RTEMS_RPI2,[test "$BSP_IS_RPI2" = "1"])
 
-# Hom many CPUs are used?
-RASPBERRYPI_CPUS="1"
-AS_IF([test "$rtems_cv_HAS_SMP" = "yes"],
-      [RASPBERRYPI_CPUS="4"])
-
-AC_DEFUN([RASPBERRYPI_LINKCMD],[
-AC_ARG_VAR([$1],[$2; default $3])dnl
-[$1]=[$]{[$1]:-[$3]}
-])
-
-RASPBERRYPI_LINKCMD([RASPBERRYPI_CPUS],[Number of active cores],[${RASPBERRYPI_CPUS}])
-
 RTEMS_BSP_CLEANUP_OPTIONS
 
-AC_CONFIG_FILES([
-Makefile
-linkcmds:../../../../../../bsps/arm/raspberrypi/start/linkcmds.in])
+AC_CONFIG_FILES([Makefile])
 AC_OUTPUT
diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am
index e41e065..01e1f3e 100644
--- a/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am
+++ b/c/src/lib/libbsp/arm/realview-pbx-a9/Makefile.am
@@ -26,7 +26,6 @@ project_lib_DATA = start.$(OBJEXT)
 
 project_lib_DATA += linkcmds
 dist_project_lib_DATA += ../../../../../../bsps/arm/realview-pbx-a9/start/linkcmds.realview_pbx_a9_qemu
-dist_project_lib_DATA += ../../../../../../bsps/arm/realview-pbx-a9/start/linkcmds.realview_pbx_a9_qemu_smp
 
 ###############################################################################
 #                  LibBSP                                                     #
diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac b/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac
index e282b35..f58b737 100644
--- a/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac
+++ b/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac
@@ -58,10 +58,6 @@ RTEMS_BSPOPTS_HELP([BSP_CONSOLE_MINOR],[minor number of console device])
 RTEMS_BSPOPTS_SET([ZYNQ_CONSOLE_USE_INTERRUPTS],[*],[1])
 RTEMS_BSPOPTS_HELP([ZYNQ_CONSOLE_USE_INTERRUPTS],[use interrupt driven mode for console devices (used by default)])
 
-ZYNQ_CPUS="1"
-AS_IF([test "$rtems_cv_HAS_SMP" = "yes"],
-      [ZYNQ_CPUS="2"])
-
 #
 # Zynq Memory map can be controlled from the configure command line. Use ...
 #
@@ -126,7 +122,6 @@ AC_ARG_VAR([$1],[$2; default $3])dnl
 [$1]=[$]{[$1]:-[$3]}
 ])
 
-ZYNQ_LINKCMD([ZYNQ_CPUS],[Number of active cores],[${ZYNQ_CPUS}])
 ZYNQ_LINKCMD([ZYNQ_RAM_ORIGIN],[normal RAM region origin],[${ZYNQ_RAM_ORIGIN}])
 ZYNQ_LINKCMD([ZYNQ_RAM_LENGTH],[normal RAM region length],[${BSP_ZYNQ_RAM_LENGTH}])
 ZYNQ_LINKCMD([ZYNQ_RAM_MMU],[MMU region origin],[${ZYNQ_RAM_MMU}])
diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h
index 7f3ffdf..e56826a 100644
--- a/cpukit/include/rtems/confdefs.h
+++ b/cpukit/include/rtems/confdefs.h
@@ -1182,12 +1182,13 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
   #error "CONFIGURE_IDLE_TASK_STACK_SIZE less than CONFIGURE_MINIMUM_TASK_STACK_SIZE"
 #endif
 
-/**
- * @brief Interrupt stack size configuration.
+/*
+ * Interrupt stack configuration.
  *
  * By default, the interrupt stack will be of minimum size.
  * The BSP or application may override this value.
  */
+
 #ifndef CONFIGURE_INTERRUPT_STACK_SIZE
   #ifdef BSP_INTERRUPT_STACK_SIZE
     #define CONFIGURE_INTERRUPT_STACK_SIZE BSP_INTERRUPT_STACK_SIZE
@@ -1196,18 +1197,23 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
   #endif
 #endif
 
-/**
- * This reserves memory for the interrupt stack if it is to be allocated
- * by RTEMS rather than the BSP.
- *
- * @todo Try to get to the point where all BSPs support allocating the
- *       memory from the Workspace.
- */
-#if (CPU_ALLOCATE_INTERRUPT_STACK == 0)
-  #define _CONFIGURE_INTERRUPT_STACK_MEMORY 0
-#else
-  #define _CONFIGURE_INTERRUPT_STACK_MEMORY \
-     _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE )
+#if CONFIGURE_INTERRUPT_STACK_SIZE % CPU_INTERRUPT_STACK_ALIGNMENT != 0
+  #error "CONFIGURE_INTERRUPT_STACK_SIZE fails to meet the CPU port interrupt stack alignment"
+#endif
+
+#ifdef CONFIGURE_INIT
+  RTEMS_DEFINE_GLOBAL_SYMBOL(
+    _Configuration_Interrupt_stack_size,
+    CONFIGURE_INTERRUPT_STACK_SIZE
+  );
+
+  char _Configuration_Interrupt_stack_area_begin[
+    CONFIGURE_MAXIMUM_PROCESSORS * CONFIGURE_INTERRUPT_STACK_SIZE
+  ] RTEMS_ALIGNED( CPU_INTERRUPT_STACK_ALIGNMENT )
+  RTEMS_SECTION( ".rtemsstack.interrupt.begin" );
+
+  const char _Configuration_Interrupt_stack_area_end[ 0 ]
+    RTEMS_SECTION( ".rtemsstack.interrupt.end" ) = { };
 #endif
 
 /**
@@ -2720,9 +2726,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
  * This macro accounts for general RTEMS system overhead.
  */
 #define _CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \
-  ( _CONFIGURE_MEMORY_FOR_INTERNAL_TASKS + \
-    _CONFIGURE_INTERRUPT_STACK_MEMORY \
-  )
+  _CONFIGURE_MEMORY_FOR_INTERNAL_TASKS
 
 /**
  * This macro reserves the memory required by the statically configured
@@ -2752,18 +2756,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
    _CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) \
   )
 
-/*
- * This macro provides a summation of the memory required by SMP as configured.
- */
-#if defined(RTEMS_SMP)
-  #define _CONFIGURE_MEMORY_FOR_SMP \
-     (CONFIGURE_MAXIMUM_PROCESSORS * \
-      _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE ) \
-     )
-#else
-  #define _CONFIGURE_MEMORY_FOR_SMP 0
-#endif
-
 /**
  * This calculates the memory required for the executive workspace.
  *
@@ -2783,7 +2775,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
    _CONFIGURE_MEMORY_FOR_POSIX + \
    _CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS + \
    _CONFIGURE_MEMORY_FOR_MP + \
-   _CONFIGURE_MEMORY_FOR_SMP + \
    CONFIGURE_MESSAGE_BUFFER_MEMORY + \
    (CONFIGURE_MEMORY_OVERHEAD * 1024) + \
    _CONFIGURE_HEAP_HANDLER_OVERHEAD \
@@ -3082,7 +3073,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
     CONFIGURE_TICKS_PER_TIMESLICE,            /* ticks per timeslice quantum */
     CONFIGURE_IDLE_TASK_BODY,                 /* user's IDLE task */
     CONFIGURE_IDLE_TASK_STACK_SIZE,           /* IDLE task stack size */
-    CONFIGURE_INTERRUPT_STACK_SIZE,           /* interrupt stack size */
     CONFIGURE_TASK_STACK_ALLOCATOR_INIT,      /* stack allocator init */
     CONFIGURE_TASK_STACK_ALLOCATOR,           /* stack allocator */
     CONFIGURE_TASK_STACK_DEALLOCATOR,         /* stack deallocator */
@@ -3239,7 +3229,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
     uint32_t POSIX;
 
     /* System overhead pieces */
-    uint32_t INTERRUPT_STACK_MEMORY;
     uint32_t MEMORY_FOR_IDLE_TASK;
 
     /* Classic API Pieces */
@@ -3288,7 +3277,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
     _CONFIGURE_MEMORY_FOR_POSIX,
 
     /* System overhead pieces */
-    _CONFIGURE_INTERRUPT_STACK_MEMORY,
     _CONFIGURE_MEMORY_FOR_INTERNAL_TASKS,
 
     /* Classic API Pieces */
diff --git a/cpukit/include/rtems/config.h b/cpukit/include/rtems/config.h
index 6b97376..248ace0 100644
--- a/cpukit/include/rtems/config.h
+++ b/cpukit/include/rtems/config.h
@@ -184,13 +184,6 @@ typedef struct {
    */
   uint32_t                       idle_task_stack_size;
 
-  /** 
-   * This field specifies the size of the interrupt stack.  If less than or
-   * equal to the minimum stack size, then the interrupt stack will be of
-   * minimum stack size.
-   */
-  uint32_t                       interrupt_stack_size;
-
   /**
    * @brief Optional task stack allocator initialization hook.
    */
@@ -313,8 +306,34 @@ extern const rtems_configuration_table Configuration;
 #define rtems_configuration_get_idle_task_stack_size() \
         (Configuration.idle_task_stack_size)
 
+/**
+ * @brief Global symbol with a value equal to the configure interrupt stack size.
+ *
+ * This global symbol is defined by the application configuration option
+ * CONFIGURE_INIT_TASK_STACK_SIZE via <rtems/confdefs.h>.
+ */
+RTEMS_DECLARE_GLOBAL_SYMBOL( _Configuration_Interrupt_stack_size );
+
+/**
+ * @brief The interrupt stack area begin.
+ *
+ * The interrupt stack area is defined by the application configuration via
+ * <rtems/confdefs.h>.  The size of the area depends on
+ * CONFIGURE_INIT_TASK_STACK_SIZE and CONFIGURE_MAXIMUM_PROCESSORS.
+ */
+extern char _Configuration_Interrupt_stack_area_begin[];
+
+/**
+ * @brief The interrupt stack area end.
+ *
+ * The interrupt stack area is defined by the application configuration via
+ * <rtems/confdefs.h>.  The size of the area depends on
+ * CONFIGURE_INIT_TASK_STACK_SIZE and CONFIGURE_MAXIMUM_PROCESSORS.
+ */
+extern const char _Configuration_Interrupt_stack_area_end[];
+
 #define rtems_configuration_get_interrupt_stack_size() \
-        (Configuration.interrupt_stack_size)
+        ((size_t) _Configuration_Interrupt_stack_size)
 
 #define rtems_configuration_get_stack_allocate_init_hook() \
         (Configuration.stack_allocate_init_hook)
diff --git a/cpukit/include/rtems/score/percpu.h b/cpukit/include/rtems/score/percpu.h
index 7d0a6c0..4a8353d 100644
--- a/cpukit/include/rtems/score/percpu.h
+++ b/cpukit/include/rtems/score/percpu.h
@@ -293,20 +293,15 @@ typedef struct Per_CPU_Control {
     CPU_Per_CPU_control cpu_per_cpu;
   #endif
 
-  #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) || \
-      (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-    /**
-     * This contains a pointer to the lower range of the interrupt stack for
-     * this CPU.  This is the address allocated and freed.
-     */
-    void  *interrupt_stack_low;
+  /**
+   * @brief The interrupt stack low address for this processor.
+   */
+  void *interrupt_stack_low;
 
-    /**
-     * This contains a pointer to the interrupt stack pointer for this CPU.
-     * It will be loaded at the beginning on an ISR.
-     */
-    void  *interrupt_stack_high;
-  #endif
+  /**
+   * @brief The interrupt stack high address for this processor.
+   */
+  void *interrupt_stack_high;
 
   /**
    *  This contains the current interrupt nesting level on this
@@ -800,33 +795,21 @@ RTEMS_INLINE_ROUTINE struct _Thread_Control *_Thread_Get_executing( void )
 
 #if defined( ASM ) || defined( _RTEMS_PERCPU_DEFINE_OFFSETS )
 
-#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) || \
-    (CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-  /*
-   *  If this CPU target lets RTEMS allocates the interrupt stack, then
-   *  we need to have places in the per CPU table to hold them.
-   */
-  #define PER_CPU_INTERRUPT_STACK_LOW \
-    CPU_PER_CPU_CONTROL_SIZE
-  #define PER_CPU_INTERRUPT_STACK_HIGH \
-    PER_CPU_INTERRUPT_STACK_LOW + CPU_SIZEOF_POINTER
-  #define PER_CPU_END_STACK             \
-    PER_CPU_INTERRUPT_STACK_HIGH + CPU_SIZEOF_POINTER
-
-  #define INTERRUPT_STACK_LOW \
-    (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_LOW)
-  #define INTERRUPT_STACK_HIGH \
-    (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_HIGH)
-#else
-  #define PER_CPU_END_STACK \
-    CPU_PER_CPU_CONTROL_SIZE
-#endif
+#define PER_CPU_INTERRUPT_STACK_LOW \
+  CPU_PER_CPU_CONTROL_SIZE
+#define PER_CPU_INTERRUPT_STACK_HIGH \
+  PER_CPU_INTERRUPT_STACK_LOW + CPU_SIZEOF_POINTER
+
+#define INTERRUPT_STACK_LOW \
+  (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_LOW)
+#define INTERRUPT_STACK_HIGH \
+  (SYM(_Per_CPU_Information) + PER_CPU_INTERRUPT_STACK_HIGH)
 
 /*
  *  These are the offsets of the required elements in the per CPU table.
  */
 #define PER_CPU_ISR_NEST_LEVEL \
-  PER_CPU_END_STACK
+  PER_CPU_INTERRUPT_STACK_HIGH + CPU_SIZEOF_POINTER
 #define PER_CPU_ISR_DISPATCH_DISABLE \
   PER_CPU_ISR_NEST_LEVEL + 4
 #define PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL \
diff --git a/cpukit/libmisc/stackchk/check.c b/cpukit/libmisc/stackchk/check.c
index abbd0e0..bc4a7fc 100644
--- a/cpukit/libmisc/stackchk/check.c
+++ b/cpukit/libmisc/stackchk/check.c
@@ -181,7 +181,6 @@ bool rtems_stack_checker_create_extension(
 
 void rtems_stack_checker_begin_extension( Thread_Control *executing )
 {
-#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
   Per_CPU_Control *cpu_self;
   uint32_t         cpu_self_index;
   Stack_Control   *stack;
@@ -214,7 +213,6 @@ void rtems_stack_checker_begin_extension( Thread_Control *executing )
 #if defined(RTEMS_SMP)
   _Thread_Dispatch_enable( cpu_self );
 #endif
-#endif
 }
 
 /*
diff --git a/cpukit/score/cpu/arm/include/rtems/score/cpu.h b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
index 3f06c03..4260e98 100644
--- a/cpukit/score/cpu/arm/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
@@ -105,12 +105,6 @@
  */
 #define CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
 
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
-
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-#define CPU_ALLOCATE_INTERRUPT_STACK FALSE
-
 #define CPU_ISR_PASSES_FRAME_POINTER FALSE
 
 #define CPU_HARDWARE_FP FALSE
diff --git a/cpukit/score/cpu/bfin/cpu.c b/cpukit/score/cpu/bfin/cpu.c
index 98c83c9..f5fb0c4 100644
--- a/cpukit/score/cpu/bfin/cpu.c
+++ b/cpukit/score/cpu/bfin/cpu.c
@@ -198,17 +198,3 @@ void _CPU_Context_Initialize(
     the_context->register_rets = (uint32_t) entry_point;
     the_context->imask = new_level ? 0 : 0xffff;
 }
-
-
-
-/*
- *  _CPU_Install_interrupt_stack
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
-void _CPU_Install_interrupt_stack( void )
-{
-}
diff --git a/cpukit/score/cpu/bfin/include/rtems/score/cpu.h b/cpukit/score/cpu/bfin/include/rtems/score/cpu.h
index d3e4e4b..c19a077 100644
--- a/cpukit/score/cpu/bfin/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/bfin/include/rtems/score/cpu.h
@@ -30,35 +30,6 @@ extern "C" {
 
 /* conditional compilation parameters */
 
-/**
- * Does RTEMS manage a dedicated interrupt stack in software?
- *
- * If TRUE, then a stack is allocated in @ref _ISR_Handler_initialization.
- * If FALSE, nothing is done.
- *
- * If the CPU supports a dedicated interrupt stack in hardware,
- * then it is generally the responsibility of the BSP to allocate it
- * and set it up.
- *
- * If the CPU does not support a dedicated interrupt stack, then
- * the porter has two options: (1) execute interrupts on the
- * stack of the interrupted task, and (2) have RTEMS manage a dedicated
- * interrupt stack.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
 /*
  *  Does the CPU follow the simple vectored interrupt model?
  *
@@ -73,40 +44,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /**
- * Does this CPU have hardware support for a dedicated interrupt stack?
- *
- * If TRUE, then it must be installed during initialization.
- * If FALSE, then no installation is performed.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/**
- * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- * If TRUE, then the memory is allocated during initialization.
- * If FALSE, then the memory is allocated during initialization.
- *
- * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/**
  * Does the RTEMS invoke the user's ISR with the vector number and
  * a pointer to the saved interrupt frame (1) or just the vector
  * number (0)?
@@ -402,21 +339,6 @@ typedef struct {
 
 /**
  * @defgroup CPUInterrupt Processor Dependent Interrupt Management
- *
- * On some CPUs, RTEMS supports a software managed interrupt stack.
- * This stack is allocated by the Interrupt Manager and the switch
- * is performed in @ref _ISR_Handler.  These variables contain pointers
- * to the lowest and highest addresses in the chunk of memory allocated
- * for the interrupt stack.  Since it is unknown whether the stack
- * grows up or down (in general), this give the CPU dependent
- * code the option of picking the version it wants to use.
- *
- * @note These two variables are required if the macro
- *       @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
  */
 /**@{**/
 
@@ -816,19 +738,6 @@ void _CPU_ISR_install_vector(
 );
 
 /**
- * @ingroup CPUInterrupt
- * This routine installs the hardware interrupt stack pointer.
- *
- * @note  It need only be provided if @ref CPU_HAS_HARDWARE_INTERRUPT_STACK
- *        is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-void _CPU_Install_interrupt_stack( void );
-
-/**
  * This routine is the CPU dependent IDLE thread body.
  *
  * @note  It need only be provided if @ref CPU_PROVIDES_IDLE_THREAD_BODY
diff --git a/cpukit/score/cpu/epiphany/cpu.c b/cpukit/score/cpu/epiphany/cpu.c
index 0428a86..489576c 100644
--- a/cpukit/score/cpu/epiphany/cpu.c
+++ b/cpukit/score/cpu/epiphany/cpu.c
@@ -83,11 +83,6 @@ void _CPU_ISR_install_vector(
   /* Do nothing */
 }
 
-void _CPU_Install_interrupt_stack( void )
-{
-  /* Do nothing */
-}
-
 CPU_Counter_ticks _CPU_Counter_read( void )
 {
   static CPU_Counter_ticks counter;
diff --git a/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h b/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h
index 65f28ac..9167c09 100644
--- a/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h
@@ -50,67 +50,6 @@ extern "C" {
 /* conditional compilation parameters */
 
 /*
- *  Does RTEMS manage a dedicated interrupt stack in software?
- *
- *  If TRUE, then a stack is allocated in _ISR_Handler_initialization.
- *  If FALSE, nothing is done.
- *
- *  If the CPU supports a dedicated interrupt stack in hardware,
- *  then it is generally the responsibility of the BSP to allocate it
- *  and set it up.
- *
- *  If the CPU does not support a dedicated interrupt stack, then
- *  the porter has two options: (1) execute interrupts on the
- *  stack of the interrupted task, and (2) have RTEMS manage a dedicated
- *  interrupt stack.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- *
- *  Currently, for epiphany port, _ISR_Handler is responsible for switching to
- *  RTEMS dedicated interrupt task.
- *
- */
-
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
-/*
- *  Does this CPU have hardware support for a dedicated interrupt stack?
- *
- *  If TRUE, then it must be installed during initialization.
- *  If FALSE, then no installation is performed.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- *
- */
-
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/*
- *  Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- *  If TRUE, then the memory is allocated during initialization.
- *  If FALSE, then the memory is allocated during initialization.
- *
- *  This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE
- *  or CPU_INSTALL_HARDWARE_INTERRUPT_STACK is TRUE.
- *
- */
-
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
@@ -728,18 +667,6 @@ void _CPU_ISR_install_vector(
 );
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  This routine installs the hardware interrupt stack pointer.
- *
- *  NOTE:  It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
- *         is TRUE.
- *
- */
-
-void _CPU_Install_interrupt_stack( void );
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  This routine is the CPU dependent IDLE thread body.
diff --git a/cpukit/score/cpu/i386/include/rtems/score/cpu.h b/cpukit/score/cpu/i386/include/rtems/score/cpu.h
index c22b42e..3f780db 100644
--- a/cpukit/score/cpu/i386/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/i386/include/rtems/score/cpu.h
@@ -50,14 +50,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
 
 /*
- *  i386 has an RTEMS allocated and managed interrupt stack.
- */
-
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-#define CPU_ALLOCATE_INTERRUPT_STACK     TRUE
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
diff --git a/cpukit/score/cpu/lm32/cpu.c b/cpukit/score/cpu/lm32/cpu.c
index a9a90c2..577f5cb 100644
--- a/cpukit/score/cpu/lm32/cpu.c
+++ b/cpukit/score/cpu/lm32/cpu.c
@@ -101,18 +101,6 @@ void _CPU_ISR_install_vector(
 }
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  LM32 Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
-void _CPU_Install_interrupt_stack( void )
-{
-}
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  NOTES:
diff --git a/cpukit/score/cpu/lm32/include/rtems/score/cpu.h b/cpukit/score/cpu/lm32/include/rtems/score/cpu.h
index 77f3389..d5fd9ce 100644
--- a/cpukit/score/cpu/lm32/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/lm32/include/rtems/score/cpu.h
@@ -29,35 +29,6 @@ extern "C" {
 /* conditional compilation parameters */
 
 /**
- * Does RTEMS manage a dedicated interrupt stack in software?
- *
- * If TRUE, then a stack is allocated in @ref _ISR_Handler_initialization.
- * If FALSE, nothing is done.
- *
- * If the CPU supports a dedicated interrupt stack in hardware,
- * then it is generally the responsibility of the BSP to allocate it
- * and set it up.
- *
- * If the CPU does not support a dedicated interrupt stack, then
- * the porter has two options: (1) execute interrupts on the
- * stack of the interrupted task, and (2) have RTEMS manage a dedicated
- * interrupt stack.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
-/**
  * Does the CPU follow the simple vectored interrupt model?
  *
  * If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -71,40 +42,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /**
- * Does this CPU have hardware support for a dedicated interrupt stack?
- *
- * If TRUE, then it must be installed during initialization.
- * If FALSE, then no installation is performed.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/**
- * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- * If TRUE, then the memory is allocated during initialization.
- * If FALSE, then the memory is allocated during initialization.
- *
- * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/**
  * Does the RTEMS invoke the user's ISR with the vector number and
  * a pointer to the saved interrupt frame (1) or just the vector
  * number (0)?
@@ -426,21 +363,6 @@ extern Context_Control_fp _CPU_Null_fp_context;
 
 /**
  * @defgroup CPUInterrupt Processor Dependent Interrupt Management
- *
- * On some CPUs, RTEMS supports a software managed interrupt stack.
- * This stack is allocated by the Interrupt Manager and the switch
- * is performed in @ref _ISR_Handler.  These variables contain pointers
- * to the lowest and highest addresses in the chunk of memory allocated
- * for the interrupt stack.  Since it is unknown whether the stack
- * grows up or down (in general), this give the CPU dependent
- * code the option of picking the version it wants to use.
- *
- * NOTE: These two variables are required if the macro
- *       @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
  */
 /**@{**/
 
@@ -847,18 +769,6 @@ void _CPU_ISR_install_vector(
   proc_ptr   *old_handler
 );
 
-/**
- * This routine installs the hardware interrupt stack pointer.
- *
- * NOTE:  It need only be provided if @ref CPU_HAS_HARDWARE_INTERRUPT_STACK
- *        is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-void _CPU_Install_interrupt_stack( void );
-
 /** @} */
 
 /**
diff --git a/cpukit/score/cpu/lm32/irq.c b/cpukit/score/cpu/lm32/irq.c
index be84d74..5d227cb 100644
--- a/cpukit/score/cpu/lm32/irq.c
+++ b/cpukit/score/cpu/lm32/irq.c
@@ -21,9 +21,7 @@
 #include <rtems/score/percpu.h>
 #include <rtems/score/threaddispatch.h>
 
-#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-  unsigned long    *_old_stack_ptr;
-#endif
+unsigned long *_old_stack_ptr;
 
 void *_exception_stack_frame;
 
@@ -44,13 +42,11 @@ void __ISR_Handler(uint32_t vector, CPU_Interrupt_frame *ifr)
 
   _Thread_Dispatch_disable();
 
-#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if ( _ISR_Nest_level == 0 ) {
     /* Install irq stack */
     _old_stack_ptr = stack_ptr;
     stack_ptr = _CPU_Interrupt_stack_high - 4;
   }
-#endif
 
   _ISR_Nest_level++;
 
@@ -64,10 +60,8 @@ void __ISR_Handler(uint32_t vector, CPU_Interrupt_frame *ifr)
 
   _ISR_Nest_level--;
 
-#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if( _ISR_Nest_level == 0)
     stack_ptr = _old_stack_ptr;
-#endif
 
   _Thread_Dispatch_unnest( _Per_CPU_Get() );
 
diff --git a/cpukit/score/cpu/m32c/cpu.c b/cpukit/score/cpu/m32c/cpu.c
index 4592e8c..6b4f886 100644
--- a/cpukit/score/cpu/m32c/cpu.c
+++ b/cpukit/score/cpu/m32c/cpu.c
@@ -113,18 +113,6 @@ void _CPU_ISR_install_vector(
 }
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
-void _CPU_Install_interrupt_stack( void )
-{
-}
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  NOTES:
diff --git a/cpukit/score/cpu/m32c/cpu_asm.c b/cpukit/score/cpu/m32c/cpu_asm.c
index f992c57..16a80b2 100644
--- a/cpukit/score/cpu/m32c/cpu_asm.c
+++ b/cpukit/score/cpu/m32c/cpu_asm.c
@@ -73,10 +73,8 @@ void _ISR_Handler(void)
    *  save some or all context on stack
    *  may need to save some special interrupt information for exit
    *
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if ( _ISR_Nest_level == 0 )
-   *      switch to software interrupt stack
-   *  #endif
+   *  if ( _ISR_Nest_level == 0 )
+   *    switch to software interrupt stack
    *
    *  _ISR_Nest_level++;
    *
@@ -100,10 +98,8 @@ void _ISR_Handler(void)
    *    return from interrupt  (maybe to _ISR_Dispatch)
    *
    *  LABEL "exit interrupt (simple case):
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if outermost interrupt
-   *      restore stack
-   *  #endif
+   *  if outermost interrupt
+   *    restore stack
    *  prepare to get out of interrupt
    *  return from interrupt
    */
diff --git a/cpukit/score/cpu/m32c/include/rtems/score/cpu.h b/cpukit/score/cpu/m32c/include/rtems/score/cpu.h
index 3f23c21..74794fe 100644
--- a/cpukit/score/cpu/m32c/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/m32c/include/rtems/score/cpu.h
@@ -45,35 +45,6 @@ extern "C" {
 #define RTEMS_USE_16_BIT_OBJECT
 
 /**
- * Does RTEMS manage a dedicated interrupt stack in software?
- *
- * If TRUE, then a stack is allocated in @ref _ISR_Handler_initialization.
- * If FALSE, nothing is done.
- *
- * If the CPU supports a dedicated interrupt stack in hardware,
- * then it is generally the responsibility of the BSP to allocate it
- * and set it up.
- *
- * If the CPU does not support a dedicated interrupt stack, then
- * the porter has two options: (1) execute interrupts on the
- * stack of the interrupted task, and (2) have RTEMS manage a dedicated
- * interrupt stack.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
-
-/**
  * Does the CPU follow the simple vectored interrupt model?
  *
  * If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -87,40 +58,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /**
- * Does this CPU have hardware support for a dedicated interrupt stack?
- *
- * If TRUE, then it must be installed during initialization.
- * If FALSE, then no installation is performed.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
-
-/**
- * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- * If TRUE, then the memory is allocated during initialization.
- * If FALSE, then the memory is allocated during initialization.
- *
- * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/**
  * Does the RTEMS invoke the user's ISR with the vector number and
  * a pointer to the saved interrupt frame (1) or just the vector
  * number (0)?
@@ -409,22 +346,6 @@ typedef struct {
 
 /**
  * @defgroup CPUInterrupt Processor Dependent Interrupt Management
- *
- * On some CPUs, RTEMS supports a software managed interrupt stack.
- * This stack is allocated by the Interrupt Manager and the switch
- * is performed in @ref _ISR_Handler.  These variables contain pointers
- * to the lowest and highest addresses in the chunk of memory allocated
- * for the interrupt stack.  Since it is unknown whether the stack
- * grows up or down (in general), this give the CPU dependent
- * code the option of picking the version it wants to use.
- *
- * NOTE: These two variables are required if the macro
- *       @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- * 
  */
 /**@{**/
 
@@ -836,20 +757,6 @@ void _CPU_ISR_install_vector(
 );
 
 /**
- * @ingroup CPUInterrupt
- *
- * This routine installs the hardware interrupt stack pointer.
- *
- * NOTE:  It need only be provided if @ref CPU_HAS_HARDWARE_INTERRUPT_STACK
- *        is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-void _CPU_Install_interrupt_stack( void );
-
-/**
  * This routine is the CPU dependent IDLE thread body.
  *
  * NOTE:  It need only be provided if @ref CPU_PROVIDES_IDLE_THREAD_BODY
diff --git a/cpukit/score/cpu/m68k/cpu.c b/cpukit/score/cpu/m68k/cpu.c
index c50a63f..77a9153 100644
--- a/cpukit/score/cpu/m68k/cpu.c
+++ b/cpukit/score/cpu/m68k/cpu.c
@@ -20,6 +20,7 @@
 #include <rtems/score/isr.h>
 #include <rtems/score/percpu.h>
 #include <rtems/score/tls.h>
+#include <rtems/config.h>
 
 #if ( M68K_HAS_VBR == 0 )
 
@@ -58,6 +59,15 @@ int (*_FPSP_install_raw_handler)(
   uint32_t _CPU_cacr_shadow;
 #endif
 
+static void m68k_install_interrupt_stack( void )
+{
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+  uintptr_t isp = (uintptr_t) _Configuration_Interrupt_stack_area_end;
+
+  __asm__ volatile ( "movec %0,%%isp" : "=r" (isp) : "0" (isp) );
+#endif
+}
+
 void _CPU_Initialize(void)
 {
 #if ( M68K_HAS_VBR == 0 )
@@ -74,6 +84,8 @@ void _CPU_Initialize(void)
     _CPU_ISR_jump_table[slot].isr_handler = (uint32_t) 0xDEADDEAD;
   }
 #endif /* M68K_HAS_VBR */
+
+  m68k_install_interrupt_stack();
 }
 
 uint32_t   _CPU_ISR_Get_level( void )
@@ -151,20 +163,6 @@ void _CPU_ISR_install_vector(
   _ISR_Vector_table[ vector ] = new_handler;
 }
 
-
-/*
- *  _CPU_Install_interrupt_stack
- */
-
-void _CPU_Install_interrupt_stack( void )
-{
-#if ( M68K_HAS_SEPARATE_STACKS == 1 )
-  void *isp = _CPU_Interrupt_stack_high;
-
-  __asm__ volatile ( "movec %0,%%isp" : "=r" (isp) : "0" (isp) );
-#endif
-}
-
 #if ( M68K_HAS_BFFFO != 1 )
 /*
  * Returns table for duplication of the BFFFO instruction (16 bits only)
diff --git a/cpukit/score/cpu/m68k/cpu_asm.S b/cpukit/score/cpu/m68k/cpu_asm.S
index a31c158..6ec89d8 100644
--- a/cpukit/score/cpu/m68k/cpu_asm.S
+++ b/cpukit/score/cpu/m68k/cpu_asm.S
@@ -259,7 +259,7 @@ SYM (_ISR_Handler):
         andl    #0x03fc,d0               | d0 = vector offset in vbr
 
 
-#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == 1 )
+#if ( M68K_HAS_SEPARATE_STACKS == 0 )
         | Make a0 point just above interrupt stack
         movel   INTERRUPT_STACK_HIGH,a0
         cmpl    INTERRUPT_STACK_LOW,a7  | stack below interrupt stack?
@@ -272,7 +272,7 @@ SYM (_ISR_Handler):
         movel   a1,a7 at -                 | store task stack pointer
                                         |     on interrupt stack
 2:
-#endif /* CPU_HAS_SOFTWARE_INTERRUPT_STACK == 1 */
+#endif /* M68K_HAS_SEPARATE_STACKS == 0 */
 
         addql   #1,ISR_NEST_LEVEL        | one nest level deeper
 
@@ -285,14 +285,14 @@ SYM (_ISR_Handler):
         addql   #4,a7                    | remove vector number
         subql   #1,ISR_NEST_LEVEL        | Reduce interrupt-nesting count
 
-#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == 1 )
+#if ( M68K_HAS_SEPARATE_STACKS == 0 )
         movel   INTERRUPT_STACK_HIGH,a0
         subql   #4,a0
         cmpl    a0,a7                   | At top of interrupt stack?
         bne.b   1f                      | No, do not restore task stack pointer
         movel   (a7),a7                 | Restore task stack pointer
 1:
-#endif /* CPU_HAS_SOFTWARE_INTERRUPT_STACK == 1 */
+#endif /* M68K_HAS_SEPARATE_STACKS == 0 */
         subql   #1,THREAD_DISPATCH_DISABLE_LEVEL
                                          | unnest multitasking
         bne.b    exit                    | If dispatch disabled, exit
diff --git a/cpukit/score/cpu/m68k/include/rtems/score/cpu.h b/cpukit/score/cpu/m68k/include/rtems/score/cpu.h
index 1b1b460..9915f36 100644
--- a/cpukit/score/cpu/m68k/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/m68k/include/rtems/score/cpu.h
@@ -42,20 +42,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /*
- *  Use the m68k's hardware interrupt stack support and have the
- *  interrupt manager allocate the memory for it.
- */
-
-#if ( M68K_HAS_SEPARATE_STACKS == 1)
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK 0
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK 1
-#else
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK 1
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK 0
-#endif
-#define CPU_ALLOCATE_INTERRUPT_STACK     1
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
@@ -615,14 +601,6 @@ void _CPU_ISR_install_vector(
 );
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  This routine installs the hardware interrupt stack pointer.
- */
-
-void _CPU_Install_interrupt_stack( void );
-
-/*
  *  _CPU_Context_switch
  *
  *  This routine switches from the run context to the heir context.
diff --git a/cpukit/score/cpu/mips/cpu.c b/cpukit/score/cpu/mips/cpu.c
index fe89a10..7f48d09 100644
--- a/cpukit/score/cpu/mips/cpu.c
+++ b/cpukit/score/cpu/mips/cpu.c
@@ -166,11 +166,6 @@ void _CPU_ISR_Set_level( uint32_t   new_level )
   mips_set_sr( sr );
 }
 
-void _CPU_Install_interrupt_stack( void )
-{
-/* we don't support this yet */
-}
-
 void _CPU_Context_Initialize(
   Context_Control  *the_context,
   uintptr_t        *stack_base,
diff --git a/cpukit/score/cpu/mips/cpu_asm.S b/cpukit/score/cpu/mips/cpu_asm.S
index c58aee1..8a58831 100644
--- a/cpukit/score/cpu/mips/cpu_asm.S
+++ b/cpukit/score/cpu/mips/cpu_asm.S
@@ -872,10 +872,8 @@ _ISR_Handler_1:
    *  save some or all context on stack
    *  may need to save some special interrupt information for exit
    *
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if ( _ISR_Nest_level == 0 )
-   *      switch to software interrupt stack
-   *  #endif
+   *  if ( _ISR_Nest_level == 0 )
+   *    switch to software interrupt stack
    */
 
 
@@ -939,9 +937,7 @@ _ISR_Handler_1:
 
 
   /*
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    restore stack
-   *  #endif
+   *  restore stack
    *
    *  if !_Thread_Dispatch_necessary 
    *    goto the label "exit interrupt (simple case)"
diff --git a/cpukit/score/cpu/mips/include/rtems/score/cpu.h b/cpukit/score/cpu/mips/include/rtems/score/cpu.h
index c20e5f4..df9f2b7 100644
--- a/cpukit/score/cpu/mips/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/mips/include/rtems/score/cpu.h
@@ -62,32 +62,6 @@ extern "C" {
 /* conditional compilation parameters */
 
 /*
- *  Does RTEMS manage a dedicated interrupt stack in software?
- *
- *  If TRUE, then a stack is allocated in _Interrupt_Manager_initialization.
- *  If FALSE, nothing is done.
- *
- *  If the CPU supports a dedicated interrupt stack in hardware,
- *  then it is generally the responsibility of the BSP to allocate it
- *  and set it up.
- *
- *  If the CPU does not support a dedicated interrupt stack, then
- *  the porter has two options: (1) execute interrupts on the
- *  stack of the interrupted task, and (2) have RTEMS manage a dedicated
- *  interrupt stack.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- */
-
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
-
-/*
  *  Does the CPU follow the simple vectored interrupt model?
  *
  *  If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -102,34 +76,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
 
 /*
- *  Does this CPU have hardware support for a dedicated interrupt stack?
- *
- *  If TRUE, then it must be installed during initialization.
- *  If FALSE, then no installation is performed.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- */
-
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/*
- *  Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- *  If TRUE, then the memory is allocated during initialization.
- *  If FALSE, then the memory is allocated during initialization.
- *
- *  This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- */
-
-#define CPU_ALLOCATE_INTERRUPT_STACK FALSE
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
@@ -871,17 +817,6 @@ void _CPU_ISR_install_vector(
 );
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  This routine installs the hardware interrupt stack pointer.
- *
- *  NOTE:  It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
- *         is TRUE.
- */
-
-void _CPU_Install_interrupt_stack( void );
-
-/*
  *  _CPU_Internal_threads_Idle_thread_body
  *
  *  This routine is the CPU dependent IDLE thread body.
diff --git a/cpukit/score/cpu/moxie/cpu.c b/cpukit/score/cpu/moxie/cpu.c
index 2a0dc1e..7fd21cd 100644
--- a/cpukit/score/cpu/moxie/cpu.c
+++ b/cpukit/score/cpu/moxie/cpu.c
@@ -105,13 +105,6 @@ void _CPU_ISR_install_vector(
 }
 
 /*
- *  _CPU_Install_interrupt_stack
- */
-void _CPU_Install_interrupt_stack( void )
-{
-}
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  NOTES:
diff --git a/cpukit/score/cpu/moxie/include/rtems/score/cpu.h b/cpukit/score/cpu/moxie/include/rtems/score/cpu.h
index 9b6dbec..4b6891f 100644
--- a/cpukit/score/cpu/moxie/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/moxie/include/rtems/score/cpu.h
@@ -38,35 +38,6 @@ extern "C" {
 #define RTEMS_USE_32_BIT_OBJECT
 
 /*
- *  Does RTEMS manage a dedicated interrupt stack in software?
- *
- *  If TRUE, then a stack is allocated in _ISR_Handler_initialization.
- *  If FALSE, nothing is done.
- *
- *  If the CPU supports a dedicated interrupt stack in hardware,
- *  then it is generally the responsibility of the BSP to allocate it
- *  and set it up.
- *
- *  If the CPU does not support a dedicated interrupt stack, then
- *  the porter has two options: (1) execute interrupts on the
- *  stack of the interrupted task, and (2) have RTEMS manage a dedicated
- *  interrupt stack.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- *
- *  MOXIE Specific Information:
- *
- *  XXX
- */
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
-/*
  *  Does the CPU follow the simple vectored interrupt model?
  *
  *  If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -80,40 +51,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /*
- *  Does this CPU have hardware support for a dedicated interrupt stack?
- *
- *  If TRUE, then it must be installed during initialization.
- *  If FALSE, then no installation is performed.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- *
- *  MOXIE Specific Information:
- *
- *  XXX
- */
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/*
- *  Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- *  If TRUE, then the memory is allocated during initialization.
- *  If FALSE, then the memory is allocated during initialization.
- *
- *  This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- *
- *  MOXIE Specific Information:
- *
- *  XXX
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/*
  *  Does the CPU have hardware floating point?
  *
  *  If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
@@ -679,20 +616,6 @@ void _CPU_ISR_install_vector(
 );
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  This routine installs the hardware interrupt stack pointer.
- *
- *  NOTE:  It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
- *         is TRUE.
- *
- *  MOXIE Specific Information:
- *
- *  XXX
- */
-void _CPU_Install_interrupt_stack( void );
-
-/*
  *  _CPU_Internal_threads_Idle_thread_body
  *
  *  This routine is the CPU dependent IDLE thread body.
diff --git a/cpukit/score/cpu/nios2/include/rtems/score/cpu.h b/cpukit/score/cpu/nios2/include/rtems/score/cpu.h
index 3cc56e5..ae1c027 100644
--- a/cpukit/score/cpu/nios2/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/nios2/include/rtems/score/cpu.h
@@ -27,8 +27,6 @@ extern "C" {
 #include <rtems/score/basedefs.h>
 #include <rtems/score/nios2.h>
 
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 #define CPU_INTERRUPT_NUMBER_OF_VECTORS 32
@@ -37,10 +35,6 @@ extern "C" {
 
 #define CPU_PROVIDES_ISR_IS_IN_PROGRESS TRUE
 
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
 #define CPU_ISR_PASSES_FRAME_POINTER FALSE
 
 #define CPU_HARDWARE_FP FALSE
diff --git a/cpukit/score/cpu/nios2/nios2-iic-irq.c b/cpukit/score/cpu/nios2/nios2-iic-irq.c
index 99f1618..cec24fd 100644
--- a/cpukit/score/cpu/nios2/nios2-iic-irq.c
+++ b/cpukit/score/cpu/nios2/nios2-iic-irq.c
@@ -32,9 +32,7 @@
  *  Upon entry, interrupts are disabled
  */
 
-#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
-  unsigned long    *_old_stack_ptr;
-#endif
+unsigned long *_old_stack_ptr;
 
 /*
  * Prototypes
@@ -98,13 +96,11 @@ void __ISR_Handler(void)
 
   /* Interrupts are disabled upon entry to this Handler */
 
-#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
   if ( _ISR_Nest_level == 0 ) {
     /* Install irq stack */
     _old_stack_ptr = stack_ptr;
     stack_ptr = _CPU_Interrupt_stack_high - 4;
   }
-#endif
 
   _ISR_Nest_level++;
 
@@ -120,9 +116,7 @@ void __ISR_Handler(void)
   _ISR_Nest_level--;
 
   if( _ISR_Nest_level == 0) {
-#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE)
     stack_ptr = _old_stack_ptr;
-#endif
 
     if( _Thread_Dispatch_is_enabled() )
     {
diff --git a/cpukit/score/cpu/no_cpu/cpu.c b/cpukit/score/cpu/no_cpu/cpu.c
index 88bd413..fe1e303 100644
--- a/cpukit/score/cpu/no_cpu/cpu.c
+++ b/cpukit/score/cpu/no_cpu/cpu.c
@@ -87,18 +87,6 @@ void _CPU_ISR_install_vector(
 }
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  NO_CPU Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-
-void _CPU_Install_interrupt_stack( void )
-{
-}
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  NOTES:
diff --git a/cpukit/score/cpu/no_cpu/cpu_asm.c b/cpukit/score/cpu/no_cpu/cpu_asm.c
index 4e56960..359bee3 100644
--- a/cpukit/score/cpu/no_cpu/cpu_asm.c
+++ b/cpukit/score/cpu/no_cpu/cpu_asm.c
@@ -151,10 +151,8 @@ void _ISR_Handler(void)
    *  save some or all context on stack
    *  may need to save some special interrupt information for exit
    *
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if ( _ISR_Nest_level == 0 )
-   *      switch to software interrupt stack
-   *  #endif
+   *  if ( _ISR_Nest_level == 0 )
+   *    switch to software interrupt stack
    *
    *  _ISR_Nest_level++;
    *
@@ -178,10 +176,8 @@ void _ISR_Handler(void)
    *    return from interrupt  (maybe to _ISR_Dispatch)
    *
    *  LABEL "exit interrupt (simple case):
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if outermost interrupt
-   *      restore stack
-   *  #endif
+   *  if outermost interrupt
+   *    restore stack
    *  prepare to get out of interrupt
    *  return from interrupt
    */
diff --git a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
index c843e26..2cbad57 100644
--- a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
@@ -46,35 +46,6 @@ extern "C" {
 /* conditional compilation parameters */
 
 /**
- * Does RTEMS manage a dedicated interrupt stack in software?
- *
- * If TRUE, then a stack is allocated in @ref _ISR_Handler_initialization.
- * If FALSE, nothing is done.
- *
- * If the CPU supports a dedicated interrupt stack in hardware,
- * then it is generally the responsibility of the BSP to allocate it
- * and set it up.
- *
- * If the CPU does not support a dedicated interrupt stack, then
- * the porter has two options: (1) execute interrupts on the
- * stack of the interrupted task, and (2) have RTEMS manage a dedicated
- * interrupt stack.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
-
-/**
  * Does the CPU follow the simple vectored interrupt model?
  *
  * If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -88,40 +59,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /**
- * Does this CPU have hardware support for a dedicated interrupt stack?
- *
- * If TRUE, then it must be installed during initialization.
- * If FALSE, then no installation is performed.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
-
-/**
- * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- * If TRUE, then the memory is allocated during initialization.
- * If FALSE, then the memory is allocated during initialization.
- *
- * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/**
  * Does the RTEMS invoke the user's ISR with the vector number and
  * a pointer to the saved interrupt frame (1) or just the vector
  * number (0)?
@@ -521,16 +458,13 @@ extern Context_Control_fp _CPU_Null_fp_context;
 /**
  * @defgroup CPUInterrupt Processor Dependent Interrupt Management
  *
- * On some CPUs, RTEMS supports a software managed interrupt stack.
- * This stack is allocated by the Interrupt Manager and the switch
- * is performed in @ref _ISR_Handler.  These variables contain pointers
- * to the lowest and highest addresses in the chunk of memory allocated
- * for the interrupt stack.  Since it is unknown whether the stack
- * grows up or down (in general), this give the CPU dependent
- * code the option of picking the version it wants to use.
- *
- * NOTE: These two variables are required if the macro
- *       @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+ * RTEMS supports a software managed interrupt stack.  The interrupt stacks
+ * are statically allocated by <rtems/confdefs.h> and the switch is performed
+ * by hardware or the interrupt processing code.  These variables contain
+ * pointers to the lowest and highest addresses in the chunk of memory
+ * allocated for the interrupt stack.  Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent code the option
+ * of picking the version it wants to use.
  *
  * Port Specific Information:
  *
@@ -1126,19 +1060,6 @@ void _CPU_ISR_install_vector(
 );
 
 /**
- * @ingroup CPUInterrupt
- * This routine installs the hardware interrupt stack pointer.
- *
- * NOTE:  It need only be provided if @ref CPU_HAS_HARDWARE_INTERRUPT_STACK
- *        is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-void _CPU_Install_interrupt_stack( void );
-
-/**
  * This routine is the CPU dependent IDLE thread body.
  *
  * NOTE:  It need only be provided if @ref CPU_PROVIDES_IDLE_THREAD_BODY
diff --git a/cpukit/score/cpu/or1k/cpu.c b/cpukit/score/cpu/or1k/cpu.c
index fe933f0..b4cbe00 100644
--- a/cpukit/score/cpu/or1k/cpu.c
+++ b/cpukit/score/cpu/or1k/cpu.c
@@ -105,10 +105,6 @@ void _CPU_ISR_install_vector(
    _ISR_Local_enable( level );
 }
 
-void _CPU_Install_interrupt_stack( void )
-{
-}
-
 void *_CPU_Thread_Idle_body( uintptr_t ignored )
 {
   do {
diff --git a/cpukit/score/cpu/or1k/include/rtems/score/cpu.h b/cpukit/score/cpu/or1k/include/rtems/score/cpu.h
index 4f8df4a..bd1b6bc 100644
--- a/cpukit/score/cpu/or1k/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/or1k/include/rtems/score/cpu.h
@@ -40,67 +40,6 @@ extern "C" {
 /* conditional compilation parameters */
 
 /*
- *  Does RTEMS manage a dedicated interrupt stack in software?
- *
- *  If TRUE, then a stack is allocated in _ISR_Handler_initialization.
- *  If FALSE, nothing is done.
- *
- *  If the CPU supports a dedicated interrupt stack in hardware,
- *  then it is generally the responsibility of the BSP to allocate it
- *  and set it up.
- *
- *  If the CPU does not support a dedicated interrupt stack, then
- *  the porter has two options: (1) execute interrupts on the
- *  stack of the interrupted task, and (2) have RTEMS manage a dedicated
- *  interrupt stack.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- *
- *  Currently, for or1k port, _ISR_Handler is responsible for switching to
- *  RTEMS dedicated interrupt task.
- *
- */
-
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
-/*
- *  Does this CPU have hardware support for a dedicated interrupt stack?
- *
- *  If TRUE, then it must be installed during initialization.
- *  If FALSE, then no installation is performed.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- *
- */
-
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/*
- *  Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- *  If TRUE, then the memory is allocated during initialization.
- *  If FALSE, then the memory is allocated during initialization.
- *
- *  This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE
- *  or CPU_INSTALL_HARDWARE_INTERRUPT_STACK is TRUE.
- *
- */
-
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
@@ -736,18 +675,6 @@ void _CPU_ISR_install_vector(
 );
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  This routine installs the hardware interrupt stack pointer.
- *
- *  NOTE:  It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
- *         is TRUE.
- *
- */
-
-void _CPU_Install_interrupt_stack( void );
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  This routine is the CPU dependent IDLE thread body.
diff --git a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h
index 65f31dd..8a17af2 100644
--- a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h
@@ -473,60 +473,6 @@ typedef struct {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
 
 /*
- *  Does RTEMS manage a dedicated interrupt stack in software?
- *
- *  If TRUE, then a stack is allocated in _ISR_Handler_initialization.
- *  If FALSE, nothing is done.
- *
- *  If the CPU supports a dedicated interrupt stack in hardware,
- *  then it is generally the responsibility of the BSP to allocate it
- *  and set it up.
- *
- *  If the CPU does not support a dedicated interrupt stack, then
- *  the porter has two options: (1) execute interrupts on the
- *  stack of the interrupted task, and (2) have RTEMS manage a dedicated
- *  interrupt stack.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- */
-
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
-/*
- *  Does this CPU have hardware support for a dedicated interrupt stack?
- *
- *  If TRUE, then it must be installed during initialization.
- *  If FALSE, then no installation is performed.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- */
-
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/*
- *  Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- *  If TRUE, then the memory is allocated during initialization.
- *  If FALSE, then the memory is allocated during initialization.
- *
- *  This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- */
-
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
diff --git a/cpukit/score/cpu/riscv/cpu.c b/cpukit/score/cpu/riscv/cpu.c
index 8d2926e..fbdb4c5 100644
--- a/cpukit/score/cpu/riscv/cpu.c
+++ b/cpukit/score/cpu/riscv/cpu.c
@@ -110,11 +110,6 @@ void _CPU_ISR_install_vector(
 
 }
 
-void _CPU_Install_interrupt_stack( void )
-{
-  /* Do nothing */
-}
-
 void *_CPU_Thread_Idle_body( uintptr_t ignored )
 {
   do {
diff --git a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h
index 2b3b609..1e72dd3 100644
--- a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h
@@ -50,9 +50,6 @@ extern "C" {
 
 #define CPU_INLINE_ENABLE_DISPATCH       FALSE
 #define CPU_UNROLL_ENQUEUE_PRIORITY      TRUE
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
 #define CPU_ISR_PASSES_FRAME_POINTER 1
 #define CPU_HARDWARE_FP                  FALSE
 #define CPU_SOFTWARE_FP                  FALSE
@@ -351,18 +348,6 @@ void _CPU_ISR_install_vector(
 );
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  This routine installs the hardware interrupt stack pointer.
- *
- *  NOTE:  It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
- *         is TRUE.
- *
- */
-
-void _CPU_Install_interrupt_stack( void );
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  This routine is the CPU dependent IDLE thread body.
diff --git a/cpukit/score/cpu/sh/include/rtems/score/cpu.h b/cpukit/score/cpu/sh/include/rtems/score/cpu.h
index d3c9bc6..3952abe 100644
--- a/cpukit/score/cpu/sh/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sh/include/rtems/score/cpu.h
@@ -50,38 +50,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /*
- *  Does RTEMS manage a dedicated interrupt stack in software?
- *
- *  If TRUE, then a stack is allocated in _ISR_Handler_initialization.
- *  If FALSE, nothing is done.
- *
- *  If the CPU supports a dedicated interrupt stack in hardware,
- *  then it is generally the responsibility of the BSP to allocate it
- *  and set it up.
- *
- *  If the CPU does not support a dedicated interrupt stack, then
- *  the porter has two options: (1) execute interrupts on the
- *  stack of the interrupted task, and (2) have RTEMS manage a dedicated
- *  interrupt stack.
- *
- *  If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- *  Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- *  CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- *  possible that both are FALSE for a particular CPU.  Although it
- *  is unclear what that would imply about the interrupt processing
- *  procedure on that CPU.
- */
-
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/*
- * We define the interrupt stack in the linker script
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK FALSE
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
@@ -641,17 +609,6 @@ void _CPU_ISR_install_vector(
 );
 
 /*
- *  _CPU_Install_interrupt_stack
- *
- *  This routine installs the hardware interrupt stack pointer.
- *
- *  NOTE:  It needs only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
- *         is TRUE.
- */
-
-void _CPU_Install_interrupt_stack( void );
-
-/*
  *  _CPU_Thread_Idle_body
  *
  *  This routine is the CPU dependent IDLE thread body.
diff --git a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h
index 16618e7..9b32f76 100644
--- a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h
@@ -69,17 +69,6 @@ extern "C" {
 #endif
 
 /**
- * Does the executive manage a dedicated interrupt stack in software?
- *
- * If TRUE, then a stack is allocated in _ISR_Handler_initialization.
- * If FALSE, nothing is done.
- *
- * The SPARC does not have a dedicated HW interrupt stack and one has
- * been implemented in SW.
- */
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK   TRUE
-
-/**
  * Does the CPU follow the simple vectored interrupt model?
  *
  * - If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -92,29 +81,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /**
- * Does this CPU have hardware support for a dedicated interrupt stack?
- *
- * - If TRUE, then it must be installed during initialization.
- * - If FALSE, then no installation is performed.
- *
- * The SPARC does not have a dedicated HW interrupt stack.
- */
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK  FALSE
-
-/**
- * Do we allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- * - If TRUE, then the memory is allocated during initialization.
- * - If FALSE, then the memory is allocated during initialization.
- *
- * The SPARC does not have hardware support for switching to a
- * dedicated interrupt stack.  The port includes support for doing this
- * in software.
- *
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK      TRUE
-
-/**
  * Does the RTEMS invoke the user's ISR with the vector number and
  * a pointer to the saved interrupt frame (1) or just the vector
  * number (0)?
diff --git a/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h b/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h
index feb7752..3172802 100644
--- a/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h
@@ -34,18 +34,6 @@ extern "C" {
 /* conditional compilation parameters */
 
 /*
- *  Does the executive manage a dedicated interrupt stack in software?
- *
- *  If TRUE, then a stack is allocated in _ISR_Handler_initialization.
- *  If FALSE, nothing is done.
- *
- *  The SPARC does not have a dedicated HW interrupt stack and one has
- *  been implemented in SW.
- */
-
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK   TRUE
-
-/*
  *  Does the CPU follow the simple vectored interrupt model?
  *
  *  If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -59,26 +47,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
 
 /*
- *  Does this CPU have hardware support for a dedicated interrupt stack?
- *
- *  If TRUE, then it must be installed during initialization.
- *  If FALSE, then no installation is performed.
- *
- *  The SPARC does not have a dedicated HW interrupt stack.
- */
-
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK  FALSE
-
-/*
- *  Do we allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- *  If TRUE, then the memory is allocated during initialization.
- *  If FALSE, then the memory is allocated during initialization.
- */
-
-#define CPU_ALLOCATE_INTERRUPT_STACK      TRUE
-
-/*
  *  Does the RTEMS invoke the user's ISR with the vector number and
  *  a pointer to the saved interrupt frame (1) or just the vector
  *  number (0)?
diff --git a/cpukit/score/cpu/v850/cpu_asm.S b/cpukit/score/cpu/v850/cpu_asm.S
index 328c71c..e9aa738 100644
--- a/cpukit/score/cpu/v850/cpu_asm.S
+++ b/cpukit/score/cpu/v850/cpu_asm.S
@@ -138,76 +138,3 @@ restore:
 __CPU_Context_restore:
         mov      r6, r7         /* move to second parameter register */
         br       restore
-
-#if 0
-/**
- *  This routine provides the RTEMS interrupt management.
- *
- *  v850 Specific Information:
- *
- *  XXX document implementation including references if appropriate
- */
-void _ISR_Handler(void); /* C warning avoidance */
-void _ISR_Handler(void)
-{
-   /*
-    *  This discussion ignores a lot of the ugly details in a real
-    *  implementation such as saving enough registers/state to be
-    *  able to do something real.  Keep in mind that the goal is
-    *  to invoke a user's ISR handler which is written in C and
-    *  uses a certain set of registers.
-    *
-    *  Also note that the exact order is to a large extent flexible.
-    *  Hardware will dictate a sequence for a certain subset of
-    *  _ISR_Handler while requirements for setting
-    */
-
-  /*
-   *  At entry to "common" _ISR_Handler, the vector number must be
-   *  available.  On some CPUs the hardware puts either the vector
-   *  number or the offset into the vector table for this ISR in a
-   *  known place.  If the hardware does not give us this information,
-   *  then the assembly portion of RTEMS for this port will contain
-   *  a set of distinct interrupt entry points which somehow place
-   *  the vector number in a known place (which is safe if another
-   *  interrupt nests this one) and branches to _ISR_Handler.
-   *
-   *  save some or all context on stack
-   *  may need to save some special interrupt information for exit
-   *
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if ( _ISR_Nest_level == 0 )
-   *      switch to software interrupt stack
-   *  #endif
-   *
-   *  _ISR_Nest_level++;
-   *
-   *  _Thread_Dispatch_disable_level++;
-   *
-   *  (*_ISR_Vector_table[ vector ])( vector );
-   *
-   *  _Thread_Dispatch_disable_level--;
-   *
-   *  --_ISR_Nest_level;
-   *
-   *  if ( _ISR_Nest_level )
-   *    goto the label "exit interrupt (simple case)"
-   *
-   *  if ( _Thread_Dispatch_disable_level )
-   *    goto the label "exit interrupt (simple case)"
-   *
-   *  if ( _Thread_Dispatch_necessary ) {
-   *    call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
-   *    prepare to get out of interrupt
-   *    return from interrupt  (maybe to _ISR_Dispatch)
-   *
-   *  LABEL "exit interrupt (simple case):
-   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
-   *    if outermost interrupt
-   *      restore stack
-   *  #endif
-   *  prepare to get out of interrupt
-   *  return from interrupt
-   */
-}
-#endif
diff --git a/cpukit/score/cpu/v850/include/rtems/score/cpu.h b/cpukit/score/cpu/v850/include/rtems/score/cpu.h
index dbae3c4..f19efa9 100644
--- a/cpukit/score/cpu/v850/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/v850/include/rtems/score/cpu.h
@@ -29,35 +29,6 @@ extern "C" {
 /* conditional compilation parameters */
 
 /**
- * Does RTEMS manage a dedicated interrupt stack in software?
- *
- * If TRUE, then a stack is allocated in @ref _ISR_Handler_initialization.
- * If FALSE, nothing is done.
- *
- * If the CPU supports a dedicated interrupt stack in hardware,
- * then it is generally the responsibility of the BSP to allocate it
- * and set it up.
- *
- * If the CPU does not support a dedicated interrupt stack, then
- * the porter has two options: (1) execute interrupts on the
- * stack of the interrupted task, and (2) have RTEMS manage a dedicated
- * interrupt stack.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * The v850 does not have support for a hardware interrupt stack.
- */
-#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
-
-/**
  * Does the CPU follow the simple vectored interrupt model?
  *
  * If TRUE, then RTEMS allocates the vector table it internally manages.
@@ -71,40 +42,6 @@ extern "C" {
 #define CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
 
 /**
- * Does this CPU have hardware support for a dedicated interrupt stack?
- *
- * If TRUE, then it must be installed during initialization.
- * If FALSE, then no installation is performed.
- *
- * If this is TRUE, @ref CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
- *
- * Only one of @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK and
- * @ref CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE.  It is
- * possible that both are FALSE for a particular CPU.  Although it
- * is unclear what that would imply about the interrupt processing
- * procedure on that CPU.
- *
- * Port Specific Information:
- *
- * The v850 does not have support for a hardware interrupt stack.
- */
-#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
-
-/**
- * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
- *
- * If TRUE, then the memory is allocated during initialization.
- * If FALSE, then the memory is allocated during initialization.
- *
- * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
-
-/**
  * @def CPU_HARDWARE_FP
  *
  * Does the CPU have hardware floating point?
@@ -389,21 +326,6 @@ typedef struct {
 
 /**
  * @defgroup CPUInterrupt Processor Dependent Interrupt Management
- *
- * On some CPUs, RTEMS supports a software managed interrupt stack.
- * This stack is allocated by the Interrupt Manager and the switch
- * is performed in @ref _ISR_Handler.  These variables contain pointers
- * to the lowest and highest addresses in the chunk of memory allocated
- * for the interrupt stack.  Since it is unknown whether the stack
- * grows up or down (in general), this give the CPU dependent
- * code the option of picking the version it wants to use.
- *
- * @note These two variables are required if the macro
- *       @ref CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
  */
 /**@{**/
 
diff --git a/cpukit/score/src/isr.c b/cpukit/score/src/isr.c
index 1078ef6..3bda275 100644
--- a/cpukit/score/src/isr.c
+++ b/cpukit/score/src/isr.c
@@ -23,7 +23,6 @@
 #include <rtems/score/interr.h>
 #include <rtems/score/percpu.h>
 #include <rtems/score/stackimpl.h>
-#include <rtems/score/wkspace.h>
 #include <rtems/config.h>
 
 #if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
@@ -36,51 +35,48 @@
 
 void _ISR_Handler_initialization( void )
 {
+  uint32_t  cpu_max;
+  uint32_t  cpu_index;
+  size_t    stack_size;
+  char     *stack_low;
+
   _ISR_Nest_level = 0;
 
 #if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
   _CPU_Initialize_vectors();
 #endif
 
-#if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
-  {
-    size_t stack_size = rtems_configuration_get_interrupt_stack_size();
-    uint32_t cpu_max = rtems_configuration_get_maximum_processors();
-    uint32_t cpu_index;
+  stack_size = rtems_configuration_get_interrupt_stack_size();
 
-    if ( !_Stack_Is_enough( stack_size ) )
-      _Internal_error( INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL );
+  if ( !_Stack_Is_enough( stack_size ) )
+    _Internal_error( INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL );
 
-    for ( cpu_index = 0 ; cpu_index < cpu_max; ++cpu_index ) {
-      Per_CPU_Control *cpu = _Per_CPU_Get_by_index( cpu_index );
-      void *low = _Workspace_Allocate_or_fatal_error( stack_size );
-      void *high = _Addresses_Add_offset( low, stack_size );
+  cpu_max = rtems_configuration_get_maximum_processors();
+  stack_low = _Configuration_Interrupt_stack_area_begin;
 
-#if (CPU_STACK_ALIGNMENT != 0)
-      high = _Addresses_Align_down( high, CPU_STACK_ALIGNMENT );
-#endif
+  for ( cpu_index = 0 ; cpu_index < cpu_max; ++cpu_index ) {
+    Per_CPU_Control *cpu;
+    char            *stack_high;
 
-      cpu->interrupt_stack_low = low;
-      cpu->interrupt_stack_high = high;
+    cpu = _Per_CPU_Get_by_index( cpu_index );
+    stack_high = _Addresses_Add_offset( stack_low, stack_size );
 
-      /*
-       * Interrupt stack might have to be aligned and/or setup in a specific
-       * way.  Do not use the local low or high variables here since
-       * _CPU_Interrupt_stack_setup() is a nasty macro that might want to play
-       * with the real memory locations.
-       */
-#if defined(_CPU_Interrupt_stack_setup)
-      _CPU_Interrupt_stack_setup(
-        cpu->interrupt_stack_low,
-        cpu->interrupt_stack_high
-      );
-#endif
-    }
-  }
+    cpu->interrupt_stack_low = stack_low;
+    cpu->interrupt_stack_high = stack_high;
 
+    /*
+     * Interrupt stack might have to be aligned and/or setup in a specific
+     * way.  Do not use the local low or high variables here since
+     * _CPU_Interrupt_stack_setup() is a nasty macro that might want to play
+     * with the real memory locations.
+     */
+#if defined(_CPU_Interrupt_stack_setup)
+    _CPU_Interrupt_stack_setup(
+      cpu->interrupt_stack_low,
+      cpu->interrupt_stack_high
+    );
 #endif
 
-#if ( CPU_HAS_HARDWARE_INTERRUPT_STACK == TRUE )
-  _CPU_Install_interrupt_stack();
-#endif
+    stack_low = stack_high;
+  }
 }
diff --git a/cpukit/score/src/percpuasm.c b/cpukit/score/src/percpuasm.c
index 2908643..ccd101a 100644
--- a/cpukit/score/src/percpuasm.c
+++ b/cpukit/score/src/percpuasm.c
@@ -122,17 +122,14 @@ RTEMS_STATIC_ASSERT(
 );
 #endif
 
-#if CPU_ALLOCATE_INTERRUPT_STACK == TRUE \
-  || CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE
-  RTEMS_STATIC_ASSERT(
-    offsetof(Per_CPU_Control, interrupt_stack_low)
-      == PER_CPU_INTERRUPT_STACK_LOW,
-    PER_CPU_INTERRUPT_STACK_LOW
-  );
+RTEMS_STATIC_ASSERT(
+  offsetof(Per_CPU_Control, interrupt_stack_low)
+    == PER_CPU_INTERRUPT_STACK_LOW,
+  PER_CPU_INTERRUPT_STACK_LOW
+);
 
-  RTEMS_STATIC_ASSERT(
-    offsetof(Per_CPU_Control, interrupt_stack_high)
-      == PER_CPU_INTERRUPT_STACK_HIGH,
-    PER_CPU_INTERRUPT_STACK_HIGH
-  );
-#endif
+RTEMS_STATIC_ASSERT(
+  offsetof(Per_CPU_Control, interrupt_stack_high)
+    == PER_CPU_INTERRUPT_STACK_HIGH,
+  PER_CPU_INTERRUPT_STACK_HIGH
+);
diff --git a/testsuites/sptests/spfatal07/testcase.h b/testsuites/sptests/spfatal07/testcase.h
index e847963..156f9b5 100644
--- a/testsuites/sptests/spfatal07/testcase.h
+++ b/testsuites/sptests/spfatal07/testcase.h
@@ -9,28 +9,6 @@
  *  http://www.rtems.org/license/LICENSE.
  */
 
-#include <rtems/bspIo.h>
-
-/*
- *  Way too much stack space.  Should generate a fatal error
- *  on the init task create.
- */
-#define CONFIGURE_HAS_OWN_INIT_TASK_TABLE
-#define CONFIGURE_INIT_TASK_STACK_SIZE   RTEMS_MINIMUM_STACK_SIZE
-rtems_initialization_tasks_table Initialization_tasks[] = {
-  { rtems_build_name('I', 'N', 'I', ' '),
-    RTEMS_MINIMUM_STACK_SIZE,
-    1,
-    RTEMS_DEFAULT_ATTRIBUTES,
-    Init,
-    RTEMS_DEFAULT_MODES,
-    0
-  }
-};
-#define CONFIGURE_INIT_TASK_TABLE Initialization_tasks
-#define CONFIGURE_INIT_TASK_TABLE_SIZE \
-  sizeof(CONFIGURE_INIT_TASK_TABLE) / sizeof(rtems_initialization_tasks_table)
-
 #define FATAL_ERROR_TEST_NAME            "7"
 #define FATAL_ERROR_DESCRIPTION \
         "Core Configuration Invalid ISR stack size"
@@ -38,20 +16,9 @@ rtems_initialization_tasks_table Initialization_tasks[] = {
 #define FATAL_ERROR_EXPECTED_ERROR       \
           INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL
 
-#if CPU_ALLOCATE_INTERRUPT_STACK == TRUE
-  #define CONFIGURE_INTERRUPT_STACK_SIZE (STACK_MINIMUM_SIZE - 1)
-#endif
+#define CONFIGURE_INTERRUPT_STACK_SIZE CPU_INTERRUPT_STACK_ALIGNMENT
 
 void force_error()
 {
-  #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
-    /* we will not run this far */
-  #else
-    printk(
-      "WARNING - Test not applicable on this target architecture.\n"
-      "WARNING - Only applicable when CPU_ALLOCATE_INTERRUPT_STACK == TRUE.\n"
-    );
-    TEST_END();
-    rtems_test_exit(0);
-  #endif
+  /* we will not run this far */
 }
diff --git a/testsuites/sptests/spsize/size.c b/testsuites/sptests/spsize/size.c
index 7b7b3a5..951cdd7 100644
--- a/testsuites/sptests/spsize/size.c
+++ b/testsuites/sptests/spsize/size.c
@@ -391,10 +391,8 @@ uninitialized =
 /* cpu.h */
 uninitialized += (sizeof _CPU_Null_fp_context);
 
-#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
 uninitialized += (sizeof _CPU_Interrupt_stack_low) +
                  (sizeof _CPU_Interrupt_stack_high);
-#endif
 
 #endif
 



More information about the vc mailing list