Changeset 5235238 in rtems


Ignore:
Timestamp:
Jun 28, 2018, 7:32:26 AM (10 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
109bc1c7
Parents:
995e91e8
git-author:
Sebastian Huber <sebastian.huber@…> (06/28/18 07:32:26)
git-committer:
Sebastian Huber <sebastian.huber@…> (06/29/18 08:04:38)
Message:

riscv: Add floating-point support

Update #3433.

Location:
cpukit/score/cpu/riscv
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/cpu/riscv/cpu.c

    r995e91e8 r5235238  
    5959RISCV_ASSERT_CONTEXT_OFFSET( s10, S10 );
    6060RISCV_ASSERT_CONTEXT_OFFSET( s11, S11 );
     61
     62#if __riscv_flen > 0
     63
     64RISCV_ASSERT_CONTEXT_OFFSET( fcsr, FCSR );
     65RISCV_ASSERT_CONTEXT_OFFSET( fs0, FS0 );
     66RISCV_ASSERT_CONTEXT_OFFSET( fs1, FS1 );
     67RISCV_ASSERT_CONTEXT_OFFSET( fs2, FS2 );
     68RISCV_ASSERT_CONTEXT_OFFSET( fs3, FS3 );
     69RISCV_ASSERT_CONTEXT_OFFSET( fs4, FS4 );
     70RISCV_ASSERT_CONTEXT_OFFSET( fs5, FS5 );
     71RISCV_ASSERT_CONTEXT_OFFSET( fs6, FS6 );
     72RISCV_ASSERT_CONTEXT_OFFSET( fs7, FS7 );
     73RISCV_ASSERT_CONTEXT_OFFSET( fs8, FS8 );
     74RISCV_ASSERT_CONTEXT_OFFSET( fs9, FS9 );
     75RISCV_ASSERT_CONTEXT_OFFSET( fs10, FS10 );
     76RISCV_ASSERT_CONTEXT_OFFSET( fs11, FS11 );
     77
     78#endif /* __riscv_flen */
    6179
    6280#define RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( field, off ) \
     
    87105RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a1, A1 );
    88106
     107#if __riscv_flen > 0
     108
     109RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fcsr, FCSR );
     110RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft0, FT0 );
     111RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft1, FT1 );
     112RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft2, FT2 );
     113RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft3, FT3 );
     114RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft4, FT4 );
     115RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft5, FT5 );
     116RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft6, FT6 );
     117RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft7, FT7 );
     118RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft8, FT8 );
     119RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft9, FT9 );
     120RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft10, FT10 );
     121RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft11, FT11 );
     122RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa0, FA0 );
     123RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa1, FA1 );
     124RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa2, FA2 );
     125RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa3, FA3 );
     126RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa4, FA4 );
     127RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa5, FA5 );
     128RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa6, FA6 );
     129RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa7, FA7 );
     130
     131#endif /* __riscv_flen */
     132
    89133RTEMS_STATIC_ASSERT(
    90134  sizeof( CPU_Interrupt_frame ) % CPU_STACK_ALIGNMENT == 0,
  • cpukit/score/cpu/riscv/include/rtems/asm.h

    r995e91e8 r5235238  
    132132#endif /* __riscv_xlen */
    133133
     134#if __riscv_flen == 32
     135
     136#define FLREG flw
     137
     138#define FSREG fsw
     139
     140#define FMVYX fmv.s.x
     141
     142#define FMVXY fmv.x.s
     143
     144#elif __riscv_flen == 64
     145
     146#define FLREG fld
     147
     148#define FSREG fsd
     149
     150#if __riscv_xlen == 32
     151
     152#define FMVYX fmv.s.x
     153
     154#define FMVXY fmv.x.s
     155
     156#elif __riscv_xlen == 64
     157
     158#define FMVYX fmv.d.x
     159
     160#define FMVXY fmv.x.d
     161
     162#endif /* __riscv_xlen */
     163
     164#endif /* __riscv_flen */
     165
    134166.macro GET_SELF_CPU_CONTROL REG
    135167#ifdef RTEMS_SMP
  • cpukit/score/cpu/riscv/include/rtems/score/cpu.h

    r995e91e8 r5235238  
    6565#define CPU_MODES_INTERRUPT_MASK   0x0000000000000001
    6666
    67 #define CPU_CONTEXT_FP_SIZE  0
    68 
    6967#define CPU_PER_CPU_CONTROL_SIZE 0
    7068
     
    10098
    10199#ifndef ASM
     100
     101#if __riscv_flen == 32
     102typedef float RISCV_Float;
     103#elif __riscv_flen == 64
     104typedef double RISCV_Float;
     105#endif
    102106
    103107typedef struct {
     
    123127  uintptr_t s10;
    124128  uintptr_t s11;
     129#if __riscv_flen > 0
     130  uint32_t fcsr;
     131  RISCV_Float fs0;
     132  RISCV_Float fs1;
     133  RISCV_Float fs2;
     134  RISCV_Float fs3;
     135  RISCV_Float fs4;
     136  RISCV_Float fs5;
     137  RISCV_Float fs6;
     138  RISCV_Float fs7;
     139  RISCV_Float fs8;
     140  RISCV_Float fs9;
     141  RISCV_Float fs10;
     142  RISCV_Float fs11;
     143#endif
    125144} Context_Control;
    126145
    127146#define _CPU_Context_Get_SP( _context ) \
    128147  (_context)->sp
    129 
    130 typedef struct {
    131   /** TODO FPU registers are listed here */
    132   double  some_float_register;
    133 } Context_Control_fp;
    134 
    135 Context_Control_fp  _CPU_Null_fp_context;
    136148
    137149#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
     
    205217   _CPU_Context_restore( (_the_context) )
    206218
    207 
    208 #define _CPU_Context_Fp_start( _base, _offset ) \
    209    ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
    210 
    211 #define _CPU_Context_Initialize_fp( _destination ) \
    212   { \
    213    *(*(_destination)) = _CPU_Null_fp_context; \
    214   }
    215 
    216219extern void _CPU_Fatal_halt(uint32_t source, uint32_t error) RTEMS_NO_RETURN;
    217220
     
    326329  Context_Control *new_context
    327330) RTEMS_NO_RETURN;
    328 
    329 /*
    330  *  _CPU_Context_save_fp
    331  *
    332  *  This routine saves the floating point context passed to it.
    333  *
    334  */
    335 
    336 void _CPU_Context_save_fp(
    337   void **fp_context_ptr
    338 );
    339 
    340 /*
    341  *  _CPU_Context_restore_fp
    342  *
    343  *  This routine restores the floating point context passed to it.
    344  *
    345  */
    346 
    347 void _CPU_Context_restore_fp(
    348   void **fp_context_ptr
    349 );
    350331
    351332/*  The following routine swaps the endian format of an unsigned int.
  • cpukit/score/cpu/riscv/include/rtems/score/cpuimpl.h

    r995e91e8 r5235238  
    7979#define RISCV_INTERRUPT_FRAME_T5 64
    8080#define RISCV_INTERRUPT_FRAME_T6 68
     81
     82#if __riscv_flen == 0
     83
    8184#define RISCV_INTERRUPT_FRAME_A0 72
    8285#define RISCV_INTERRUPT_FRAME_A1 76
    8386
    8487#define CPU_INTERRUPT_FRAME_SIZE 80
     88
     89#elif __riscv_flen == 32
     90
     91#define RISCV_CONTEXT_FCSR 68
     92
     93#define RISCV_CONTEXT_F( x ) (72 + 4 * (x))
     94
     95#define RISCV_INTERRUPT_FRAME_FCSR 72
     96
     97#define RISCV_INTERRUPT_FRAME_F( x ) (76 + 4 * (x))
     98
     99#define RISCV_INTERRUPT_FRAME_A0 156
     100#define RISCV_INTERRUPT_FRAME_A1 160
     101
     102#define CPU_INTERRUPT_FRAME_SIZE 176
     103
     104#elif __riscv_flen == 64
     105
     106#define RISCV_CONTEXT_FCSR 68
     107
     108#define RISCV_CONTEXT_F( x ) (72 + 8 * (x))
     109
     110#define RISCV_INTERRUPT_FRAME_FCSR 72
     111
     112#define RISCV_INTERRUPT_FRAME_F( x ) (80 + 8 * (x))
     113
     114#define RISCV_INTERRUPT_FRAME_A0 240
     115#define RISCV_INTERRUPT_FRAME_A1 244
     116
     117#define CPU_INTERRUPT_FRAME_SIZE 256
     118
     119#endif /* __riscv_flen */
    85120
    86121#elif __riscv_xlen == 64
     
    120155#define RISCV_INTERRUPT_FRAME_T5 128
    121156#define RISCV_INTERRUPT_FRAME_T6 136
     157
     158#if __riscv_flen == 0
     159
    122160#define RISCV_INTERRUPT_FRAME_A0 144
    123161#define RISCV_INTERRUPT_FRAME_A1 152
     
    125163#define CPU_INTERRUPT_FRAME_SIZE 160
    126164
     165#elif __riscv_flen == 32
     166
     167#define RISCV_CONTEXT_FCSR 128
     168
     169#define RISCV_CONTEXT_F( x ) (132 + 4 * (x))
     170
     171#define RISCV_INTERRUPT_FRAME_FCSR 144
     172
     173#define RISCV_INTERRUPT_FRAME_F( x ) (148 + 4 * (x))
     174
     175#define RISCV_INTERRUPT_FRAME_A0 232
     176#define RISCV_INTERRUPT_FRAME_A1 240
     177
     178#define CPU_INTERRUPT_FRAME_SIZE 256
     179
     180#elif __riscv_flen == 64
     181
     182#define RISCV_CONTEXT_FCSR 128
     183
     184#define RISCV_CONTEXT_F( x ) (136 + 8 * (x))
     185
     186#define RISCV_INTERRUPT_FRAME_FCSR 144
     187
     188#define RISCV_INTERRUPT_FRAME_F( x ) (152 + 8 * (x))
     189
     190#define RISCV_INTERRUPT_FRAME_A0 312
     191#define RISCV_INTERRUPT_FRAME_A1 320
     192
     193#define CPU_INTERRUPT_FRAME_SIZE 336
     194
     195#endif /* __riscv_flen */
     196
    127197#endif /* __riscv_xlen */
     198
     199#if __riscv_flen > 0
     200
     201#define RISCV_CONTEXT_FS0 RISCV_CONTEXT_F( 0 )
     202#define RISCV_CONTEXT_FS1 RISCV_CONTEXT_F( 1 )
     203#define RISCV_CONTEXT_FS2 RISCV_CONTEXT_F( 2 )
     204#define RISCV_CONTEXT_FS3 RISCV_CONTEXT_F( 3 )
     205#define RISCV_CONTEXT_FS4 RISCV_CONTEXT_F( 4 )
     206#define RISCV_CONTEXT_FS5 RISCV_CONTEXT_F( 5 )
     207#define RISCV_CONTEXT_FS6 RISCV_CONTEXT_F( 6 )
     208#define RISCV_CONTEXT_FS7 RISCV_CONTEXT_F( 7 )
     209#define RISCV_CONTEXT_FS8 RISCV_CONTEXT_F( 8 )
     210#define RISCV_CONTEXT_FS9 RISCV_CONTEXT_F( 9 )
     211#define RISCV_CONTEXT_FS10 RISCV_CONTEXT_F( 10 )
     212#define RISCV_CONTEXT_FS11 RISCV_CONTEXT_F( 11 )
     213
     214#define RISCV_INTERRUPT_FRAME_FT0 RISCV_INTERRUPT_FRAME_F( 0 )
     215#define RISCV_INTERRUPT_FRAME_FT1 RISCV_INTERRUPT_FRAME_F( 1 )
     216#define RISCV_INTERRUPT_FRAME_FT2 RISCV_INTERRUPT_FRAME_F( 2 )
     217#define RISCV_INTERRUPT_FRAME_FT3 RISCV_INTERRUPT_FRAME_F( 3 )
     218#define RISCV_INTERRUPT_FRAME_FT4 RISCV_INTERRUPT_FRAME_F( 4 )
     219#define RISCV_INTERRUPT_FRAME_FT5 RISCV_INTERRUPT_FRAME_F( 5 )
     220#define RISCV_INTERRUPT_FRAME_FT6 RISCV_INTERRUPT_FRAME_F( 6 )
     221#define RISCV_INTERRUPT_FRAME_FT7 RISCV_INTERRUPT_FRAME_F( 7 )
     222#define RISCV_INTERRUPT_FRAME_FT8 RISCV_INTERRUPT_FRAME_F( 8 )
     223#define RISCV_INTERRUPT_FRAME_FT9 RISCV_INTERRUPT_FRAME_F( 9 )
     224#define RISCV_INTERRUPT_FRAME_FT10 RISCV_INTERRUPT_FRAME_F( 10 )
     225#define RISCV_INTERRUPT_FRAME_FT11 RISCV_INTERRUPT_FRAME_F( 11 )
     226#define RISCV_INTERRUPT_FRAME_FA0 RISCV_INTERRUPT_FRAME_F( 12 )
     227#define RISCV_INTERRUPT_FRAME_FA1 RISCV_INTERRUPT_FRAME_F( 13 )
     228#define RISCV_INTERRUPT_FRAME_FA2 RISCV_INTERRUPT_FRAME_F( 14 )
     229#define RISCV_INTERRUPT_FRAME_FA3 RISCV_INTERRUPT_FRAME_F( 15 )
     230#define RISCV_INTERRUPT_FRAME_FA4 RISCV_INTERRUPT_FRAME_F( 16 )
     231#define RISCV_INTERRUPT_FRAME_FA5 RISCV_INTERRUPT_FRAME_F( 17 )
     232#define RISCV_INTERRUPT_FRAME_FA6 RISCV_INTERRUPT_FRAME_F( 18 )
     233#define RISCV_INTERRUPT_FRAME_FA7 RISCV_INTERRUPT_FRAME_F( 19 )
     234
     235#endif /* __riscv_flen */
    128236
    129237#ifndef ASM
     
    152260  uintptr_t t5;
    153261  uintptr_t t6;
     262#if __riscv_flen > 0
     263  uint32_t fcsr;
     264  RISCV_Float ft0;
     265  RISCV_Float ft1;
     266  RISCV_Float ft2;
     267  RISCV_Float ft3;
     268  RISCV_Float ft4;
     269  RISCV_Float ft5;
     270  RISCV_Float ft6;
     271  RISCV_Float ft7;
     272  RISCV_Float ft8;
     273  RISCV_Float ft9;
     274  RISCV_Float ft10;
     275  RISCV_Float ft11;
     276  RISCV_Float fa0;
     277  RISCV_Float fa1;
     278  RISCV_Float fa2;
     279  RISCV_Float fa3;
     280  RISCV_Float fa4;
     281  RISCV_Float fa5;
     282  RISCV_Float fa6;
     283  RISCV_Float fa7;
     284#endif
    154285  uintptr_t a0;
    155286  uintptr_t a1;
  • cpukit/score/cpu/riscv/riscv-context-switch.S

    r995e91e8 r5235238  
    3939PUBLIC(_CPU_Context_switch)
    4040PUBLIC(_CPU_Context_restore)
    41 PUBLIC(_CPU_Context_restore_fp)
    42 PUBLIC(_CPU_Context_save_fp)
    4341
    4442SYM(_CPU_Context_switch):
    4543        GET_SELF_CPU_CONTROL    a2
    4644        lw      a3, PER_CPU_ISR_DISPATCH_DISABLE(a2)
     45
     46#if __riscv_flen > 0
     47        frcsr   a4
     48#endif
    4749
    4850        SREG    ra, RISCV_CONTEXT_RA(a0)
     
    6062        SREG    s10, RISCV_CONTEXT_S10(a0)
    6163        SREG    s11, RISCV_CONTEXT_S11(a0)
     64
     65#if __riscv_flen > 0
     66        sw      a4, RISCV_CONTEXT_FCSR(a0)
     67        FSREG   fs0, RISCV_CONTEXT_FS0(a0)
     68        FSREG   fs1, RISCV_CONTEXT_FS1(a0)
     69        FSREG   fs2, RISCV_CONTEXT_FS2(a0)
     70        FSREG   fs3, RISCV_CONTEXT_FS3(a0)
     71        FSREG   fs4, RISCV_CONTEXT_FS4(a0)
     72        FSREG   fs5, RISCV_CONTEXT_FS5(a0)
     73        FSREG   fs6, RISCV_CONTEXT_FS6(a0)
     74        FSREG   fs7, RISCV_CONTEXT_FS7(a0)
     75        FSREG   fs8, RISCV_CONTEXT_FS8(a0)
     76        FSREG   fs9, RISCV_CONTEXT_FS9(a0)
     77        FSREG   fs10, RISCV_CONTEXT_FS10(a0)
     78        FSREG   fs11, RISCV_CONTEXT_FS11(a0)
     79#endif
    6280
    6381        sw      a3, RISCV_CONTEXT_ISR_DISPATCH_DISABLE(a0)
     
    82100        LREG    s11, RISCV_CONTEXT_S11(a1)
    83101
     102#if __riscv_flen > 0
     103        lw      a4, RISCV_CONTEXT_FCSR(a1)
     104        FLREG   fs0, RISCV_CONTEXT_FS0(a1)
     105        FLREG   fs1, RISCV_CONTEXT_FS1(a1)
     106        FLREG   fs2, RISCV_CONTEXT_FS2(a1)
     107        FLREG   fs3, RISCV_CONTEXT_FS3(a1)
     108        FLREG   fs4, RISCV_CONTEXT_FS4(a1)
     109        FLREG   fs5, RISCV_CONTEXT_FS5(a1)
     110        FLREG   fs6, RISCV_CONTEXT_FS6(a1)
     111        FLREG   fs7, RISCV_CONTEXT_FS7(a1)
     112        FLREG   fs8, RISCV_CONTEXT_FS8(a1)
     113        FLREG   fs9, RISCV_CONTEXT_FS9(a1)
     114        FLREG   fs10, RISCV_CONTEXT_FS10(a1)
     115        FLREG   fs11, RISCV_CONTEXT_FS11(a1)
     116        fscsr   a4
     117#endif
     118
    84119        sw      a3, PER_CPU_ISR_DISPATCH_DISABLE(a2)
    85120
     
    90125        GET_SELF_CPU_CONTROL    a2
    91126        j       .Lrestore
    92 
    93         /* TODO no FP support for riscv32 yet */
    94         SYM(_CPU_Context_restore_fp):
    95         nop
    96 
    97         SYM(_CPU_Context_save_fp):
    98         nop
  • cpukit/score/cpu/riscv/riscv-context-validate.S

    r995e91e8 r5235238  
    6262#define T5_OFFSET OFFSET(26)
    6363#define T6_OFFSET OFFSET(27)
     64#define TMP_OFFSET OFFSET(28)
     65
     66#if __riscv_flen == 32
     67#define FOFFSET(i) (OFFSET(29) + (i) * 4)
     68#elif __riscv_flen == 64
     69#define FOFFSET(i) (OFFSET(29) + (i) * 8)
     70#else
     71#define FOFFSET(i) OFFSET(29)
     72#endif /* __riscv_flen */
    6473
    6574#define FRAME_SIZE \
    66   ((OFFSET(28) + CPU_STACK_ALIGNMENT - 1) & ~(CPU_STACK_ALIGNMENT - 1))
     75  ((FOFFSET(32) + CPU_STACK_ALIGNMENT - 1) & ~(CPU_STACK_ALIGNMENT - 1))
    6776
    6877        .section        .text, "ax", @progbits
     
    7483
    7584        /* Save */
     85
    7686        SREG    ra, RA_OFFSET(sp)
    7787        SREG    t0, T0_OFFSET(sp)
     
    103113        SREG    t6, T6_OFFSET(sp)
    104114
     115#if __riscv_flen > 0
     116        FSREG   f0, FOFFSET(0)(sp)
     117        FSREG   f1, FOFFSET(1)(sp)
     118        FSREG   f2, FOFFSET(2)(sp)
     119        FSREG   f3, FOFFSET(3)(sp)
     120        FSREG   f4, FOFFSET(4)(sp)
     121        FSREG   f5, FOFFSET(5)(sp)
     122        FSREG   f6, FOFFSET(6)(sp)
     123        FSREG   f7, FOFFSET(7)(sp)
     124        FSREG   f8, FOFFSET(8)(sp)
     125        FSREG   f9, FOFFSET(9)(sp)
     126        FSREG   f10, FOFFSET(10)(sp)
     127        FSREG   f11, FOFFSET(11)(sp)
     128        FSREG   f12, FOFFSET(12)(sp)
     129        FSREG   f13, FOFFSET(13)(sp)
     130        FSREG   f14, FOFFSET(14)(sp)
     131        FSREG   f15, FOFFSET(15)(sp)
     132        FSREG   f16, FOFFSET(16)(sp)
     133        FSREG   f17, FOFFSET(17)(sp)
     134        FSREG   f18, FOFFSET(18)(sp)
     135        FSREG   f19, FOFFSET(19)(sp)
     136        FSREG   f20, FOFFSET(20)(sp)
     137        FSREG   f21, FOFFSET(21)(sp)
     138        FSREG   f22, FOFFSET(22)(sp)
     139        FSREG   f23, FOFFSET(23)(sp)
     140        FSREG   f24, FOFFSET(24)(sp)
     141        FSREG   f25, FOFFSET(25)(sp)
     142        FSREG   f26, FOFFSET(26)(sp)
     143        FSREG   f27, FOFFSET(27)(sp)
     144        FSREG   f28, FOFFSET(28)(sp)
     145        FSREG   f29, FOFFSET(29)(sp)
     146        FSREG   f30, FOFFSET(30)(sp)
     147        FSREG   f31, FOFFSET(31)(sp)
     148#endif /* __riscv_flen */
     149
    105150        /* Fill */
     151
    106152        addi    ra, a0, 1
    107153        /* sp must remain as is */
     
    137183        xor     t6, tp, a0
    138184
     185#if __riscv_flen > 0
     186        andi    t0, a0, 0x1f
     187        fsflags t0
     188
     189        .macro  fill_f reg, inc
     190        addi    t0, a0, 24 + \inc
     191        FMVYX   \reg, t0
     192        .endm
     193
     194        fill_f  f0, 0
     195        fill_f  f1, 1
     196        fill_f  f2, 2
     197        fill_f  f3, 3
     198        fill_f  f4, 4
     199        fill_f  f5, 5
     200        fill_f  f6, 6
     201        fill_f  f7, 7
     202        fill_f  f8, 8
     203        fill_f  f9, 9
     204        fill_f  f10, 10
     205        fill_f  f11, 11
     206        fill_f  f12, 12
     207        fill_f  f13, 13
     208        fill_f  f14, 14
     209        fill_f  f15, 15
     210        fill_f  f16, 16
     211        fill_f  f17, 17
     212        fill_f  f18, 18
     213        fill_f  f19, 19
     214        fill_f  f20, 20
     215        fill_f  f21, 21
     216        fill_f  f22, 22
     217        fill_f  f23, 23
     218        fill_f  f24, 24
     219        fill_f  f25, 25
     220        fill_f  f26, 26
     221        fill_f  f27, 27
     222        fill_f  f28, 28
     223        fill_f  f29, 29
     224        fill_f  f30, 30
     225        fill_f  f31, 31
     226#endif /* __riscv_flen */
     227
    139228        /* Check */
     229
    140230.Lcheck:
    141231        .macro  check_register reg, inc
     
    177267        bne     t6, t0, .Lrestore
    178268
     269#if __riscv_flen > 0
     270        SREG    t1, TMP_OFFSET(sp)
     271        frflags t0
     272        andi    t1, a0, 0x1f
     273        xor     t0, t1, t0
     274        LREG    t1, TMP_OFFSET(sp)
     275        bnez    t0, .Lrestore
     276
     277
     278        .macro  check_f reg, inc
     279        FMVXY   t0, \reg
     280        addi    t0, t0, -24 - \inc
     281        bne     t0, a0, .Lrestore
     282        .endm
     283
     284        check_f f0, 0
     285        check_f f1, 1
     286        check_f f2, 2
     287        check_f f3, 3
     288        check_f f4, 4
     289        check_f f5, 5
     290        check_f f6, 6
     291        check_f f7, 7
     292        check_f f8, 8
     293        check_f f9, 9
     294        check_f f10, 10
     295        check_f f11, 11
     296        check_f f12, 12
     297        check_f f13, 13
     298        check_f f14, 14
     299        check_f f15, 15
     300        check_f f16, 16
     301        check_f f17, 17
     302        check_f f18, 18
     303        check_f f19, 19
     304        check_f f20, 20
     305        check_f f21, 21
     306        check_f f22, 22
     307        check_f f23, 23
     308        check_f f24, 24
     309        check_f f25, 25
     310        check_f f26, 26
     311        check_f f27, 27
     312        check_f f28, 28
     313        check_f f29, 29
     314        check_f f30, 30
     315        check_f f31, 31
     316#endif /* __riscv_flen */
     317
    179318        j       .Lcheck
    180319
    181320        /* Restore */
     321
    182322.Lrestore:
     323
    183324        LREG    ra, RA_OFFSET(sp)
    184325        LREG    t0, T0_OFFSET(sp)
     
    210351        LREG    t6, T6_OFFSET(sp)
    211352
     353#if __riscv_flen > 0
     354        FLREG   f0, FOFFSET(0)(sp)
     355        FLREG   f1, FOFFSET(1)(sp)
     356        FLREG   f2, FOFFSET(2)(sp)
     357        FLREG   f3, FOFFSET(3)(sp)
     358        FLREG   f4, FOFFSET(4)(sp)
     359        FLREG   f5, FOFFSET(5)(sp)
     360        FLREG   f6, FOFFSET(6)(sp)
     361        FLREG   f7, FOFFSET(7)(sp)
     362        FLREG   f8, FOFFSET(8)(sp)
     363        FLREG   f9, FOFFSET(9)(sp)
     364        FLREG   f10, FOFFSET(10)(sp)
     365        FLREG   f11, FOFFSET(11)(sp)
     366        FLREG   f12, FOFFSET(12)(sp)
     367        FLREG   f13, FOFFSET(13)(sp)
     368        FLREG   f14, FOFFSET(14)(sp)
     369        FLREG   f15, FOFFSET(15)(sp)
     370        FLREG   f16, FOFFSET(16)(sp)
     371        FLREG   f17, FOFFSET(17)(sp)
     372        FLREG   f18, FOFFSET(18)(sp)
     373        FLREG   f19, FOFFSET(19)(sp)
     374        FLREG   f20, FOFFSET(20)(sp)
     375        FLREG   f21, FOFFSET(21)(sp)
     376        FLREG   f22, FOFFSET(22)(sp)
     377        FLREG   f23, FOFFSET(23)(sp)
     378        FLREG   f24, FOFFSET(24)(sp)
     379        FLREG   f25, FOFFSET(25)(sp)
     380        FLREG   f26, FOFFSET(26)(sp)
     381        FLREG   f27, FOFFSET(27)(sp)
     382        FLREG   f28, FOFFSET(28)(sp)
     383        FLREG   f29, FOFFSET(29)(sp)
     384        FLREG   f30, FOFFSET(30)(sp)
     385        FLREG   f31, FOFFSET(31)(sp)
     386#endif /* __riscv_flen */
     387
    212388        addi    sp, sp, FRAME_SIZE
    213389        ret
  • cpukit/score/cpu/riscv/riscv-context-volatile-clobber.S

    r995e91e8 r5235238  
    3737SYM(_CPU_Context_volatile_clobber):
    3838
     39#if __riscv_flen > 0
     40        andi    t0, a0, 0x1f
     41        fsflags t0
     42
     43        addi    t0, a0, 15
     44        FMVYX   ft0, t0
     45        addi    t0, a0, 16
     46        FMVYX   ft1, t0
     47        addi    t0, a0, 17
     48        FMVYX   ft2, t0
     49        addi    t0, a0, 18
     50        FMVYX   ft3, t0
     51        addi    t0, a0, 19
     52        FMVYX   ft4, t0
     53        addi    t0, a0, 20
     54        FMVYX   ft5, t0
     55        addi    t0, a0, 21
     56        FMVYX   ft6, t0
     57        addi    t0, a0, 22
     58        FMVYX   ft7, t0
     59        addi    t0, a0, 23
     60        FMVYX   ft8, t0
     61        addi    t0, a0, 24
     62        FMVYX   ft9, t0
     63        addi    t0, a0, 25
     64        FMVYX   ft10, t0
     65        addi    t0, a0, 26
     66        FMVYX   ft11, t0
     67        addi    t0, a0, 27
     68        FMVYX   fa0, t0
     69        addi    t0, a0, 28
     70        FMVYX   fa1, t0
     71        addi    t0, a0, 29
     72        FMVYX   fa2, t0
     73        addi    t0, a0, 30
     74        FMVYX   fa3, t0
     75        addi    t0, a0, 31
     76        FMVYX   fa4, t0
     77        addi    t0, a0, 32
     78        FMVYX   fa5, t0
     79        addi    t0, a0, 33
     80        FMVYX   fa6, t0
     81        addi    t0, a0, 34
     82        FMVYX   fa7, t0
     83#endif /* __riscv_flen */
     84
    3985        addi    a1, a0, 1
    4086        addi    a2, a0, 2
  • cpukit/score/cpu/riscv/riscv-exception-handler.S

    r995e91e8 r5235238  
    6363        GET_SELF_CPU_CONTROL    s0
    6464        SREG    s1, RISCV_INTERRUPT_FRAME_S1(sp)
     65#if __riscv_flen > 0
     66        frcsr   s1
     67#endif
    6568        SREG    ra, RISCV_INTERRUPT_FRAME_RA(sp)
    6669        SREG    a3, RISCV_INTERRUPT_FRAME_A3(sp)
     
    7881        SREG    a1, RISCV_INTERRUPT_FRAME_MSTATUS(sp)
    7982        SREG    a2, RISCV_INTERRUPT_FRAME_MEPC(sp)
     83#if __riscv_flen > 0
     84        sw      s1, RISCV_INTERRUPT_FRAME_FCSR(sp)
     85        FSREG   ft0, RISCV_INTERRUPT_FRAME_FT0(sp)
     86        FSREG   ft1, RISCV_INTERRUPT_FRAME_FT1(sp)
     87        FSREG   ft2, RISCV_INTERRUPT_FRAME_FT2(sp)
     88        FSREG   ft3, RISCV_INTERRUPT_FRAME_FT3(sp)
     89        FSREG   ft4, RISCV_INTERRUPT_FRAME_FT4(sp)
     90        FSREG   ft5, RISCV_INTERRUPT_FRAME_FT5(sp)
     91        FSREG   ft6, RISCV_INTERRUPT_FRAME_FT6(sp)
     92        FSREG   ft7, RISCV_INTERRUPT_FRAME_FT7(sp)
     93        FSREG   ft8, RISCV_INTERRUPT_FRAME_FT8(sp)
     94        FSREG   ft9, RISCV_INTERRUPT_FRAME_FT9(sp)
     95        FSREG   ft10, RISCV_INTERRUPT_FRAME_FT10(sp)
     96        FSREG   ft11, RISCV_INTERRUPT_FRAME_FT11(sp)
     97        FSREG   fa0, RISCV_INTERRUPT_FRAME_FA0(sp)
     98        FSREG   fa1, RISCV_INTERRUPT_FRAME_FA1(sp)
     99        FSREG   fa2, RISCV_INTERRUPT_FRAME_FA2(sp)
     100        FSREG   fa3, RISCV_INTERRUPT_FRAME_FA3(sp)
     101        FSREG   fa4, RISCV_INTERRUPT_FRAME_FA4(sp)
     102        FSREG   fa5, RISCV_INTERRUPT_FRAME_FA5(sp)
     103        FSREG   fa6, RISCV_INTERRUPT_FRAME_FA6(sp)
     104        FSREG   fa7, RISCV_INTERRUPT_FRAME_FA7(sp)
     105#endif
    80106
    81107        /* FIXME Only handle interrupts for now (MSB = 1) */
     
    192218        csrw    mstatus, a0
    193219        csrw    mepc, a1
     220#if __riscv_flen > 0
     221        lw      a0, RISCV_INTERRUPT_FRAME_FCSR(sp)
     222        FLREG   ft0, RISCV_INTERRUPT_FRAME_FT0(sp)
     223        FLREG   ft1, RISCV_INTERRUPT_FRAME_FT1(sp)
     224        FLREG   ft2, RISCV_INTERRUPT_FRAME_FT2(sp)
     225        FLREG   ft3, RISCV_INTERRUPT_FRAME_FT3(sp)
     226        FLREG   ft4, RISCV_INTERRUPT_FRAME_FT4(sp)
     227        FLREG   ft5, RISCV_INTERRUPT_FRAME_FT5(sp)
     228        FLREG   ft6, RISCV_INTERRUPT_FRAME_FT6(sp)
     229        FLREG   ft7, RISCV_INTERRUPT_FRAME_FT7(sp)
     230        FLREG   ft8, RISCV_INTERRUPT_FRAME_FT8(sp)
     231        FLREG   ft9, RISCV_INTERRUPT_FRAME_FT9(sp)
     232        FLREG   ft10, RISCV_INTERRUPT_FRAME_FT10(sp)
     233        FLREG   ft11, RISCV_INTERRUPT_FRAME_FT11(sp)
     234        FLREG   fa0, RISCV_INTERRUPT_FRAME_FA0(sp)
     235        FLREG   fa1, RISCV_INTERRUPT_FRAME_FA1(sp)
     236        FLREG   fa2, RISCV_INTERRUPT_FRAME_FA2(sp)
     237        FLREG   fa3, RISCV_INTERRUPT_FRAME_FA3(sp)
     238        FLREG   fa4, RISCV_INTERRUPT_FRAME_FA4(sp)
     239        FLREG   fa5, RISCV_INTERRUPT_FRAME_FA5(sp)
     240        FLREG   fa6, RISCV_INTERRUPT_FRAME_FA6(sp)
     241        FLREG   fa7, RISCV_INTERRUPT_FRAME_FA7(sp)
     242        fscsr   a0
     243#endif
    194244        LREG    a0, RISCV_INTERRUPT_FRAME_A0(sp)
    195245        LREG    a1, RISCV_INTERRUPT_FRAME_A1(sp)
Note: See TracChangeset for help on using the changeset viewer.