Ignore:
Timestamp:
Nov 7, 2017, 3:08:12 PM (7 years ago)
Author:
alain
Message:

First implementation of fork/exec.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/tsar_mips32/core/hal_uspace.c

    r315 r407  
    4545    hal_disable_irq( &save_sr );
    4646
     47
    4748        for( i = 0 ; i < wsize ; i++ )          // transfer one word per iteration
    4849        {
     
    129130}  // end hal_copy_to_uspace()
    130131
    131 //////////////////////////////////////////
    132 error_t hal_strcpy_from_uspace( char     * k_dst,
    133                                 char     * u_src,
    134                                 uint32_t   max_size )
    135 
    136 {
    137 
    138 // TODO implement the max_size handling, and error handling
    139 
    140     uint32_t save_sr;
     132//////////////////////////////////////////////
     133void hal_strcpy_from_uspace( char     * k_dst,
     134                             char     * u_src,
     135                             uint32_t   size )
     136{
     137    uint32_t save_sr;
     138
    141139    uint32_t src = (uint32_t)u_src;
    142140    uint32_t dst = (uint32_t)k_dst;
    143     uint32_t length;
    144     error_t error;
    145     paddr_t paddr;
    146 
    147     // XXX XXX XXX: must be converted, to handle faults
    148     error = vmm_v2p_translate( false , u_src , &paddr );
    149     if( error )
    150     {
    151         return EFAULT;
    152     }
    153 
    154     length = hal_strlen_from_uspace( u_src );
    155     if( length >= max_size )
    156     {
    157         return EFAULT;
    158     }
    159 
    160     hal_disable_irq( &save_sr );
    161 
    162     // loop on characters while non NUL
     141
     142    hal_disable_irq( &save_sr );
     143
     144    // loop on characters while ( (character != NUL) and (count < size )
    163145    asm volatile(
    164         "mfc2   $15,   $1           \n"   /* save current MMU_MODE          */
    165         "1:                         \n"   /* loop entry                     */
    166         "ori    $14,   $0,  0x7     \n" 
    167         "mtc2   $14,   $1                       \n"   /* MMU_MODE <= DTLB ON            */
    168         "lb         $13,   0(%0)        \n"   /* read char from user space      */
    169         "mtc2   $15,   $1                       \n"   /* restore MMU_MODE               */
    170             "sb     $13,   0(%1)        \n"   /* store char to kernel space     */
    171         "addi   %0,    %0,  1       \n"   /* increment SRC pointer          */
    172         "addi   %1,    %1,  1       \n"   /* increment DST pointer          */
    173         "bne    $13,   $0,  1b      \n"   /* test NUL                       */
     146        ".set noreorder             \n"
     147        "move   $11,   %0           \n"   /* $11 <= count == size           */
     148        "move   $12,   %1           \n"   /* $12 <= u_src                   */
     149        "move   $13,   %2           \n"   /* $13 <= k_dst                   */
     150        "mfc2   $15,   $1           \n"   /* $15 <= MMU_MODE                */
     151        "ori    $14,   $15,  0x7    \n"   /* $14 <= mode DTLB on            */
     152        "1:                         \n"
     153        "mtc2   $14,   $1                       \n"   /* MMU_MODE <= DTLB ON            */
     154        "lb     $10,   0($12)       \n"   /* read char from user space      */
     155        "mtc2   $15,   $1                       \n"   /* restore MMU_MODE               */
     156            "sb     $10,   0($13)       \n"   /* store char to kernel space     */
     157        "beq    $13,   $0,   2f     \n"   /* exit if char = 0               */
     158        "addi   $11,   $11, -1      \n"   /* decrement count                */
     159        "addi   $12,   $12,  1      \n"   /* increment u_src pointer        */
     160        "beq    $11,   $0,   2f     \n"   /* exit if count == 0             */
     161        "addi   $13,   $13,  1      \n"   /* increment k_src pointer        */
     162        "j                   1b     \n"   /* jump to next iteration         */
     163        "2:                         \n"
    174164        "nop                        \n"
    175         : : "r"( src ) , "r"( dst ) : "$13","$14","$15", "memory" );
    176 
    177     hal_restore_irq( save_sr );
    178 
    179     return 0;
     165        ".set reorder               \n"
     166        :
     167        : "r"(size),"r"(src),"r"(dst)
     168        : "$10","$11","$12","$13","$14","$15" );
     169       
     170    hal_restore_irq( save_sr );
     171
    180172} // hal_strcpy_from_uspace()
    181173
    182174////////////////////////////////////////////
    183 error_t hal_strcpy_to_uspace( char     * u_dst,
    184                               char     * k_src,
    185                               uint32_t   max_size )
    186 {
    187 
    188 // TODO implement the max_size handling, and error handling
    189 
    190     uint32_t save_sr;
     175void hal_strcpy_to_uspace( char     * u_dst,
     176                           char     * k_src,
     177                           uint32_t   size )
     178{
     179    uint32_t save_sr;
     180
    191181    uint32_t src = (uint32_t)k_src;
    192182    uint32_t dst = (uint32_t)u_dst;
     
    194184    hal_disable_irq( &save_sr );
    195185
    196     // loop on characters while non NUL
     186    // loop on characters while ( (character != NUL) and (count < size) )
    197187    asm volatile(
    198         "mfc2   $15,   $1           \n"   /* save current MMU_MODE          */
    199         "1:                         \n"   /* loop entry                     */
    200         "lb         $13,   0(%0)        \n"   /* read char from kernel space    */
    201         "ori    $14,   $0,  0x7     \n" 
    202         "mtc2   $14,   $1                       \n"   /* MMU_MODE <= DTLB ON            */
    203             "sb     $13,   0(%1)        \n"   /* store char to user space       */
    204         "mtc2   $15,   $1                       \n"   /* restore MMU_MODE               */
    205         "addi   %0,    %0,  1       \n"   /* increment SRC pointer          */
    206         "addi   %1,    %1,  1       \n"   /* increment DST pointer          */
    207         "bne    $13,   $0,  1b      \n"   /* test NUL                       */
     188        ".set noreorder             \n"
     189        "move   $11,   %0           \n"   /* $11 <= count == size           */
     190        "move   $12,   %1           \n"   /* $12 <= k_src                   */
     191        "move   $13,   %2           \n"   /* $13 <= u_dst                   */
     192        "mfc2   $15,   $1           \n"   /* $15 <= MMU_MODE                */
     193        "ori    $14,   $15,  0x7    \n"   /* $14 <= mode DTLB on            */
     194        "1:                         \n"
     195        "lb     $10,   0($12)       \n"   /* read char from kernel space    */
     196        "mtc2   $14,   $1                       \n"   /* MMU_MODE <= DTLB ON            */
     197            "sb     $10,   0($13)       \n"   /* store char to user space       */
     198        "mtc2   $15,   $1                       \n"   /* restore MMU_MODE               */
     199        "beq    $13,   $0,   2f     \n"   /* exit if char == 0              */
     200        "addi   $11,   $11, -1      \n"   /* decrement count                */
     201        "addi   $12,   $12,  1      \n"   /* increment k_src pointer        */
     202        "beq    $11,   $0,   2f     \n"   /* exit if count == size          */
     203        "addi   $13,   $13,  1      \n"   /* increment u_src pointer        */
     204        "j                   1b     \n"   /* jump to next iteration         */
     205        "2:                         \n"
    208206        "nop                        \n"
    209         : : "r"( src ) , "r"( dst ) : "$13","$14","$15", "memory" );
    210 
    211     hal_restore_irq( save_sr );
    212 
    213     return 0;
     207        ".set reorder               \n"
     208        :
     209        : "r"(size),"r"(src),"r"(dst)
     210        : "$10","$11","$12","$13","$14","$15" );
     211       
     212    hal_restore_irq( save_sr );
     213
    214214} // hal_strcpy_to_uspace()
    215215
     
    218218{
    219219    uint32_t save_sr;
    220     uint32_t str      = (uint32_t)u_str;
    221     uint32_t count    = 0;
     220    uint32_t count = 0;
     221
     222    uint32_t str = (uint32_t)u_str;
    222223
    223224    hal_disable_irq( &save_sr );
    224225
    225226        asm volatile(
    226         "ori    $15,   %0,   0      \n"   /* $15 <= count                   */
     227        ".set noreorder             \n"
    227228        "ori    $13,   %1,   0      \n"   /* $13 <= str                     */
    228    
    229         "mfc2   $15,   $1           \n"   /* save   MMU_MODE                */
    230         "ori    $14,   $0,   0x7    \n"   /* $14 <= mode DTLB on            */
    231         "mtc2   $14,   $1                       \n"   /* MMU_MODE <= DTLB ON            */
    232 
     229        "mfc2   $15,   $1           \n"   /* $15 <= MMU_MODE                */
     230        "ori    $14,   $15,  0x7    \n"   /* $14 <= mode DTLB on            */
     231        "mtc2   $14,   $1                       \n"   /* MMU_MODE <= DTLB ON            */
    233232        "1:                         \n"
    234         "lb         $13,   0(%0)        \n"   /* read char from kernel space    */
     233        "lb         $12,   0($13)       \n"   /* read char from user space      */
    235234        "addi   $13,   $13,  1      \n"   /* increment address              */
    236         "bne    $13,   $0,   1b     \n"   /* loop until NUL found           */
    237         "addi   $15,   $15,  1      \n"   /* increment counter              */
    238 
    239         "mtc2   $14,   $1                       \n"   /* restore MMU_MODE               */
    240         : "+r"(count) : "r"(str) : "$13","$14","$15" );
     235        "bne    $12,   $0,   1b     \n"   /* loop until NUL found           */
     236        "addi   %0,    %0,   1      \n"   /* increment count                */
     237        "mtc2   $15,   $1                       \n"   /* restore MMU_MODE               */
     238        ".set reorder               \n"
     239        : "+r"(count)
     240        : "r"(str)
     241        : "$12","$13","$14","$15" );
    241242
    242243    hal_restore_irq( save_sr );
Note: See TracChangeset for help on using the changeset viewer.