Changeset 7cd7a8d in mainline for kernel/arch/ia64/src/context.S


Ignore:
Timestamp:
2018-08-02T20:38:05Z (6 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9b7adc38
Parents:
0c27956
git-author:
Jakub Jermar <jakub@…> (2018-08-01 22:48:10)
git-committer:
Jakub Jermar <jakub@…> (2018-08-02 20:38:05)
Message:

Preserve AR.FPSR in thread context

AR.FPSR is a preserved register so it should be part of the thread
context, leaving its extra copy in istate_t rather for debugging
purposes.

In this commit we also disable all IEEE FP traps and the
Denormal/Unnormal Operand Floating-Point Exception fault for each new
thread context, leaving the thread with the possibility to change this
setting later in uspace.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/context.S

    r0c27956 r7cd7a8d  
    3333
    3434FUNCTION_BEGIN(context_save_arch)
    35         alloc loc0 = ar.pfs, 1, 49, 0, 0
     35        alloc loc0 = ar.pfs, 1, 50, 0, 0
    3636        mov loc1 = ar.unat ;;
    3737        mov loc3 = ar.rsc
     
    5757
    5858        mov loc6 = ar.lc
     59        mov loc7 = ar.fpsr
    5960
    6061        add loc8 = CONTEXT_OFFSET_AR_PFS, in0
     
    6566        add loc13 = CONTEXT_OFFSET_AR_RNAT, in0
    6667        add loc14 = CONTEXT_OFFSET_AR_LC, in0
    67 
    68         add loc15 = CONTEXT_OFFSET_R1, in0
    69         add loc16 = CONTEXT_OFFSET_R4, in0
    70         add loc17 = CONTEXT_OFFSET_R5, in0
    71         add loc18 = CONTEXT_OFFSET_R6, in0
    72         add loc19 = CONTEXT_OFFSET_R7, in0
    73         add loc20 = CONTEXT_OFFSET_SP, in0
    74         add loc21 = CONTEXT_OFFSET_R13, in0
    75 
    76         add loc22 = CONTEXT_OFFSET_PC, in0
    77         add loc23 = CONTEXT_OFFSET_B1, in0
    78         add loc24 = CONTEXT_OFFSET_B2, in0
    79         add loc25 = CONTEXT_OFFSET_B3, in0
    80         add loc26 = CONTEXT_OFFSET_B4, in0
    81         add loc27 = CONTEXT_OFFSET_B5, in0
    82 
    83         add loc28 = CONTEXT_OFFSET_PR, in0
    84 
    85         add loc29 = CONTEXT_OFFSET_F2, in0
    86         add loc30 = CONTEXT_OFFSET_F3, in0
    87         add loc31 = CONTEXT_OFFSET_F4, in0
    88         add loc32 = CONTEXT_OFFSET_F5, in0
    89 
    90         add loc33 = CONTEXT_OFFSET_F16, in0
    91         add loc34 = CONTEXT_OFFSET_F17, in0
    92         add loc35 = CONTEXT_OFFSET_F18, in0
    93         add loc36 = CONTEXT_OFFSET_F19, in0
    94         add loc37 = CONTEXT_OFFSET_F20, in0
    95         add loc38 = CONTEXT_OFFSET_F21, in0
    96         add loc39 = CONTEXT_OFFSET_F22, in0
    97         add loc40 = CONTEXT_OFFSET_F23, in0
    98         add loc41 = CONTEXT_OFFSET_F24, in0
    99         add loc42 = CONTEXT_OFFSET_F25, in0
    100         add loc43 = CONTEXT_OFFSET_F26, in0
    101         add loc44 = CONTEXT_OFFSET_F27, in0
    102         add loc45 = CONTEXT_OFFSET_F28, in0
    103         add loc46 = CONTEXT_OFFSET_F29, in0
    104         add loc47 = CONTEXT_OFFSET_F30, in0
    105         add loc48 = CONTEXT_OFFSET_F31, in0 ;;
    106 
    107         /*
    108          * Save general registers including NaT bits
    109          */
    110         st8.spill [loc15] = r1 ;;
    111         st8.spill [loc16] = r4 ;;
    112         st8.spill [loc17] = r5 ;;
    113         st8.spill [loc18] = r6 ;;
    114         st8.spill [loc19] = r7 ;;
    115         st8.spill [loc20] = r12 ;;      /* save sp */
    116         st8.spill [loc21] = r13 ;;
    117 
    118         mov loc2 = ar.unat
    119 
    120         /*
    121          * Save application registers
    122          */
    123         st8 [loc8] = loc0       /* save ar.pfs */
    124         st8 [loc9] = loc1 ;;    /* save ar.unat (caller) */
    125         st8 [loc10] = loc2      /* save ar.unat (callee) */
    126         st8 [loc11] = loc3      /* save ar.rsc */
    127         st8 [loc12] = loc4      /* save ar.bsp */
    128         st8 [loc13] = loc5      /* save ar.rnat */
    129         st8 [loc14] = loc6 ;;   /* save ar.lc */
    130 
    131         /*
    132          * Save branch registers
    133          */
    134         mov loc2 = b0
    135         mov loc3 = b1
    136         mov loc4 = b2
    137         mov loc5 = b3
    138         mov loc6 = b4
    139         mov loc7 = b5 ;;
    140         st8 [loc22] = loc2      /* save pc */
    141         st8 [loc23] = loc3
    142         st8 [loc24] = loc4
    143         st8 [loc25] = loc5
    144         st8 [loc26] = loc6
    145         st8 [loc27] = loc7 ;;
    146 
    147         /*
    148          * Save predicate registers
    149          */
    150         mov loc2 = pr ;;
    151         st8 [loc28] = loc2
    152 
    153         /*
    154          * Save floating-point registers.
    155          */
    156         stf.spill [loc29] = f2
    157         stf.spill [loc30] = f3
    158         stf.spill [loc31] = f4
    159         stf.spill [loc32] = f5
    160 
    161         stf.spill [loc33] = f16
    162         stf.spill [loc34] = f17
    163         stf.spill [loc35] = f18
    164         stf.spill [loc36] = f19
    165         stf.spill [loc37] = f20
    166         stf.spill [loc38] = f21
    167         stf.spill [loc39] = f22
    168         stf.spill [loc40] = f23
    169         stf.spill [loc41] = f24
    170         stf.spill [loc42] = f25
    171         stf.spill [loc43] = f26
    172         stf.spill [loc44] = f27
    173         stf.spill [loc45] = f28
    174         stf.spill [loc46] = f29
    175         stf.spill [loc47] = f30
    176         stf.spill [loc48] = f31
    177 
    178         mov ar.unat = loc1
    179 
    180         add r8 = r0, r0, 1      /* context_save returns 1 */
    181         br.ret.sptk.many b0
    182 FUNCTION_END(context_save_arch)
    183 
    184 FUNCTION_BEGIN(context_restore_arch)
    185         alloc loc0 = ar.pfs, 1, 50, 0, 0        ;;
    186 
    187         add loc9 = CONTEXT_OFFSET_AR_PFS, in0
    188         add loc10 = CONTEXT_OFFSET_AR_UNAT_CALLER, in0
    189         add loc11 = CONTEXT_OFFSET_AR_UNAT_CALLEE, in0
    190         add loc12 = CONTEXT_OFFSET_AR_RSC, in0
    191         add loc13 = CONTEXT_OFFSET_BSP, in0
    192         add loc14 = CONTEXT_OFFSET_AR_RNAT, in0
    193         add loc15 = CONTEXT_OFFSET_AR_LC, in0
     68        add loc15 = CONTEXT_OFFSET_AR_FPSR, in0
    19469
    19570        add loc16 = CONTEXT_OFFSET_R1, in0
     
    232107        add loc49 = CONTEXT_OFFSET_F31, in0 ;;
    233108
     109        /*
     110         * Save general registers including NaT bits
     111         */
     112        st8.spill [loc16] = r1 ;;
     113        st8.spill [loc17] = r4 ;;
     114        st8.spill [loc18] = r5 ;;
     115        st8.spill [loc19] = r6 ;;
     116        st8.spill [loc20] = r7 ;;
     117        st8.spill [loc21] = r12 ;;      /* save sp */
     118        st8.spill [loc22] = r13 ;;
     119
     120        mov loc2 = ar.unat
     121
     122        /*
     123         * Save application registers
     124         */
     125        st8 [loc8] = loc0       /* save ar.pfs */
     126        st8 [loc9] = loc1 ;;    /* save ar.unat (caller) */
     127        st8 [loc10] = loc2      /* save ar.unat (callee) */
     128        st8 [loc11] = loc3      /* save ar.rsc */
     129        st8 [loc12] = loc4      /* save ar.bsp */
     130        st8 [loc13] = loc5      /* save ar.rnat */
     131        st8 [loc14] = loc6      /* save ar.lc */
     132        st8 [loc15] = loc7 ;;   /* save ar.fpsr */
     133
     134        /*
     135         * Save branch registers
     136         */
     137        mov loc2 = b0
     138        mov loc3 = b1
     139        mov loc4 = b2
     140        mov loc5 = b3
     141        mov loc6 = b4
     142        mov loc7 = b5 ;;
     143        st8 [loc23] = loc2      /* save pc */
     144        st8 [loc24] = loc3
     145        st8 [loc25] = loc4
     146        st8 [loc26] = loc5
     147        st8 [loc27] = loc6
     148        st8 [loc28] = loc7 ;;
     149
     150        /*
     151         * Save predicate registers
     152         */
     153        mov loc2 = pr ;;
     154        st8 [loc29] = loc2
     155
     156        /*
     157         * Save floating-point registers.
     158         */
     159        stf.spill [loc30] = f2
     160        stf.spill [loc31] = f3
     161        stf.spill [loc32] = f4
     162        stf.spill [loc33] = f5
     163
     164        stf.spill [loc34] = f16
     165        stf.spill [loc35] = f17
     166        stf.spill [loc36] = f18
     167        stf.spill [loc37] = f19
     168        stf.spill [loc38] = f20
     169        stf.spill [loc39] = f21
     170        stf.spill [loc40] = f22
     171        stf.spill [loc41] = f23
     172        stf.spill [loc42] = f24
     173        stf.spill [loc43] = f25
     174        stf.spill [loc44] = f26
     175        stf.spill [loc45] = f27
     176        stf.spill [loc46] = f28
     177        stf.spill [loc47] = f29
     178        stf.spill [loc48] = f30
     179        stf.spill [loc49] = f31
     180
     181        mov ar.unat = loc1
     182
     183        add r8 = r0, r0, 1      /* context_save returns 1 */
     184        br.ret.sptk.many b0
     185FUNCTION_END(context_save_arch)
     186
     187FUNCTION_BEGIN(context_restore_arch)
     188        alloc loc0 = ar.pfs, 1, 51, 0, 0 ;;
     189
     190        add loc9 = CONTEXT_OFFSET_AR_PFS, in0
     191        add loc10 = CONTEXT_OFFSET_AR_UNAT_CALLER, in0
     192        add loc11 = CONTEXT_OFFSET_AR_UNAT_CALLEE, in0
     193        add loc12 = CONTEXT_OFFSET_AR_RSC, in0
     194        add loc13 = CONTEXT_OFFSET_BSP, in0
     195        add loc14 = CONTEXT_OFFSET_AR_RNAT, in0
     196        add loc15 = CONTEXT_OFFSET_AR_LC, in0
     197        add loc16 = CONTEXT_OFFSET_AR_FPSR, in0
     198
     199        add loc17 = CONTEXT_OFFSET_R1, in0
     200        add loc18 = CONTEXT_OFFSET_R4, in0
     201        add loc19 = CONTEXT_OFFSET_R5, in0
     202        add loc20 = CONTEXT_OFFSET_R6, in0
     203        add loc21 = CONTEXT_OFFSET_R7, in0
     204        add loc22 = CONTEXT_OFFSET_SP, in0
     205        add loc23 = CONTEXT_OFFSET_R13, in0
     206
     207        add loc24 = CONTEXT_OFFSET_PC, in0
     208        add loc25 = CONTEXT_OFFSET_B1, in0
     209        add loc26 = CONTEXT_OFFSET_B2, in0
     210        add loc27 = CONTEXT_OFFSET_B3, in0
     211        add loc28 = CONTEXT_OFFSET_B4, in0
     212        add loc29 = CONTEXT_OFFSET_B5, in0
     213
     214        add loc30 = CONTEXT_OFFSET_PR, in0
     215
     216        add loc31 = CONTEXT_OFFSET_F2, in0
     217        add loc32 = CONTEXT_OFFSET_F3, in0
     218        add loc33 = CONTEXT_OFFSET_F4, in0
     219        add loc34 = CONTEXT_OFFSET_F5, in0
     220
     221        add loc35 = CONTEXT_OFFSET_F16, in0
     222        add loc36 = CONTEXT_OFFSET_F17, in0
     223        add loc37 = CONTEXT_OFFSET_F18, in0
     224        add loc38 = CONTEXT_OFFSET_F19, in0
     225        add loc39 = CONTEXT_OFFSET_F20, in0
     226        add loc40 = CONTEXT_OFFSET_F21, in0
     227        add loc41 = CONTEXT_OFFSET_F22, in0
     228        add loc42 = CONTEXT_OFFSET_F23, in0
     229        add loc43 = CONTEXT_OFFSET_F24, in0
     230        add loc44 = CONTEXT_OFFSET_F25, in0
     231        add loc45 = CONTEXT_OFFSET_F26, in0
     232        add loc46 = CONTEXT_OFFSET_F27, in0
     233        add loc47 = CONTEXT_OFFSET_F28, in0
     234        add loc48 = CONTEXT_OFFSET_F29, in0
     235        add loc49 = CONTEXT_OFFSET_F30, in0
     236        add loc50 = CONTEXT_OFFSET_F31, in0 ;;
     237
    234238        ld8 loc0 = [loc9]       /* load ar.pfs */
    235239        ld8 loc1 = [loc10]      /* load ar.unat (caller) */
     
    239243        ld8 loc5 = [loc14]      /* load ar.rnat */
    240244        ld8 loc6 = [loc15]      /* load ar.lc */
     245        ld8 loc7 = [loc16]      /* load ar.fpsr */
    241246
    242247        .auto
     
    269274        mov ar.pfs = loc0
    270275        mov ar.rsc = loc3
     276        mov ar.fpsr = loc7
    271277
    272278        .explicit
     
    278284         * Restore general registers including NaT bits
    279285         */
    280         ld8.fill r1 = [loc16] ;;
    281         ld8.fill r4 = [loc17] ;;
    282         ld8.fill r5 = [loc18] ;;
    283         ld8.fill r6 = [loc19] ;;
    284         ld8.fill r7 = [loc20] ;;
    285         ld8.fill r12 = [loc21] ;;       /* restore sp */
    286         ld8.fill r13 = [loc22] ;;
     286        ld8.fill r1 = [loc17] ;;
     287        ld8.fill r4 = [loc18] ;;
     288        ld8.fill r5 = [loc19] ;;
     289        ld8.fill r6 = [loc20] ;;
     290        ld8.fill r7 = [loc21] ;;
     291        ld8.fill r12 = [loc22] ;;       /* restore sp */
     292        ld8.fill r13 = [loc23] ;;
    287293
    288294        /*
    289295         * Restore branch registers
    290296         */
    291         ld8 loc2 = [loc23]              /* restore pc */
    292         ld8 loc3 = [loc24]
    293         ld8 loc4 = [loc25]
    294         ld8 loc5 = [loc26]
    295         ld8 loc6 = [loc27]
    296         ld8 loc7 = [loc28] ;;
     297        ld8 loc2 = [loc24]              /* restore pc */
     298        ld8 loc3 = [loc25]
     299        ld8 loc4 = [loc26]
     300        ld8 loc5 = [loc27]
     301        ld8 loc6 = [loc28]
     302        ld8 loc7 = [loc29] ;;
    297303        mov b0 = loc2
    298304        mov b1 = loc3
     
    305311         * Restore predicate registers
    306312         */
    307         ld8 loc2 = [loc29] ;;
     313        ld8 loc2 = [loc30] ;;
    308314        mov pr = loc2, ~0
    309315
     
    311317         * Restore floating-point registers.
    312318         */
    313         ldf.fill f2 = [loc30]
    314         ldf.fill f3 = [loc31]
    315         ldf.fill f4 = [loc32]
    316         ldf.fill f5 = [loc33]
    317 
    318         ldf.fill f16 = [loc34]
    319         ldf.fill f17 = [loc35]
    320         ldf.fill f18 = [loc36]
    321         ldf.fill f19 = [loc37]
    322         ldf.fill f20 = [loc38]
    323         ldf.fill f21 = [loc39]
    324         ldf.fill f22 = [loc40]
    325         ldf.fill f23 = [loc41]
    326         ldf.fill f24 = [loc42]
    327         ldf.fill f25 = [loc43]
    328         ldf.fill f26 = [loc44]
    329         ldf.fill f27 = [loc45]
    330         ldf.fill f28 = [loc46]
    331         ldf.fill f29 = [loc47]
    332         ldf.fill f30 = [loc48]
    333         ldf.fill f31 = [loc49]
     319        ldf.fill f2 = [loc31]
     320        ldf.fill f3 = [loc32]
     321        ldf.fill f4 = [loc33]
     322        ldf.fill f5 = [loc34]
     323
     324        ldf.fill f16 = [loc35]
     325        ldf.fill f17 = [loc36]
     326        ldf.fill f18 = [loc37]
     327        ldf.fill f19 = [loc38]
     328        ldf.fill f20 = [loc39]
     329        ldf.fill f21 = [loc40]
     330        ldf.fill f22 = [loc41]
     331        ldf.fill f23 = [loc42]
     332        ldf.fill f24 = [loc43]
     333        ldf.fill f25 = [loc44]
     334        ldf.fill f26 = [loc45]
     335        ldf.fill f27 = [loc46]
     336        ldf.fill f28 = [loc47]
     337        ldf.fill f29 = [loc48]
     338        ldf.fill f30 = [loc49]
     339        ldf.fill f31 = [loc50]
    334340
    335341        mov ar.unat = loc1
Note: See TracChangeset for help on using the changeset viewer.