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

First implementation of fork/exec.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/syscalls/sys_read.c

    r313 r407  
    3333#include <process.h>
    3434
    35 /* TODO: user page(s) need to be locked  [AG] */
     35// TODO: concurrent user page(s) munmap need to be handled [AG]
     36
     37// instrumentation
     38extern uint32_t enter_sys_read;
     39extern uint32_t enter_devfs_move;
     40extern uint32_t enter_txt_read;
     41extern uint32_t enter_chdev_cmd;
     42extern uint32_t enter_chdev_server;
     43extern uint32_t enter_tty_cmd;
     44extern uint32_t enter_tty_isr;
     45extern uint32_t exit_tty_isr;
     46extern uint32_t exit_tty_cmd;
     47extern uint32_t exit_chdev_server;
     48extern uint32_t exit_chdev_cmd;
     49extern uint32_t exit_txt_read;
     50extern uint32_t exit_devfs_move;
     51extern uint32_t exit_sys_read;
     52
    3653
    3754/////////////////////////////////
    3855int sys_read( uint32_t   file_id,
    39               void     * buf,
     56              void     * vaddr,
    4057              uint32_t   count )
    4158{
     
    4360    paddr_t      paddr;       // required for user space checking
    4461        xptr_t       file_xp;     // remote file extended pointer
     62    uint32_t     nbytes;      // number of bytes actually read
     63
     64        uint32_t     tm_start;
     65        uint32_t     tm_end;
     66
     67        tm_start = hal_get_cycles();
     68
     69#if CONFIG_READ_START
     70enter_sys_read = tm_start;
     71#endif
    4572
    4673        thread_t  *  this    = CURRENT_THREAD;
     
    5178        {
    5279        printk("\n[ERROR] in %s : illegal file descriptor index = %d\n",
    53                __FUNCTION__ , file_id );
     80        __FUNCTION__ , file_id );
    5481                this->errno = EBADFD;
    5582                return -1;
     
    5784
    5885    // check user buffer in user space
    59     error = vmm_v2p_translate( false , buf , &paddr );
     86    error = vmm_v2p_translate( false , vaddr , &paddr );
    6087
    6188    if ( error )
    6289    {
    6390        printk("\n[ERROR] in %s : user buffer unmapped = %x\n",
    64                __FUNCTION__ , (intptr_t)buf );
     91        __FUNCTION__ , (intptr_t)vaddr );
    6592                this->errno = EINVAL;
    6693                return -1;
     
    7299    if( file_xp == XPTR_NULL )
    73100    {
    74         printk("\n[ERROR] in %s : undefined file descriptor index = %d\n",
    75                __FUNCTION__ , file_id );
     101        printk("\n[ERROR] in %s : undefined file descriptor index = %d in process %x\n",
     102        __FUNCTION__ , file_id , process->pid );
    76103        this->errno = EBADFD;
    77104        return -1;
     
    86113    if( (attr & FD_ATTR_READ_ENABLE) == 0 )
    87114        {
    88         printk("\n[ERROR] in %s : file %d not readable\n",
    89                __FUNCTION__ , file_id );
     115        printk("\n[ERROR] in %s : file %d not readable in process %x\n",
     116        __FUNCTION__ , file_id , process->pid );
    90117                this->errno = EBADFD;
    91118                return -1;
    92119        }
    93120   
    94     // transfer count bytes directly from mapper to user buffer
    95     error = vfs_user_move( true,               // to_buffer
    96                            file_xp ,
    97                            buf,
    98                            count );
     121    // get file type
     122    vfs_inode_type_t type = hal_remote_lw( XPTR( file_cxy , &file_ptr->type ) );
    99123
    100     if( error )
     124    // action depend on file type
     125    if( type == INODE_TYPE_FILE )      // transfer count bytes from file mapper
    101126    {
    102         printk("\n[ERROR] in %s cannot read data from file %d\n",
    103                __FUNCTION__ , file_id );
     127        nbytes = vfs_user_move( true,               // from mapper to buffer
     128                                file_xp,
     129                                vaddr,
     130                                count );
     131    }
     132    else if( type == INODE_TYPE_DEV )  // transfer count bytes from device
     133    {
     134        nbytes = devfs_user_move( true,             // from device to buffer
     135                                  file_xp,
     136                                  vaddr,
     137                                  count );
     138    }
     139    else
     140    {
     141        nbytes = 0;
     142        panic("file type %d non supported yet", type );
     143    }
     144
     145    if( nbytes != count )
     146    {
     147        printk("\n[ERROR] in %s cannot read data from file %d in process %x\n",
     148        __FUNCTION__ , file_id , process->pid );
    104149        this->errno = error;
    105150        return -1;
     
    108153    hal_fence();
    109154
    110         return 0;
     155    tm_end = hal_get_cycles();
     156
     157#if CONFIG_READ_DEBUG
     158exit_sys_read = tm_end;
     159
     160printk("\n@@@@@@@@@@@@ timing ro read character %c\n"
     161" - enter_sys_read     = %d / delta %d\n"
     162" - enter_devfs_move   = %d / delta %d\n"
     163" - enter_txt_read     = %d / delta %d\n"
     164" - enter_chdev_cmd    = %d / delta %d\n"
     165" - enter_chdev_server = %d / delta %d\n"
     166" - enter_tty_cmd      = %d / delta %d\n"
     167" - enter_tty_isr      = %d / delta %d\n"
     168" - exit_tty_isr       = %d / delta %d\n"
     169" - exit_tty_cmd       = %d / delta %d\n"
     170" - exit_chdev_server  = %d / delta %d\n"
     171" - exit_chdev_cmd     = %d / delta %d\n"
     172" - exit_txt_read      = %d / delta %d\n"
     173" - exit_devfs_move    = %d / delta %d\n"
     174" - exit_sys_read      = %d / delta %d\n",
     175*((char *)(intptr_t)paddr) ,
     176enter_sys_read     , 0 ,
     177enter_devfs_move   , enter_devfs_move   - enter_sys_read     ,
     178enter_txt_read     , enter_txt_read     - enter_devfs_move   ,
     179enter_chdev_cmd    , enter_chdev_cmd    - enter_txt_read     ,
     180enter_chdev_server , enter_chdev_server - enter_chdev_cmd    ,
     181enter_tty_cmd      , enter_tty_cmd      - enter_chdev_server ,
     182enter_tty_isr      , enter_tty_isr      - enter_tty_cmd      ,
     183exit_tty_isr       , exit_tty_isr       - enter_tty_isr      ,
     184exit_tty_cmd       , exit_tty_cmd       - exit_tty_isr       ,
     185exit_chdev_server  , exit_chdev_server  - exit_tty_cmd       ,
     186exit_chdev_cmd     , exit_chdev_cmd     - exit_chdev_server  ,
     187exit_txt_read      , exit_txt_read      - exit_chdev_cmd     ,
     188exit_devfs_move    , exit_devfs_move    - exit_txt_read      ,
     189exit_sys_read      , exit_sys_read      - exit_devfs_move    );
     190#endif
     191
     192syscall_dmsg("\n[DBG] %s : core[%x,%d] / thread %x / nbytes = %d / cycle %d\n"
     193" first byte = %c / file_id = %d / cost = %d\n",
     194__FUNCTION__ , local_cxy , this->core->lid , this->trdid , nbytes , tm_start ,
     195*((char *)(intptr_t)paddr) , file_id , tm_end - tm_start );
     196 
     197        return nbytes;
    111198
    112199}  // end sys_read()
Note: See TracChangeset for help on using the changeset viewer.