Changeset 9c2fb97 in mainline


Ignore:
Timestamp:
2007-11-16T16:18:29Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1b03ed3
Parents:
296426ad
Message:

Support for six syscall arguments on mips32.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/mips32/include/stack.h

    r296426ad r9c2fb97  
    3939#define STACK_ALIGNMENT         8
    4040
     41#define STACK_ARG0              0
     42#define STACK_ARG1              4
     43#define STACK_ARG2              8
     44#define STACK_ARG3              12
     45#define STACK_ARG4              16
     46#define STACK_ARG5              20
     47#define STACK_ARG6              24
     48
    4149#endif
    4250
  • kernel/arch/mips32/src/start.S

    r296426ad r9c2fb97  
    3131#include <arch/asm/boot.h>
    3232#include <arch/context_offset.h>
     33#include <arch/stack.h>
    3334       
    3435.text
     
    5253# SP is NOT saved as part of these registers
    5354.macro REGISTERS_STORE_AND_EXC_RESET r
    54         sw $at,EOFFSET_AT(\r)
    55         sw $v0,EOFFSET_V0(\r)
    56         sw $v1,EOFFSET_V1(\r)
    57         sw $a0,EOFFSET_A0(\r)
    58         sw $a1,EOFFSET_A1(\r)
    59         sw $a2,EOFFSET_A2(\r)
    60         sw $a3,EOFFSET_A3(\r)
    61         sw $t0,EOFFSET_T0(\r)
    62         sw $t1,EOFFSET_T1(\r)
    63         sw $t2,EOFFSET_T2(\r)
    64         sw $t3,EOFFSET_T3(\r)
    65         sw $t4,EOFFSET_T4(\r)
    66         sw $t5,EOFFSET_T5(\r)
    67         sw $t6,EOFFSET_T6(\r)
    68         sw $t7,EOFFSET_T7(\r)
    69         sw $t8,EOFFSET_T8(\r)
    70         sw $t9,EOFFSET_T9(\r)
     55        sw $at, EOFFSET_AT(\r)
     56        sw $v0, EOFFSET_V0(\r)
     57        sw $v1, EOFFSET_V1(\r)
     58        sw $a0, EOFFSET_A0(\r)
     59        sw $a1, EOFFSET_A1(\r)
     60        sw $a2, EOFFSET_A2(\r)
     61        sw $a3, EOFFSET_A3(\r)
     62        sw $t0, EOFFSET_T0(\r)
     63        sw $t1, EOFFSET_T1(\r)
     64        sw $t2, EOFFSET_T2(\r)
     65        sw $t3, EOFFSET_T3(\r)
     66        sw $t4, EOFFSET_T4(\r)
     67        sw $t5, EOFFSET_T5(\r)
     68        sw $t6, EOFFSET_T6(\r)
     69        sw $t7, EOFFSET_T7(\r)
     70        sw $t8, EOFFSET_T8(\r)
     71        sw $t9, EOFFSET_T9(\r)
    7172
    7273        mflo $at
     
    7677       
    7778#ifdef CONFIG_DEBUG_ALLREGS     
    78         sw $s0,EOFFSET_S0(\r)
    79         sw $s1,EOFFSET_S1(\r)
    80         sw $s2,EOFFSET_S2(\r)
    81         sw $s3,EOFFSET_S3(\r)
    82         sw $s4,EOFFSET_S4(\r)
    83         sw $s5,EOFFSET_S5(\r)
    84         sw $s6,EOFFSET_S6(\r)
    85         sw $s7,EOFFSET_S7(\r)
    86         sw $s8,EOFFSET_S8(\r)
     79        sw $s0, EOFFSET_S0(\r)
     80        sw $s1, EOFFSET_S1(\r)
     81        sw $s2, EOFFSET_S2(\r)
     82        sw $s3, EOFFSET_S3(\r)
     83        sw $s4, EOFFSET_S4(\r)
     84        sw $s5, EOFFSET_S5(\r)
     85        sw $s6, EOFFSET_S6(\r)
     86        sw $s7, EOFFSET_S7(\r)
     87        sw $s8, EOFFSET_S8(\r)
    8788#endif
    8889       
    89         sw $gp,EOFFSET_GP(\r)
    90         sw $ra,EOFFSET_RA(\r)
    91         sw $k1,EOFFSET_K1(\r)
     90        sw $gp, EOFFSET_GP(\r)
     91        sw $ra, EOFFSET_RA(\r)
     92        sw $k1, EOFFSET_K1(\r)
    9293
    9394        mfc0 $t0, $status
    9495        mfc0 $t1, $epc
    9596       
    96         and $t2, $t0, REG_SAVE_MASK  # Save only KSU,EXL,ERL,IE
     97        and $t2, $t0, REG_SAVE_MASK     # Save only KSU,EXL,ERL,IE
    9798        li $t3, ~(0x1f)
    98         and $t0, $t0, $t3           # Clear KSU,EXL,ERL,IE
     99        and $t0, $t0, $t3               # Clear KSU,EXL,ERL,IE
    99100       
    100101        sw $t2,EOFFSET_STATUS(\r)
     
    109110        lw $t1,EOFFSET_STATUS(\r)
    110111
    111         li $t2, ~REG_SAVE_MASK    # Mask UM,EXL,ERL,IE
     112        li $t2, ~REG_SAVE_MASK          # Mask UM,EXL,ERL,IE
    112113        and $t0, $t0, $t2
    113114       
    114         or $t0, $t0, $t1   # Copy UM,EXL,ERL,IE from saved status
     115        or $t0, $t0, $t1                # Copy UM,EXL, ERL, IE from saved status
    115116        mtc0 $t0, $status
    116117       
    117         lw $v0,EOFFSET_V0(\r)
    118         lw $v1,EOFFSET_V1(\r)
    119         lw $a0,EOFFSET_A0(\r)
    120         lw $a1,EOFFSET_A1(\r)
    121         lw $a2,EOFFSET_A2(\r)
    122         lw $a3,EOFFSET_A3(\r)
    123         lw $t0,EOFFSET_T0(\r)
    124         lw $t1,EOFFSET_T1(\r)
    125         lw $t2,EOFFSET_T2(\r)
    126         lw $t3,EOFFSET_T3(\r)
    127         lw $t4,EOFFSET_T4(\r)
    128         lw $t5,EOFFSET_T5(\r)
    129         lw $t6,EOFFSET_T6(\r)
    130         lw $t7,EOFFSET_T7(\r)
    131         lw $t8,EOFFSET_T8(\r)
    132         lw $t9,EOFFSET_T9(\r)
     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)
    133134       
    134135#ifdef CONFIG_DEBUG_ALLREGS     
    135         lw $s0,EOFFSET_S0(\r)
    136         lw $s1,EOFFSET_S1(\r)
    137         lw $s2,EOFFSET_S2(\r)
    138         lw $s3,EOFFSET_S3(\r)
    139         lw $s4,EOFFSET_S4(\r)
    140         lw $s5,EOFFSET_S5(\r)
    141         lw $s6,EOFFSET_S6(\r)
    142         lw $s7,EOFFSET_S7(\r)
    143         lw $s8,EOFFSET_S8(\r)
     136        lw $s0, EOFFSET_S0(\r)
     137        lw $s1, EOFFSET_S1(\r)
     138        lw $s2, EOFFSET_S2(\r)
     139        lw $s3, EOFFSET_S3(\r)
     140        lw $s4, EOFFSET_S4(\r)
     141        lw $s5, EOFFSET_S5(\r)
     142        lw $s6, EOFFSET_S6(\r)
     143        lw $s7, EOFFSET_S7(\r)
     144        lw $s8, EOFFSET_S8(\r)
    144145#endif
    145         lw $gp,EOFFSET_GP(\r)
    146         lw $ra,EOFFSET_RA(\r)
    147         lw $k1,EOFFSET_K1(\r)
    148        
    149         lw $at,EOFFSET_LO(\r)
     146        lw $gp, EOFFSET_GP(\r)
     147        lw $ra, EOFFSET_RA(\r)
     148        lw $k1, EOFFSET_K1(\r)
     149       
     150        lw $at, EOFFSET_LO(\r)
    150151        mtlo $at
    151         lw $at,EOFFSET_HI(\r)
     152        lw $at, EOFFSET_HI(\r)
    152153        mthi $at
    153154
    154         lw $at,EOFFSET_EPC(\r)
     155        lw $at, EOFFSET_EPC(\r)
    155156        mtc0 $at, $epc
    156157       
    157         lw $at,EOFFSET_AT(\r)
    158         lw $sp,EOFFSET_SP(\r)
     158        lw $at, EOFFSET_AT(\r)
     159        lw $sp, EOFFSET_SP(\r)
    159160.endm
    160161
     
    229230        j exception_handler
    230231        nop     
    231 
    232        
    233232       
    234233exception_handler:
    235234        KERNEL_STACK_TO_K0
    236235        sub $k0, REGISTER_SPACE
    237         sw $sp,EOFFSET_SP($k0)
     236        sw $sp, EOFFSET_SP($k0)
    238237        move $sp, $k0
    239238       
    240239        mfc0 $k0, $cause
    241240       
    242         sra $k0, $k0, 0x2     # cp0_exc_cause() part 1
    243         andi $k0, $k0, 0x1f   # cp0_exc_cause() part 2
    244         sub $k0, 8            # 8=SYSCALL
     241        sra $k0, $k0, 0x2               # cp0_exc_cause() part 1
     242        andi $k0, $k0, 0x1f             # cp0_exc_cause() part 2
     243        sub $k0, 8                      # 8 = SYSCALL
    245244       
    246245        beqz $k0, syscall_shortcut
    247         add $k0, 8            # Revert $k0 back to correct exc number
     246        add $k0, 8                      # Revert $k0 back to correct exc number
    248247       
    249248        REGISTERS_STORE_AND_EXC_RESET $sp
    250249       
    251250        move $a1, $sp
    252         jal exc_dispatch      # exc_dispatch(excno, register_space)
     251        jal exc_dispatch                # exc_dispatch(excno, register_space)
    253252        move $a0, $k0
    254253
     
    257256        eret
    258257
    259 # it seems that mips reserves some space on stack for varfuncs???
    260 #define SS_ARG4   16
    261 #define SS_SP     EOFFSET_SP
    262 #define SS_STATUS EOFFSET_STATUS
    263 #define SS_EPC    EOFFSET_EPC
    264 #define SS_K1     EOFFSET_K1
     258## Syscall entry
     259#
     260# Registers:
     261#
     262# @param v0             Syscall number.
     263# @param a0             1st argument.
     264# @param a1             2nd argument.
     265# @param a2             3rd argument.
     266# @param a3             4th argument.
     267# @param t0             5th argument.
     268# @param t1             6th argument.
     269#
     270# @return               The return value will be stored in v0.
     271#
     272#define SS_SP           EOFFSET_SP
     273#define SS_STATUS       EOFFSET_STATUS
     274#define SS_EPC          EOFFSET_EPC
     275#define SS_K1           EOFFSET_K1
    265276syscall_shortcut:
    266277        # We have a lot of space on the stack, with free use
    267         mfc0 $t1, $epc
    268         mfc0 $t0, $status
    269         sw $t1,SS_EPC($sp)  # Save EPC
    270         sw $k1,SS_K1($sp)   # Save k1, which is not saved during context switch
    271        
    272         and $t2, $t0, REG_SAVE_MASK # Save only KSU,EXL,ERL,IE
    273         li $t3, ~(0x1f)
    274         and $t0, $t0, $t3           # Clear KSU,EXL,ERL
    275         ori $t0, $t0, 0x1           # Set IE
    276 
    277         sw $t2,SS_STATUS($sp)
    278         mtc0 $t0, $status
    279 
    280         # CALL Syscall handler
     278        mfc0 $t3, $epc
     279        mfc0 $t2, $status
     280        sw $t3, SS_EPC($sp)             # Save EPC
     281        sw $k1, SS_K1($sp)              # Save k1 not saved on context switch
     282       
     283        and $t4, $t2, REG_SAVE_MASK     # Save only KSU, EXL, ERL, IE
     284        li $t5, ~(0x1f)
     285        and $t2, $t2, $t5               # Clear KSU, EXL, ERL
     286        ori $t2, $t2, 0x1               # Set IE
     287
     288        sw $t4, SS_STATUS($sp)
     289        mtc0 $t2, $status
     290
     291        #
     292        # Call the higher level system call handler
     293        # We are going to reuse part of the unused exception stack frame
     294        #
     295        sw $t0, STACK_ARG4($sp)         # save the 5th argument on the stack
     296        sw $t1, STACK_ARG5($sp)         # save the 6th argument on the stack
    281297        jal syscall_handler
    282         sw $v0, SS_ARG4($sp)        # save v0 - arg4 to stack
     298        sw $v0, STACK_ARG6($sp)         # save the syscall number on the stack
    283299
    284300        # restore status
    285         mfc0 $t0, $status
    286         lw $t1,SS_STATUS($sp)
    287 
    288         # Change back to EXL=1(from last exception), otherwise
    289         # an interrupt could rewrite the CP0-EPC
    290         li $t2, ~REG_SAVE_MASK      # Mask UM,EXL,ERL,IE
    291         and $t0, $t0, $t2
    292         or $t0, $t0, $t1            # Copy UM,EXL,ERL,IE from saved status
    293         mtc0 $t0, $status
     301        mfc0 $t2, $status
     302        lw $t3, SS_STATUS($sp)
     303
     304        # Change back to EXL = 1 (from last exception), otherwise
     305        # an interrupt could rewrite the CP0 - EPC
     306        li $t4, ~REG_SAVE_MASK          # Mask UM, EXL, ERL, IE
     307        and $t2, $t2, $t4
     308        or $t2, $t2, $t3                # Copy saved UM, EXL, ERL, IE
     309        mtc0 $t2, $status
    294310                       
    295         # restore epc+4
    296         lw $t0,SS_EPC($sp)
    297         lw $k1,SS_K1($sp)
    298         addi $t0, $t0, 4
    299         mtc0 $t0, $epc
    300        
    301         lw $sp,SS_SP($sp) # restore sp
     311        # restore epc + 4
     312        lw $t2, SS_EPC($sp)
     313        lw $k1, SS_K1($sp)
     314        addi $t2, $t2, 4
     315        mtc0 $t2, $epc
     316       
     317        lw $sp, SS_SP($sp)              # restore sp
    302318       
    303319        eret
     
    334350        add $sp, $a0, 0
    335351        add $v0, $a1, 0
    336         add $t9, $a2, 0   # Set up correct entry into PIC code
    337         eret
     352        add $t9, $a2, 0                 # Set up correct entry into PIC code
     353        eret
  • uspace/lib/libc/arch/mips32/src/syscall.c

    r296426ad r9c2fb97  
    3636#include <libc.h>
    3737
    38 sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2,
    39                    const sysarg_t p3, const sysarg_t p4,
    40                    const syscall_t id)
     38sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3,
     39    const sysarg_t p4, const sysarg_t p5, const sysarg_t p6, const syscall_t id)
    4140{
    4241        register sysarg_t __mips_reg_a0 asm("$4") = p1;
     
    4443        register sysarg_t __mips_reg_a2 asm("$6") = p3;
    4544        register sysarg_t __mips_reg_a3 asm("$7") = p4;
     45        register sysarg_t __mips_reg_t0 asm("$8") = p5;
     46        register sysarg_t __mips_reg_t1 asm("$9") = p6;
    4647        register sysarg_t __mips_reg_v0 asm("$2") = id;
    4748       
     
    5354                  "r" (__mips_reg_a2),
    5455                  "r" (__mips_reg_a3),
     56                  "r" (__mips_reg_t0),
     57                  "r" (__mips_reg_t1),
    5558                  "r" (__mips_reg_v0)
    5659                : "%ra" /* We are a function call, although C does not
Note: See TracChangeset for help on using the changeset viewer.