Changeset 1b109cb in mainline for arch/mips32/src/start.S


Ignore:
Timestamp:
2006-03-20T13:39:56Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9d3e185
Parents:
8d25b44
Message:

Cleanup of mips

  • inline register reads
  • better fpu disable/enable - global settings is automatically propagated to task
  • fast syscall
File:
1 edited

Legend:

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

    r8d25b44 r1b109cb  
    4444.global userspace_asm
    4545
     46# Which status bits should are thread-local
     47#define REG_SAVE_MASK 0x1f # KSU(UM), EXL, ERL, IE
     48       
    4649# Save registers to space defined by \r
    47 # We will change $at on the way
    48 .macro REGISTERS_STORE r
     50# We will change status: Disable ERL,EXL,UM,IE
     51# These changes will be automatically reversed in REGISTER_LOAD
     52.macro REGISTERS_STORE_AND_EXC_RESET r
    4953        sw $at,EOFFSET_AT(\r)
    5054        sw $v0,EOFFSET_V0(\r)
     
    8690        sw $sp,EOFFSET_SP(\r)
    8791
    88         mfc0 $at, $status
    89         sw $at,EOFFSET_STATUS(\r)
    90         mfc0 $at, $epc
    91         sw $at,EOFFSET_EPC(\r)
     92        mfc0 $t0, $status
     93        mfc0 $t1, $epc
     94       
     95        and $t2, $t0, REG_SAVE_MASK  # Save only KSU,EXL,ERL,IE
     96        li $t3, ~(0x1f)
     97        and $t0, $t0, $t3           # Clear KSU,EXL,ERL,IE
     98       
     99        sw $t2,EOFFSET_STATUS(\r)
     100        sw $t1,EOFFSET_EPC(\r)
     101        mtc0 $t0, $status
    92102.endm
    93103
    94104.macro REGISTERS_LOAD r
     105        # Update only UM,EXR,IE from status, the rest
     106        # is controlled by OS and not bound to task
     107        mfc0 $t0, $status
     108        lw $t1,EOFFSET_STATUS(\r)
     109
     110        li $t2, ~REG_SAVE_MASK    # Mask UM,EXL,ERL,IE
     111        and $t0, $t0, $t2
     112       
     113        or $t0, $t0, $t1   # Copy UM,EXL,ERL,IE from saved status
     114        mtc0 $t0, $status
     115       
    95116        lw $v0,EOFFSET_V0(\r)
    96117        lw $v1,EOFFSET_V1(\r)
     
    129150        mthi $at
    130151
    131         lw $at,EOFFSET_STATUS(\r)
    132         mtc0 $at, $status
    133152        lw $at,EOFFSET_EPC(\r)
    134153        mtc0 $at, $epc
     
    189208exception_handler:
    190209        KERNEL_STACK_TO_K0
     210       
     211        mfc0 $k1, $cause
    191212        sub $k0, REGISTER_SPACE
    192         REGISTERS_STORE $k0
    193         add $sp, $k0, 0
    194 
    195         add $a0, $sp, 0
    196         jal exception /* exception(register_space) */
    197         nop
     213       
     214        sra $k1, $k1, 0x2     # cp0_exc_cause() part 1
     215        andi $k1, $k1, 0x1f   # cp0_exc_cause() part 2
     216        sub $k1, 8            # 8=SYSCALL
     217       
     218        beqz $k1, uspace_shortcut
     219        add $k1, 8            # Revert $k1 back to correct exc number
     220       
     221        REGISTERS_STORE_AND_EXC_RESET $k0
     222        move $sp, $k0
     223       
     224        move $a1, $sp
     225        jal exc_dispatch      # exc_dispatch(excno, register_space)
     226        move $a0, $k1
    198227
    199228        REGISTERS_LOAD $sp
     
    201230        eret
    202231        nop
     232
     233# it seems that mips reserves some space on stack for varfuncs???
     234#define SS_ARG4   16
     235#define SS_SP     20
     236#define SS_STATUS 24
     237#define SS_EPC    28
     238#define SS_RA     32
     239uspace_shortcut:
     240        # We have a lot of space on the stack, with free use
     241        sw $sp, SS_SP($k0)
     242        move $sp, $k0
     243        sw $ra, SS_RA($k0)
     244
     245        mfc0 $t1, $epc
     246        mfc0 $t0, $status
     247        sw $t1,SS_EPC($sp)  # Save EPC
     248       
     249        and $t2, $t0, REG_SAVE_MASK # Save only KSU,EXL,ERL,IE
     250        li $t3, ~(0x1f)
     251        and $t0, $t0, $t3           # Clear KSU,EXL,ERL
     252        ori $t0, $t0, 0x1           # Set IE
     253
     254        sw $t2,SS_STATUS($sp)
     255        mtc0 $t0, $status
     256
     257        jal syscall_handler
     258        sw $v0, SS_ARG4($sp)        # save v0 - arg4 to stack
     259
     260        # Restore RA
     261        lw $ra, SS_RA($sp)
     262       
     263        # restore epc+4
     264        lw $t0,SS_EPC($sp)
     265        addi $t0, $t0, 4
     266        mtc0 $t0, $epc
     267       
     268        # restore status
     269        mfc0 $t0, $status
     270        lw $t1,SS_STATUS($sp)
     271
     272        li $t2, ~REG_SAVE_MASK      # Mask UM,EXL,ERL,IE
     273        and $t0, $t0, $t2
     274        or $t0, $t0, $t1            # Copy UM,EXL,ERL,IE from saved status
     275        mtc0 $t0, $status
     276                       
     277        lw $sp,SS_SP($sp) # restore sp
     278       
     279        eret
    203280       
    204281tlb_refill_handler:
    205282        KERNEL_STACK_TO_K0
    206283        sub $k0, REGISTER_SPACE
    207         REGISTERS_STORE $k0
     284        REGISTERS_STORE_AND_EXC_RESET $k0
    208285        add $sp, $k0, 0
    209286
     
    215292
    216293        eret
    217         nop
    218294
    219295cache_error_handler:
    220296        KERNEL_STACK_TO_K0
    221297        sub $sp, REGISTER_SPACE
    222         REGISTERS_STORE $sp
     298        REGISTERS_STORE_AND_EXC_RESET $sp
    223299        add $sp, $k0, 0
    224300
     
    229305
    230306        eret
    231         nop
    232307
    233308userspace_asm:
     
    235310        add $v0, $a1, 0
    236311        eret
    237         nop
    238 
     312
Note: See TracChangeset for help on using the changeset viewer.