Changeset f2180e0 in rtems


Ignore:
Timestamp:
Aug 18, 1999, 8:00:05 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
fc766ef5
Parents:
e8367362
Message:

Patch from Jimen Ching <jimen@…>:

Please take a look at this new patch. It contains a cleaner implementation
of the reset operation. These patches are against 4.0.0. But the files
did not change from the 3.6.0 release. Also, the cpu.h patch below still
applies. I.e. instead of using i960ca_PRCB, use i960_PRCB.

Explanation:

The previous patch removed the use of the reset instruction,
because it always fails. But this was due to the fact that
some of the registers were corrupted by the re-init procedure.
The new patches save and restore those registers when a re-init
is done.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/score/cpu/i960/cpu_asm.S

    re8367362 rf2180e0  
    1414 *  $Id$
    1515 */
     16        .data
     17        .align 4
     18_soft_reset_reg_save:
     19        .word  0
     20        .word  0
     21        .word  0
     22        .word  0
     23_ISR_reg_save:
     24        .word  0
     25        .word  0
     26        .word  0
     27        .word  0
     28        .word  0
     29        .word  0
    1630
    1731          .text
     
    124138          movl      g6,r14                   # save g6-g7
    125139
     140                  stq           g8, _ISR_reg_save                # save g8-g11
     141                  stl           g12, _ISR_reg_save+16    # save g12-g13
     142
    126143          ld        __ISR_Vector_table[g0*4],g1    # g1 = Users handler
    127144          addo      1,r5,r5                  # increment ISR level
     
    174191          movq      r8,g0                    # restore g0-g3
    175192          movq      r12,g4                   # restore g4-g7
     193                  ldq           _ISR_reg_save, g8                # restore g8-g11
     194                  ldl           _ISR_reg_save+16, g12    # restore g12-g13
    176195          ret
    177196
     
    198217        movq      r12,g4
    199218        ret
     219
     220
     221/*PAGE
     222 *
     223 *  void __i960_soft_reset_asm
     224 *
     225 *  Flush the register cache and save the important (fp, pfp, sp) registers,
     226 *  which are clobbered by the reinit operation. (Not documented, but it happens).
     227 */
     228
     229                .globl __i960_soft_reset_asm
     230__i960_soft_reset_asm:
     231                flushreg                                                                # flush register cache
     232                mov                     fp, r4
     233                mov                     pfp, r5
     234                mov                     sp, r6
     235                stt                     r4, _soft_reset_reg_save    # save fp, pfp, sp
     236                lda                     __i960_reset_done, r4
     237                ldconst         0x300, r5
     238                sysctl          r5, r4, g0                  # reinit: clobbers almost all registers
     239__i960_reset_done:
     240                ldt             _soft_reset_reg_save, r4    # restore fp, pfp, sp
     241                mov                     r4, fp
     242                mov                     r5, pfp
     243                mov                     r6, sp
     244                ret
  • cpukit/score/cpu/i960/cpu_asm.S

    re8367362 rf2180e0  
    1414 *  $Id$
    1515 */
     16        .data
     17        .align 4
     18_soft_reset_reg_save:
     19        .word  0
     20        .word  0
     21        .word  0
     22        .word  0
     23_ISR_reg_save:
     24        .word  0
     25        .word  0
     26        .word  0
     27        .word  0
     28        .word  0
     29        .word  0
    1630
    1731          .text
     
    124138          movl      g6,r14                   # save g6-g7
    125139
     140                  stq           g8, _ISR_reg_save                # save g8-g11
     141                  stl           g12, _ISR_reg_save+16    # save g12-g13
     142
    126143          ld        __ISR_Vector_table[g0*4],g1    # g1 = Users handler
    127144          addo      1,r5,r5                  # increment ISR level
     
    174191          movq      r8,g0                    # restore g0-g3
    175192          movq      r12,g4                   # restore g4-g7
     193                  ldq           _ISR_reg_save, g8                # restore g8-g11
     194                  ldl           _ISR_reg_save+16, g12    # restore g12-g13
    176195          ret
    177196
     
    198217        movq      r12,g4
    199218        ret
     219
     220
     221/*PAGE
     222 *
     223 *  void __i960_soft_reset_asm
     224 *
     225 *  Flush the register cache and save the important (fp, pfp, sp) registers,
     226 *  which are clobbered by the reinit operation. (Not documented, but it happens).
     227 */
     228
     229                .globl __i960_soft_reset_asm
     230__i960_soft_reset_asm:
     231                flushreg                                                                # flush register cache
     232                mov                     fp, r4
     233                mov                     pfp, r5
     234                mov                     sp, r6
     235                stt                     r4, _soft_reset_reg_save    # save fp, pfp, sp
     236                lda                     __i960_reset_done, r4
     237                ldconst         0x300, r5
     238                sysctl          r5, r4, g0                  # reinit: clobbers almost all registers
     239__i960_reset_done:
     240                ldt             _soft_reset_reg_save, r4    # restore fp, pfp, sp
     241                mov                     r4, fp
     242                mov                     r5, pfp
     243                mov                     r6, sp
     244                ret
Note: See TracChangeset for help on using the changeset viewer.