⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu.h

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 H
字号:
/*  cpu.h * *  This include file contains information pertaining to the Intel *  i960 processor family. * *  COPYRIGHT (c) 1989-1999. *  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: cpu.h,v 1.12.2.1 2003/09/04 18:47:27 joel Exp $ */#ifndef __CPU_h#define __CPU_h#ifdef __cplusplusextern "C" {#endif#include <rtems/score/i960.h>              /* pick up machine definitions */#ifndef ASM#include <rtems/score/types.h>#endif#define CPU_INLINE_ENABLE_DISPATCH       FALSE#define CPU_UNROLL_ENQUEUE_PRIORITY      FALSE/* *  Use the i960's hardware interrupt stack support and have the *  interrupt manager allocate the memory for it. */#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE#define CPU_ALLOCATE_INTERRUPT_STACK     TRUE/* *  Does the RTEMS invoke the user's ISR with the vector number and *  a pointer to the saved interrupt frame (1) or just the vector  *  number (0)? */#define CPU_ISR_PASSES_FRAME_POINTER 0/* *  Some family members have no FP (SA/KA/CA/CF), others have it built in *  (KB/MC/MX).  There does not appear to be an external coprocessor *  for this family. */#if ( I960_HAS_FPU == 1 )#define CPU_HARDWARE_FP     TRUE#error "Floating point support for i960 family has been implemented!!!"#else#define CPU_HARDWARE_FP     FALSE#endif#define CPU_SOFTWARE_FP     FALSE#define CPU_ALL_TASKS_ARE_FP             FALSE#define CPU_IDLE_TASK_IS_FP              FALSE#define CPU_USE_DEFERRED_FP_SWITCH       TRUE#define CPU_PROVIDES_IDLE_THREAD_BODY    FALSE#define CPU_STACK_GROWS_UP               TRUE#define CPU_STRUCTURE_ALIGNMENT          /* __attribute__ ((aligned (16))) *//* *  Define what is required to specify how the network to host conversion *  routines are handled. */#define CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES     FALSE#define CPU_BIG_ENDIAN                           TRUE#define CPU_LITTLE_ENDIAN                        FALSE/* structures *//* *  Basic integer context for the i960 family. */typedef struct {  void       *r0_pfp;                 /* (r0)  Previous Frame Pointer */  void       *r1_sp;                  /* (r1)  Stack Pointer */  unsigned32  pc;                     /* (pc)  Processor Control */  void       *g8;                     /* (g8)  Global Register 8 */  void       *g9;                     /* (g9)  Global Register 9 */  void       *g10;                    /* (g10) Global Register 10 */  void       *g11;                    /* (g11) Global Register 11 */  void       *g12;                    /* (g12) Global Register 12 */  void       *g13;                    /* (g13) Global Register 13 */  unsigned32  g14;                    /* (g14) Global Register 14 */  void       *g15_fp;                 /* (g15) Frame Pointer */}   Context_Control;/* *  FP context save area for the i960 Numeric Extension */typedef struct {   unsigned32  fp0_1;                 /* (fp0) first word  */   unsigned32  fp0_2;                 /* (fp0) second word */   unsigned32  fp0_3;                 /* (fp0) third word  */   unsigned32  fp1_1;                 /* (fp1) first word  */   unsigned32  fp1_2;                 /* (fp1) second word */   unsigned32  fp1_3;                 /* (fp1) third word  */   unsigned32  fp2_1;                 /* (fp2) first word  */   unsigned32  fp2_2;                 /* (fp2) second word */   unsigned32  fp2_3;                 /* (fp2) third word  */   unsigned32  fp3_1;                 /* (fp3) first word  */   unsigned32  fp3_2;                 /* (fp3) second word */   unsigned32  fp3_3;                 /* (fp3) third word  */} Context_Control_fp;/* *  The following structure defines the set of information saved *  on the current stack by RTEMS upon receipt of each interrupt. */typedef struct {  unsigned32   TBD;   /* XXX Fix for this CPU */} CPU_Interrupt_frame;/* *  Call frame for the i960 family. */typedef struct {  void       *r0_pfp;                 /* (r0)  Previous Frame Pointer */  void       *r1_sp;                  /* (r1)  Stack Pointer */  void       *r2_rip;                 /* (r2)  Return Instruction Pointer */  void       *r3;                     /* (r3)  Local Register 3 */  void       *r4;                     /* (r4)  Local Register 4 */  void       *r5;                     /* (r5)  Local Register 5 */  void       *r6;                     /* (r6)  Local Register 6 */  void       *r7;                     /* (r7)  Local Register 7 */  void       *r8;                     /* (r8)  Local Register 8 */  void       *r9;                     /* (r9)  Local Register 9 */  void       *r10;                    /* (r10) Local Register 10 */  void       *r11;                    /* (r11) Local Register 11 */  void       *r12;                    /* (r12) Local Register 12 */  void       *r13;                    /* (r13) Local Register 13 */  void       *r14;                    /* (r14) Local Register 14 */  void       *r15;                    /* (r15) Local Register 15 */  /* XXX Looks like sometimes there is FP stuff here (MC manual)? */}   CPU_Call_frame;/* *  The following table contains the information required to configure *  the i960 specific parameters. */typedef struct {  void       (*pretasking_hook)( void );  void       (*predriver_hook)( void );  void       (*postdriver_hook)( void );  void       (*idle_task)( void );  boolean      do_zero_of_workspace;  unsigned32   idle_task_stack_size;  unsigned32   interrupt_stack_size;  unsigned32   extra_mpci_receive_server_stack;  void *     (*stack_allocate_hook)( unsigned32 );  void       (*stack_free_hook)( void* );  /* end of fields required on all CPUs */}   rtems_cpu_table;/* *  Macros to access required entires in the CPU Table are in  *  the file rtems/system.h. *//* *  Macros to access i960 specific additions to the CPU Table * *  NONE *//* variables */SCORE_EXTERN void               *_CPU_Interrupt_stack_low;SCORE_EXTERN void               *_CPU_Interrupt_stack_high;/* constants *//* *  This defines the number of levels and the mask used to pick those *  bits out of a thread mode. */#define CPU_MODES_INTERRUPT_LEVEL  0x0000001f  /* interrupt level in mode */#define CPU_MODES_INTERRUPT_MASK   0x0000001f  /* interrupt level in mode *//* *  context size area for floating point */#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )/* *  extra stack required by the MPCI receive server thread */#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK (CPU_STACK_MINIMUM_SIZE)/* *  i960 family supports 256 distinct vectors. */#define CPU_INTERRUPT_NUMBER_OF_VECTORS      256#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER  (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)/* *  This is defined if the port has a special way to report the ISR nesting *  level.  Most ports maintain the variable _ISR_Nest_level. */#define CPU_PROVIDES_ISR_IS_IN_PROGRESS FALSE/* *  Minimum size of a thread's stack. * *  NOTE:  See CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK */#define CPU_STACK_MINIMUM_SIZE          2048/* *  i960 is pretty tolerant of alignment but some CPU models do *  better with different default aligments so we use what the *  CPU model selected in rtems/score/i960.h. */#define CPU_ALIGNMENT                   I960_CPU_ALIGNMENT#define CPU_HEAP_ALIGNMENT              CPU_ALIGNMENT#define CPU_PARTITION_ALIGNMENT         CPU_ALIGNMENT/* * i960ca stack requires 16 byte alignment * *  NOTE:  This factor may need to be family member dependent. */#define CPU_STACK_ALIGNMENT        16/* macros *//* *  ISR handler macros * *  These macros perform the following functions: *     + initialize the RTEMS vector table *     + disable all maskable CPU interrupts *     + restore previous interrupt level (enable) *     + temporarily restore interrupts (flash) *     + set a particular level */#define _CPU_Initialize_vectors()#define _CPU_ISR_Disable( _level ) i960_disable_interrupts( _level )#define _CPU_ISR_Enable( _level )  i960_enable_interrupts( _level )#define _CPU_ISR_Flash( _level )   i960_flash_interrupts( _level )#define _CPU_ISR_Set_level( newlevel ) \  { \    unsigned32 _mask = 0; \    unsigned32 _level = (newlevel); \    \    __asm__ volatile ( "ldconst 0x1f0000,%0; \                    modpc   0,%0,%1"     : "=d" (_mask), "=d" (_level) \                                         : "0"  (_mask), "1" (_level) \    ); \  }unsigned32 _CPU_ISR_Get_level( void );/* ISR handler section macros *//* *  Context handler macros * *  These macros perform the following functions: *     + initialize a context area *     + restart the current thread *     + calculate the initial pointer into a FP context area *     + initialize an FP context area */#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \                                  _isr, _entry, _is_fp ) \ { CPU_Call_frame *_texit_frame; \   unsigned32 _mask; \   unsigned32 _base_pc; \   unsigned32  _stack_tmp; \   void       *_stack; \   \  _stack_tmp = (unsigned32)(_stack_base) + CPU_STACK_ALIGNMENT; \  _stack_tmp &= ~(CPU_STACK_ALIGNMENT - 1); \  _stack = (void *) _stack_tmp; \   \   __asm__ volatile ( "flushreg" : : );   /* flush register cache */ \   \   (_the_context)->r0_pfp = _stack; \   (_the_context)->g15_fp = _stack + (1 * sizeof(CPU_Call_frame)); \   (_the_context)->r1_sp  = _stack + (2 * sizeof(CPU_Call_frame)); \   __asm__ volatile ( "ldconst 0x1f0000,%0 ; " \                  "modpc   0,0,%1 ; " \                  "andnot  %0,%1,%1 ; " \                  : "=d" (_mask), "=d" (_base_pc) : ); \   (_the_context)->pc     = _base_pc | ((_isr) << 16); \   (_the_context)->g14    = 0; \   \   _texit_frame         = (CPU_Call_frame *)_stack; \   _texit_frame->r0_pfp = NULL; \   _texit_frame->r1_sp  = (_the_context)->g15_fp; \   _texit_frame->r2_rip = (_entry); \ }#define _CPU_Context_Restart_self( _the_context ) \   _CPU_Context_restore( (_the_context) );#define _CPU_Context_Fp_start( _base, _offset )         NULL#define _CPU_Context_Initialize_fp( _fp_area )/* end of Context handler macros *//* *  Fatal Error manager macros * *  These macros perform the following functions: *    + disable interrupts and halt the CPU */#define _CPU_Fatal_halt( _errorcode ) \  { unsigned32 _mask, _level; \    unsigned32 _error = (_errorcode); \    \    __asm__ volatile ( "ldconst 0x1f0000,%0 ; \                    mov     %0,%1 ; \                    modpc   0,%0,%1 ; \                    mov     %2,g0 ; \            self:   b       self " \                    : "=d" (_mask), "=d" (_level), "=d" (_error) : ); \  }/* end of Fatal Error Manager macros *//* *  Bitfield handler macros * *  These macros perform the following functions: *     + scan for the highest numbered (MSB) set in a 16 bit bitfield */#define CPU_USE_GENERIC_BITFIELD_CODE FALSE#define CPU_USE_GENERIC_BITFIELD_DATA FALSE#define _CPU_Bitfield_Find_first_bit( _value, _output ) \  { unsigned32 _search = (_value); \    \    (_output) = 0; /* to prevent warnings */ \    __asm__ volatile ( "scanbit   %0,%1  " \                    : "=d" (_search), "=d" (_output) \                    : "0"  (_search), "1"  (_output) ); \  }/* end of Bitfield handler macros *//* *  Priority handler macros * *  These macros perform the following functions: *    + return a mask with the bit for this major/minor portion of *      of thread priority set. *    + translate the bit number returned by "Bitfield_find_first_bit" *      into an index into the thread ready chain bit maps */#define _CPU_Priority_Mask( _bit_number ) \   ( 0x8000 >> (_bit_number) )#define _CPU_Priority_bits_index( _priority ) \   ( 15 - (_priority) )/* end of Priority handler macros *//* functions *//* *  _CPU_Initialize * *  This routine performs CPU dependent initialization. */void _CPU_Initialize(  rtems_cpu_table  *cpu_table,  void      (*thread_dispatch));/* *  _CPU_ISR_install_raw_handler * *  This routine installs a "raw" interrupt handler directly into the  *  processor's vector table. */ void _CPU_ISR_install_raw_handler(  unsigned32  vector,  proc_ptr    new_handler,  proc_ptr   *old_handler);/* *  _CPU_ISR_install_vector * *  This routine installs an interrupt vector. */void _CPU_ISR_install_vector(  unsigned32  vector,  proc_ptr    new_handler,  proc_ptr   *old_handler);/* *  _CPU_Install_interrupt_stack * *  This routine installs the hardware interrupt stack pointer. */void _CPU_Install_interrupt_stack( void );/* *  _CPU_Context_switch * *  This routine switches from the run context to the heir context. */void _CPU_Context_switch(  Context_Control  *run,  Context_Control  *heir);/* *  _CPU_Context_restore * *  This routine is generally used only to restart self in an *  efficient manner and avoid stack conflicts. */void _CPU_Context_restore(  Context_Control *new_context);/* *  _CPU_Context_save_fp * *  This routine saves the floating point context passed to it. */void _CPU_Context_save_fp(  void        **fp_context_ptr);/* *  _CPU_Context_restore_fp * *  This routine restores the floating point context passed to it. */void _CPU_Context_restore_fp(  void        **fp_context_ptr);#ifdef __cplusplus}#endif#endif/* end of include file */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -