Changeset b22b1294 in rtems


Ignore:
Timestamp:
Jun 25, 1998, 4:26:43 PM (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
7252f656
Parents:
a5400c0
Message:

Coldfire support patch from David Fiddes <D.J.Fiddes@…>.

Location:
c/src/exec/score/cpu/m68k
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/score/cpu/m68k/cpu.h

    ra5400c0 rb22b1294  
    392392 */
    393393
     394#if ( M68K_COLDFIRE_ARCH == 1 )
     395#define _CPU_Fatal_halt( _error ) \
     396  { asm volatile( "move.w %%sr,%%d0\n\t" \
     397                  "or.l %2,%%d0\n\t" \
     398                  "move.w %%d0,%%sr\n\t" \
     399                  "move.l %1,%%d0\n\t" \
     400                  "move.l #0xDEADBEEF,%%d1\n\t" \
     401                  "halt" \
     402                  : "=g" (_error) \
     403                  : "0" (_error), "d"(0x0700) \
     404                  : "d0", "d1" ); \
     405  }
     406#else
    394407#define _CPU_Fatal_halt( _error ) \
    395408  { asm volatile( "movl  %0,%%d0; " \
     
    397410                  "stop  #0x2700" : "=d" ((_error)) : "0" ((_error)) ); \
    398411  }
     412#endif
    399413
    400414/* end of Fatal Error manager macros */
     
    426440   _CPU_Priority_bits_index is not needed), handles the 0 case, and
    427441   does not molest _value -- jsg */
    428 #if ( M68K_HAS_EXTB_L == 1 )
     442#if ( M68K_COLDFIRE_ARCH == 1 )
     443#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
     444  { \
     445    extern const unsigned char __BFFFOtable[256]; \
     446    register int dumby; \
     447    \
     448    asm volatile ( \
     449       "   clr.l   %1\n"         \
     450       "   move.w  %2,%1\n"      \
     451       "   lsr.l   #8,%1\n"      \
     452       "   beq.s   1f\n"         \
     453       "   move.b  (%3,%1),%0\n" \
     454       "   bra.s   0f\n"         \
     455       "1: move.w  %2,%1\n"      \
     456       "   move.b  (%3,%1),%0\n" \
     457       "   addq.l  #8,%0\n"      \
     458       "0: and.l   #0xff,%0\n"   \
     459       : "=&d" ((_output)), "=&d" ((dumby))    \
     460       : "d" ((_value)), "ao" ((__BFFFOtable)) \
     461       : "cc" ) ; \
     462  }
     463#elif ( M68K_HAS_EXTB_L == 1 )
    429464#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
    430465  { \
     
    464499       : "cc" ) ; \
    465500  }
    466 #endif /* M68K_HAS_EXTB_L */
     501#endif
    467502
    468503#endif
  • c/src/exec/score/cpu/m68k/cpu_asm.s

    ra5400c0 rb22b1294  
    121121 */
    122122 
    123 #if ( M68K_HAS_VBR == 1)
     123#if ( M68K_COLDFIRE_ARCH == 1 )
     124.set SR_OFFSET,    2                     | Status register offset
     125.set PC_OFFSET,    4                     | Program Counter offset
     126.set FVO_OFFSET,   0                     | Format/vector offset
     127#elif ( M68K_HAS_VBR == 1)
    124128.set SR_OFFSET,    0                     | Status register offset
    125129.set PC_OFFSET,    2                     | Program Counter offset
     
    138142SYM (_ISR_Handler):
    139143        addql   #1,SYM (_Thread_Dispatch_disable_level) | disable multitasking
     144#if ( M68K_COLDFIRE_ARCH == 0 )
    140145        moveml  d0-d1/a0-a1,a7@-         | save d0-d1,a0-a1
    141146        movew   a7@(SAVED+FVO_OFFSET),d0 | d0 = F/VO
    142147        andl    #0x0fff,d0               | d0 = vector offset in vbr
     148#else
     149        lea     a7@(-SAVED),a7
     150        movm.l  d0-d1/a0-a1,a7@          | save d0-d1,a0-a1
     151        movew   a7@(SAVED+FVO_OFFSET),d0 | d0 = F/VO
     152        andl    #0x0ffc,d0               | d0 = vector offset in vbr
     153#endif
    143154
    144155
    145156#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == 1 )
     157  #if ( M68K_COLDFIRE_ARCH == 0 )
    146158        movew   sr,d1                   | Save status register
    147159        oriw    #0x700,sr               | Disable interrupts
     160  #else
     161        move.l  d0,a7@-                 | Save d0 value
     162        move.l  0x700,d0                | Load in disable ints value
     163        move.w  sr,d1                   | Grab SR
     164        or.l    d1,d0                   | Create new SR
     165        move.w  d0,sr                   | Disable interrupts
     166        move.l  a7@+,d0                 | Restore d0 value
     167  #endif
     168 
    148169        tstl    SYM (_ISR_Nest_level)   | Interrupting an interrupt handler?
    149170        bne     1f                      | Yes, just skip over stack switch code
     
    172193
    173194#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == 1 )
     195  #if ( M68K_COLDFIRE_ARCH == 0 )
    174196        movew   sr,d0                   | Save status register
    175197        oriw    #0x700,sr               | Disable interrupts
     198  #else
     199        move.l  0x700,d1                | Load in disable int value
     200        move.w  sr,d0                   | Grab SR
     201        or.l    d0,d1                   | Create new SR
     202        move.w  d1,sr                   | Load to disable interrupts
     203  #endif
     204
    176205        subql   #1,SYM(_ISR_Nest_level) | Reduce interrupt-nesting count
    177206        bne     1f                      | Skip if return to interrupt
     
    216245#endif
    217246
    218 exit:   moveml  a7@+,d0-d1/a0-a1         | restore d0-d1,a0-a1
     247#if ( M68K_COLDFIRE_ARCH == 0 )
     248exit:   moveml  a7@+,d0-d1/a0-a1         | restore d0-d1,a0-a1
     249#else
     250exit:   moveml  a7@,d0-d1/a0-a1          | restore d0-d1,a0-a1
     251        lea     a7@(SAVED),a7
     252#endif
     253
    219254#if ( M68K_HAS_VBR == 0 )
    220255        addql   #2,a7                    | pop format/id
     
    239274        .global SYM (_ISR_Dispatch)
    240275SYM (_ISR_Dispatch):
     276#if ( M68K_COLDFIRE_ARCH == 0 )
    241277        movml   d0-d1/a0-a1,a7@-
    242278        jsr     SYM (_Thread_Dispatch)
    243279        movml   a7@+,d0-d1/a0-a1
     280#else
     281        lea     a7@(-SAVED),a7
     282        movml   d0-d1/a0-a1,a7@
     283        jsr     SYM (_Thread_Dispatch)
     284        movml   a7@,d0-d1/a0-a1
     285        lea     a7@(SAVED),a7
     286#endif
     287
    244288#if ( M68K_HAS_VBR == 0 )
    245289        addql   #2,a7                    | pop format/id
  • c/src/exec/score/cpu/m68k/m68k.h

    ra5400c0 rb22b1294  
    4141 *     -m68332        (no FP) (deprecated, use -mcpu32)
    4242 *     -mcpu32        (no FP)
     43 *     -m5200         (no FP)
    4344 *
    4445 *  As of gcc 2.8.1 and egcs 1.1, there is no distinction made between
     
    165166#define M68K_HAS_FPSP_PACKAGE    0
    166167
     168#elif defined(__mcf5200__)
     169/* Motorola ColdFire V2 core - RISC/68020 hybrid */
     170#define CPU_MODEL_NAME         "m5200"
     171#define M68K_HAS_VBR             1
     172#define M68K_HAS_BFFFO           0
     173#define M68K_HAS_SEPARATE_STACKS 0
     174#define M68K_HAS_PREINDEXING     0
     175#define M68K_HAS_EXTB_L          1
     176#define M68K_HAS_MISALIGNED      1
     177#define M68K_HAS_FPU             0
     178#define M68K_HAS_FPSP_PACKAGE    0
     179#define M68K_COLDFIRE_ARCH       1
     180
    167181#elif defined(__mc68000__)
    168182 
     
    189203
    190204/*
     205 *  If the above did not specify a ColdFire architecture, then set
     206 *  this flag to indicate that it is not a ColdFire CPU.
     207 */
     208
     209#if !defined(M68K_COLDFIRE_ARCH)
     210#define M68K_COLDFIRE_ARCH       0
     211#endif
     212
     213/*
    191214 *  Define the name of the CPU family.
    192215 */
    193216
    194 #define CPU_NAME "Motorola MC68xxx"
     217#if ( M68K_COLDFIRE_ARCH == 1 )
     218  #define CPU_NAME "Motorola ColdFire"
     219#else
     220  #define CPU_NAME "Motorola MC68xxx"
     221#endif
    195222
    196223#ifndef ASM
    197224
     225#if ( M68K_COLDFIRE_ARCH == 1 )
    198226#define m68k_disable_interrupts( _level ) \
    199   asm volatile ( "movew   %%sr,%0\n\t" \
    200                  "orw     #0x0700,%%sr" \
     227   do { register unsigned32 _tmpsr = 0x0700; \
     228        asm volatile ( "move.w %%sr,%0\n\t" \
     229                       "or.l   %0,%1\n\t" \
     230                       "move.w %1,%%sr" \
     231                       : "=d" (_level), "=d"(_tmpsr) : "1"(_tmpsr) ); \
     232   } while( 0 )
     233#else
     234#define m68k_disable_interrupts( _level ) \
     235  asm volatile ( "move.w  %%sr,%0\n\t" \
     236                 "or.w    #0x0700,%%sr" \
    201237                    : "=d" (_level))
     238#endif
    202239
    203240#define m68k_enable_interrupts( _level ) \
    204   asm volatile ( "movew   %0,%%sr " : : "d" (_level));
    205 
     241  asm volatile ( "move.w  %0,%%sr " : : "d" (_level));
     242
     243#if ( M68K_COLDFIRE_ARCH == 1 )
    206244#define m68k_flash_interrupts( _level ) \
    207   asm volatile ( "movew   %0,%%sr\n\t" \
    208                  "orw     #0x0700,%%sr" \
     245   do { register unsigned32 _tmpsr = 0x0700; \
     246        asm volatile ( "move.w %2,%%sr\n\t" \
     247                       "or.l   %2,%1\n\t" \
     248                       "move.w %1,%%sr" \
     249                       : "=d"(_tmpsr) : "0"(_tmpsr), "d"(_level) ); \
     250   } while( 0 )
     251#else
     252#define m68k_flash_interrupts( _level ) \
     253  asm volatile ( "move.w  %0,%%sr\n\t" \
     254                 "or.w    #0x0700,%%sr" \
    209255                    : : "d" (_level))
     256#endif
    210257
    211258#define m68k_get_interrupt_level( _level ) \
     
    213260    register unsigned32 _tmpsr; \
    214261    \
    215     asm volatile( "movw %%sr,%0" : "=d" (_tmpsr)); \
     262    asm volatile( "move.w %%sr,%0" : "=d" (_tmpsr)); \
    216263    _level = (_tmpsr & 0x0700) >> 8; \
    217264  } while (0)
     
    221268    register unsigned32 _tmpsr; \
    222269    \
    223     asm volatile( "movw  %%sr,%0" : "=d" (_tmpsr)); \
     270    asm volatile( "move.w  %%sr,%0" : "=d" (_tmpsr)); \
    224271    _tmpsr = (_tmpsr & 0xf8ff) | ((_newlevel) << 8); \
    225     asm volatile( "movw  %0,%%sr" : : "d" (_tmpsr)); \
     272    asm volatile( "move.w  %0,%%sr" : : "d" (_tmpsr)); \
    226273  } while (0)
    227274
    228 #if ( M68K_HAS_VBR == 1 )
     275#if ( M68K_HAS_VBR == 1 && M68K_COLDFIRE_ARCH == 0 )
    229276#define m68k_get_vbr( vbr ) \
    230277  asm volatile ( "movec   %%vbr,%0 " : "=r" (vbr))
     
    232279#define m68k_set_vbr( vbr ) \
    233280  asm volatile ( "movec   %0,%%vbr " : : "r" (vbr))
     281
     282#elif ( M68K_COLDFIRE_ARCH == 1 )
     283#define m68k_get_vbr( _vbr ) _vbr = (void *)_VBR
     284
     285#define m68k_set_vbr( _vbr ) \
     286    asm volatile ("move.l  %%a7,%%d1 \n\t" \
     287                  "move.l  %0,%%a7\n\t"    \
     288                  "movec   %%a7,%%vbr\n\t" \
     289                  "move.l  %%d1,%%a7\n\t"  \
     290                  : : "d" (_vbr) : "d1" );
     291 
    234292#else
    235293#define m68k_get_vbr( _vbr ) _vbr = (void *)_VBR
Note: See TracChangeset for help on using the changeset viewer.