OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [regtest.S] - Rev 2

Compare with Previous | Blame | View Log


        .text
        .align 4
        .global _regtest, regtest
        .proc   04

_regtest:
regtest:


#ifndef _FLAT
        save %sp, -96, %sp
#endif

# do jmp/jmpl pipeline tests

        set  0, %o2
        set  b1, %o0
        set  b1+4, %o1
        set  b2, %o3
        set  b2+4, %o4

        jmpl  %o0, %o1
        jmp  %o1
        ba   err1
b1:
        jmp  %o3
        jmp  %o4
        ba   err1
b2:
        add %o2, 1, %o2
        add %o2, 1, %o2
        subcc %o2, 3, %g0
        bne err1
        nop

#ifdef LEON2
        set     0x80000024, %l2
        ld      [%l2], %l2
        srl     %l2, 20, %g5
        and     %g5, 0x1f, %g5
        ba 2f
        mov     %g5, %g6
#else
!       ba 1f
        
        
!       mov %g0, %asr16
!       nop; nop; nop
        mov %asr16, %g3
        srl %g3, 14, %g6
        andcc %g6, 7, %g6
        subcc %g6, 0, %g0
        be 1f                   ! no FT
        nop
        srl %g3, 11, %l7
        and %l7, 0x7, %l7
        subcc %l7, 0, %g0       ! error counter should be 0
        bne 1f
        nop
        subcc %g6, 2, %g0
        bne ft1                 ! only test if IUFT = 2
        nop

        set 0x40000000, %l2
        ldd [%l2], %l2          ! pre-load dcache
        set 0x40000000, %l2
        set 0x40000104, %l4
        mov %l2, %l3
        mov %l2, %l5
        mov %l4, %l6
        mov 0x46, %asr16        ! single bit error in byte 0
        mov %g0, %l2
        mov %g0, %l5
        nop; 
        mov 0x4E, %asr16        ! double bit error in byte 0 & 3
        mov 0x100, %l4
        nop; 
        mov %g0, %asr16         ! test mode off
        nop; nop; 
        
        std %l4, [%l2+0x30]

        subcc %l2, %l3, %g1     ! %l3 should be 0 (corrected)
        bne err1
        subcc %l4, %l6, %g1     ! %l6 should be 0 (corrected)
        bne err1
        nop
        nop; nop                ! wait until error counters are updated
        mov %asr16, %g3
        srl %g3, 11, %g6
        andcc %g6, 0x7, %g6
        subcc %g6, 5, %g6
        bne err1                ! error counter should be 4
        mov %g0, %asr16         ! test mode off
        nop; nop; nop
        ldd [%l2+0x30], %l4
        subcc %l4, %l6, %g1     ! %l3 should be 0 (corrected)
        bne err1
        subcc %l5, %l2, %g1     ! %l6 should be 0 (corrected)
        mov %g0, %l2            ! clear remaining error
        bne err1
        nop; nop                ! wait until error counters are updated
        mov %asr16, %g3
        srl %g3, 11, %g6
        andcc %g6, 0x7, %g6
        subcc %g6, 3, %g6
        bne err1                ! error counter should be 4
        nop


        ba 1f
        nop

ft1:
        subcc %g6, 1, %g0
        bne ft3                 ! only test if IUFT = 1

        set 0x40000000, %l2
        ldd [%l2], %l2          ! pre-load dcache
        set 0x40000000, %l2
        set 0x40000104, %l4
        mov %l2, %l3
        mov %l2, %l5
        mov %l4, %l6
        mov 0x46, %asr16        ! single bit error in byte 0
        mov %g0, %l2
        mov %g0, %l5
        nop; 
        mov 0x4E, %asr16        ! double bit error in byte 0 & 3
        mov 0x100, %l4
        nop; 
        mov %g0, %asr16         ! test mode off
        nop; nop; nop

        std %l4, [%l2]

        subcc %l2, %l3, %g1     ! %l3 should be 0 (corrected)
        bne err1
        subcc %l4, %l6, %g1     ! %l6 should be 0 (corrected)
        bne err1
        nop; nop                ! wait until error counters are updated
        mov %asr16, %g3
        srl %g3, 11, %g6
        andcc %g6, 0x7, %g6
        subcc %g6, 2, %g6
        bne err1                ! error counter should be 2
        nop
        ba 1f
        nop


ft3:
        subcc %g6, 3, %g0
        bne 1f                  ! only test if IUFT = 3
        mov %g0, %l3
        set 0xe, %l1            ! test mode enable, xor lsb of check bits
        mov %l1, %asr16         ! regfile EDAC test mode enable
        mov %g0, %l3
        mov %g0, %asr16 
        or %l3, 0, %l4
        mov %asr16, %l5
        nop
        or %l3, 0, %l6
        nop
        mov %asr16, %l7
        subcc %l4, 0, %g0       ! %l4 should be zero
        bne err1
        andcc %l5, 0xe00, %l5   ! data-forwarding should not trigger EDAC error
        subcc %l5, %g0, %g0     
        bne err1
        subcc %l6, 0, %g0       ! %l6 should be 0 (corrected)
        bne err1
        srl %l7, 11, %l7
        and %l7, 0x7, %l7
        subcc %l7, 1, %g0       ! error counter should be incremented
        bne err1
        nop

        mov %g0, %l0            ! correctable EDAC error in LD
        mov %l1, %asr16         
        mov %g0, %l3    
        mov %g0, %asr16 
        ldd [%g0], %l4
        mov %g0, %l6
        mov %g0, %l7
        ld [%l3], %l6
        ld [%l3 + 4], %l7
        cmp %l4, %l6
        bne err1
        cmp %l5, %l7
        bne err1
        nop
        mov %asr16, %l2
        srl %l2, 11, %l2
        and %l2, 0x7, %l2
        subcc %l2, 1, %g0       ! error counter should be incremented
        bne err1
        nop

        mov %g0, %l0            ! 2 correctable EDAC errors in LD
        mov %l1, %asr16         
        mov %g0, %l3    
        mov %g0, %asr16 
        set 0xa, %l1            ! test mode enable, xor lsb of check bits
        mov %l1, %asr16         
        mov %g0, %l2    
        mov %g0, %asr16 
        ldd [%g0], %l4
        mov %g0, %l6
        mov %g0, %l7
        ld [%l3 + %l2], %l6
        ld [%l3 + 4], %l7
        cmp %l4, %l6
        bne err1
        cmp %l5, %l7
        bne err1
        nop
        mov %asr16, %l2
        srl %l2, 11, %l2
        and %l2, 0x7, %l2
        subcc %l2, 2, %g0       ! error counter should be incremented
        bl err1
        nop

!       set 0x40000000, %l0             ! 4 correctable EDAC errors in STD
        set ftbuf, %l0          ! 4 correctable EDAC errors in STD
        ldd [%l0], %l6
!       set 0x41000000, %l0
        add %l0, 8, %l0
        ldd [%l0], %l4
        mov %l1, %asr16         
        mov %g0, %l3    
        mov %g0, %asr16 
        set 0xe, %l1            ! test mode enable, xor lsb of check bits
        mov %l1, %asr16         
        mov %l0, %l2    
        mov %g0, %l6    
        mov %g0, %l7    
        mov %g0, %asr16 
        nop; nop
        std %l6, [%l2 + %l3]
        mov %g0, %l6
        mov %g0, %l7
        ldd [%l3 + %l2], %l4
        cmp %l4, %l6
        bne err1
        cmp %l5, %l7
        bne err1
        nop
        mov %asr16, %l2
        srl %l2, 11, %l2
        and %l2, 0x7, %l2
        subcc %l2, 4, %g0       ! error counter should be incremented
        bne err1
        nop
        ba 1f
        nop

        ! flush all register windows (maximum 32)
1:
        mov     %asr17, %g5
        and     %g5, 0x1f, %g5
        subcc   %g5, 1, %g0
        be      4f
        mov     %g5, %g6
#endif
2:
        save %sp, -96, %sp
        subcc   %g5, 1, %g5
        bge     2b
        nop
3:
        restore
        subcc   %g6, 1, %g6
        bge     3b
        nop

        ! save global and input registers
4:
        nop; nop
        sub     %sp, 128, %l0
        andn    %l0, 0x7, %l0
        mov     %l0, %g7
        mov     %psr, %l1
        st      %l1, [%l0]
        st      %g1, [%l0+4]
        std     %g2, [%l0+8]
        std     %g4, [%l0+16]
        std     %g6, [%l0+24]
        std     %i0, [%l0+32]
        std     %i2, [%l0+40]
        std     %i4, [%l0+48]
        std     %i6, [%l0+56]
        std     %o0, [%l0+64]
        std     %o2, [%l0+72]
        std     %o4, [%l0+80]
        std     %o6, [%l0+88]
        mov     %wim, %l2
        st      %l2, [%l0+96]

        ! test gloabal registers

        mov     8, %g0
        mov     1, %g1
        mov     2, %g2
        mov     3, %g3
        mov     4, %g4
        mov     5, %g5
        mov     6, %g6
!       mov     7, %g7
        mov     %g0, %wim
        andn    %l1, 0x1f, %l2
        mov     %l2, %psr
        nop; nop; nop
        
        ! fill all registers
        set     0x01010101, %g1
        mov     %g0, %g2
        mov     %g0, %g3
#ifdef LEON2
        set     0x80000024, %g4
        ld      [%g4], %g4
        srl     %g4, 20, %g4
        and     %g4, 0x1f, %g4
#else
        mov     %asr17, %g4
        and     %g4, 0x1f, %g4
#endif
        mov     %g4, %g3
4:
        mov     %g2, %l0
        add     %g1, %g2, %g2
        mov     %g2, %l1
        add     %g1, %g2, %g2
        mov     %g2, %l2
        add     %g1, %g2, %g2
        mov     %g2, %l3
        add     %g1, %g2, %g2
        mov     %g2, %l4
        add     %g1, %g2, %g2
        mov     %g2, %l5
        add     %g1, %g2, %g2
        mov     %g2, %l6
        add     %g1, %g2, %g2
        mov     %g2, %l7
        add     %g1, %g2, %g2
        mov     %g2, %o0
        add     %g1, %g2, %g2
        mov     %g2, %o1
        add     %g1, %g2, %g2
        mov     %g2, %o2
        add     %g1, %g2, %g2
        mov     %g2, %o3
        add     %g1, %g2, %g2
        mov     %g2, %o4
        add     %g1, %g2, %g2
        mov     %g2, %o5
        add     %g1, %g2, %g2
        mov     %g2, %o6
        add     %g1, %g2, %g2
        mov     %g2, %o7
        add     %g1, %g2, %g2
        save
        subcc   %g3, 1, %g3
        bge     4b
        nop
        
        ! check values

        set     0x01010101, %g1
        mov     %g0, %g2
        mov     %g4, %g3
5:
        cmp     %l0, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %l1, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %l2, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %l3, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %l4, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %l5, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %l6, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %l7, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o0, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o1, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o2, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o3, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o4, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o5, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o6, %g2
        bne     fail
        add     %g1, %g2, %g2
        cmp     %o7, %g2
        bne     fail
        add     %g1, %g2, %g2
        
        save
        subcc   %g3, 1, %g3
        bge     5b
        nop
        


        subcc   %g0, 0, %g0
        bne     fail
        subcc   %g3, -1, %g0
        bne     fail
        subcc   %g5, 5, %g0
        bne     fail
        subcc   %g6, 6, %g0
        bne     fail
!       subcc   %g7, 7, %g0
!       bne     fail
        nop

testok:
        mov     %g7, %l0
        ba      exit
        st      %g0, [%l0+32]
fail:
        mov     %g7, %l0
        mov     1, %o0
        ba      exit
        st      %o0, [%l0+32]

exit:

        ! restore state

        mov     %g7, %g1
        ld      [%g1], %g2
        mov     %g2, %psr
        nop; nop; nop
        ldd     [%g1+8], %g2
        ldd     [%g1+16], %g4
        ldd     [%g1+24], %g6
        ldd     [%g1+32], %i0
        ldd     [%g1+40], %i2
        ldd     [%g1+48], %i4
        ldd     [%g1+56], %i6

        ldd     [%g1+64], %o0
        ldd     [%g1+72], %o2
        ldd     [%g1+80], %o4
        ldd     [%g1+88], %o6

        ld      [%g1+96], %l2
        ld      [%g1+4], %g1
        mov     %l2, %wim
        nop; nop; nop

last:

        mov     %g7, %l0
#ifndef _FLAT
        ld      [%l0+32], %i0
        ret
        restore
#else
        retl
        ld      [%l0+32], %o0
#endif

err1:
        ba last
        mov %g0, %i0

        .align 8
!.common   regbuf, 168,"bss"
        .data   
ftbuf:
        .word 0
        .word 1
        .word 2
        .word 3

.align 32
        .text

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.