Пример #1
0
rtems_isr Spurious_Isr(
  rtems_vector_number vector
)
{
  /*int sp = 0; */
#if 0
  const char * const VectDescrip[] = {
    _Spurious_Error_[0],   _Spurious_Error_[0],  _Spurious_Error_[1],
    _Spurious_Error_[2],   _Spurious_Error_[3],  _Spurious_Error_[4],
    _Spurious_Error_[5],   _Spurious_Error_[6],  _Spurious_Error_[7],
    _Spurious_Error_[8],   _Spurious_Error_[9], _Spurious_Error_[10],
    _Spurious_Error_[11], _Spurious_Error_[12], _Spurious_Error_[13],
    _Spurious_Error_[13], _Spurious_Error_[14], _Spurious_Error_[14],
    _Spurious_Error_[14], _Spurious_Error_[14], _Spurious_Error_[14],
    _Spurious_Error_[14], _Spurious_Error_[14], _Spurious_Error_[14],
    _Spurious_Error_[15], _Spurious_Error_[16], _Spurious_Error_[17],
    _Spurious_Error_[18], _Spurious_Error_[19], _Spurious_Error_[20],
    _Spurious_Error_[21], _Spurious_Error_[22], _Spurious_Error_[23],
    _Spurious_Error_[24], _Spurious_Error_[23], _Spurious_Error_[23],
    _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
    _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
    _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
    _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[25],
    _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
    _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
    _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
    _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[27],
    _Spurious_Error_[27], _Spurious_Error_[27], _Spurious_Error_[27],
    _Spurious_Error_[27], _Spurious_Error_[28]};
#endif

  /*asm volatile ( "movea.l   %%sp,%0 " : "=a" (sp) : "0" (sp) ); */

  _CPU_ISR_Set_level( 7 );
  /*_UART_flush(); */
#if 0
  RAW_PUTS("\n\rRTEMS: Spurious interrupt: ");
  RAW_PUTS((char *)VectDescrip[( (vector>64) ? 64 : vector )]);
  RAW_PUTS("\n\rRTEMS:    Vector: ");
  RAW_PUTI(vector);
  RAW_PUTS(" sp: ");
  RAW_PUTI(sp);
  RAW_PUTS("\n\r");
#endif
  bsp_cleanup();

  /* BDM SIGEMT */
  asm("  .word  0x4afa");

  for(;;);
}
Пример #2
0
/*
 *  This is the initialization framework routine that weaves together
 *  calls to RTEMS and the BSP in the proper sequence to initialize
 *  the system while maximizing shared code and keeping BSP code in C
 *  as much as possible.
 */
int boot_card(
    const char *cmdline
)
{
    rtems_interrupt_level  bsp_isr_level;
    void                  *work_area_start = NULL;
    uintptr_t              work_area_size = 0;
    void                  *heap_start = NULL;
    uintptr_t              heap_size = 0;

    /*
     * Special case for PowerPC: The interrupt disable mask is stored in SPRG0.
     * It must be valid before we can use rtems_interrupt_disable().
     */
#ifdef PPC_INTERRUPT_DISABLE_MASK_DEFAULT
    ppc_interrupt_set_disable_mask( PPC_INTERRUPT_DISABLE_MASK_DEFAULT );
#endif /* PPC_INTERRUPT_DISABLE_MASK_DEFAULT */

    /*
     *  Make sure interrupts are disabled.
     */
    rtems_interrupt_disable( bsp_isr_level );

    bsp_boot_cmdline = cmdline;

    /*
     * Invoke Board Support Package initialization routine written in C.
     */
    bsp_start();

    /*
     *  Find out where the block of memory the BSP will use for
     *  the RTEMS Workspace and the C Program Heap is.
     */
    bsp_get_work_area(&work_area_start, &work_area_size,
                      &heap_start, &heap_size);

    if ( work_area_size <= Configuration.work_space_size ) {
        printk(
            "bootcard: work space too big for work area: %p > %p\n",
            (void *) Configuration.work_space_size,
            (void *) work_area_size
        );
        bsp_cleanup();
        return -1;
    }

    if ( rtems_unified_work_area ) {
        Configuration.work_space_start = work_area_start;
        Configuration.work_space_size  = work_area_size;
    } else {
        Configuration.work_space_start = work_area_start;
    }

#if (BSP_DIRTY_MEMORY == 1)
    memset( work_area_start, 0xCF,  work_area_size );
#endif

    /*
     *  Initialize RTEMS data structures
     */
    rtems_initialize_data_structures();

    /*
     *  Initialize the C library for those BSPs using the shared
     *  framework.
     */
    bootcard_bsp_libc_helper(
        work_area_start,
        work_area_size,
        heap_start,
        heap_size
    );

    /*
     *  All BSP to do any required initialization now that RTEMS
     *  data structures are initialized.  In older BSPs or those
     *  which do not use the shared framework, this is the typical
     *  time when the C Library is initialized so malloc()
     *  can be called by device drivers.  For BSPs using the shared
     *  framework, this routine can be empty.
     */
    bsp_pretasking_hook();

    /*
     *  If debug is enabled, then enable all dynamic RTEMS debug
     *  capabilities.
     *
     *  NOTE: Most debug features are conditionally compiled in
     *        or enabled via configure time plugins.
     */
#ifdef RTEMS_DEBUG
    rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
#endif

    /*
     *  Let RTEMS perform initialization it requires before drivers
     *  are allowed to be initialized.
     */
    rtems_initialize_before_drivers();

    /*
     *  Execute BSP specific pre-driver hook. Drivers haven't gotten
     *  to initialize yet so this is a good chance to initialize
     *  buses, spurious interrupt handlers, etc..
     *
     *  NOTE: Many BSPs do not require this handler and use the
     *        shared stub.
     */
    bsp_predriver_hook();

    /*
     *  Initialize all device drivers.
     */
    rtems_initialize_device_drivers();

    /*
     *  Invoke the postdriver hook.  This normally opens /dev/console
     *  for use as stdin, stdout, and stderr.
     */
    bsp_postdriver_hook();

    /*
     *  Complete initialization of RTEMS and switch to the first task.
     *  Global C++ constructors will be executed in the context of that task.
     */
    rtems_initialize_start_multitasking();

    /***************************************************************
     ***************************************************************
     *  APPLICATION RUNS HERE!!!  When it shuts down, we return!!! *
     ***************************************************************
     ***************************************************************
     */

    /*
     *  Perform any BSP specific shutdown actions which are written in C.
     */
    bsp_cleanup();

    /*
     *  Now return to the start code.
     */
    return 0;
}