summaryrefslogblamecommitdiffstats
path: root/c/src/exec/score/cpu/sparc/sparc.h
blob: 3c5f0574f51832f020a47f29f07703d1082de10a (plain) (tree)















































































































































































                                                                            
/*  sparc.h
 *
 *  This include file contains information pertaining to the Motorola
 *  SPARC processor family.
 *
 *  $Id$
 */

#ifndef _INCLUDE_SPARC_h
#define _INCLUDE_SPARC_h

#ifdef __cplusplus
extern "C" {
#endif

/*
 *  The following define the CPU Family and Model within the family
 *
 *  NOTE: The string "REPLACE_THIS_WITH_THE_CPU_MODEL" is replaced
 *        with the name of the appropriate macro for this target CPU.
 */
 
#ifdef sparc
#undef sparc
#endif
#define sparc

#ifdef REPLACE_THIS_WITH_THE_CPU_MODEL
#undef REPLACE_THIS_WITH_THE_CPU_MODEL
#endif
#define REPLACE_THIS_WITH_THE_CPU_MODEL
 
#ifdef REPLACE_THIS_WITH_THE_BSP
#undef REPLACE_THIS_WITH_THE_BSP
#endif
#define REPLACE_THIS_WITH_THE_BSP

/*
 *  This file contains the information required to build
 *  RTEMS for a particular member of the "sparc"
 *  family when executing in protected mode.  It does
 *  this by setting variables to indicate which implementation
 *  dependent features are present in a particular member
 *  of the family.
 *
 *  Currently recognized feature flags:
 *
 *    + SPARC_HAS_FPU 
 *        0 - no HW FPU
 *        1 - has HW FPU (assumed to be compatible w/90C602)
 *
 *    + SPARC_HAS_BITSCAN 
 *        0 - does not have scan instructions
 *        1 - has scan instruction  (no support implemented)
 * 
 */
 
#if defined(erc32)
 
#define CPU_MODEL_NAME  "erc32"
#define SPARC_HAS_FPU     1
#define SPARC_HAS_BITSCAN 0
 
#else
 
#error "Unsupported CPU Model"
 
#endif

/*
 *  Define the name of the CPU family.
 */

#define CPU_NAME "SPARC"

/*
 *  Standard nop
 */

#define nop() \
  do { \
    asm volatile ( "nop" ); \
  } while ( 0 )

/*
 *  Some macros to aid in accessing special registers.
 */

#define sparc_get_psr( _psr ) \
  do { \
     (_psr) = 0; \
     asm volatile( "rd %%psr, %0" :  "=r" (_psr) : "0" (_psr) ); \
  } while ( 0 )

#define sparc_set_psr( _psr ) \
  do { \
    asm volatile ( "wr   %%g0,%0,%%psr " : "=r" ((_psr)) : "0" ((_psr)) ); \
    nop(); nop(); nop(); \
  } while ( 0 )

#define sparc_get_tbr( _tbr ) \
  do { \
     asm volatile( "rd %%tbr, %0" :  "=r" (_tbr) : "0" (_tbr) ); \
  } while ( 0 )

#define sparc_set_tbr( _tbr ) \
  do { \
  } while ( 0 )

#define sparc_get_wim( _wim ) \
  do { \
     asm volatile( "rd %%wim, %0" :  "=r" (_wim) : "0" (_wim) ); \
  } while ( 0 )

#define sparc_set_wim( _wim ) \
  do { \
  } while ( 0 )

/*
 *  Manipulate the interrupt level in the psr 
 *
 */

#define SPARC_PIL_MASK  0x00000F00

#define sparc_disable_interrupts( _level ) \
  do { register unsigned int _mask = SPARC_PIL_MASK; \
    (_level) = 0; \
    \
    asm volatile ( "rd   %%psr,%0 ; \
                    wr   %0,%1,%%psr " \
                    : "=r" ((_level)), "=r" (_mask) \
                    : "0" ((_level)), "1" (_mask) \
    ); \
    nop(); nop(); nop(); \
  } while ( 0 )
 
#define sparc_enable_interrupts( _level ) \
  do { unsigned int _tmp; \
    sparc_get_psr( _tmp ); \
    _tmp &= ~SPARC_PIL_MASK; \
    _tmp |= (_level) & SPARC_PIL_MASK; \
    sparc_set_psr( _tmp ); \
  } while ( 0 ) 
  
 
#define sparc_flash_interrupts( _level ) \
  do { \
      register unsigned32 _ignored = 0; \
      sparc_enable_interrupts( (_level) ); \
      sparc_disable_interrupts( _ignored ); \
  } while ( 0 )

#define sparc_set_interrupt_level( _new_level ) \
  do { register unsigned32 _new_psr_level = 0; \
    \
    sparc_get_psr( _new_psr_level ); \
    _new_psr_level &= ~SPARC_PIL_MASK; \
    _new_psr_level |= (((_new_level) << 8) & SPARC_PIL_MASK); \
    sparc_set_psr( _new_psr_level ); \
  } while ( 0 )

#define sparc_get_interrupt_level( _level ) \
  do { \
    register unsigned32 _psr_level = 0; \
    \
    sparc_get_psr( _psr_level ); \
    (_level) = (_psr_level & SPARC_PIL_MASK) >> 8; \
  } while ( 0 )

#ifdef __cplusplus
}
#endif

#endif /* ! _INCLUDE_SPARC_h */
/* end of include file */