Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/mips32/src/start.S

    r0cb47cf r3fb3c1fc  
    4646
    4747/*
    48  * Which status bits should are thread-local:
     48 * Which status bits are thread-local:
    4949 * KSU(UM), EXL, ERL, IE
    5050 */
    5151#define REG_SAVE_MASK 0x1f
     52
     53#define ISTATE_OFFSET_A0        0
     54#define ISTATE_OFFSET_A1        4
     55#define ISTATE_OFFSET_A2        8
     56#define ISTATE_OFFSET_A3        12
     57#define ISTATE_OFFSET_T0        16
     58#define ISTATE_OFFSET_T1        20
     59#define ISTATE_OFFSET_V0        24
     60#define ISTATE_OFFSET_V1        28
     61#define ISTATE_OFFSET_AT        32
     62#define ISTATE_OFFSET_T2        36
     63#define ISTATE_OFFSET_T3        40
     64#define ISTATE_OFFSET_T4        44
     65#define ISTATE_OFFSET_T5        48
     66#define ISTATE_OFFSET_T6        52
     67#define ISTATE_OFFSET_T7        56
     68#define ISTATE_OFFSET_S0        60
     69#define ISTATE_OFFSET_S1        64
     70#define ISTATE_OFFSET_S2        68
     71#define ISTATE_OFFSET_S3        72
     72#define ISTATE_OFFSET_S4        76
     73#define ISTATE_OFFSET_S5        80
     74#define ISTATE_OFFSET_S6        84
     75#define ISTATE_OFFSET_S7        88
     76#define ISTATE_OFFSET_T8        92
     77#define ISTATE_OFFSET_T9        96
     78#define ISTATE_OFFSET_KT0       100
     79#define ISTATE_OFFSET_KT1       104
     80#define ISTATE_OFFSET_GP        108
     81#define ISTATE_OFFSET_SP        112
     82#define ISTATE_OFFSET_S8        116
     83#define ISTATE_OFFSET_RA        120
     84#define ISTATE_OFFSET_LO        124
     85#define ISTATE_OFFSET_HI        128
     86#define ISTATE_OFFSET_STATUS    132
     87#define ISTATE_OFFSET_EPC       136
     88#define ISTATE_OFFSET_ALIGNMENT 140
     89
     90#define ISTATE_SOFT_SIZE        144
    5291
    5392/*
     
    5897 */
    5998.macro REGISTERS_STORE_AND_EXC_RESET r
    60         sw $at, EOFFSET_AT(\r)
    61         sw $v0, EOFFSET_V0(\r)
    62         sw $v1, EOFFSET_V1(\r)
    63         sw $a0, EOFFSET_A0(\r)
    64         sw $a1, EOFFSET_A1(\r)
    65         sw $a2, EOFFSET_A2(\r)
    66         sw $a3, EOFFSET_A3(\r)
    67         sw $t0, EOFFSET_T0(\r)
    68         sw $t1, EOFFSET_T1(\r)
    69         sw $t2, EOFFSET_T2(\r)
    70         sw $t3, EOFFSET_T3(\r)
    71         sw $t4, EOFFSET_T4(\r)
    72         sw $t5, EOFFSET_T5(\r)
    73         sw $t6, EOFFSET_T6(\r)
    74         sw $t7, EOFFSET_T7(\r)
    75         sw $t8, EOFFSET_T8(\r)
    76         sw $t9, EOFFSET_T9(\r)
     99        sw $at, ISTATE_OFFSET_AT(\r)
     100        sw $v0, ISTATE_OFFSET_V0(\r)
     101        sw $v1, ISTATE_OFFSET_V1(\r)
     102        sw $a0, ISTATE_OFFSET_A0(\r)
     103        sw $a1, ISTATE_OFFSET_A1(\r)
     104        sw $a2, ISTATE_OFFSET_A2(\r)
     105        sw $a3, ISTATE_OFFSET_A3(\r)
     106        sw $t0, ISTATE_OFFSET_T0(\r)
     107        sw $t1, ISTATE_OFFSET_T1(\r)
     108        sw $t2, ISTATE_OFFSET_T2(\r)
     109        sw $t3, ISTATE_OFFSET_T3(\r)
     110        sw $t4, ISTATE_OFFSET_T4(\r)
     111        sw $t5, ISTATE_OFFSET_T5(\r)
     112        sw $t6, ISTATE_OFFSET_T6(\r)
     113        sw $t7, ISTATE_OFFSET_T7(\r)
     114        sw $t8, ISTATE_OFFSET_T8(\r)
     115        sw $t9, ISTATE_OFFSET_T9(\r)
     116        sw $s0, ISTATE_OFFSET_S0(\r)
     117        sw $s1, ISTATE_OFFSET_S1(\r)
     118        sw $s2, ISTATE_OFFSET_S2(\r)
     119        sw $s3, ISTATE_OFFSET_S3(\r)
     120        sw $s4, ISTATE_OFFSET_S4(\r)
     121        sw $s5, ISTATE_OFFSET_S5(\r)
     122        sw $s6, ISTATE_OFFSET_S6(\r)
     123        sw $s7, ISTATE_OFFSET_S7(\r)
     124        sw $s8, ISTATE_OFFSET_S8(\r)
    77125       
    78126        mflo $at
    79         sw $at, EOFFSET_LO(\r)
     127        sw $at, ISTATE_OFFSET_LO(\r)
    80128        mfhi $at
    81         sw $at, EOFFSET_HI(\r)
    82        
    83         sw $gp, EOFFSET_GP(\r)
    84         sw $ra, EOFFSET_RA(\r)
    85         sw $k1, EOFFSET_K1(\r)
     129        sw $at, ISTATE_OFFSET_HI(\r)
     130       
     131        sw $gp, ISTATE_OFFSET_GP(\r)
     132        sw $ra, ISTATE_OFFSET_RA(\r)
     133        sw $k0, ISTATE_OFFSET_KT0(\r)
     134        sw $k1, ISTATE_OFFSET_KT1(\r)
    86135       
    87136        mfc0 $t0, $status
     
    95144        and $t0, $t0, $t3
    96145       
    97         sw $t2, EOFFSET_STATUS(\r)
    98         sw $t1, EOFFSET_EPC(\r)
     146        sw $t2, ISTATE_OFFSET_STATUS(\r)
     147        sw $t1, ISTATE_OFFSET_EPC(\r)
    99148        mtc0 $t0, $status
    100149.endm
     
    106155         */
    107156        mfc0 $t0, $status
    108         lw $t1,EOFFSET_STATUS(\r)
     157        lw $t1, ISTATE_OFFSET_STATUS(\r)
    109158       
    110159        /* mask UM, EXL, ERL, IE */
     
    116165        mtc0 $t0, $status
    117166       
    118         lw $v0, EOFFSET_V0(\r)
    119         lw $v1, EOFFSET_V1(\r)
    120         lw $a0, EOFFSET_A0(\r)
    121         lw $a1, EOFFSET_A1(\r)
    122         lw $a2, EOFFSET_A2(\r)
    123         lw $a3, EOFFSET_A3(\r)
    124         lw $t0, EOFFSET_T0(\r)
    125         lw $t1, EOFFSET_T1(\r)
    126         lw $t2, EOFFSET_T2(\r)
    127         lw $t3, EOFFSET_T3(\r)
    128         lw $t4, EOFFSET_T4(\r)
    129         lw $t5, EOFFSET_T5(\r)
    130         lw $t6, EOFFSET_T6(\r)
    131         lw $t7, EOFFSET_T7(\r)
    132         lw $t8, EOFFSET_T8(\r)
    133         lw $t9, EOFFSET_T9(\r)
    134        
    135         lw $gp, EOFFSET_GP(\r)
    136         lw $ra, EOFFSET_RA(\r)
    137         lw $k1, EOFFSET_K1(\r)
    138        
    139         lw $at, EOFFSET_LO(\r)
     167        lw $v0, ISTATE_OFFSET_V0(\r)
     168        lw $v1, ISTATE_OFFSET_V1(\r)
     169        lw $a0, ISTATE_OFFSET_A0(\r)
     170        lw $a1, ISTATE_OFFSET_A1(\r)
     171        lw $a2, ISTATE_OFFSET_A2(\r)
     172        lw $a3, ISTATE_OFFSET_A3(\r)
     173        lw $t0, ISTATE_OFFSET_T0(\r)
     174        lw $t1, ISTATE_OFFSET_T1(\r)
     175        lw $t2, ISTATE_OFFSET_T2(\r)
     176        lw $t3, ISTATE_OFFSET_T3(\r)
     177        lw $t4, ISTATE_OFFSET_T4(\r)
     178        lw $t5, ISTATE_OFFSET_T5(\r)
     179        lw $t6, ISTATE_OFFSET_T6(\r)
     180        lw $t7, ISTATE_OFFSET_T7(\r)
     181        lw $t8, ISTATE_OFFSET_T8(\r)
     182        lw $t9, ISTATE_OFFSET_T9(\r)
     183       
     184        lw $gp, ISTATE_OFFSET_GP(\r)
     185        lw $ra, ISTATE_OFFSET_RA(\r)
     186        lw $k1, ISTATE_OFFSET_KT1(\r)
     187       
     188        lw $at, ISTATE_OFFSET_LO(\r)
    140189        mtlo $at
    141         lw $at, EOFFSET_HI(\r)
     190        lw $at, ISTATE_OFFSET_HI(\r)
    142191        mthi $at
    143192       
    144         lw $at, EOFFSET_EPC(\r)
     193        lw $at, ISTATE_OFFSET_EPC(\r)
    145194        mtc0 $at, $epc
    146195       
    147         lw $at, EOFFSET_AT(\r)
    148         lw $sp, EOFFSET_SP(\r)
     196        lw $at, ISTATE_OFFSET_AT(\r)
     197        lw $sp, ISTATE_OFFSET_SP(\r)
    149198.endm
    150199
     
    159208       
    160209        beq $k0, $0, 1f
    161         add $k0, $sp, 0
     210        move $k0, $sp
    162211       
    163212        /* move $k0 pointer to kernel stack */
     
    166215       
    167216        /* move $k0 (supervisor_sp) */
    168         lw $k0, 0($k0)
     217        lw $k0, ($k0)
    169218       
    170219        1:
     
    205254        KERNEL_STACK_TO_K0
    206255       
    207         sub $k0, REGISTER_SPACE
    208         sw $sp, EOFFSET_SP($k0)
     256        sub $k0, ISTATE_SOFT_SIZE
     257        sw $sp, ISTATE_OFFSET_SP($k0)
    209258        move $sp, $k0
    210259       
     
    227276        /* the $sp is automatically restored to former value */
    228277        eret
    229 
    230 #define SS_SP      EOFFSET_SP
    231 #define SS_STATUS  EOFFSET_STATUS
    232 #define SS_EPC     EOFFSET_EPC
    233 #define SS_K1      EOFFSET_K1
    234278
    235279/** Syscall entry
     
    252296        mfc0 $t3, $epc
    253297        mfc0 $t2, $status
    254         sw $t3, SS_EPC($sp)  /* save EPC */
    255         sw $k1, SS_K1($sp)   /* save $k1 not saved on context switch */
     298        sw $t3, ISTATE_OFFSET_EPC($sp)  /* save EPC */
     299        sw $k1, ISTATE_OFFSET_KT1($sp)  /* save $k1 not saved on context switch */
    256300       
    257301        and $t4, $t2, REG_SAVE_MASK  /* save only KSU, EXL, ERL, IE */
     
    260304        ori $t2, $t2, 0x1  /* set IE */
    261305       
    262         sw $t4, SS_STATUS($sp)
     306        sw $t4, ISTATE_OFFSET_STATUS($sp)
    263307        mtc0 $t2, $status
    264308       
    265309        /*
    266310         * Call the higher level system call handler.
    267          * We are going to reuse part of the unused exception stack frame.
    268311         *
    269312         */
    270         sw $t0, STACK_ARG4($sp)  /* save the 5th argument on the stack */
    271         sw $t1, STACK_ARG5($sp)  /* save the 6th argument on the stack */
     313        sw $t0, ISTATE_OFFSET_T0($sp)  /* save the 5th argument on the stack */
     314        sw $t1, ISTATE_OFFSET_T1($sp)  /* save the 6th argument on the stack */
    272315        jal syscall_handler
    273         sw $v0, STACK_ARG6($sp)  /* save the syscall number on the stack */
     316        sw $v0, ISTATE_OFFSET_V0($sp)  /* save the syscall number on the stack */
    274317       
    275318        /* restore status */
    276319        mfc0 $t2, $status
    277         lw $t3, SS_STATUS($sp)
     320        lw $t3, ISTATE_OFFSET_STATUS($sp)
    278321       
    279322        /*
     
    288331       
    289332        /* restore epc + 4 */
    290         lw $t2, SS_EPC($sp)
    291         lw $k1, SS_K1($sp)
     333        lw $t2, ISTATE_OFFSET_EPC($sp)
     334        lw $k1, ISTATE_OFFSET_KT1($sp)
    292335        addi $t2, $t2, 4
    293336        mtc0 $t2, $epc
    294337       
    295         lw $sp, SS_SP($sp)  /* restore $sp */
     338        lw $sp, ISTATE_OFFSET_SP($sp)  /* restore $sp */
    296339        eret
    297340
    298341tlb_refill_handler:
    299342        KERNEL_STACK_TO_K0
    300         sub $k0, REGISTER_SPACE
     343        sub $k0, ISTATE_SOFT_SIZE
    301344        REGISTERS_STORE_AND_EXC_RESET $k0
    302         sw $sp,EOFFSET_SP($k0)
    303         add $sp, $k0, 0
     345        sw $sp, ISTATE_OFFSET_SP($k0)
     346        move $sp, $k0
    304347       
    305348        jal tlb_refill
    306         add $a0, $sp, 0
     349        move $a0, $sp
    307350       
    308351        REGISTERS_LOAD $sp
     
    311354cache_error_handler:
    312355        KERNEL_STACK_TO_K0
    313         sub $k0, REGISTER_SPACE
     356        sub $k0, ISTATE_SOFT_SIZE
    314357        REGISTERS_STORE_AND_EXC_RESET $k0
    315         sw $sp,EOFFSET_SP($k0)
    316         add $sp, $k0, 0
     358        sw $sp, ISTATE_OFFSET_SP($k0)
     359        move $sp, $k0
    317360       
    318361        jal cache_error
    319         add $a0, $sp, 0
     362        move $a0, $sp
    320363       
    321364        REGISTERS_LOAD $sp
     
    323366
    324367userspace_asm:
    325         add $sp, $a0, 0
    326         add $v0, $a1, 0
    327         add $t9, $a2, 0    /* set up correct entry into PIC code */
     368        move $sp, $a0
     369        move $v0, $a1
     370        move $t9, $a2      /* set up correct entry into PIC code */
    328371        xor $a0, $a0, $a0  /* $a0 is defined to hold pcb_ptr */
    329372                           /* set it to 0 */
Note: See TracChangeset for help on using the changeset viewer.