Changeset 2f8704b6 in rtems


Ignore:
Timestamp:
Jul 13, 2017, 7:26:50 AM (4 years ago)
Author:
Daniel Cederman <cederman@…>
Branches:
5, master
Children:
4debaca6
Parents:
1549beb
git-author:
Daniel Cederman <cederman@…> (07/13/17 07:26:50)
git-committer:
Sebastian Huber <sebastian.huber@…> (07/17/17 05:41:38)
Message:

sparc: Add assembly workaround for LEON3FT B2BST errata

This patch adds NOP instructions to prevent instruction sequences
that are sensitive to the LEON3FT B2BST errata. See GRLIB-TN-0009:
"LEON3FT Stale Cache Entry After Store with Data Tag Parity Error"
for more information.

The sequences are only modified if FIX_LEON3FT_B2BST is defined.

The patch works in conjunction with the -mfix-ut700, -mfix-gr712rc,
and -mfix-ut699 GCC flags that prevents the sensitive sequences from
being generated.

Update #3057.

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/sparc/shared/irq_asm.S

    r1549beb r2f8704b6  
    6767
    6868        std     %l0, [%o0 + L0_OFFSET]       ! save the local registers
     69        SPARC_LEON3FT_B2BST_NOP
    6970        std     %l2, [%o0 + L2_OFFSET]
     71        SPARC_LEON3FT_B2BST_NOP
    7072        std     %l4, [%o0 + L4_OFFSET]
     73        SPARC_LEON3FT_B2BST_NOP
    7174        std     %l6, [%o0 + L6_OFFSET]
     75        SPARC_LEON3FT_B2BST_NOP
    7276
    7377        std     %i0, [%o0 + I0_OFFSET]       ! save the input registers
     78        SPARC_LEON3FT_B2BST_NOP
    7479        std     %i2, [%o0 + I2_OFFSET]
     80        SPARC_LEON3FT_B2BST_NOP
    7581        std     %i4, [%o0 + I4_OFFSET]
     82        SPARC_LEON3FT_B2BST_NOP
    7683        std     %i6, [%o0 + I6_FP_OFFSET]
     84        SPARC_LEON3FT_B2BST_NOP
    7785
    7886        std     %o6, [%o0 + O6_SP_OFFSET]    ! save the output registers
     
    159167
    160168        std     %l0, [%sp + CPU_STACK_FRAME_L0_OFFSET]
     169        SPARC_LEON3FT_B2BST_NOP
    161170        std     %l2, [%sp + CPU_STACK_FRAME_L2_OFFSET]
     171        SPARC_LEON3FT_B2BST_NOP
    162172        std     %l4, [%sp + CPU_STACK_FRAME_L4_OFFSET]
     173        SPARC_LEON3FT_B2BST_NOP
    163174        std     %l6, [%sp + CPU_STACK_FRAME_L6_OFFSET]
     175        SPARC_LEON3FT_B2BST_NOP
    164176
    165177        std     %i0, [%sp + CPU_STACK_FRAME_I0_OFFSET]
     178        SPARC_LEON3FT_B2BST_NOP
    166179        std     %i2, [%sp + CPU_STACK_FRAME_I2_OFFSET]
     180        SPARC_LEON3FT_B2BST_NOP
    167181        std     %i4, [%sp + CPU_STACK_FRAME_I4_OFFSET]
     182        SPARC_LEON3FT_B2BST_NOP
    168183        std     %i6, [%sp + CPU_STACK_FRAME_I6_FP_OFFSET]
     184        SPARC_LEON3FT_B2BST_NOP
    169185
    170186        ba      save_frame_loop
     
    376392
    377393        std     %l0, [%sp + CPU_STACK_FRAME_L0_OFFSET]
     394        SPARC_LEON3FT_B2BST_NOP
    378395        std     %l2, [%sp + CPU_STACK_FRAME_L2_OFFSET]
     396        SPARC_LEON3FT_B2BST_NOP
    379397        std     %l4, [%sp + CPU_STACK_FRAME_L4_OFFSET]
     398        SPARC_LEON3FT_B2BST_NOP
    380399        std     %l6, [%sp + CPU_STACK_FRAME_L6_OFFSET]
     400        SPARC_LEON3FT_B2BST_NOP
    381401
    382402        std     %i0, [%sp + CPU_STACK_FRAME_I0_OFFSET]
     403        SPARC_LEON3FT_B2BST_NOP
    383404        std     %i2, [%sp + CPU_STACK_FRAME_I2_OFFSET]
     405        SPARC_LEON3FT_B2BST_NOP
    384406        std     %i4, [%sp + CPU_STACK_FRAME_I4_OFFSET]
     407        SPARC_LEON3FT_B2BST_NOP
    385408        std     %i6, [%sp + CPU_STACK_FRAME_I6_FP_OFFSET]
    386409
     
    407430
    408431        std     %l0, [%sp + ISF_PSR_OFFSET]    ! save psr, PC
     432        SPARC_LEON3FT_B2BST_NOP
    409433        st      %l2, [%sp + ISF_NPC_OFFSET]    ! save nPC
    410434        st      %g1, [%sp + ISF_G1_OFFSET]     ! save g1
    411435        std     %g2, [%sp + ISF_G2_OFFSET]     ! save g2, g3
     436        SPARC_LEON3FT_B2BST_NOP
    412437        std     %l4, [%sp + ISF_G4_OFFSET]     ! save g4, g5 -- see above
     438        SPARC_LEON3FT_B2BST_NOP
    413439        st      %g7, [%sp + ISF_G7_OFFSET]     ! save g7
    414440
    415441        std     %i0, [%sp + ISF_I0_OFFSET]     ! save i0, i1
     442        SPARC_LEON3FT_B2BST_NOP
    416443        std     %i2, [%sp + ISF_I2_OFFSET]     ! save i2, i3
     444        SPARC_LEON3FT_B2BST_NOP
    417445        std     %i4, [%sp + ISF_I4_OFFSET]     ! save i4, i5
     446        SPARC_LEON3FT_B2BST_NOP
    418447        std     %i6, [%sp + ISF_I6_FP_OFFSET]  ! save i6/fp, i7
    419448
     
    441470        add      %l7, 1, %l7
    442471        st       %l7, [%g6 + PER_CPU_ISR_NEST_LEVEL]
     472        SPARC_LEON3FT_B2BST_NOP
    443473
    444474        add      %l6, 1, %l6
     
    588618        ld       [%g6 + PER_CPU_ISR_DISPATCH_DISABLE], %o3
    589619        st       %l7, [%g6 + PER_CPU_ISR_NEST_LEVEL]
     620        SPARC_LEON3FT_B2BST_NOP
    590621        sub      %l6, 1, %l6
    591622        st       %l6, [%g6 + PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
     
    636667        sub     %sp, FP_FRAME_SIZE, %sp
    637668        std     %f0, [%sp + FP_FRAME_OFFSET_FO_F1]
     669        SPARC_LEON3FT_B2BST_NOP
    638670        std     %f2, [%sp + FP_FRAME_OFFSET_F2_F3]
     671        SPARC_LEON3FT_B2BST_NOP
    639672        std     %f4, [%sp + FP_FRAME_OFFSET_F4_F5]
     673        SPARC_LEON3FT_B2BST_NOP
    640674        std     %f6, [%sp + FP_FRAME_OFFSET_F6_F7]
     675        SPARC_LEON3FT_B2BST_NOP
    641676        std     %f8, [%sp + FP_FRAME_OFFSET_F8_F9]
     677        SPARC_LEON3FT_B2BST_NOP
    642678        std     %f10, [%sp + FP_FRAME_OFFSET_F1O_F11]
     679        SPARC_LEON3FT_B2BST_NOP
    643680        std     %f12, [%sp + FP_FRAME_OFFSET_F12_F13]
     681        SPARC_LEON3FT_B2BST_NOP
    644682        std     %f14, [%sp + FP_FRAME_OFFSET_F14_F15]
     683        SPARC_LEON3FT_B2BST_NOP
    645684        std     %f16, [%sp + FP_FRAME_OFFSET_F16_F17]
     685        SPARC_LEON3FT_B2BST_NOP
    646686        std     %f18, [%sp + FP_FRAME_OFFSET_F18_F19]
     687        SPARC_LEON3FT_B2BST_NOP
    647688        std     %f20, [%sp + FP_FRAME_OFFSET_F2O_F21]
     689        SPARC_LEON3FT_B2BST_NOP
    648690        std     %f22, [%sp + FP_FRAME_OFFSET_F22_F23]
     691        SPARC_LEON3FT_B2BST_NOP
    649692        std     %f24, [%sp + FP_FRAME_OFFSET_F24_F25]
     693        SPARC_LEON3FT_B2BST_NOP
    650694        std     %f26, [%sp + FP_FRAME_OFFSET_F26_F27]
     695        SPARC_LEON3FT_B2BST_NOP
    651696        std     %f28, [%sp + FP_FRAME_OFFSET_F28_F29]
     697        SPARC_LEON3FT_B2BST_NOP
    652698        std     %f30, [%sp + FP_FRAME_OFFSET_F3O_F31]
     699        SPARC_LEON3FT_B2BST_NOP
    653700        st      %fsr, [%sp + FP_FRAME_OFFSET_FSR]
    654701        call    SYM(_Thread_Do_dispatch)
  • c/src/lib/libcpu/sparc/access/access.S

    r1549beb r2f8704b6  
    6060         ldd [%o0], %o0
    6161
     62#if defined(__FIX_LEON3FT_B2BST)
     63
     64SYM(_st8):
     65        stub %o1, [%o0]
     66        retl
     67         nop
     68
     69SYM(_st_be16):
     70SYM(_st16):
     71        stuh %o1, [%o0]
     72        retl
     73         nop
     74
     75SYM(_st_be32):
     76SYM(_st32):
     77        st %o1, [%o0]
     78        retl
     79         nop
     80
     81SYM(_st_be64):
     82SYM(_st64):
     83        std %o1, [%o0]
     84        retl
     85         nop
     86
     87#else
     88
    6289SYM(_st8):
    6390        retl
     
    80107        retl
    81108         std %o2, [%o0]
     109#endif
  • c/src/lib/libcpu/sparc/reg_win/window.S

    r1549beb r2f8704b6  
    5252
    5353        std  %l0, [%sp + 0x00]           ! save local register set
     54        SPARC_LEON3FT_B2BST_NOP
    5455        std  %l2, [%sp + 0x08]
    5556        mov  %wim, %l3
     
    5758                                         ! l2  = WIM << (Number Windows - 1)
    5859        std  %l4, [%sp + 0x10]
     60        SPARC_LEON3FT_B2BST_NOP
    5961        std  %l6, [%sp + 0x18]
    6062        srl  %l3, 1, %l3                 ! l3  = WIM >> 1
     
    6365                                         ! 3 instruction delay not needed here
    6466        std  %i0, [%sp + 0x20]           ! save input register set
     67        SPARC_LEON3FT_B2BST_NOP
    6568        std  %i2, [%sp + 0x28]
     69        SPARC_LEON3FT_B2BST_NOP
    6670        std  %i4, [%sp + 0x30]
     71        SPARC_LEON3FT_B2BST_NOP
    6772        std  %i6, [%sp + 0x38]
    6873        restore                          ! Go back to trap window.
     
    207212
    208213        std     %l0, [%sp + CPU_STACK_FRAME_L0_OFFSET]
     214        SPARC_LEON3FT_B2BST_NOP
    209215        std     %l2, [%sp + CPU_STACK_FRAME_L2_OFFSET]
     216        SPARC_LEON3FT_B2BST_NOP
    210217        std     %l4, [%sp + CPU_STACK_FRAME_L4_OFFSET]
     218        SPARC_LEON3FT_B2BST_NOP
    211219        std     %l6, [%sp + CPU_STACK_FRAME_L6_OFFSET]
     220        SPARC_LEON3FT_B2BST_NOP
    212221
    213222        std     %i0, [%sp + CPU_STACK_FRAME_I0_OFFSET]
     223        SPARC_LEON3FT_B2BST_NOP
    214224        std     %i2, [%sp + CPU_STACK_FRAME_I2_OFFSET]
     225        SPARC_LEON3FT_B2BST_NOP
    215226        std     %i4, [%sp + CPU_STACK_FRAME_I4_OFFSET]
     227        SPARC_LEON3FT_B2BST_NOP
    216228        std     %i6, [%sp + CPU_STACK_FRAME_I6_FP_OFFSET]
    217229
  • cpukit/score/cpu/sparc/cpu_asm.S

    r1549beb r2f8704b6  
    4747        ld      [%o0], %o1
    4848        std     %f0, [%o1 + FO_F1_OFFSET]
     49        SPARC_LEON3FT_B2BST_NOP
    4950        std     %f2, [%o1 + F2_F3_OFFSET]
     51        SPARC_LEON3FT_B2BST_NOP
    5052        std     %f4, [%o1 + F4_F5_OFFSET]
     53        SPARC_LEON3FT_B2BST_NOP
    5154        std     %f6, [%o1 + F6_F7_OFFSET]
     55        SPARC_LEON3FT_B2BST_NOP
    5256        std     %f8, [%o1 + F8_F9_OFFSET]
     57        SPARC_LEON3FT_B2BST_NOP
    5358        std     %f10, [%o1 + F1O_F11_OFFSET]
     59        SPARC_LEON3FT_B2BST_NOP
    5460        std     %f12, [%o1 + F12_F13_OFFSET]
     61        SPARC_LEON3FT_B2BST_NOP
    5562        std     %f14, [%o1 + F14_F15_OFFSET]
     63        SPARC_LEON3FT_B2BST_NOP
    5664        std     %f16, [%o1 + F16_F17_OFFSET]
     65        SPARC_LEON3FT_B2BST_NOP
    5766        std     %f18, [%o1 + F18_F19_OFFSET]
     67        SPARC_LEON3FT_B2BST_NOP
    5868        std     %f20, [%o1 + F2O_F21_OFFSET]
     69        SPARC_LEON3FT_B2BST_NOP
    5970        std     %f22, [%o1 + F22_F23_OFFSET]
     71        SPARC_LEON3FT_B2BST_NOP
    6072        std     %f24, [%o1 + F24_F25_OFFSET]
     73        SPARC_LEON3FT_B2BST_NOP
    6174        std     %f26, [%o1 + F26_F27_OFFSET]
     75        SPARC_LEON3FT_B2BST_NOP
    6276        std     %f28, [%o1 + F28_F29_OFFSET]
     77        SPARC_LEON3FT_B2BST_NOP
    6378        std     %f30, [%o1 + F3O_F31_OFFSET]
     79        SPARC_LEON3FT_B2BST_NOP
     80#if defined(__FIX_LEON3FT_B2BST)
     81        st     %fsr, [%o1 + FSR_OFFSET]
     82        jmp     %o7 + 8
     83         nop
     84#else
    6485        jmp     %o7 + 8
    6586         st     %fsr, [%o1 + FSR_OFFSET]
     87#endif
    6688
    6789/*
  • cpukit/score/cpu/sparc/rtems/score/sparc.h

    r1549beb r2f8704b6  
    6262 */
    6363#define SPARC_NUMBER_OF_REGISTER_WINDOWS 8
     64
     65/**
     66 * See GRLIB-TN-0009: "LEON3FT Stale Cache Entry After Store with
     67 * Data Tag Parity Error"
     68 */
     69#if defined(__FIX_LEON3FT_B2BST)
     70  #define SPARC_LEON3FT_B2BST_NOP nop
     71#else
     72  #define SPARC_LEON3FT_B2BST_NOP
     73#endif
    6474
    6575/**
  • cpukit/score/cpu/sparc/sparc-context-validate.S

    r1549beb r2f8704b6  
    283283
    284284        st      %o1, [%sp + FRAME_OFFSET_BUFFER_2]
     285        SPARC_LEON3FT_B2BST_NOP
    285286        /* Check floating point registers */
    286287        check_float_register    %f31
Note: See TracChangeset for help on using the changeset viewer.