Ignore:
Timestamp:
Aug 2, 2017, 3:24:57 PM (6 years ago)
Author:
alain
Message:

RSeveral modifs in the page-fault handling.

File:
1 edited

Legend:

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

    r265 r313  
    4040{
    4141    error_t      error;
    42     paddr_t      paddr;
    43     char         kbuf[CONFIG_VFS_KBUF_SIZE];
    44         xptr_t       file_xp;                       // remote file extended pointer
    45     uint32_t     nbytes;                        // number of bytes in one iteration
     42    paddr_t      paddr;                // required for user space checking
     43        xptr_t       file_xp;              // remote file extended pointer
    4644
    4745        thread_t   * this = CURRENT_THREAD;
     
    9290        }
    9391   
    94     // transfer at most CONFIG_VFS_KBUF_SIZE bytes per iteration
    95     while( count )
     92    // transfer count bytes directly from user buffer to mapper
     93    error = vfs_user_move( false,               // from buffer
     94                           file_xp,
     95                           kbuf ,
     96                           nbytes );
     97
     98    if( error )
    9699    {
    97         if( count <= CONFIG_VFS_KBUF_SIZE )
    98         {
    99             nbytes = count;
    100             count  = 0;
    101         }
    102         else
    103         {
    104             nbytes = CONFIG_VFS_KBUF_SIZE;
    105             count  = count - CONFIG_VFS_KBUF_SIZE;
    106         }
    107 
    108         // copy user buffer to kernel buffer
    109         hal_copy_to_uspace( buf , kbuf , nbytes );
    110 
    111         // transfer nbytes from kernel buffer
    112         error = vfs_move( false,               // from buffer
    113                           true,                // is_user
    114                           file_xp,
    115                           kbuf ,
    116                           nbytes );
    117 
    118         if( error )
    119         {
    120             printk("\n[ERROR] in %s cannot read data from file %d\n",
    121                    __FUNCTION__ , file_id );
    122             this->errno = error;
    123             return -1;
    124         }
     100        printk("\n[ERROR] in %s cannot read data from file %d\n",
     101               __FUNCTION__ , file_id );
     102        this->errno = error;
     103        return -1;
    125104    }
    126105
Note: See TracChangeset for help on using the changeset viewer.