Changeset 2e549dad in rtems for cpukit/score/cpu/mips/cpu_asm.S


Ignore:
Timestamp:
03/14/01 00:14:18 (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
7b79761
Parents:
07fbfced
Message:

2001-03-13 Joel Sherrill <joel@…>

  • cpu.c, cpu_asm.S, iregdef.h, rtems/score/cpu.h, rtems/score/mips.h: Merged MIPS1 and MIPS3 code reducing the number of lines of assembly. Also reimplemented some assembly routines in C further reducing the amount of assembly and increasing maintainability.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/cpu/mips/cpu_asm.S

    r07fbfced r2e549dad  
    2020 *             of this software for any purpose.
    2121 *    2000: Reworked by Alan Cudmore <alanc@linuxstart.com> to become
    22  *          the more general MIPS port.  Joel Sherrill <joel@OARcorp.com>
    23  *          continued this rework, rewriting as much as possible in
    24  *          C and testing on the TX39.
     22 *          the baseline of the more general MIPS port. 
     23 *    2001: Joel Sherrill <joel@OARcorp.com> continued this rework,
     24 *          rewriting as much as possible in C and added the JMR3904 BSP
     25 *          so testing could be performed on a simulator.
    2526 * 
    2627 *  COPYRIGHT (c) 1989-2000.
     
    4142#define ISR_VEC_SIZE 4
    4243
    43 #if 1  /* 32 bit unsigned32 types */
    44 #define sint sw
    45 #define lint lw
    46 #define stackadd addiu
    47 #define intadd addu
     44/*  Ifdefs prevent the duplication of code for MIPS ISA Level 3 ( R4xxx )
     45 *  and MIPS ISA Level 1 (R3xxx).
     46 */
     47
     48#if __mips == 3
     49/* 64 bit register operations */
     50#define ADD   dadd
     51#define STREG sd
     52#define LDREG ld
     53#define MFCO  dmfc0
     54#define MTCO  dmtc0
     55#define ADDU   addu
     56#define ADDIU  addiu
     57#define R_SZ  8
     58#define F_SZ  8
     59#define SZ_INT 8
     60#define SZ_INT_POW2 3
     61
     62/* XXX if we don't always want 64 bit register ops, then another ifdef */
     63
     64#elif __mips == 1
     65/* 32 bit register operations*/
     66#define ADD   add
     67#define STREG sw
     68#define LDREG lw
     69#define MFCO  mfc0
     70#define MTCO  mtc0
     71#define ADDU  add
     72#define ADDIU addi
     73#define R_SZ  4
     74#define F_SZ  4
    4875#define SZ_INT 4
    4976#define SZ_INT_POW2 2
    50 #else /* 64 bit unsigned32 types */
    51 #define sint dw
    52 #define lint dw
    53 #define stackadd daddiu
    54 #define intadd daddu
    55 #define SZ_INT 8
    56 #define SZ_INT_POW2 3
    57 #endif
     77
     78#else
     79#error "mips assembly: what size registers do I deal with?"
     80#endif
     81
    5882
    5983#ifdef __GNUC__
     
    113137
    114138
    115 /*PAGE
    116  *
    117  *  _CPU_ISR_Get_level
    118  *
    119  *  unsigned32 _CPU_ISR_Get_level( void )
    120  *
    121  *  This routine returns the current interrupt level.
    122  */
    123 
    124 #if __mips == 3
    125 /* return the current exception level for the 4650 */
    126 FRAME(_CPU_ISR_Get_level,sp,0,ra)
    127         mfc0 v0,C0_SR
    128         nop
    129         andi v0,SR_EXL
    130         srl v0,1
    131         j ra
    132 ENDFRAME(_CPU_ISR_Get_level)
    133 
    134 FRAME(_CPU_ISR_Set_level,sp,0,ra)
    135         nop
    136         mfc0 v0,C0_SR
    137         nop
    138         andi v0,SR_EXL
    139         beqz v0,_CPU_ISR_Set_1          /* normalize v0 */
    140         nop
    141         li v0,1         
    142 _CPU_ISR_Set_1:
    143         beq v0,a0,_CPU_ISR_Set_exit     /* if (current_level != new_level ) */
    144         nop
    145         bnez a0,_CPU_ISR_Set_2
    146         nop
    147         nop
    148         mfc0 t0, C0_SR
    149         nop
    150         li t1,~SR_EXL
    151         and t0,t1
    152         nop
    153         mtc0 t0,C0_SR                   /* disable exception level */
    154         nop
    155         j ra
    156         nop
    157 _CPU_ISR_Set_2:
    158         nop
    159         mfc0 t0,C0_SR
    160         nop
    161         li t1,~SR_IE
    162         and t0,t1
    163         nop
    164         mtc0 t0,C0_SR                   /* first disable ie bit (recommended) */
    165         nop
    166         ori  t0, SR_EXL|SR_IE           /* enable exception level */   
    167         nop
    168         mtc0 t0,C0_SR         
    169         nop
    170 _CPU_ISR_Set_exit:
    171         j ra
    172         nop
    173 ENDFRAME(_CPU_ISR_Set_level)
    174 
    175 #elif __mips == 1
    176 
    177 /* MIPS ISA 1 ( R3000 ) */
    178 /* _CPU_ISR_Get/Set_level are called as part of task mode manipulation. */
    179 /*  and are defined in C for the __mips == 1 */
    180 
    181 #else
    182    #error "__mips is set to 1 or 3"
    183 #endif
    184 
    185139/*
    186140 *  _CPU_Context_save_fp_context
     
    201155 */
    202156
     157#if ( CPU_HARDWARE_FP == FALSE )
    203158FRAME(_CPU_Context_save_fp,sp,0,ra)
    204         .set noat
    205         ld a1,(a0)
    206         swc1 $f0,FP0_OFFSET*4(a1)
    207         swc1 $f1,FP1_OFFSET*4(a1)
    208         swc1 $f2,FP2_OFFSET*4(a1)
    209         swc1 $f3,FP3_OFFSET*4(a1)
    210         swc1 $f4,FP4_OFFSET*4(a1)
    211         swc1 $f5,FP5_OFFSET*4(a1)
    212         swc1 $f6,FP6_OFFSET*4(a1)
    213         swc1 $f7,FP7_OFFSET*4(a1)
    214         swc1 $f8,FP8_OFFSET*4(a1)
    215         swc1 $f9,FP9_OFFSET*4(a1)
    216         swc1 $f10,FP10_OFFSET*4(a1)
    217         swc1 $f11,FP11_OFFSET*4(a1)
    218         swc1 $f12,FP12_OFFSET*4(a1)
    219         swc1 $f13,FP13_OFFSET*4(a1)
    220         swc1 $f14,FP14_OFFSET*4(a1)
    221         swc1 $f15,FP15_OFFSET*4(a1)
    222         swc1 $f16,FP16_OFFSET*4(a1)
    223         swc1 $f17,FP17_OFFSET*4(a1)
    224         swc1 $f18,FP18_OFFSET*4(a1)
    225         swc1 $f19,FP19_OFFSET*4(a1)
    226         swc1 $f20,FP20_OFFSET*4(a1)
    227         swc1 $f21,FP21_OFFSET*4(a1)
    228         swc1 $f22,FP22_OFFSET*4(a1)
    229         swc1 $f23,FP23_OFFSET*4(a1)
    230         swc1 $f24,FP24_OFFSET*4(a1)
    231         swc1 $f25,FP25_OFFSET*4(a1)
    232         swc1 $f26,FP26_OFFSET*4(a1)
    233         swc1 $f27,FP27_OFFSET*4(a1)
    234         swc1 $f28,FP28_OFFSET*4(a1)
    235         swc1 $f29,FP29_OFFSET*4(a1)
    236         swc1 $f30,FP30_OFFSET*4(a1)
    237         swc1 $f31,FP31_OFFSET*4(a1)
    238         j ra
    239         nop
    240         .set at
     159        .set noat
     160        ld a1,(a0)
     161        swc1 $f0,FP0_OFFSET*F_SZ(a1)
     162        swc1 $f1,FP1_OFFSET*F_SZ(a1)
     163        swc1 $f2,FP2_OFFSET*F_SZ(a1)
     164        swc1 $f3,FP3_OFFSET*F_SZ(a1)
     165        swc1 $f4,FP4_OFFSET*F_SZ(a1)
     166        swc1 $f5,FP5_OFFSET*F_SZ(a1)
     167        swc1 $f6,FP6_OFFSET*F_SZ(a1)
     168        swc1 $f7,FP7_OFFSET*F_SZ(a1)
     169        swc1 $f8,FP8_OFFSET*F_SZ(a1)
     170        swc1 $f9,FP9_OFFSET*F_SZ(a1)
     171        swc1 $f10,FP10_OFFSET*F_SZ(a1)
     172        swc1 $f11,FP11_OFFSET*F_SZ(a1)
     173        swc1 $f12,FP12_OFFSET*F_SZ(a1)
     174        swc1 $f13,FP13_OFFSET*F_SZ(a1)
     175        swc1 $f14,FP14_OFFSET*F_SZ(a1)
     176        swc1 $f15,FP15_OFFSET*F_SZ(a1)
     177        swc1 $f16,FP16_OFFSET*F_SZ(a1)
     178        swc1 $f17,FP17_OFFSET*F_SZ(a1)
     179        swc1 $f18,FP18_OFFSET*F_SZ(a1)
     180        swc1 $f19,FP19_OFFSET*F_SZ(a1)
     181        swc1 $f20,FP20_OFFSET*F_SZ(a1)
     182        swc1 $f21,FP21_OFFSET*F_SZ(a1)
     183        swc1 $f22,FP22_OFFSET*F_SZ(a1)
     184        swc1 $f23,FP23_OFFSET*F_SZ(a1)
     185        swc1 $f24,FP24_OFFSET*F_SZ(a1)
     186        swc1 $f25,FP25_OFFSET*F_SZ(a1)
     187        swc1 $f26,FP26_OFFSET*F_SZ(a1)
     188        swc1 $f27,FP27_OFFSET*F_SZ(a1)
     189        swc1 $f28,FP28_OFFSET*F_SZ(a1)
     190        swc1 $f29,FP29_OFFSET*F_SZ(a1)
     191        swc1 $f30,FP30_OFFSET*F_SZ(a1)
     192        swc1 $f31,FP31_OFFSET*F_SZ(a1)
     193        j ra
     194        nop
     195        .set at
    241196ENDFRAME(_CPU_Context_save_fp)
     197#endif
    242198
    243199/*
     
    259215 */
    260216
     217#if ( CPU_HARDWARE_FP == FALSE )
    261218FRAME(_CPU_Context_restore_fp,sp,0,ra)
    262         .set noat
    263         ld a1,(a0)
    264         lwc1 $f0,FP0_OFFSET*4(a1)
    265         lwc1 $f1,FP1_OFFSET*4(a1)
    266         lwc1 $f2,FP2_OFFSET*4(a1)
    267         lwc1 $f3,FP3_OFFSET*4(a1)
    268         lwc1 $f4,FP4_OFFSET*4(a1)
    269         lwc1 $f5,FP5_OFFSET*4(a1)
    270         lwc1 $f6,FP6_OFFSET*4(a1)
    271         lwc1 $f7,FP7_OFFSET*4(a1)
    272         lwc1 $f8,FP8_OFFSET*4(a1)
    273         lwc1 $f9,FP9_OFFSET*4(a1)
    274         lwc1 $f10,FP10_OFFSET*4(a1)
    275         lwc1 $f11,FP11_OFFSET*4(a1)
    276         lwc1 $f12,FP12_OFFSET*4(a1)
    277         lwc1 $f13,FP13_OFFSET*4(a1)
    278         lwc1 $f14,FP14_OFFSET*4(a1)
    279         lwc1 $f15,FP15_OFFSET*4(a1)
    280         lwc1 $f16,FP16_OFFSET*4(a1)
    281         lwc1 $f17,FP17_OFFSET*4(a1)
    282         lwc1 $f18,FP18_OFFSET*4(a1)
    283         lwc1 $f19,FP19_OFFSET*4(a1)
    284         lwc1 $f20,FP20_OFFSET*4(a1)
    285         lwc1 $f21,FP21_OFFSET*4(a1)
    286         lwc1 $f22,FP22_OFFSET*4(a1)
    287         lwc1 $f23,FP23_OFFSET*4(a1)
    288         lwc1 $f24,FP24_OFFSET*4(a1)
    289         lwc1 $f25,FP25_OFFSET*4(a1)
    290         lwc1 $f26,FP26_OFFSET*4(a1)
    291         lwc1 $f27,FP27_OFFSET*4(a1)
    292         lwc1 $f28,FP28_OFFSET*4(a1)
    293         lwc1 $f29,FP29_OFFSET*4(a1)
    294         lwc1 $f30,FP30_OFFSET*4(a1)
    295         lwc1 $f31,FP31_OFFSET*4(a1)
    296         j ra
    297         nop
    298         .set at
     219        .set noat
     220        ld a1,(a0)
     221        lwc1 $f0,FP0_OFFSET*4(a1)
     222        lwc1 $f1,FP1_OFFSET*4(a1)
     223        lwc1 $f2,FP2_OFFSET*4(a1)
     224        lwc1 $f3,FP3_OFFSET*4(a1)
     225        lwc1 $f4,FP4_OFFSET*4(a1)
     226        lwc1 $f5,FP5_OFFSET*4(a1)
     227        lwc1 $f6,FP6_OFFSET*4(a1)
     228        lwc1 $f7,FP7_OFFSET*4(a1)
     229        lwc1 $f8,FP8_OFFSET*4(a1)
     230        lwc1 $f9,FP9_OFFSET*4(a1)
     231        lwc1 $f10,FP10_OFFSET*4(a1)
     232        lwc1 $f11,FP11_OFFSET*4(a1)
     233        lwc1 $f12,FP12_OFFSET*4(a1)
     234        lwc1 $f13,FP13_OFFSET*4(a1)
     235        lwc1 $f14,FP14_OFFSET*4(a1)
     236        lwc1 $f15,FP15_OFFSET*4(a1)
     237        lwc1 $f16,FP16_OFFSET*4(a1)
     238        lwc1 $f17,FP17_OFFSET*4(a1)
     239        lwc1 $f18,FP18_OFFSET*4(a1)
     240        lwc1 $f19,FP19_OFFSET*4(a1)
     241        lwc1 $f20,FP20_OFFSET*4(a1)
     242        lwc1 $f21,FP21_OFFSET*4(a1)
     243        lwc1 $f22,FP22_OFFSET*4(a1)
     244        lwc1 $f23,FP23_OFFSET*4(a1)
     245        lwc1 $f24,FP24_OFFSET*4(a1)
     246        lwc1 $f25,FP25_OFFSET*4(a1)
     247        lwc1 $f26,FP26_OFFSET*4(a1)
     248        lwc1 $f27,FP27_OFFSET*4(a1)
     249        lwc1 $f28,FP28_OFFSET*4(a1)
     250        lwc1 $f29,FP29_OFFSET*4(a1)
     251        lwc1 $f30,FP30_OFFSET*4(a1)
     252        lwc1 $f31,FP31_OFFSET*4(a1)
     253        j ra
     254        nop
     255        .set at
    299256ENDFRAME(_CPU_Context_restore_fp)
     257#endif
    300258
    301259/*  _CPU_Context_switch
     
    309267 * )
    310268 */
     269
     270FRAME(_CPU_Context_switch,sp,0,ra)
     271
     272        mfc0  t0,C0_SR
     273        li    t1,~(SR_INTERRUPT_ENABLE_BITS)
     274        STREG t0,C0_SR_OFFSET*4(a0)   /* save status register */
     275        and   t0,t1
     276        mtc0  t0,C0_SR                /* first disable ie bit (recommended) */
    311277#if __mips == 3
    312 /* MIPS ISA Level 3 ( R4xxx ) */
    313 
    314 FRAME(_CPU_Context_switch,sp,0,ra)
    315 
    316         mfc0 t0,C0_SR
    317         li t1,~SR_IE
    318         sd t0,C0_SR_OFFSET*8(a0)        /* save status register */
    319         and t0,t1
    320         mtc0 t0,C0_SR                   /* first disable ie bit (recommended) */
    321         ori t0,SR_EXL|SR_IE             /* enable exception level to disable interrupts */
    322         mtc0 t0,C0_SR
    323 
    324         sd ra,RA_OFFSET*8(a0)           /* save current context */
    325         sd sp,SP_OFFSET*8(a0)
    326         sd fp,FP_OFFSET*8(a0)
    327         sd s1,S1_OFFSET*8(a0)
    328         sd s2,S2_OFFSET*8(a0)
    329         sd s3,S3_OFFSET*8(a0)
    330         sd s4,S4_OFFSET*8(a0)
    331         sd s5,S5_OFFSET*8(a0)
    332         sd s6,S6_OFFSET*8(a0)
    333         sd s7,S7_OFFSET*8(a0)
    334         dmfc0 t0,C0_EPC
    335         sd t0,C0_EPC_OFFSET*8(a0)
     278        ori t0,SR_EXL|SR_IE   /* enable exception level to disable interrupts */
     279        mtc0  t0,C0_SR
     280#endif
     281
     282        STREG ra,RA_OFFSET*R_SZ(a0)         /* save current context */
     283        STREG sp,SP_OFFSET*R_SZ(a0)
     284        STREG fp,FP_OFFSET*R_SZ(a0)
     285        STREG s0,S0_OFFSET*R_SZ(a0)
     286        STREG s1,S1_OFFSET*R_SZ(a0)
     287        STREG s2,S2_OFFSET*R_SZ(a0)
     288        STREG s3,S3_OFFSET*R_SZ(a0)
     289        STREG s4,S4_OFFSET*R_SZ(a0)
     290        STREG s5,S5_OFFSET*R_SZ(a0)
     291        STREG s6,S6_OFFSET*R_SZ(a0)
     292        STREG s7,S7_OFFSET*R_SZ(a0)
     293
     294        MFC0  t0,C0_EPC
     295        STREG t0,C0_EPC_OFFSET*R_SZ(a0)
    336296
    337297_CPU_Context_switch_restore:
    338         ld s0,S0_OFFSET*8(a1)           /* restore context */
    339         ld s1,S1_OFFSET*8(a1)
    340         ld s2,S2_OFFSET*8(a1)
    341         ld s3,S3_OFFSET*8(a1)
    342         ld s4,S4_OFFSET*8(a1)
    343         ld s5,S5_OFFSET*8(a1)
    344         ld s6,S6_OFFSET*8(a1)
    345         ld s7,S7_OFFSET*8(a1)
    346         ld fp,FP_OFFSET*8(a1)
    347         ld sp,SP_OFFSET*8(a1)
    348         ld ra,RA_OFFSET*8(a1)
    349         ld t0,C0_EPC_OFFSET*8(a1)
    350         dmtc0 t0,C0_EPC
    351         ld t0,C0_SR_OFFSET*8(a1)
    352         andi t0,SR_EXL
    353         bnez t0,_CPU_Context_1          /* set exception level from restore context */
    354         li t0,~SR_EXL
    355         mfc0 t1,C0_SR
    356         nop
    357         and t1,t0
    358         mtc0 t1,C0_SR
    359 _CPU_Context_1:
    360         j ra
    361         nop
    362 ENDFRAME(_CPU_Context_switch)
     298        LDREG s0,S0_OFFSET*R_SZ(a1)           /* restore context */
     299        LDREG s1,S1_OFFSET*R_SZ(a1)
     300        LDREG s2,S2_OFFSET*R_SZ(a1)
     301        LDREG s3,S3_OFFSET*R_SZ(a1)
     302        LDREG s4,S4_OFFSET*R_SZ(a1)
     303        LDREG s5,S5_OFFSET*R_SZ(a1)
     304        LDREG s6,S6_OFFSET*R_SZ(a1)
     305        LDREG s7,S7_OFFSET*R_SZ(a1)
     306        LDREG fp,FP_OFFSET*R_SZ(a1)
     307        LDREG sp,SP_OFFSET*R_SZ(a1)
     308        LDREG ra,RA_OFFSET*R_SZ(a1)
     309        LDREG t0,C0_EPC_OFFSET*R_SZ(a1)
     310        MTC0  t0,C0_EPC
     311        LDREG t0, C0_SR_OFFSET*R_SZ(a1)
     312
     313#if __mips == 3
     314        andi  t0,SR_EXL
     315        bnez  t0,_CPU_Context_1   /* set exception level from restore context */
     316        li    t0,~SR_EXL
     317        mfc0  t1,C0_SR
     318        nop
     319        and   t1,t0
     320        mtc0  t1,C0_SR
    363321
    364322#elif __mips == 1
    365 /* MIPS ISA Level 1 ( R3000 ) */
    366 
    367 FRAME(_CPU_Context_switch,sp,0,ra)
    368 
    369         mfc0 t0,C0_SR
    370         li t1,~(SR_INTERRUPT_ENABLE_BITS)
    371         sw t0,C0_SR_OFFSET*4(a0)        /* save status register */
    372         and t0,t1
    373         mtc0 t0,C0_SR                   /* first disable ie bit (recommended) */
    374 
    375         sw ra,RA_OFFSET*4(a0)           /* save current context */
    376         sw sp,SP_OFFSET*4(a0)
    377         sw fp,FP_OFFSET*4(a0)
    378         sw s0,S0_OFFSET*4(a0)
    379         sw s1,S1_OFFSET*4(a0)
    380         sw s2,S2_OFFSET*4(a0)
    381         sw s3,S3_OFFSET*4(a0)
    382         sw s4,S4_OFFSET*4(a0)
    383         sw s5,S5_OFFSET*4(a0)
    384         sw s6,S6_OFFSET*4(a0)
    385         sw s7,S7_OFFSET*4(a0)
    386 
    387         mfc0 t0,C0_EPC
    388         sw t0,C0_EPC_OFFSET*4(a0)
    389 
    390 _CPU_Context_switch_restore:
    391         lw s0,S0_OFFSET*4(a1)           /* restore context */
    392         lw s1,S1_OFFSET*4(a1)
    393         lw s2,S2_OFFSET*4(a1)
    394         lw s3,S3_OFFSET*4(a1)
    395         lw s4,S4_OFFSET*4(a1)
    396         lw s5,S5_OFFSET*4(a1)
    397         lw s6,S6_OFFSET*4(a1)
    398         lw s7,S7_OFFSET*4(a1)
    399         lw fp,FP_OFFSET*4(a1)
    400         lw sp,SP_OFFSET*4(a1)
    401         lw ra,RA_OFFSET*4(a1)
    402         lw t0,C0_EPC_OFFSET*4(a1)
    403         mtc0 t0,C0_EPC
    404         lw t0, C0_SR_OFFSET*4(a1)
    405         andi t0,(SR_INTERRUPT_ENABLE_BITS) /* we know 0 disabled */
    406         beq t0,$0,_CPU_Context_1        /* set level from restore context */
    407         mfc0 t0,C0_SR
    408         nop
    409         or  t0,(SR_INTERRUPT_ENABLE_BITS)  /* new_sr = old sr with enabled  */
    410         mtc0 t0,C0_SR                      /* set with enabled */
    411        
     323        andi  t0,(SR_INTERRUPT_ENABLE_BITS) /* we know 0 disabled */
     324        beq   t0,$0,_CPU_Context_1          /* set level from restore context */
     325        mfc0  t0,C0_SR
     326        nop
     327        or    t0,(SR_INTERRUPT_ENABLE_BITS) /* new_sr = old sr with enabled  */
     328        mtc0  t0,C0_SR                      /* set with enabled */
     329#endif
    412330
    413331_CPU_Context_1:
     
    415333        nop
    416334ENDFRAME(_CPU_Context_switch)
    417 
    418 #else
    419 
    420    #error "__mips is not set to 1 or 3"
    421 
    422 #endif
    423335
    424336/*
     
    435347 */
    436348
    437 #if __mips == 3
    438 
    439349FRAME(_CPU_Context_restore,sp,0,ra)
    440         dadd a1,a0,zero
    441         j _CPU_Context_switch_restore
    442         nop
     350        ADD a1,a0,zero
     351        j  _CPU_Context_switch_restore
     352        nop
    443353ENDFRAME(_CPU_Context_restore)
    444 
    445 #elif __mips == 1
    446 
    447 FRAME(_CPU_Context_restore,sp,0,ra)
    448         add  a1,a0,zero
    449         j _CPU_Context_switch_restore
    450         nop
    451 ENDFRAME(_CPU_Context_restore)
    452 
    453 #else
    454 
    455       #error "__mips is not set to 1 or 3"
    456 
    457 #endif
    458354
    459355ASM_EXTERN(_ISR_Nest_level, SZ_INT)
     
    492388 */
    493389
    494 #if __mips == 3
    495 /* ----------------------------------------------------------------------------- */
    496390FRAME(_ISR_Handler,sp,0,ra)
    497 .set noreorder
    498 #if USE_IDTKIT
    499 /* IDT/Kit incorrectly adds 4 to EPC before returning.  This compensates */
    500         lreg    k0, R_EPC*R_SZ(sp)
    501         daddiu    k0,k0,-4
    502         sreg    k0, R_EPC*R_SZ(sp)
    503         lreg    k0, R_CAUSE*R_SZ(sp)
    504         li      k1, ~CAUSE_BD
    505         and     k0, k1
    506         sreg    k0, R_CAUSE*R_SZ(sp)
    507 #endif
    508        
    509 /* save registers not already saved by IDT/sim */
    510         stackadd sp,sp,-EXCP_STACK_SIZE /* store ra on the stack */
    511 
    512         sreg    ra, R_RA*R_SZ(sp)
    513         sreg    v0, R_V0*R_SZ(sp)
    514         sreg    v1, R_V1*R_SZ(sp)
    515         sreg    a0, R_A0*R_SZ(sp)
    516         sreg    a1, R_A1*R_SZ(sp)
    517         sreg    a2, R_A2*R_SZ(sp)
    518         sreg    a3, R_A3*R_SZ(sp)
    519         sreg    t0, R_T0*R_SZ(sp)
    520         sreg    t1, R_T1*R_SZ(sp)
    521         sreg    t2, R_T2*R_SZ(sp)
    522         sreg    t3, R_T3*R_SZ(sp)
    523         sreg    t4, R_T4*R_SZ(sp)
    524         sreg    t5, R_T5*R_SZ(sp)
    525         sreg    t6, R_T6*R_SZ(sp)
    526         sreg    t7, R_T7*R_SZ(sp)
    527         mflo    k0
    528         sreg    t8, R_T8*R_SZ(sp)
    529         sreg    k0, R_MDLO*R_SZ(sp)
    530         sreg    t9, R_T9*R_SZ(sp)
    531         mfhi    k0
    532         sreg    gp, R_GP*R_SZ(sp)
    533         sreg    fp, R_FP*R_SZ(sp)
    534         sreg    k0, R_MDHI*R_SZ(sp)
    535         .set noat
    536         sreg    AT, R_AT*R_SZ(sp)
    537         .set at
    538 
    539         stackadd sp,sp,-40              /* store ra on the stack */
    540         sd ra,32(sp)
     391        .set noreorder
     392
     393        /* Q: _ISR_Handler, not using IDT/SIM ...save extra regs? */
     394
     395        /* wastes a lot of stack space for context?? */
     396        ADDIU    sp,sp,-EXCP_STACK_SIZE
     397
     398        STREG ra, R_RA*R_SZ(sp)  /* store ra on the stack */
     399        STREG v0, R_V0*R_SZ(sp)
     400        STREG v1, R_V1*R_SZ(sp)
     401        STREG a0, R_A0*R_SZ(sp)
     402        STREG a1, R_A1*R_SZ(sp)
     403        STREG a2, R_A2*R_SZ(sp)
     404        STREG a3, R_A3*R_SZ(sp)
     405        STREG t0, R_T0*R_SZ(sp)
     406        STREG t1, R_T1*R_SZ(sp)
     407        STREG t2, R_T2*R_SZ(sp)
     408        STREG t3, R_T3*R_SZ(sp)
     409        STREG t4, R_T4*R_SZ(sp)
     410        STREG t5, R_T5*R_SZ(sp)
     411        STREG t6, R_T6*R_SZ(sp)
     412        STREG t7, R_T7*R_SZ(sp)
     413        mflo  k0
     414        STREG t8, R_T8*R_SZ(sp)
     415        STREG k0, R_MDLO*R_SZ(sp)
     416        STREG t9, R_T9*R_SZ(sp)
     417        mfhi  k0
     418        STREG gp, R_GP*R_SZ(sp)
     419        STREG fp, R_FP*R_SZ(sp)
     420        STREG k0, R_MDHI*R_SZ(sp)
     421        .set noat
     422        STREG AT, R_AT*R_SZ(sp)
     423        .set at
     424
     425        /* Q: Why hardcode -40 for stack add??? */
     426        /* This needs to be figured out.........*/
     427        ADDIU    sp,sp,-40
     428        STREG    ra,32(sp)                /* store ra on the stack */
    541429
    542430/* determine if an interrupt generated this exception */
    543         mfc0 k0,C0_CAUSE
    544         and k1,k0,CAUSE_EXCMASK
    545         bnez k1,_ISR_Handler_prom_exit /* not an external interrupt,
    546                                                 pass exception to Monitor */
    547         mfc0 k1,C0_SR
    548         and k0,k1
    549         and k0,CAUSE_IPMASK
    550         beq k0,zero,_ISR_Handler_quick_exit /* external interrupt not
    551                                                         enabled, ignore */
    552         nop
     431
     432        mfc0     k0,C0_CAUSE
     433        and      k1,k0,CAUSE_EXCMASK
     434        beq      k1, 0, _ISR_Handler_1
     435        nop
     436
     437_ISR_Handler_Exception:
     438        nop
     439        b        _ISR_Handler_Exception       /* Jump to the exception code */
     440        nop
     441
     442_ISR_Handler_1:
     443
     444        mfc0     k1,C0_SR
     445        and      k0,k1
     446        and      k0,CAUSE_IPMASK
     447        beq      k0,zero,_ISR_Handler_exit
     448                /* external interrupt not enabled, ignore */
     449                /* but if it's not an exception or an interrupt, */
     450                /* Then where did it come from??? */
     451        nop
    553452
    554453  /*
     
    561460   *  #endif
    562461   */
    563 #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
    564         lint t0,_ISR_Nest_level
    565         beq t0, zero,  _ISR_Handler_1
    566         nop
    567         /* switch stacks */     
    568 _ISR_Handler_1:
    569 #else
    570         lint t0,_ISR_Nest_level
    571 #endif
     462
    572463  /*
    573464   *  _ISR_Nest_level++;
    574465   */
    575         addi t0,t0,1
    576         sint t0,_ISR_Nest_level
     466        LDREG  t0,_ISR_Nest_level
     467        ADD    t0,t0,1
     468        STREG  t0,_ISR_Nest_level
    577469  /*
    578470   *  _Thread_Dispatch_disable_level++;
    579471   */
    580         lint t1,_Thread_Dispatch_disable_level
    581         addi t1,t1,1
    582         sint t1,_Thread_Dispatch_disable_level
    583 #if 0
    584         nop
    585         j _ISR_Handler_4
    586         nop
    587   /*
    588    *  while ( interrupts_pending(cause_reg) ) {
    589    *     vector = BITFIELD_TO_INDEX(cause_reg);
    590    *     (*_ISR_Vector_table[ vector ])( vector );
    591    *  }
    592    */
    593 _ISR_Handler_2:
    594 /* software interrupt priorities can be applied here */
    595         li t1,-1
    596 /* convert bit field into interrupt index */
    597 _ISR_Handler_3:
    598         andi t2,t0,1
    599         addi t1,1
    600         beql t2,zero,_ISR_Handler_3
    601         dsrl t0,1
    602         li t1,7
    603         dsll t1,3                       /* convert index to byte offset (*8) */
    604         la t3,_ISR_Vector_table
    605         intadd t1,t3
    606         lint t1,(t1)
    607         jalr t1
    608         nop
    609         j _ISR_Handler_5
    610         nop
    611 _ISR_Handler_4:
    612         mfc0 t0,C0_CAUSE
    613         andi t0,CAUSE_IPMASK
    614         bne t0,zero,_ISR_Handler_2
    615         dsrl t0,t0,8
    616 _ISR_Handler_5:
    617 #else
    618         nop
    619         li t1,7
    620         dsll t1,t1,SZ_INT_POW2
    621         la t3,_ISR_Vector_table
    622         intadd t1,t3
    623         lint t1,(t1)
    624         jalr t1
    625         nop
    626 #endif
     472        LDREG  t1,_Thread_Dispatch_disable_level
     473        ADD    t1,t1,1
     474        STREG  t1,_Thread_Dispatch_disable_level
     475
     476  /*
     477   *  Call the CPU model or BSP specific routine to decode the
     478   *  interrupt source and actually vector to device ISR handlers.
     479   */
     480
     481        jal    mips_vector_isr_handlers
     482        nop
     483
    627484  /*
    628485   *  --_ISR_Nest_level;
    629486   */
    630         lint t2,_ISR_Nest_level
    631         addi t2,t2,-1
    632         sint t2,_ISR_Nest_level
     487        LDREG t2,_ISR_Nest_level
     488        ADD    t2,t2,-1
     489        STREG t2,_ISR_Nest_level
    633490  /*
    634491   *  --_Thread_Dispatch_disable_level;
    635492   */
    636         lint t1,_Thread_Dispatch_disable_level
    637         addi t1,t1,-1
    638         sint t1,_Thread_Dispatch_disable_level
     493        LDREG t1,_Thread_Dispatch_disable_level
     494        ADD    t1,t1,-1
     495        STREG t1,_Thread_Dispatch_disable_level
    639496  /*
    640497   *  if ( _Thread_Dispatch_disable_level || _ISR_Nest_level )
    641498   *    goto the label "exit interrupt (simple case)"
    642499   */
    643         or t0,t2,t1
    644         bne t0,zero,_ISR_Handler_exit
    645         nop
     500        or t0,t2,t1
     501        bne t0,zero,_ISR_Handler_exit
     502        nop
    646503  /*
    647504   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
     
    652509   *    goto the label "exit interrupt (simple case)"
    653510   */
    654         lint t0,_Context_Switch_necessary
    655         lint t1,_ISR_Signals_to_thread_executing
    656         or t0,t0,t1
    657         beq t0,zero,_ISR_Handler_exit
    658         nop
    659 
     511        LDREG t0,_Context_Switch_necessary
     512        LDREG t1,_ISR_Signals_to_thread_executing
     513        or    t0,t0,t1
     514        beq   t0,zero,_ISR_Handler_exit
     515        nop
    660516  /*
    661517   *  call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
    662518   */
    663         jal _Thread_Dispatch
    664         nop
     519        jal _Thread_Dispatch
     520        nop
    665521  /*
    666522   *  prepare to get out of interrupt
     
    671527   *  return from interrupt
    672528   */
     529
    673530_ISR_Handler_exit:
    674         ld ra,32(sp)
    675         stackadd sp,sp,40
    676 
    677 /* restore interrupt context from stack */
    678         lreg    k0, R_MDLO*R_SZ(sp)
    679         mtlo    k0
    680         lreg    k0, R_MDHI*R_SZ(sp)
    681         lreg    a2, R_A2*R_SZ(sp)
    682         mthi    k0
    683         lreg    a3, R_A3*R_SZ(sp)
    684         lreg    t0, R_T0*R_SZ(sp)
    685         lreg    t1, R_T1*R_SZ(sp)
    686         lreg    t2, R_T2*R_SZ(sp)
    687         lreg    t3, R_T3*R_SZ(sp)
    688         lreg    t4, R_T4*R_SZ(sp)
    689         lreg    t5, R_T5*R_SZ(sp)
    690         lreg    t6, R_T6*R_SZ(sp)
    691         lreg    t7, R_T7*R_SZ(sp)
    692         lreg    t8, R_T8*R_SZ(sp)
    693         lreg    t9, R_T9*R_SZ(sp)
    694         lreg    gp, R_GP*R_SZ(sp)
    695         lreg    fp, R_FP*R_SZ(sp)
    696         lreg    ra, R_RA*R_SZ(sp)
    697         lreg    a0, R_A0*R_SZ(sp)
    698         lreg    a1, R_A1*R_SZ(sp)
    699         lreg    v1, R_V1*R_SZ(sp)
    700         lreg    v0, R_V0*R_SZ(sp)
    701         .set noat
    702         lreg    AT, R_AT*R_SZ(sp)
    703         .set at
    704 
    705         stackadd sp,sp,EXCP_STACK_SIZE /* store ra on the stack */
    706 
    707 #if USE_IDTKIT
    708 /* we handled exception, so return non-zero value */
    709         li v0,1
    710 #endif
    711 
    712 _ISR_Handler_quick_exit:
    713 #ifdef USE_IDTKIT
    714         j ra
    715 #else
    716         eret
    717 #endif
    718         nop
    719 
    720 _ISR_Handler_prom_exit:
    721 #if __mips == 1
    722         la      k0, (R_VEC+((48)*8))
    723 #endif
    724 
    725 #if __mips == 3
    726         la      k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
    727 #endif
    728         j       k0
    729         nop
    730 
    731        .set    reorder
    732 
    733 ENDFRAME(_ISR_Handler)
    734 
    735 /* ---------------------------------------------------------------------- */
    736 #elif __mips == 1
    737 /* MIPS ISA Level 1 */
    738 
    739 FRAME(_ISR_Handler,sp,0,ra)
    740 .set noreorder
    741 
    742         /* Q: _ISR_Handler, not using IDT/SIM ...save extra regs? */
    743 
    744         addiu sp,sp,-EXCP_STACK_SIZE       /* wastes alot of stack space for context?? */
    745 
    746         sw    ra, R_RA*R_SZ(sp)  /* store ra on the stack */
    747         sw    v0, R_V0*R_SZ(sp)
    748         sw    v1, R_V1*R_SZ(sp)
    749         sw    a0, R_A0*R_SZ(sp)
    750         sw    a1, R_A1*R_SZ(sp)
    751         sw    a2, R_A2*R_SZ(sp)
    752         sw    a3, R_A3*R_SZ(sp)
    753         sw    t0, R_T0*R_SZ(sp)
    754         sw    t1, R_T1*R_SZ(sp)
    755         sw    t2, R_T2*R_SZ(sp)
    756         sw    t3, R_T3*R_SZ(sp)
    757         sw    t4, R_T4*R_SZ(sp)
    758         sw    t5, R_T5*R_SZ(sp)
    759         sw    t6, R_T6*R_SZ(sp)
    760         sw    t7, R_T7*R_SZ(sp)
    761         mflo    k0
    762         sw    t8, R_T8*R_SZ(sp)
    763         sw    k0, R_MDLO*R_SZ(sp)
    764         sw    t9, R_T9*R_SZ(sp)
    765         mfhi    k0
    766         sw    gp, R_GP*R_SZ(sp)
    767         sw    fp, R_FP*R_SZ(sp)
    768         sw    k0, R_MDHI*R_SZ(sp)
    769         .set noat
    770         sw    AT, R_AT*R_SZ(sp)
    771         .set at
    772 
    773         /* Q: Why hardcode -40 for stack add??? */
    774         /* This needs to be figured out.........*/
    775         addiu sp,sp,-40
    776         sw ra,32(sp)    /* store ra on the stack */
    777 
    778 /* determine if an interrupt generated this exception */
    779 
    780         mfc0 k0,C0_CAUSE
    781         and k1,k0,CAUSE_EXCMASK
    782         beq k1, 0, _ISR_Handler_1
    783         nop
    784 
    785 _ISR_Handler_Exception:
    786         nop
    787         b  _ISR_Handler_Exception       /* Jump to the exception code */
    788         nop
    789 
    790 _ISR_Handler_1:
    791 
    792         mfc0 k1,C0_SR
    793         and k0,k1
    794         and k0,CAUSE_IPMASK
    795         beq k0,zero,_ISR_Handler_exit
    796                 /* external interrupt not enabled, ignore */
    797                 /* but if it's not an exception or an interrupt, */
    798                 /* Then where did it come from??? */
    799         nop
    800 
    801   /*
    802    *  save some or all context on stack
    803    *  may need to save some special interrupt information for exit
    804    *
    805    *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
    806    *    if ( _ISR_Nest_level == 0 )
    807    *      switch to software interrupt stack
    808    *  #endif
    809    */
    810 
    811   /*
    812    *  _ISR_Nest_level++;
    813    */
    814         lw   t0,_ISR_Nest_level
    815         addi t0,t0,1
    816         sw   t0,_ISR_Nest_level
    817   /*
    818    *  _Thread_Dispatch_disable_level++;
    819    */
    820         lw   t1,_Thread_Dispatch_disable_level
    821         addi t1,t1,1
    822         sw   t1,_Thread_Dispatch_disable_level
    823 
    824   /*
    825    *  Call the CPU model or BSP specific routine to decode the
    826    *  interrupt source and actually vector to device ISR handlers.
    827    */
    828 
    829         jal     mips_vector_isr_handlers
    830         nop
    831 
    832   /*
    833    *  --_ISR_Nest_level;
    834    */
    835         lw   t2,_ISR_Nest_level
    836         addi t2,t2,-1
    837         sw   t2,_ISR_Nest_level
    838   /*
    839    *  --_Thread_Dispatch_disable_level;
    840    */
    841         lw   t1,_Thread_Dispatch_disable_level
    842         addi t1,t1,-1
    843         sw   t1,_Thread_Dispatch_disable_level
    844   /*
    845    *  if ( _Thread_Dispatch_disable_level || _ISR_Nest_level )
    846    *    goto the label "exit interrupt (simple case)"
    847    */
    848         or  t0,t2,t1
    849         bne t0,zero,_ISR_Handler_exit
    850         nop
    851   /*
    852    *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
    853    *    restore stack
    854    *  #endif
    855    * 
    856    *  if ( !_Context_Switch_necessary && !_ISR_Signals_to_thread_executing )
    857    *    goto the label "exit interrupt (simple case)"
    858    */
    859         lw  t0,_Context_Switch_necessary
    860         lw  t1,_ISR_Signals_to_thread_executing
    861         or  t0,t0,t1
    862         beq t0,zero,_ISR_Handler_exit
    863         nop
    864   /*
    865    *  call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
    866    */
    867         jal _Thread_Dispatch
    868         nop
    869   /*
    870    *  prepare to get out of interrupt
    871    *  return from interrupt  (maybe to _ISR_Dispatch)
    872    *
    873    *  LABEL "exit interrupt (simple case):
    874    *  prepare to get out of interrupt
    875    *  return from interrupt
    876    */
    877 
    878 _ISR_Handler_exit:
    879         ld ra,32(sp)
    880         addiu sp,sp,40    /* Q: Again with the 40...Is this needed? */
     531        LDREG    ra,32(sp)
     532        ADDIU    sp,sp,40    /* Q: Again with the 40...Is this needed? */
    881533
    882534/* restore interrupt context from stack */
    883535     
    884         lw    k0, R_MDLO*R_SZ(sp)           
    885         mtlo  k0
    886         lw    k0, R_MDHI*R_SZ(sp)           
    887         lw    a2, R_A2*R_SZ(sp)
    888         mthi  k0
    889         lw    a3, R_A3*R_SZ(sp)
    890         lw    t0, R_T0*R_SZ(sp)
    891         lw    t1, R_T1*R_SZ(sp)
    892         lw    t2, R_T2*R_SZ(sp)
    893         lw    t3, R_T3*R_SZ(sp)
    894         lw    t4, R_T4*R_SZ(sp)
    895         lw    t5, R_T5*R_SZ(sp)
    896         lw    t6, R_T6*R_SZ(sp)
    897         lw    t7, R_T7*R_SZ(sp)
    898         lw    t8, R_T8*R_SZ(sp)
    899         lw    t9, R_T9*R_SZ(sp)
    900         lw    gp, R_GP*R_SZ(sp)
    901         lw    fp, R_FP*R_SZ(sp)
    902         lw    ra, R_RA*R_SZ(sp)
    903         lw    a0, R_A0*R_SZ(sp)
    904         lw    a1, R_A1*R_SZ(sp)
    905         lw    v1, R_V1*R_SZ(sp)
    906         lw    v0, R_V0*R_SZ(sp)
    907         .set noat
    908         lw    AT, R_AT*R_SZ(sp)
    909         .set at
    910 
    911         addiu sp,sp,EXCP_STACK_SIZE
    912 
    913         mfc0    k0, C0_EPC
    914        
     536        LDREG k0, R_MDLO*R_SZ(sp)           
     537        mtlo  k0
     538        LDREG k0, R_MDHI*R_SZ(sp)           
     539        LDREG a2, R_A2*R_SZ(sp)
     540        mthi  k0
     541        LDREG a3, R_A3*R_SZ(sp)
     542        LDREG t0, R_T0*R_SZ(sp)
     543        LDREG t1, R_T1*R_SZ(sp)
     544        LDREG t2, R_T2*R_SZ(sp)
     545        LDREG t3, R_T3*R_SZ(sp)
     546        LDREG t4, R_T4*R_SZ(sp)
     547        LDREG t5, R_T5*R_SZ(sp)
     548        LDREG t6, R_T6*R_SZ(sp)
     549        LDREG t7, R_T7*R_SZ(sp)
     550        LDREG t8, R_T8*R_SZ(sp)
     551        LDREG t9, R_T9*R_SZ(sp)
     552        LDREG gp, R_GP*R_SZ(sp)
     553        LDREG fp, R_FP*R_SZ(sp)
     554        LDREG ra, R_RA*R_SZ(sp)
     555        LDREG a0, R_A0*R_SZ(sp)
     556        LDREG a1, R_A1*R_SZ(sp)
     557        LDREG v1, R_V1*R_SZ(sp)
     558        LDREG v0, R_V0*R_SZ(sp)
     559        .set noat
     560        LDREG AT, R_AT*R_SZ(sp)
     561        .set at
     562
     563        ADDIU    sp,sp,EXCP_STACK_SIZE
     564
     565        MFC0      k0, C0_EPC
     566       
    915567        rfe  /* Might not need to do RFE here... */
    916         j k0
    917         nop
     568        j        k0
     569        nop
    918570
    919571       .set    reorder
    920572ENDFRAME(_ISR_Handler)
    921573
    922 #else
    923 
    924    #error "__mips is not set to 1 or 3 "
    925 
    926 #endif
    927 
    928574FRAME(mips_break,sp,0,ra)
    929575#if 1
    930         break 0x0
    931         j mips_break
     576        break 0x0
     577        j mips_break
    932578#else
    933         j ra
    934 #endif
    935         nop
     579        j ra
     580#endif
     581        nop
    936582ENDFRAME(mips_break)
    937583
Note: See TracChangeset for help on using the changeset viewer.