Changeset e0b8176 in rtems


Ignore:
Timestamp:
Jul 11, 2008, 10:05:13 AM (12 years ago)
Author:
Thomas Doerfler <Thomas.Doerfler@…>
Branches:
4.10, 4.11, 4.9, master
Children:
9ab94a1f
Parents:
767cdd8
Message:

added support for mcf548x

Location:
cpukit/score/cpu/m68k
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/cpu/m68k/cpu_asm.S

    r767cdd8 re0b8176  
    1616
    1717#include <rtems/asm.h>
     18        .data
     19
     20#if (defined(__mcoldfire__))
     21#if ( M68K_HAS_FPU == 1 )
     22PUBLIC (_CPU_cacr_shadow)     
     23SYM (_CPU_cacr_shadow):   
     24         .long 1
     25#endif
     26#endif
    1827
    1928        .text
     
    3645
    3746          moval    a7@(HEIRCONTEXT_ARG),a0| a0 = heir thread context
     47
     48#if (defined(__mcoldfire__))
     49#if ( M68K_HAS_FPU == 1 )         
     50          moveb    a0@(13*4),d0                 | get context specific DF bit info in d0   
     51          btstb    #4,d0                        | test context specific DF bit info
     52          beq      fpu_on                       | branch if FPU needs to be switched on
     53         
     54fpu_off:  movl     _CPU_cacr_shadow,d0          | get content of _CPU_cacr_shadow in d0     
     55          btstl    #4,d0                        | test DF bit info in d0
     56          bne      restore                      | branch if FPU is already switched off     
     57          bsetl    #4,d0                        | set DF bit in d0
     58          bra      cacr_set                     | branch to set the new FPU setting in cacr and _CPU_cacr_shadow   
     59         
     60fpu_on:   movl     _CPU_cacr_shadow,d0          | get content of _CPU_cacr_shadow in d1       
     61          btstl    #4,d0                        | test context specific DF bit info
     62          beq      restore                      | branch if FPU is already switched on   
     63          bclrl    #4,d0                        | clear DF bit info in d0
     64         
     65cacr_set: movew    sr,d1                        | get content of sr in d1
     66          oril     #0x00000700,d1               | mask d1
     67          movew    d1,sr                        | disable all interrupts
     68          movl     d0,_CPU_cacr_shadow          | move _CPU_cacr_shadow to d1
     69          movec    d0,cacr                      | enable FPU in cacr             
     70#endif
     71#endif
     72
    3873restore:  movml    a0@,d1-d7/a2-a7       | restore context
    3974          movw     d1,sr                 | restore status register
     
    67102SYM (_CPU_Context_save_fp):
    68103#if ( M68K_HAS_FPU == 1 )
     104#if (defined(__mcoldfire__))
     105       
     106        moval    a7@(FPCONTEXT_ARG),a1    | a1 = &ptr to context area
     107        moval    a1@,a0                   | a0 = Save context area
     108        leal     a0@(-16),a0              | open context frame for coldfire state frame
     109        fsave    a0@                      | save coldfire state frame   
     110        tstb     a0@                      | check for a null frame
     111        beq.b    nosave                   | Yes, skip save of user model
     112        leal     a0@(-64),a0              | open context frame for coldfire data registers (fp0-fp7)
     113        fmovem   fp0-fp7,a0@              | save coldfire data registers (fp0-fp7)                     
     114        movl     #-1,a0@-                 | place not-null flag on stack
     115nosave: movl     a0,a1@                   | save pointer to saved context
     116
     117#if ( M68K_HAS_EMAC == 1 )
     118
     119        movel    macsr,d0                 | store content of macsr in d0
     120        clrl     d1                       | clear d1
     121        movl     d1,macsr                 | disable rounding in macsr
     122        movl     acc0,d1                  | store content of acc0 in d1
     123        moveml   d0-d1,a0@(-8)            | save EMAC macsr/acc0
     124        movl     acc1,d0                  | store acc1 in d0
     125        movl     acc2,d1                  | store acc2 in d1
     126        moveml   d0-d1,a0@(-16)           | save EMAC acc1/acc2 with offset
     127        movl     acc3,d0                  | store acc3 in d0
     128        movl     accext01,d1              | store acc2 in d1
     129        moveml   d0-d1,a0@(-24)           | save EMAC acc3/accext01 with offset
     130        movl     accext23,d0              | store accext23 in d0
     131        movl     mask,d1                  | store mask in d1
     132        moveml   d0-d1,a0@(-32)           | save EMAC accext23/mask with offset
     133        leal     a0@(-32),a0              | set a0 to the begin of coldfire data registers frame (fp0-fp7)
     134        movl     a0,a1@                   | save pointer to saved context
     135
     136#endif
     137     
     138#else
     139
    69140        moval    a7@(FPCONTEXT_ARG),a1    | a1 = &ptr to context area
    70141        moval    a1@,a0                   | a0 = Save context area
     
    89160        movl     #-1,a0@-                 | place not-null flag on stack
    90161nosv:   movl     a0,a1@                   | save pointer to saved context
     162
     163#endif
    91164#endif
    92165        rts
     
    96169SYM (_CPU_Context_restore_fp):
    97170#if ( M68K_HAS_FPU == 1 )
     171
     172#if (defined(__mcoldfire__))
     173
     174        moval    a7@(FPCONTEXT_ARG),a1    | a1 = &ptr to context area
     175        moval    a1@,a0                   | a0 = address of saved context
     176       
     177#if ( M68K_HAS_EMAC == 1 )
     178
     179        clrl     d0                       | clear d0
     180        movl     d0,macsr                 | disable roundrounding in macsr
     181        moveml   a0@(0),d0-d1             | get mask/accext23 in d0/d1
     182        movl     d0,mask                  | restore mask
     183        movl     d1,accext23              | restore accext23
     184        moveml   a0@(8),d0-d1             | get accext01/acc3 in d0/d1
     185        movl     d0,accext01              | restore accext01
     186        movl     d1,acc3                  | restore acc3
     187        moveml   a0@(16),d0-d1            | get acc2/acc1 in d0/d1
     188        movl     d0,acc2                  | restore acc2
     189        movl     d1,acc1                  | restore acc1
     190        moveml   a0@(24),d0-d1            | get acc0/macsr in d0/d1
     191        movl     d0,acc0                  | restore acc0
     192        movl     d1,macsr                 | restore macsr
     193        leal     a0@(32),a0               | set a0 to the begin of coldfire FPU frame
     194 
     195#endif
     196               
     197        tstb     a0@                      | Null context frame?
     198        beq.b    norest                   | Yes, skip fp restore
     199        addql    #4,a0                    | throwaway non-null flag
     200        fmovem   a0@,fp0-fp7              | restore data regs (fp0-fp7)
     201        leal     a0@(+64),a0              | close context frame for coldfire data registers (fp0-fp7)
     202norest: frestore a0@                      | restore the fp state frame
     203        leal     a0@(+16),a0              | close context frame for coldfire state frame
     204        movl     a0,a1@                   | save pointer to saved context
     205
     206#else
     207
    98208        moval    a7@(FPCONTEXT_ARG),a1    | a1 = &ptr to context area
    99209        moval    a1@,a0                   | a0 = address of saved context
     
    115225#endif
    116226        movl     a0,a1@                   | save pointer to saved context
     227
     228#endif
    117229#endif
    118230        rts
  • cpukit/score/cpu/m68k/rtems/asm.h

    r767cdd8 re0b8176  
    9797#define mbar    REG (mbar)
    9898
     99/* additional v4e special regs */
     100#define rambar1   REG (rambar1)
     101#define macsr     REG (macsr)
     102#define acc0      REG (acc0)
     103#define acc1      REG (acc1)
     104#define acc2      REG (acc2)
     105#define acc3      REG (acc3)
     106#define accext01  REG (accext01)
     107#define accext23  REG (accext23)
     108#define mask      REG (mask)
     109
    99110
    100111#define fp0 REG (fp0)
  • cpukit/score/cpu/m68k/rtems/score/cpu.h

    r767cdd8 re0b8176  
    134134  void       *a6;                /* (a6) address register 6 */
    135135  void       *a7_msp;            /* (a7) master stack pointer */
     136
     137#if (defined(__mcoldfire__))
     138#if ( M68K_HAS_FPU == 1 )
     139  uint8_t   fpu_dis;
     140#endif
     141#endif
     142
    136143}   Context_Control;
    137144
     
    169176} Context_Control_fp;
    170177
    171 #else
    172 
     178#elif (defined(__mcoldfire__))
     179
     180/*
     181 *  FP context save area for the ColdFire core numeric coprocessors
     182 */
     183typedef struct {
     184  uint8_t     fp_save_area[84];     /*    16 bytes for FSAVE/FRESTORE    */
     185                                    /*    64 bytes for FMOVEM FP0-7      */
     186                                    /*     4 bytes for non-null flag     */
     187
     188#if (M68K_HAS_EMAC == 1)
     189
     190/*
     191 *  EMAC context save area for the ColdFire core
     192 */
     193  uint8_t     emac_save_area[32];   /*  32 bytes for EMAC registers      */
     194
     195#endif
     196
     197} Context_Control_fp;
     198
     199#if ( M68K_HAS_FPU == 1 )
     200extern uint32_t _CPU_cacr_shadow;
     201#endif
     202
     203#else
    173204/*
    174205 *  FP context save area for the M68881/M68882 numeric coprocessors.
    175206 */
    176 
    177207typedef struct {
    178208  uint8_t     fp_save_area[332];    /*   216 bytes for FSAVE/FRESTORE    */
     
    342372 */
    343373
     374#if (defined(__mcoldfire__) && ( M68K_HAS_FPU == 1 ))
    344375#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
    345376                                 _isr, _entry_point, _is_fp ) \
     
    351382     (_the_context)->a7_msp  = (void *)_stack; \
    352383     *(void **)_stack        = (void *)(_entry_point); \
     384     (_the_context)->fpu_dis = (_is_fp == TRUE) ? 0x00 : 0x10;          \
    353385   } while ( 0 )
     386#else
     387#define _CPU_Context_Initialize( _the_context, _stack_base, _size,      \
     388                                 _isr, _entry_point, _is_fp )           \
     389   do {                                                                 \
     390     uint32_t   _stack;                                                 \
     391                                                                        \
     392     (_the_context)->sr      = 0x3000 | ((_isr) << 8);                  \
     393     _stack                  = (uint32_t  )(_stack_base) + (_size) - 4; \
     394     (_the_context)->a7_msp  = (void *)_stack;                          \
     395     *(void **)_stack        = (void *)(_entry_point);                  \
     396   } while ( 0 )
     397#endif
    354398
    355399#define _CPU_Context_Restart_self( _the_context ) \
     
    397441   )
    398442
     443#if (defined(__mcoldfire__) && ( M68K_HAS_FPU == 1 ))
     444#define _CPU_Context_Initialize_fp( _fp_area ) \
     445   { uint32_t   *_fp_context = (uint32_t   *)*(_fp_area); \
     446     \
     447     *(--(_fp_context)) = 0; \
     448     *(_fp_area) = (uint8_t   *)(_fp_context); \
     449     asm volatile("movl %0,%%macsr": : "d" (0) ); \
     450   }
     451#else
    399452#define _CPU_Context_Initialize_fp( _fp_area ) \
    400453   { uint32_t   *_fp_context = (uint32_t   *)*(_fp_area); \
     
    403456     *(_fp_area) = (uint8_t   *)(_fp_context); \
    404457   }
     458#endif
    405459#endif
    406460
  • cpukit/score/cpu/m68k/rtems/score/m68k.h

    r767cdd8 re0b8176  
    131131# if defined (__mcffpu__)
    132132# define M68K_HAS_FPU            1
     133  /*
     134   * td: can we be sure that all CFs with FPU also have an EMAC?
     135   */
     136# define M68K_HAS_EMAC           1
    133137# define M68K_HAS_FPSP_PACKAGE   0
    134138# else
Note: See TracChangeset for help on using the changeset viewer.