Ignore:
File:
1 edited

Legend:

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

    r0cb47cf r96e0748d  
    4545.global userspace_asm
    4646
    47 /*
    48  * Which status bits should are thread-local:
    49  * KSU(UM), EXL, ERL, IE
    50  */
    51 #define REG_SAVE_MASK 0x1f
    52 
    53 /*
    54  * Save registers to space defined by \r
    55  * We will change status: Disable ERL, EXL, UM, IE
    56  * These changes will be automatically reversed in REGISTER_LOAD
    57  * %sp is NOT saved as part of these registers
    58  */
     47# Which status bits should are thread-local
     48#define REG_SAVE_MASK 0x1f # KSU(UM), EXL, ERL, IE
     49       
     50# Save registers to space defined by \r
     51# We will change status: Disable ERL,EXL,UM,IE
     52# These changes will be automatically reversed in REGISTER_LOAD
     53# SP is NOT saved as part of these registers
    5954.macro REGISTERS_STORE_AND_EXC_RESET r
    6055        sw $at, EOFFSET_AT(\r)
     
    7570        sw $t8, EOFFSET_T8(\r)
    7671        sw $t9, EOFFSET_T9(\r)
    77        
     72
    7873        mflo $at
    7974        sw $at, EOFFSET_LO(\r)
     
    8479        sw $ra, EOFFSET_RA(\r)
    8580        sw $k1, EOFFSET_K1(\r)
    86        
     81
    8782        mfc0 $t0, $status
    8883        mfc0 $t1, $epc
    8984       
    90         /* save only KSU, EXL, ERL, IE */
    91         and $t2, $t0, REG_SAVE_MASK
    92        
    93         /* clear KSU, EXL, ERL, IE */
    94         li $t3, ~(REG_SAVE_MASK)
    95         and $t0, $t0, $t3
    96        
    97         sw $t2, EOFFSET_STATUS(\r)
    98         sw $t1, EOFFSET_EPC(\r)
     85        and $t2, $t0, REG_SAVE_MASK     # Save only KSU,EXL,ERL,IE
     86        li $t3, ~(0x1f)
     87        and $t0, $t0, $t3               # Clear KSU,EXL,ERL,IE
     88       
     89        sw $t2,EOFFSET_STATUS(\r)
     90        sw $t1,EOFFSET_EPC(\r)
    9991        mtc0 $t0, $status
    10092.endm
    10193
    10294.macro REGISTERS_LOAD r
    103         /*
    104          * Update only UM, EXR, IE from status, the rest
    105          * is controlled by OS and not bound to task.
    106          */
     95        # Update only UM,EXR,IE from status, the rest
     96        # is controlled by OS and not bound to task
    10797        mfc0 $t0, $status
    10898        lw $t1,EOFFSET_STATUS(\r)
    109        
    110         /* mask UM, EXL, ERL, IE */
    111         li $t2, ~REG_SAVE_MASK
     99
     100        li $t2, ~REG_SAVE_MASK          # Mask UM,EXL,ERL,IE
    112101        and $t0, $t0, $t2
    113102       
    114         /* copy UM, EXL, ERL, IE from saved status */
    115         or $t0, $t0, $t1
     103        or $t0, $t0, $t1                # Copy UM,EXL, ERL, IE from saved status
    116104        mtc0 $t0, $status
    117105       
     
    141129        lw $at, EOFFSET_HI(\r)
    142130        mthi $at
    143        
     131
    144132        lw $at, EOFFSET_EPC(\r)
    145133        mtc0 $at, $epc
     
    149137.endm
    150138
    151 /*
    152  * Move kernel stack pointer address to register $k0.
    153  * If we are in user mode, load the appropriate stack address.
    154  */
     139# Move kernel stack pointer address to register K0
     140# - if we are in user mode, load the appropriate stack
     141# address
    155142.macro KERNEL_STACK_TO_K0
    156         /* if we are in user mode */
     143        # If we are in user mode
    157144        mfc0 $k0, $status
    158145        andi $k0, 0x10
     
    161148        add $k0, $sp, 0
    162149       
    163         /* move $k0 pointer to kernel stack */
     150        # Move $k0 pointer to kernel stack
    164151        lui $k0, %hi(supervisor_sp)
    165152        ori $k0, $k0, %lo(supervisor_sp)
    166        
    167         /* move $k0 (supervisor_sp) */
     153        # Move $k0 (superveisor_sp)
    168154        lw $k0, 0($k0)
    169        
    170         1:
     1551:
    171156.endm
    172157
    173158.org 0x0
    174159kernel_image_start:
    175         /* load temporary stack */
     160        /* Load temporary stack */
    176161        lui $sp, %hi(end_stack)
    177162        ori $sp, $sp, %lo(end_stack)
    178163       
    179         /* not sure about this, but might be needed for PIC code */
     164        /* Not sure about this, but might
     165           be needed for PIC code */
    180166        lui $gp, 0x8000
    181167       
    182168        /* $a1 contains physical address of bootinfo_t */
     169       
    183170        jal arch_pre_main
    184171        nop
     
    187174        nop
    188175
    189 .space TEMP_STACK_SIZE
     176        .space TEMP_STACK_SIZE
    190177end_stack:
    191178
     
    204191exception_handler:
    205192        KERNEL_STACK_TO_K0
    206        
    207193        sub $k0, REGISTER_SPACE
    208194        sw $sp, EOFFSET_SP($k0)
     
    211197        mfc0 $k0, $cause
    212198       
    213         sra $k0, $k0, 0x2    /* cp0_exc_cause() part 1 */
    214         andi $k0, $k0, 0x1f  /* cp0_exc_cause() part 2 */
    215         sub $k0, 8           /* 8 = SYSCALL */
     199        sra $k0, $k0, 0x2    # cp0_exc_cause() part 1
     200        andi $k0, $k0, 0x1f  # cp0_exc_cause() part 2
     201        sub $k0, 8           # 8 = SYSCALL
    216202       
    217203        beqz $k0, syscall_shortcut
    218         add $k0, 8           /* revert $k0 back to correct exc number */
     204        add $k0, 8           # Revert $k0 back to correct exc number
    219205       
    220206        REGISTERS_STORE_AND_EXC_RESET $sp
    221207       
    222208        move $a1, $sp
    223         jal exc_dispatch     /* exc_dispatch(excno, register_space) */
     209        jal exc_dispatch     # exc_dispatch(excno, register_space)
    224210        move $a0, $k0
    225        
     211
    226212        REGISTERS_LOAD $sp
    227         /* the $sp is automatically restored to former value */
    228         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
    234 
    235 /** Syscall entry
    236  *
    237  * Registers:
    238  *
    239  * @param $v0 Syscall number.
    240  * @param $a0 1st argument.
    241  * @param $a1 2nd argument.
    242  * @param $a2 3rd argument.
    243  * @param $a3 4th argument.
    244  * @param $t0 5th argument.
    245  * @param $t1 6th argument.
    246  *
    247  * @return The return value will be stored in $v0.
    248  *
    249  */
     213        # The $sp is automatically restored to former value
     214        eret
     215
     216## Syscall entry
     217#
     218# Registers:
     219#
     220# @param v0             Syscall number.
     221# @param a0             1st argument.
     222# @param a1             2nd argument.
     223# @param a2             3rd argument.
     224# @param a3             4th argument.
     225# @param t0             5th argument.
     226# @param t1             6th argument.
     227#
     228# @return               The return value will be stored in v0.
     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
    250234syscall_shortcut:
    251         /* we have a lot of space on the stack, with free use */
     235        # We have a lot of space on the stack, with free use
    252236        mfc0 $t3, $epc
    253237        mfc0 $t2, $status
    254         sw $t3, SS_EPC($sp)  /* save EPC */
    255         sw $k1, SS_K1($sp)   /* save $k1 not saved on context switch */
    256        
    257         and $t4, $t2, REG_SAVE_MASK  /* save only KSU, EXL, ERL, IE */
     238        sw $t3, SS_EPC($sp)             # Save EPC
     239        sw $k1, SS_K1($sp)              # Save k1 not saved on context switch
     240       
     241        and $t4, $t2, REG_SAVE_MASK     # Save only KSU, EXL, ERL, IE
    258242        li $t5, ~(0x1f)
    259         and $t2, $t2, $t5  /* clear KSU, EXL, ERL */
    260         ori $t2, $t2, 0x1  /* set IE */
    261        
     243        and $t2, $t2, $t5               # Clear KSU, EXL, ERL
     244        ori $t2, $t2, 0x1               # Set IE
     245
    262246        sw $t4, SS_STATUS($sp)
    263247        mtc0 $t2, $status
    264        
    265         /*
    266          * Call the higher level system call handler.
    267          * We are going to reuse part of the unused exception stack frame.
    268          *
    269          */
    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 */
     248
     249        #
     250        # Call the higher level system call handler
     251        # We are going to reuse part of the unused exception stack frame
     252        #
     253        sw $t0, STACK_ARG4($sp)         # save the 5th argument on the stack
     254        sw $t1, STACK_ARG5($sp)         # save the 6th argument on the stack
    272255        jal syscall_handler
    273         sw $v0, STACK_ARG6($sp)  /* save the syscall number on the stack */
    274        
    275         /* restore status */
     256        sw $v0, STACK_ARG6($sp)         # save the syscall number on the stack
     257
     258        # restore status
    276259        mfc0 $t2, $status
    277260        lw $t3, SS_STATUS($sp)
    278        
    279         /*
    280          * Change back to EXL = 1 (from last exception), otherwise
    281          * an interrupt could rewrite the CP0 - EPC.
    282          *
    283          */
    284         li $t4, ~REG_SAVE_MASK  /* mask UM, EXL, ERL, IE */
     261
     262        # Change back to EXL = 1 (from last exception), otherwise
     263        # an interrupt could rewrite the CP0 - EPC
     264        li $t4, ~REG_SAVE_MASK          # Mask UM, EXL, ERL, IE
    285265        and $t2, $t2, $t4
    286         or $t2, $t2, $t3  /* copy saved UM, EXL, ERL, IE */
     266        or $t2, $t2, $t3                # Copy saved UM, EXL, ERL, IE
    287267        mtc0 $t2, $status
    288        
    289         /* restore epc + 4 */
     268                       
     269        # restore epc + 4
    290270        lw $t2, SS_EPC($sp)
    291271        lw $k1, SS_K1($sp)
     
    293273        mtc0 $t2, $epc
    294274       
    295         lw $sp, SS_SP($sp)  /* restore $sp */
    296         eret
    297 
     275        lw $sp, SS_SP($sp)              # restore sp
     276       
     277        eret
     278               
    298279tlb_refill_handler:
    299280        KERNEL_STACK_TO_K0
     
    302283        sw $sp,EOFFSET_SP($k0)
    303284        add $sp, $k0, 0
    304        
     285
    305286        jal tlb_refill
    306287        add $a0, $sp, 0
    307        
     288
    308289        REGISTERS_LOAD $sp
     290
    309291        eret
    310292
     
    315297        sw $sp,EOFFSET_SP($k0)
    316298        add $sp, $k0, 0
    317        
     299
    318300        jal cache_error
    319         add $a0, $sp, 0
    320        
     301        add $a0, $sp, 0 
     302
    321303        REGISTERS_LOAD $sp
     304
    322305        eret
    323306
    324307userspace_asm:
    325308        add $sp, $a0, 0
    326         add $v0, $a1, 0
    327         add $t9, $a2, 0    /* set up correct entry into PIC code */
    328         xor $a0, $a0, $a0  /* $a0 is defined to hold pcb_ptr */
    329                            /* set it to 0 */
    330         eret
     309        add $v0, $a1, 0 
     310        add $t9, $a2, 0                 # Set up correct entry into PIC code
     311        xor $a0, $a0, $a0               # $a0 is defined to hold pcb_ptr
     312                                        # set it to 0
     313        eret
Note: See TracChangeset for help on using the changeset viewer.