summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/bspgetworkarea.c
blob: d799800d610a39b2010ea58176ea6d0b468c5e11 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 *  This set of routines are the BSP specific initialization
 *  support routines.
 *
 *  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.
 */

/* #define BSP_GET_WORK_AREA_DEBUG */
#include <bsp.h>
#include <bsp/bootcard.h>
#ifdef BSP_GET_WORK_AREA_DEBUG
  #include <rtems/bspIo.h>
#endif

/* Tells us where to put the workspace in case remote debugger is present.  */
extern uint32_t rdb_start;

/* Must be aligned to 8, _end is aligned to 8 */
unsigned int early_mem = (unsigned int)&end;

/*
 *  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_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 *)early_mem;
  uintptr_t work_area_size  =
    (uintptr_t)rdb_start - (uintptr_t)early_mem - STACK_SIZE;
  early_mem        = ~0; /* Signal bsp_early_malloc not to be used anymore */

  /*
   *  The following may be helpful in debugging what goes wrong when
   *  you are allocating the Work Area in a new BSP.
   */
  #ifdef BSP_GET_WORK_AREA_DEBUG
    {
      void *sp = __builtin_frame_address(0);
      void *end = *work_area_start + *work_area_size;
      printk(
        "work_area_start = 0x%p\n"
        "work_area_size = %d 0x%08x\n"
        "end = 0x%p\n"
        "current stack pointer = 0x%p%s\n",
        work_area_start,
        work_area_size,  /* decimal */
        work_area_size,  /* hexadecimal */
        end,
        sp,
        ((sp >= *work_area_start && sp <= end) ? " OVERLAPS!" : "")
     );
     printk( "rdb_start = 0x%08x\n", rdb_start );
   }
 #endif

  bsp_work_area_initialize_default(work_area_start, work_area_size);
}