Index: c/src/lib/libbsp/arm/csb336/ChangeLog
===================================================================
--- c/src/lib/libbsp/arm/csb336/ChangeLog	(revision c3ee425704ae116621331f4fee5ed8412823d4e3)
+++ c/src/lib/libbsp/arm/csb336/ChangeLog	(revision b7774253cfedcd1b25fff538b866711b7dfd5bb2)
@@ -1,2 +1,9 @@
+2008-09-12	Joel Sherrill <joel.sherrill@oarcorp.com>
+
+	* Makefile.am, configure.ac, startup/bspstart.c: Split out
+	bsp_get_work_area() into its own file and user BSP Framework to
+	perform more initialization. Let edb7312 and csb336 shared the
+	implementation.
+
 2008-08-21	Joel Sherrill <joel.sherrill@oarcorp.com>
 
Index: c/src/lib/libbsp/arm/csb336/Makefile.am
===================================================================
--- c/src/lib/libbsp/arm/csb336/Makefile.am	(revision c3ee425704ae116621331f4fee5ed8412823d4e3)
+++ c/src/lib/libbsp/arm/csb336/Makefile.am	(revision b7774253cfedcd1b25fff538b866711b7dfd5bb2)
@@ -27,7 +27,7 @@
 
 startup_SOURCES = ../../shared/bsplibc.c ../../shared/bsppost.c \
-    ../../shared/bsppredriverhook.c \
-    startup/bspstart.c startup/bspclean.c startup/memmap.c \
-    ../../shared/bootcard.c ../../shared/sbrk.c \
+    ../shared/bspgetworkarea.c ../../shared/bsppretaskinghook.c \
+    ../../shared/bsppredriverhook.c startup/bspstart.c startup/bspclean.c \
+    startup/memmap.c ../../shared/bootcard.c ../../shared/sbrk.c \
     ../../shared/gnatinstallhandler.c
 console_SOURCES = console/uart.c 
Index: c/src/lib/libbsp/arm/csb336/configure.ac
===================================================================
--- c/src/lib/libbsp/arm/csb336/configure.ac	(revision c3ee425704ae116621331f4fee5ed8412823d4e3)
+++ c/src/lib/libbsp/arm/csb336/configure.ac	(revision b7774253cfedcd1b25fff538b866711b7dfd5bb2)
@@ -19,4 +19,6 @@
 AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
 
+RTEMS_BSP_BOOTCARD_HANDLES_RAM_ALLOCATION
+
 # Explicitly list all Makefiles here
 AC_CONFIG_FILES([Makefile])
Index: c/src/lib/libbsp/arm/csb336/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/arm/csb336/startup/bspstart.c	(revision c3ee425704ae116621331f4fee5ed8412823d4e3)
+++ c/src/lib/libbsp/arm/csb336/startup/bspstart.c	(revision b7774253cfedcd1b25fff538b866711b7dfd5bb2)
@@ -4,12 +4,12 @@
  * Copyright (c) 2004 by Cogent Computer Systems
  * Written by Jay Monkman <jtm@lopingdog.com>
- *      
+ *
  * The license and distribution terms for this file may be
  * found in the file LICENSE in this distribution or at
- *
  * http://www.rtems.com/license/LICENSE.
  *
  *  $Id$
  */
+
 #include <bsp.h>
 #include <rtems/libcsupport.h>
@@ -18,176 +18,107 @@
 #include <mc9328mxl.h>
 
-/* Global Variables */
-extern void            *_flash_size;
-extern void            *_flash_base;
-extern void            *_sdram_size;
-extern void            *_sdram_base;
-extern void            *_bss_free_start;
+extern void rtems_irq_mngt_init(void);
+extern void mmu_set_cpu_async_mode(void);
 
-unsigned long           free_mem_start;
-unsigned long           free_mem_end;
-
-extern void rtems_irq_mngt_init(void);
-void bsp_libc_init( void *, uint32_t, int );
-
-/**************************************************************************/
-/*                                                                        */
-/* NAME: bsp_pretasking_hook - Function to setup system before startup    */
-/*                                                                        */
-/* DESCRIPTION:                                                           */
-/*   This function is called before drivers are initialized and used      */
-/*   to setup libc and BSP extensions.                                    */
-/*                                                                        */
-/* RESTRICTIONS/LIMITATIONS:                                              */
-/*   Since this function is setting up libc, it cannot use and libc       */
-/*   functions.                                                           */
-/*                                                                        */
-/**************************************************************************/
-void bsp_pretasking_hook(void)
-{
-    uint32_t heap_start;
-    uint32_t heap_size;
-
-    /* 
-     * Set up the heap. 
-     */
-    heap_start =  free_mem_start;
-    heap_size = free_mem_end - free_mem_start;
-
-    /* call rtems lib init - malloc stuff */
-    bsp_libc_init((void *)heap_start, heap_size, 0);
-} 
- 
-
-/**************************************************************************/
-/*                                                                        */
-/* NAME: bsp_start_default - BSP initialization function                  */
-/*                                                                        */
-/* DESCRIPTION:                                                           */
-/*   This function is called before RTEMS is initialized and used         */
-/*   adjust the kernel's configuration.                                   */
-/*                                                                        */
-/*   This function also configures the CPU's memory protection unit.      */
-/*                                                                        */
-/* RESTRICTIONS/LIMITATIONS:                                              */
-/*   Since RTEMS is not configured, no RTEMS functions can be called.     */
-/*                                                                        */
-/**************************************************************************/
-void mmu_set_cpu_async_mode(void);
+/*
+ * bsp_start_default - BSP initialization function
+ *
+ *   This function is called before RTEMS is initialized and used
+ *   adjust the kernel's configuration.
+ *
+ *   This function also configures the CPU's memory protection unit.
+ *
+ * RESTRICTIONS/LIMITATIONS:
+ *   Since RTEMS is not configured, no RTEMS functions can be called.
+ *
+ */
 void bsp_start_default( void )
 {
-    int i;
+  int i;
 
-    /* Set the MCU prescaler to divide by 1 */
-    MC9328MXL_PLL_CSCR &= ~MC9328MXL_PLL_CSCR_PRESC;
+  /* Set the MCU prescaler to divide by 1 */
+  MC9328MXL_PLL_CSCR &= ~MC9328MXL_PLL_CSCR_PRESC;
 
-    /* Enable the MCU PLL */
-    MC9328MXL_PLL_CSCR |= MC9328MXL_PLL_CSCR_MPEN;
+  /* Enable the MCU PLL */
+  MC9328MXL_PLL_CSCR |= MC9328MXL_PLL_CSCR_MPEN;
 
-    /* Delay to allow time for PLL to get going */
-    for (i = 0; i < 100; i++) {
-        asm volatile ("nop\n");
-    }
+  /* Delay to allow time for PLL to get going */
+  for (i = 0; i < 100; i++) {
+    asm volatile ("nop\n");
+  }
 
-    /* Set the CPU to asynchrous clock mode, so it uses its fastest clock */
-    mmu_set_cpu_async_mode();
+  /* Set the CPU to asynchrous clock mode, so it uses its fastest clock */
+  mmu_set_cpu_async_mode();
 
-    /* disable interrupts */
-    MC9328MXL_AITC_INTENABLEL = 0;
-    MC9328MXL_AITC_INTENABLEH = 0;
+  /* disable interrupts */
+  MC9328MXL_AITC_INTENABLEL = 0;
+  MC9328MXL_AITC_INTENABLEH = 0;
 
-    /* Set interrupt priority to -1 (allow all priorities) */
-    MC9328MXL_AITC_NIMASK = 0x1f;
+  /* Set interrupt priority to -1 (allow all priorities) */
+  MC9328MXL_AITC_NIMASK = 0x1f;
 
-    /* Place RTEMS workspace at beginning of free memory. */
-    Configuration.work_space_start = (void *)&_bss_free_start;
-    
-    free_mem_start = ((uint32_t)&_bss_free_start + 
-                      rtems_configuration_get_work_space_size());
-    
-    free_mem_end = ((uint32_t)&_sdram_base + (uint32_t)&_sdram_size);
+  /*
+   * Init rtems exceptions management
+   */
+  rtems_exception_init_mngt();
 
-    /*
-     * Init rtems exceptions management
-     */
-    rtems_exception_init_mngt();
-    
-    /*
-     * Init rtems interrupt management
-     */
-    rtems_irq_mngt_init();
-    
-    
-    /*
-     *  The following information is very useful when debugging.
-     */
-#if 0
-    printk( "work_space_size = 0x%x\n", 
-            rtems_configuration_get_work_space_size() );
-    printk( "microseconds_per_tick = 0x%x\n",
-            rtems_configuration_get_microseconds_per_tick() );
-    printk( "ticks_per_timeslice = 0x%x\n",
-            rtems_configuration_get_ticks_per_timeslice() );
-    printk( "work_space_start = 0x%x\n", 
-            Configuration.work_space_start );
-    printk( "work_space_size = 0x%x\n", 
-            rtems_configuration_get_work_space_size() );
-#endif
+  /*
+   * Init rtems interrupt management
+   */
+  rtems_irq_mngt_init();
 } /* bsp_start */
-
-
 
 /* Calcuate the frequency for perclk1 */
 int get_perclk1_freq(void)
 {
-    unsigned int fin;
-    unsigned int fpll;
-    unsigned int pd;
-    unsigned int mfd;
-    unsigned int mfi;
-    unsigned int mfn;
-    uint32_t reg;
-    int perclk1;
+  unsigned int fin;
+  unsigned int fpll;
+  unsigned int pd;
+  unsigned int mfd;
+  unsigned int mfi;
+  unsigned int mfn;
+  uint32_t reg;
+  int perclk1;
 
-    if (MC9328MXL_PLL_CSCR & MC9328MXL_PLL_CSCR_SYSSEL) {
-        /* Use external oscillator */
-        fin = BSP_OSC_FREQ;
-    } else {
-        /* Use scaled xtal freq */
-        fin = BSP_XTAL_FREQ * 512;
-    }
+  if (MC9328MXL_PLL_CSCR & MC9328MXL_PLL_CSCR_SYSSEL) {
+    /* Use external oscillator */
+    fin = BSP_OSC_FREQ;
+  } else {
+    /* Use scaled xtal freq */
+    fin = BSP_XTAL_FREQ * 512;
+  }
 
-    /* calculate the output of the system PLL */
-    reg = MC9328MXL_PLL_SPCTL0;
-    pd = ((reg & MC9328MXL_PLL_SPCTL_PD_MASK) >> 
-          MC9328MXL_PLL_SPCTL_PD_SHIFT);
-    mfd = ((reg & MC9328MXL_PLL_SPCTL_MFD_MASK) >> 
-           MC9328MXL_PLL_SPCTL_MFD_SHIFT);
-    mfi = ((reg & MC9328MXL_PLL_SPCTL_MFI_MASK) >> 
-           MC9328MXL_PLL_SPCTL_MFI_SHIFT);
-    mfn = ((reg & MC9328MXL_PLL_SPCTL_MFN_MASK) >> 
-           MC9328MXL_PLL_SPCTL_MFN_SHIFT);
+  /* calculate the output of the system PLL */
+  reg = MC9328MXL_PLL_SPCTL0;
+  pd = ((reg & MC9328MXL_PLL_SPCTL_PD_MASK) >>
+        MC9328MXL_PLL_SPCTL_PD_SHIFT);
+  mfd = ((reg & MC9328MXL_PLL_SPCTL_MFD_MASK) >>
+         MC9328MXL_PLL_SPCTL_MFD_SHIFT);
+  mfi = ((reg & MC9328MXL_PLL_SPCTL_MFI_MASK) >>
+         MC9328MXL_PLL_SPCTL_MFI_SHIFT);
+  mfn = ((reg & MC9328MXL_PLL_SPCTL_MFN_MASK) >>
+         MC9328MXL_PLL_SPCTL_MFN_SHIFT);
 
 #if 0
-    printk("fin = %d\n", fin);
-    printk("pd = %d\n", pd);
-    printk("mfd = %d\n", mfd);
-    printk("mfi = %d\n", mfi);
-    printk("mfn = %d\n", mfn);
-    printk("rounded (fin * mfi) / (pd + 1) = %d\n", (fin * mfi) / (pd + 1));
-    printk("rounded (fin * mfn) / ((pd + 1) * (mfd + 1)) = %d\n",
-           ((long long)fin * mfn) / ((pd + 1) * (mfd + 1)));
+  printk("fin = %d\n", fin);
+  printk("pd = %d\n", pd);
+  printk("mfd = %d\n", mfd);
+  printk("mfi = %d\n", mfi);
+  printk("mfn = %d\n", mfn);
+  printk("rounded (fin * mfi) / (pd + 1) = %d\n", (fin * mfi) / (pd + 1));
+  printk("rounded (fin * mfn) / ((pd + 1) * (mfd + 1)) = %d\n",
+         ((long long)fin * mfn) / ((pd + 1) * (mfd + 1)));
 #endif
 
-    fpll = 2 * ( ((fin * mfi  + (pd + 1) / 2) / (pd + 1)) +
-                 (((long long)fin * mfn + ((pd + 1) * (mfd + 1)) / 2) / 
-		 ((pd + 1) * (mfd + 1))) );
+  fpll = 2 * ( ((fin * mfi  + (pd + 1) / 2) / (pd + 1)) +
+               (((long long)fin * mfn + ((pd + 1) * (mfd + 1)) / 2) /
+               ((pd + 1) * (mfd + 1))) );
 
-    /* calculate the output of the PERCLK1 divider */
-    reg = MC9328MXL_PLL_PCDR;
-    perclk1 = fpll / (1 + ((reg & MC9328MXL_PLL_PCDR_PCLK1_MASK) >>
-                           MC9328MXL_PLL_PCDR_PCLK1_SHIFT));
+  /* calculate the output of the PERCLK1 divider */
+  reg = MC9328MXL_PLL_PCDR;
+  perclk1 = fpll / (1 + ((reg & MC9328MXL_PLL_PCDR_PCLK1_MASK) >>
+                         MC9328MXL_PLL_PCDR_PCLK1_SHIFT));
 
-    return perclk1;
+  return perclk1;
 }
 
@@ -196,27 +127,19 @@
  *  can override the actual bsp_start routine used.
  */
-
 void bsp_start (void) __attribute__ ((weak, alias("bsp_start_default")));
-
 
 /**
  *  Reset the system.
  *
- *  This functions enables the watchdog and waits for it to 
- *  fire, thus resetting the system.
- */
-/**
- *  Reset the system.
- *
- *  This functions enables the watchdog and waits for it to 
+ *  This functions enables the watchdog and waits for it to
  *  fire, thus resetting the system.
  */
 void bsp_reset(void)
 {
-    rtems_interrupt_level level;
+  rtems_interrupt_level level;
 
-    _CPU_ISR_Disable(level);
+  _CPU_ISR_Disable(level);
 
-    printk("\n\rI should reset here.\n\r");
-    while(1);
+  printk("\n\rI should reset here.\n\r");
+  while(1);
 }
