Changeset 4a5a4504 in rtems


Ignore:
Timestamp:
May 29, 2015, 8:18:19 AM (4 years ago)
Author:
Alexander Krutwig <alexander.krutwig@…>
Branches:
4.11, master
Children:
b17fb17a
Parents:
5611839
git-author:
Alexander Krutwig <alexander.krutwig@…> (05/29/15 08:18:19)
git-committer:
Sebastian Huber <sebastian.huber@…> (05/29/15 13:36:40)
Message:

sparc: Improve _CPU_Context_validate()

Write the pattern only once to the entry register window and the
floating point registers.

Update #2270.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/cpu/sparc/sparc-context-validate.S

    r5611839 r4a5a4504  
    2020#include <rtems/score/cpu.h>
    2121
    22 #define FRAME_OFFSET_BUFFER (CPU_MINIMUM_STACK_FRAME_SIZE)
    23 #define FRAME_OFFSET_L0 (FRAME_OFFSET_BUFFER + 0x04)
     22#define FRAME_OFFSET_BUFFER_0 (CPU_MINIMUM_STACK_FRAME_SIZE)
     23#define FRAME_OFFSET_BUFFER_1 (FRAME_OFFSET_BUFFER_0 + 0x04)
     24#define FRAME_OFFSET_BUFFER_2 (FRAME_OFFSET_BUFFER_1 + 0x04)
     25#define FRAME_OFFSET_L0 (FRAME_OFFSET_BUFFER_2 + 0x04)
    2426#define FRAME_OFFSET_L1 (FRAME_OFFSET_L0 + 0x04)
    2527#define FRAME_OFFSET_L2 (FRAME_OFFSET_L1 + 0x04)
     
    3739#define FRAME_OFFSET_I6 (FRAME_OFFSET_I5 + 0x04)
    3840#define FRAME_OFFSET_I7 (FRAME_OFFSET_I6 + 0x04)
    39 #define FRAME_OFFSET_SP (FRAME_OFFSET_I7 + 0x04)
    40 #define FRAME_END (FRAME_OFFSET_SP + 0x04)
     41#define FRAME_END (FRAME_OFFSET_I7 + 0x04)
    4142#define FRAME_SIZE \
    4243  ((FRAME_END + CPU_STACK_ALIGNMENT - 1) & ~(CPU_STACK_ALIGNMENT - 1))
     
    5152.macro check_float_register reg
    5253        sub     %g1, 1, %g1
    53         st      \reg, [%sp + FRAME_OFFSET_BUFFER]
    54         ld      [%sp + FRAME_OFFSET_BUFFER], %o1
     54        st      \reg, [%sp + FRAME_OFFSET_BUFFER_0]
     55        ld      [%sp + FRAME_OFFSET_BUFFER_0], %o1
    5556        cmp     %g1, %o1
    56         bne     restore_registers
    57          nop
    58 .endm
    59 
    60 .macro check_fsr_register reg
    61         st      \reg, [%sp + FRAME_OFFSET_BUFFER]
    62         ld      [%sp + FRAME_OFFSET_BUFFER], %o1
    63         sub     %g1, 1, %g1
    64         clr     %g3
    65         sethi   %hi(0xCF800000), %g3
    66         or      %g3, %lo(0x0FFF), %g3
    67         and     %g1, %g3, %g3
    68         and     %o1, %g3, %o1
    69         cmp     %o1, %g3
    7057        bne     restore_registers
    7158         nop
     
    7966.macro write_float_register reg
    8067        add     %g1, 1, %g1
    81         st      %g1, [%sp + FRAME_OFFSET_BUFFER]
    82         ld      [%sp + FRAME_OFFSET_BUFFER], \reg
    83 .endm
    84 
    85 .macro write_fsr_register reg
    86         st      \reg, [%sp + FRAME_OFFSET_BUFFER]
    87         ld      [%sp + FRAME_OFFSET_BUFFER], %o1
    88         add     %g1, 1, %g1
    89         clr     %g3
    90 
    91         /*
    92          * FSR is masked with undefined, reserved or system-specific values
    93          * (e.g. FPU architecture version, FP queue).
    94          */
    95         sethi   %hi(0xCF800000), %g3
    96         or      %g3, %lo(0x0FFF), %g3
    97         and     %g1, %g3, %g3
    98         or      %o1, %g3, %g3
    99         st      %g3, [%sp + FRAME_OFFSET_BUFFER]
    100         ld      [%sp + FRAME_OFFSET_BUFFER], \reg
     68        st      %g1, [%sp + FRAME_OFFSET_BUFFER_0]
     69        ld      [%sp + FRAME_OFFSET_BUFFER_0], \reg
    10170.endm
    10271
     
    137106        st      %i6, [%sp + FRAME_OFFSET_I6]
    138107        st      %i7, [%sp + FRAME_OFFSET_I7]
    139         st      %sp, [%sp + FRAME_OFFSET_SP]
    140108
    141109        cmp     %g4, 0
     
    147115new_check_cycle:
    148116        clr     %g4
    149         sub     %g1, 1, %g1
    150 
     117        add     %g4, 1, %g4
     118        ld      [%sp + FRAME_OFFSET_BUFFER_1], %g1
     119        b       switch_to_next_window
     120         nop
    151121        /* Write pattern values into registers */
    152122
     
    156126         nop
    157127
    158         write_fsr_register      %fsr
     128        /*
     129         * Write pattern to FSR.  FSR is masked with undefined, reserved or
     130         * system-specific values (e.g. FPU architecture version, FP queue).
     131         */
     132        st      %fsr, [%sp + FRAME_OFFSET_BUFFER_0]
     133        ld      [%sp + FRAME_OFFSET_BUFFER_0], %o1
     134        add     %g1, 1, %g1
     135        sethi   %hi(0xCF800000), %g3
     136        or      %g3, %lo(0x0FFF), %g3
     137        and     %g1, %g3, %g3
     138        or      %o1, %g3, %g3
     139        st      %g3, [%sp + FRAME_OFFSET_BUFFER_0]
     140        ld      [%sp + FRAME_OFFSET_BUFFER_0], %fsr
     141
    159142        write_float_register    %f0
    160143        write_float_register    %f1
     
    225208
    226209        add     %g4, 1, %g4
     210        cmp     %g4, 1
     211        bne     no_store
     212         nop
     213        st      %g1, [%sp + FRAME_OFFSET_BUFFER_1]
     214
     215no_store:
    227216        cmp     %g4, SPARC_NUMBER_OF_REGISTER_WINDOWS
    228217        bne     switch_to_next_window
     
    285274        /* Check Y register */
    286275y_checking:
     276        st      %o1, [%sp + FRAME_OFFSET_BUFFER_2]
    287277        mov     %y, %o1
    288278        check_register  %o1
     279        ld      [%sp + FRAME_OFFSET_BUFFER_2], %o1
    289280        cmp     %g2, 0
    290281        be      new_check_cycle
    291282         nop
    292283
     284        st      %o1, [%sp + FRAME_OFFSET_BUFFER_2]
    293285        /* Check floating point registers */
    294286        check_float_register    %f31
     
    324316        check_float_register    %f1
    325317        check_float_register    %f0
    326         check_fsr_register      %fsr
    327 
    328         be      new_check_cycle
     318
     319        st      %fsr, [%sp + FRAME_OFFSET_BUFFER_0]
     320        ld      [%sp + FRAME_OFFSET_BUFFER_0], %o1
     321        sub     %g1, 1, %g1
     322        clr     %g3
     323        sethi   %hi(0xCF800000), %g3
     324        or      %g3, %lo(0x0FFF), %g3
     325        and     %g1, %g3, %g3
     326        and     %o1, %g3, %o1
     327        cmp     %o1, %g3
     328        bne     restore_registers
     329         ld     [%sp + FRAME_OFFSET_BUFFER_2], %o1
     330
     331        b       new_check_cycle
    329332         nop
    330333
Note: See TracChangeset for help on using the changeset viewer.