Changeset 317 for trunk/kernel/vfs/vfs.c


Ignore:
Timestamp:
Aug 4, 2017, 2:03:44 PM (7 years ago)
Author:
alain
Message:

1) Introduce the TSAR hal_cpu_context_switch() function.
2) Introduce the generic vfs_kernel_move() function.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/vfs/vfs.c

    r315 r317  
    662662}  // end vfs_open()
    663663
    664 //////////////////////////////////////////
     664////////////////////////////////////////////
    665665error_t vfs_user_move( bool_t   to_buffer,
    666666                       xptr_t   file_xp,
     
    722722}  // end vfs_user_move()
    723723
     724////////////////////////////////////////////
     725error_t vfs_kernel_move( bool_t   to_buffer,
     726                         xptr_t   file_xp,
     727                         xptr_t   buffer_xp,
     728                         uint32_t size )
     729{
     730    assert( ( file_xp != XPTR_NULL ) , __FUNCTION__ , "file_xp == XPTR_NULL" );
     731
     732    cxy_t              file_cxy;     // remote file descriptor cluster
     733    vfs_file_t       * file_ptr;     // remote file descriptor local pointer
     734    vfs_inode_type_t   inode_type;
     735    uint32_t           file_offset;  // current offset in file
     736    mapper_t         * mapper;
     737    error_t            error;
     738
     739    // get cluster and local pointer on remote file descriptor
     740    file_cxy  = GET_CXY( file_xp );
     741    file_ptr  = (vfs_file_t *)GET_PTR( file_xp );
     742
     743    // get inode type from remote file descriptor
     744    inode_type = hal_remote_lw( XPTR( file_cxy , &file_ptr->type   ) );
     745   
     746    // action depends on inode type
     747    if( inode_type == INODE_TYPE_FILE )
     748    {
     749        // get mapper pointer and file offset from file descriptor
     750        file_offset = hal_remote_lw( XPTR( file_cxy , &file_ptr->offset ) );
     751        mapper = (mapper_t *)hal_remote_lpt( XPTR( file_cxy , &file_ptr->mapper ) );
     752
     753        // move data between mapper and buffer
     754        if( file_cxy == local_cxy )
     755        {
     756            error = mapper_move_kernel( mapper,
     757                                        to_buffer,
     758                                        file_offset,
     759                                        buffer_xp,
     760                                        size );
     761        }
     762        else
     763        {
     764            rpc_mapper_move_buffer_client( file_cxy,
     765                                           mapper,
     766                                           to_buffer,
     767                                           false,          // kernel buffer
     768                                           file_offset,
     769                                           buffer_xp,
     770                                           size,
     771                                           &error );
     772        }
     773
     774        if( error ) return -1;
     775        else        return 0;
     776    }
     777    else
     778    {
     779        printk("\n[ERROR] in %s : inode is not a file", __FUNCTION__ );
     780        return -1;
     781    }
     782}  // end vfs_kernel_move()
     783
    724784//////////////////////////////////////
    725785error_t vfs_lseek( xptr_t     file_xp,
Note: See TracChangeset for help on using the changeset viewer.