Index: c/src/lib/libbsp/i386/pc386/ChangeLog
===================================================================
--- c/src/lib/libbsp/i386/pc386/ChangeLog	(revision 7f09abec3eeeca99cd0d8312a5dae97485c38525)
+++ c/src/lib/libbsp/i386/pc386/ChangeLog	(revision ef37cb67a1aa02c80a0e4f4c902a8b69ce28dbb8)
@@ -1,2 +1,9 @@
+2008-09-18	Joel Sherrill <joel.sherrill@oarcorp.com>
+
+	* Makefile.am, configure.ac, startup/bspstart.c, startup/linkcmds: Add
+	bsp_get_work_area() implementation and use more of the BSP
+	Initialization Framework.
+	* startup/bspgetworkarea.c: New file.
+
 2008-09-18	Joel Sherrill <joel.sherrill@oarcorp.com>
 
Index: c/src/lib/libbsp/i386/pc386/Makefile.am
===================================================================
--- c/src/lib/libbsp/i386/pc386/Makefile.am	(revision 7f09abec3eeeca99cd0d8312a5dae97485c38525)
+++ c/src/lib/libbsp/i386/pc386/Makefile.am	(revision ef37cb67a1aa02c80a0e4f4c902a8b69ce28dbb8)
@@ -80,5 +80,6 @@
 include_HEADERS += ../../i386/shared/comm/uart.h
 startup_SOURCES = ../../shared/bsplibc.c ../../shared/bsppost.c \
-    ../../shared/bsppredriverhook.c \
+    ../../shared/bsppredriverhook.c startup/bspgetworkarea.c \
+    ../../shared/bsppretaskinghook.c \
     startup/bspstart.c startup/bspclean.c ../../i386/shared/irq/idt.c \
     ../../i386/shared/irq/irq.c ../../i386/shared/irq/irq_init.c \
Index: c/src/lib/libbsp/i386/pc386/configure.ac
===================================================================
--- c/src/lib/libbsp/i386/pc386/configure.ac	(revision 7f09abec3eeeca99cd0d8312a5dae97485c38525)
+++ c/src/lib/libbsp/i386/pc386/configure.ac	(revision ef37cb67a1aa02c80a0e4f4c902a8b69ce28dbb8)
@@ -59,4 +59,6 @@
 AC_SUBST(RTEMS_BSP)
 
+RTEMS_BSP_BOOTCARD_HANDLES_RAM_ALLOCATION
+
 # Explicitly list all Makefiles here
 AC_CONFIG_FILES([Makefile])
Index: c/src/lib/libbsp/i386/pc386/startup/bspgetworkarea.c
===================================================================
--- c/src/lib/libbsp/i386/pc386/startup/bspgetworkarea.c	(revision ef37cb67a1aa02c80a0e4f4c902a8b69ce28dbb8)
+++ c/src/lib/libbsp/i386/pc386/startup/bspgetworkarea.c	(revision ef37cb67a1aa02c80a0e4f4c902a8b69ce28dbb8)
@@ -0,0 +1,131 @@
+/*
+ *  This routine is an implementation of the bsp_get_work_area()
+ *  that can be used by all m68k BSPs following linkcmds conventions
+ *  regarding heap, stack, and workspace allocation.
+ *
+ *  COPYRIGHT (c) 1989-2008.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ *  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 <bsp/bootcard.h>
+
+/*
+ *  These are provided by the linkcmds.
+ */
+extern char   WorkAreaBase[];
+extern char   HeapSize[];
+extern char   RamSize[];
+
+/* rudimentary multiboot info */
+struct multiboot_info {
+  uint32_t  flags;       /* start.S only raises flags for items actually */
+                         /* saved; this allows us to check for the size  */
+                         /* of the data structure.                       */
+  uint32_t  mem_lower;  /* avail kB in lower memory */
+  uint32_t  mem_upper;  /* avail kB in lower memory */
+  /* ... (unimplemented) */
+};
+
+extern struct multiboot_info _boot_multiboot_info;
+
+/*
+ * Board's memory size easily be overridden by application.
+ */
+uint32_t bsp_mem_size = 0;
+
+/* Size of stack used during initialization. Defined in 'start.s'.  */
+extern uint32_t _stack_size;
+
+/* Address of start of free memory. */
+uintptr_t rtemsFreeMemStart;
+
+
+void bsp_size_memory(void)
+{
+  uintptr_t topAddr;
+  uintptr_t lowest;
+  uint32_t  val;
+  int       i;
+
+  /* set the value of start of free memory. */
+  rtemsFreeMemStart = (uint32_t)WorkAreaBase + _stack_size;
+
+  /* Place RTEMS workspace at beginning of free memory. */
+
+  if (rtemsFreeMemStart & (CPU_ALIGNMENT - 1))  /* not aligned => align it */
+    rtemsFreeMemStart = (rtemsFreeMemStart+CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+  /* find the lowest 1M boundary to probe */
+  lowest = ((rtemsFreeMemStart + (1<<20)) >> 20) + 1;
+  if ( lowest  < 2 )
+      lowest = 2;
+
+  /* The memory detection algorithm is very crude; try
+   * to use multiboot info, if possible (set from start.S)
+   */
+  if ( ((uintptr_t)RamSize == (uintptr_t) 0xFFFFFFFF)  &&
+       (_boot_multiboot_info.flags & 1) &&
+       _boot_multiboot_info.mem_upper ) {
+    bsp_mem_size = _boot_multiboot_info.mem_upper * 1024;
+    printk( "multiboot\n" );
+  }
+
+  if ( (uintptr_t) RamSize == (uintptr_t) 0xFFFFFFFF ) {
+    printk( "sizing\n" );
+    /*
+     * We have to dynamically size memory. Memory size can be anything
+     * between no less than 2M and 2048M.
+     * let us first write
+     */
+    for (i=2048; i>=lowest; i--) {
+      topAddr = i*1024*1024 - 4;
+      *(volatile uint32_t*)topAddr = topAddr;
+    }
+
+    for(i=lowest; i<=2048; i++) {
+      topAddr = i*1024*1024 - 4;
+      val =  *(uint32_t*)topAddr;
+      if (val != topAddr) {
+        break;
+      }
+    }
+      
+    topAddr = (i-1)*1024*1024 - 4;
+  } else {
+    printk( "hardcoded\n" );
+    topAddr = (uintptr_t) RamSize;
+  }
+
+  bsp_mem_size = topAddr;
+}
+/*
+ *  This method returns the base address and size of the area which
+ *  is to be allocated between the RTEMS Workspace and the C Program
+ *  Heap.
+ */
+void bsp_get_work_area(
+  void   **work_area_start,
+  size_t  *work_area_size,
+  void   **heap_start,
+  size_t  *heap_size
+)
+{
+  *work_area_start = (void *) rtemsFreeMemStart;
+  *work_area_size  = (uintptr_t) bsp_mem_size - (uintptr_t) rtemsFreeMemStart;
+  *heap_start      = BSP_BOOTCARD_HEAP_USES_WORK_AREA;
+  *heap_size       = (size_t) HeapSize;
+
+  #if 0
+    printk( "WorkArea Base = %p\n", *work_area_start );
+    printk( "WorkArea Size = 0x%08x\n", *work_area_size );
+    printk( "C Program Heap Base = %p\n", *heap_start );
+    printk( "C Program Heap Size = 0x%08x\n", *heap_size );
+  #endif
+}
Index: c/src/lib/libbsp/i386/pc386/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/i386/pc386/startup/bspstart.c	(revision 7f09abec3eeeca99cd0d8312a5dae97485c38525)
+++ c/src/lib/libbsp/i386/pc386/startup/bspstart.c	(revision ef37cb67a1aa02c80a0e4f4c902a8b69ce28dbb8)
@@ -20,5 +20,5 @@
 | With the following copyright notice:
 | **************************************************************************
-| *  COPYRIGHT (c) 1989-1999.
+| *  COPYRIGHT (c) 1989-2008.
 | *  On-Line Applications Research Corporation (OAR).
 | *
@@ -35,118 +35,10 @@
 #include <libcpu/cpuModel.h>
 
-/*-------------------------------------------------------------------------+
-| Global Variables
-+--------------------------------------------------------------------------*/
-extern uint32_t         _end;         /* End of BSS. Defined in 'linkcmds'. */
-
-/* rudimentary multiboot info */
-struct multiboot_info {
-	uint32_t	flags;		/* start.S only raises flags for items actually saved; this allows us to check for the size of the data structure */
-	uint32_t	mem_lower;	/* avail kB in lower memory */
-	uint32_t	mem_upper;	/* avail kB in lower memory */
-	/* ... (unimplemented) */
-};
-
-extern struct multiboot_info _boot_multiboot_info;
 /*
- * Size of heap if it is 0 it will be dynamically defined by memory size,
- * otherwise the value should be changed by binary patch
+ *  External routines
  */
-uint32_t         _heap_size = 0;
-
-/* Alternative way to hardcode the board's memory size [rather than heap size].
- * Can easily be overridden by application.
- */
-extern uint32_t bsp_mem_size
-  __attribute__ ((weak, alias("bsp_mem_size_default")));
-uint32_t bsp_mem_size_default = 0;
-
-/* Size of stack used during initialization. Defined in 'start.s'.  */
-extern uint32_t         _stack_size;
-
-uint32_t         rtemsFreeMemStart;
-                         /* Address of start of free memory - should be updated
-                            after creating new partitions or regions.         */
-
-
-/*-------------------------------------------------------------------------+
-| External Prototypes
-+--------------------------------------------------------------------------*/
+extern void Calibrate_loop_1ms(void);
 extern void rtems_irq_mngt_init(void);
-void bsp_libc_init( void *, uint32_t, int );
-
-/*-------------------------------------------------------------------------+
-|         Function: bsp_pretasking_hook
-|      Description: BSP pretasking hook.  Called just before drivers are
-|                   initialized. Used to setup libc and install any BSP
-|                   extensions. NOTE: Must not use libc (to do io) from here,
-|                   since drivers are not yet initialized.
-| Global Variables: None.
-|        Arguments: None.
-|          Returns: Nothing.
-+--------------------------------------------------------------------------*/
-void bsp_pretasking_hook(void)
-{
-  uint32_t topAddr, val;
-  int      i, lowest;
-
-  if (rtemsFreeMemStart & (CPU_ALIGNMENT - 1))  /* not aligned => align it */
-    rtemsFreeMemStart = (rtemsFreeMemStart+CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
-
-  /* find the lowest 1M boundary to probe */
-  lowest = ((rtemsFreeMemStart + (1<<20)) >> 20) + 1;
-  if ( lowest  < 2 )
-      lowest = 2;
-
-  /* The memory detection algorithm is very crude; try
-   * to use multiboot info, if possible (set from start.S)
-   */
-  if ( bsp_mem_size == 0 &&
-       (_boot_multiboot_info.flags & 1) &&
-       _boot_multiboot_info.mem_upper ) {
-    bsp_mem_size = _boot_multiboot_info.mem_upper * 1024;
-  }
-
-  if ( _heap_size == 0 ) {
-    if ( bsp_mem_size == 0 ) {
-        /*
-         * We have to dynamically size memory. Memory size can be anything
-         * between no less than 2M and 2048M.
-         * let us first write
-         */
-        for (i=2048; i>=lowest; i--) {
-          topAddr = i*1024*1024 - 4;
-          *(volatile uint32_t*)topAddr = topAddr;
-        }
-
-        for(i=lowest; i<=2048; i++) {
-          topAddr = i*1024*1024 - 4;
-          val =  *(uint32_t*)topAddr;
-          if (val != topAddr) {
-            break;
-          }
-        }
-      
-        topAddr = (i-1)*1024*1024 - 4;
-      } else {
-        topAddr = bsp_mem_size;
-      }
-
-    if ( rtemsFreeMemStart > topAddr ) {
-      printk( "Out of memory -- unable to initialize BSP\n" );
-      rtems_fatal_error_occurred( 0x85858585 ); 
-    }
- 
-    _heap_size = topAddr - rtemsFreeMemStart;
-  }
-
-  bsp_libc_init((void *)rtemsFreeMemStart, _heap_size, 0);
-  rtemsFreeMemStart += _heap_size;           /* HEAP_SIZE  in KBytes */
-} /* bsp_pretasking_hook */
-
-/*
- *  External but essentially private method
- */
-void Calibrate_loop_1ms(void);
+extern void bsp_size_memory(void);
 
 /*-------------------------------------------------------------------------+
@@ -162,18 +54,12 @@
 
   /*
+   *  We need to determine how much memory there is in the system.
+   */
+  bsp_size_memory();
+
+  /*
    * Calibrate variable for 1ms-loop (see timer.c)
    */
   Calibrate_loop_1ms();
-
-  /* set the value of start of free memory. */
-  rtemsFreeMemStart = (uint32_t)&_end + _stack_size;
-
-  /* Place RTEMS workspace at beginning of free memory. */
-
-  if (rtemsFreeMemStart & (CPU_ALIGNMENT - 1))  /* not aligned => align it */
-    rtemsFreeMemStart = (rtemsFreeMemStart+CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
-
-  Configuration.work_space_start = (void *)rtemsFreeMemStart;
-  rtemsFreeMemStart += rtems_configuration_get_work_space_size();
 
   /*
@@ -193,13 +79,4 @@
       printk("PCI bus: could not initialize PCI BIOS interface\n");
   }
-
-
-#if 0
-  printk( "_heap_size = 0x%x\n", _heap_size );
-  printk( "_stack_size = 0x%x\n", _stack_size );
-  printk( "rtemsFreeMemStart = 0x%x\n", rtemsFreeMemStart );
-  printk( "work_space_start = 0x%x\n", rtems_configuration_get_work_space_start() );
-  printk( "work_space_size = 0x%x\n", rtems_configuration_get_work_space_size() );
-#endif
 } /* bsp_start */
 
Index: c/src/lib/libbsp/i386/pc386/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/i386/pc386/startup/linkcmds	(revision 7f09abec3eeeca99cd0d8312a5dae97485c38525)
+++ c/src/lib/libbsp/i386/pc386/startup/linkcmds	(revision ef37cb67a1aa02c80a0e4f4c902a8b69ce28dbb8)
@@ -18,4 +18,7 @@
 ENTRY(_start)
 */
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
+RamSize = DEFINED(RamSize) ? RamSize    : 0xFFFFFFFF;
+
 SECTIONS
 {
@@ -184,5 +187,8 @@
   . = ALIGN(32 / 8);
   _end = .; PROVIDE (end = .);
+  . = ALIGN(0x10);
+  WorkAreaBase = .;
   . = DATA_SEGMENT_END (.);
+
   /* Stabs debugging sections.  */
   .stab          0 : { *(.stab) }
