Changeset 407 for trunk/kernel/syscalls/sys_read.c
- Timestamp:
- Nov 7, 2017, 3:08:12 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/syscalls/sys_read.c
r313 r407 33 33 #include <process.h> 34 34 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 38 extern uint32_t enter_sys_read; 39 extern uint32_t enter_devfs_move; 40 extern uint32_t enter_txt_read; 41 extern uint32_t enter_chdev_cmd; 42 extern uint32_t enter_chdev_server; 43 extern uint32_t enter_tty_cmd; 44 extern uint32_t enter_tty_isr; 45 extern uint32_t exit_tty_isr; 46 extern uint32_t exit_tty_cmd; 47 extern uint32_t exit_chdev_server; 48 extern uint32_t exit_chdev_cmd; 49 extern uint32_t exit_txt_read; 50 extern uint32_t exit_devfs_move; 51 extern uint32_t exit_sys_read; 52 36 53 37 54 ///////////////////////////////// 38 55 int sys_read( uint32_t file_id, 39 void * buf,56 void * vaddr, 40 57 uint32_t count ) 41 58 { … … 43 60 paddr_t paddr; // required for user space checking 44 61 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 70 enter_sys_read = tm_start; 71 #endif 45 72 46 73 thread_t * this = CURRENT_THREAD; … … 51 78 { 52 79 printk("\n[ERROR] in %s : illegal file descriptor index = %d\n", 53 80 __FUNCTION__ , file_id ); 54 81 this->errno = EBADFD; 55 82 return -1; … … 57 84 58 85 // check user buffer in user space 59 error = vmm_v2p_translate( false , buf, &paddr );86 error = vmm_v2p_translate( false , vaddr , &paddr ); 60 87 61 88 if ( error ) 62 89 { 63 90 printk("\n[ERROR] in %s : user buffer unmapped = %x\n", 64 __FUNCTION__ , (intptr_t)buf);91 __FUNCTION__ , (intptr_t)vaddr ); 65 92 this->errno = EINVAL; 66 93 return -1; … … 72 99 if( file_xp == XPTR_NULL ) 73 100 { 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 ); 76 103 this->errno = EBADFD; 77 104 return -1; … … 86 113 if( (attr & FD_ATTR_READ_ENABLE) == 0 ) 87 114 { 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 ); 90 117 this->errno = EBADFD; 91 118 return -1; 92 119 } 93 120 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 ) ); 99 123 100 if( error ) 124 // action depend on file type 125 if( type == INODE_TYPE_FILE ) // transfer count bytes from file mapper 101 126 { 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 ); 104 149 this->errno = error; 105 150 return -1; … … 108 153 hal_fence(); 109 154 110 return 0; 155 tm_end = hal_get_cycles(); 156 157 #if CONFIG_READ_DEBUG 158 exit_sys_read = tm_end; 159 160 printk("\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) , 176 enter_sys_read , 0 , 177 enter_devfs_move , enter_devfs_move - enter_sys_read , 178 enter_txt_read , enter_txt_read - enter_devfs_move , 179 enter_chdev_cmd , enter_chdev_cmd - enter_txt_read , 180 enter_chdev_server , enter_chdev_server - enter_chdev_cmd , 181 enter_tty_cmd , enter_tty_cmd - enter_chdev_server , 182 enter_tty_isr , enter_tty_isr - enter_tty_cmd , 183 exit_tty_isr , exit_tty_isr - enter_tty_isr , 184 exit_tty_cmd , exit_tty_cmd - exit_tty_isr , 185 exit_chdev_server , exit_chdev_server - exit_tty_cmd , 186 exit_chdev_cmd , exit_chdev_cmd - exit_chdev_server , 187 exit_txt_read , exit_txt_read - exit_chdev_cmd , 188 exit_devfs_move , exit_devfs_move - exit_txt_read , 189 exit_sys_read , exit_sys_read - exit_devfs_move ); 190 #endif 191 192 syscall_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; 111 198 112 199 } // end sys_read()
Note: See TracChangeset
for help on using the changeset viewer.