Changeset 657 for trunk/kernel/syscalls/sys_fbf.c
- Timestamp:
- Mar 18, 2020, 11:16:59 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/syscalls/sys_fbf.c
r647 r657 2 2 * sys_fbf.c - Acces the frame buffer peripheral. 3 3 * 4 * Authors Alain Greiner (2016,2017,2018,2019 )4 * Authors Alain Greiner (2016,2017,2018,2019,2020) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 33 33 #include <syscalls.h> 34 34 35 //////////////////////// //////////36 int sys_fbf( uint32_t operation,37 void * arg0,38 void * arg1,39 void * arg2)35 //////////////////////// 36 int sys_fbf( reg_t arg0, 37 reg_t arg1, 38 reg_t arg2, 39 reg_t arg3 ) 40 40 { 41 41 vseg_t * vseg; // for vaddr check 42 42 error_t error; 43 43 44 #if (DEBUG_SYS_FBF || CONFIG_INSTRUMENTATION_SYSCALLS) 45 uint64_t tm_start = hal_get_cycles(); 46 #endif 47 44 48 thread_t * this = CURRENT_THREAD; 45 49 process_t * process = this->process; 46 50 47 #if (DEBUG_SYS_FBF || CONFIG_INSTRUMENTATION_SYSCALLS) 48 uint64_t tm_start = hal_get_cycles(); 49 #endif 51 // for some operations, the MSB of arg0 can contain the wid 52 uint32_t operation = arg0 & 0xFFFF; 50 53 51 54 #if DEBUG_SYS_FBF 52 55 if( DEBUG_SYS_FBF < tm_start ) 53 printk("\n[%s] thread[%x,%x] enter for %s / cycle %d\n", 54 __FUNCTION__, process->pid, this->trdid, dev_fbf_cmd_str( operation ), (uint32_t)tm_start ); 56 printk("\n[%s] thread[%x,%x] enter for %s / arg1 %x / arg2 %x / arg3 %x / cycle %d\n", 57 __FUNCTION__, process->pid, this->trdid, dev_fbf_cmd_str( operation ), 58 arg1, arg2, arg3, (uint32_t)tm_start ); 55 59 #endif 56 60 … … 65 69 uint32_t type; 66 70 67 // check arg0 (width) in user vspace 68 error = vmm_get_vseg( process , (intptr_t)arg0 , &vseg ); 69 if( error ) 70 { 71 72 #if DEBUG_SYSCALLS_ERROR 73 printk("\n[ERROR] in %s : unmapped arg0 %x for %s / thread[%x,%x]\n", 74 __FUNCTION__ , arg0, dev_fbf_cmd_str(operation), process->pid, this->trdid ); 75 #endif 76 this->errno = EINVAL; 77 return -1; 78 } 79 80 // check arg1 (height) in user vspace 71 // check "width" in user vspace 81 72 error = vmm_get_vseg( process , (intptr_t)arg1 , &vseg ); 82 73 if( error ) … … 88 79 #endif 89 80 this->errno = EINVAL; 90 return -1; 91 } 92 93 // check arg2 (type) in user vspace 94 error = vmm_get_vseg( process , (intptr_t)arg2 , &vseg ); 81 } 82 83 // check "height" in user vspace 84 error |= vmm_get_vseg( process , (intptr_t)arg2 , &vseg ); 95 85 if( error ) 96 86 { … … 101 91 #endif 102 92 this->errno = EINVAL; 103 return -1; 93 } 94 95 // check "type" in user vspace 96 error |= vmm_get_vseg( process , (intptr_t)arg3 , &vseg ); 97 if( error ) 98 { 99 100 #if DEBUG_SYSCALLS_ERROR 101 printk("\n[ERROR] in %s : unmapped arg3 %x for %s / thread[%x,%x]\n", 102 __FUNCTION__ , arg3, dev_fbf_cmd_str(operation), process->pid, this->trdid ); 103 #endif 104 this->errno = EINVAL; 104 105 } 105 106 … … 107 108 dev_fbf_get_config( &width , &height , &type ); 108 109 109 // transfer to user space 110 hal_copy_to_uspace( arg0 , XPTR( local_cxy , &width ) , sizeof(uint32_t) ); 111 hal_copy_to_uspace( arg1 , XPTR( local_cxy , &height ) , sizeof(uint32_t) ); 112 hal_copy_to_uspace( arg2 , XPTR( local_cxy , &type ) , sizeof(uint32_t) ); 113 114 break; 115 } 116 ////////////// 117 case FBF_READ: 118 case FBF_WRITE: 119 { 120 // check arg0 (buffer) in user space 121 error = vmm_get_vseg( process , (intptr_t)arg0 , &vseg ); 122 if( error ) 123 { 124 125 #if DEBUG_SYSCALLS_ERROR 126 printk("\n[ERROR] in %s : unmapped arg0 %x for %s / thread[%x,%x]\n", 127 __FUNCTION__ , arg0, dev_fbf_cmd_str(operation), process->pid, this->trdid ); 128 #endif 129 this->errno = EINVAL; 130 return -1; 131 } 132 133 // get length and offset values 134 135 uint32_t length = (uint32_t)(intptr_t)arg1; 136 uint32_t offset = (uint32_t)(intptr_t)arg2; 110 // transfer to user space if no error 111 if( error == 0 ) 112 { 113 hal_copy_to_uspace( (void*)arg1, XPTR(local_cxy , &width ), sizeof(uint32_t) ); 114 hal_copy_to_uspace( (void*)arg2, XPTR(local_cxy , &height), sizeof(uint32_t) ); 115 hal_copy_to_uspace( (void*)arg3, XPTR(local_cxy , &type ), sizeof(uint32_t) ); 116 } 117 break; 118 } 119 ///////////////////// 120 case FBF_DIRECT_READ: 121 case FBF_DIRECT_WRITE: 122 { 123 void * buffer = (void *)arg1; 124 uint32_t npixels = arg2; 125 uint32_t offset = arg3; 126 bool_t is_write = (operation == FBF_DIRECT_WRITE); 127 128 // check buffer in user space 129 error = vmm_get_vseg( process , (intptr_t)buffer , &vseg ); 130 if( error ) 131 { 132 133 #if DEBUG_SYSCALLS_ERROR 134 printk("\n[ERROR] in %s : unmapped buffer %x for %s / thread[%x,%x]\n", 135 __FUNCTION__ , buffer, dev_fbf_cmd_str(operation), process->pid, this->trdid ); 136 #endif 137 this->errno = EINVAL; 138 } 139 else 140 { 141 // call relevant kernel function 142 error |= dev_fbf_move_data( is_write, buffer, npixels, offset ); 143 144 if( error ) 145 { 146 147 #if DEBUG_SYSCALLS_ERROR 148 printk("\n[ERROR] in %s : cannot move data for %s / buffer %x / thread[%x,%x]\n", 149 __FUNCTION__ , dev_fbf_cmd_str(operation), buffer, process->pid, this->trdid ); 150 #endif 151 this->errno = EINVAL; 152 } 153 } 154 break; 155 } 156 /////////////////////// 157 case FBF_CREATE_WINDOW: 158 { 159 uint32_t l_zero = arg1 >> 16; 160 uint32_t p_zero = arg1 & 0xFFFF; 161 uint32_t nlines = arg2 >> 16; 162 uint32_t npixels = arg2 & 0xFFFF; 163 164 // check buffer in user space 165 error = vmm_get_vseg( process , (intptr_t)arg3 , &vseg ); 166 if( error ) 167 { 168 169 #if DEBUG_SYSCALLS_ERROR 170 printk("\n[ERROR] in %s : unmapped user buffer %x for %s / thread[%x,%x]\n", 171 __FUNCTION__ , (intptr_t)arg3, dev_fbf_cmd_str(operation), process->pid, this->trdid ); 172 #endif 173 this->errno = EINVAL; 174 } 175 else 176 { 177 // allocated buffer base address 178 intptr_t user_buffer; 179 180 // call relevant kernel function 181 error = dev_fbf_create_window( nlines, 182 npixels, 183 l_zero, 184 p_zero, 185 &user_buffer ); 186 if( error == -1 ) 187 { 188 189 #if DEBUG_SYSCALLS_ERROR 190 printk("\n[ERROR] in %s : cannot create window for %s / thread[%x,%x]\n", 191 __FUNCTION__ , dev_fbf_cmd_str(operation), process->pid, this->trdid ); 192 #endif 193 this->errno = EINVAL; 194 } 195 196 // copy vseg base address to user space buffer 197 hal_copy_to_uspace( (void *)arg3, 198 XPTR( local_cxy , &user_buffer ), 199 sizeof(intptr_t) ); 200 hal_fence(); 201 } 202 break; 203 } 204 /////////////////////// 205 case FBF_DELETE_WINDOW: 206 { 207 uint32_t wid = arg1; 208 209 // call relevant kernel function 210 error = dev_fbf_delete_window( wid ); 211 212 if( error ) 213 { 214 215 #if DEBUG_SYSCALLS_ERROR 216 printk("\n[ERROR] in %s : cannot delete window for %s / thread[%x,%x]\n", 217 __FUNCTION__ , dev_fbf_cmd_str(operation), process->pid, this->trdid ); 218 #endif 219 this->errno = EINVAL; 220 } 221 break; 222 } 223 //////////////////////// 224 case FBF_REFRESH_WINDOW: 225 { 226 uint32_t wid = arg1; 227 uint32_t line_first = arg2; 228 uint32_t line_last = arg3; 229 230 // call relevant kernel function 231 error = dev_fbf_refresh_window( wid, 232 line_first, 233 line_last ); 234 235 if( error ) 236 { 237 238 #if DEBUG_SYSCALLS_ERROR 239 printk("\n[ERROR] in %s : cannot refresh window for %s / thread[%x,%x]\n", 240 __FUNCTION__ , dev_fbf_cmd_str(operation), process->pid, this->trdid ); 241 #endif 242 this->errno = EINVAL; 243 } 244 break; 245 } 246 ///////////////////// 247 case FBF_MOVE_WINDOW: 248 { 249 uint32_t wid = arg1; 250 uint32_t l_zero = arg2; 251 uint32_t p_zero = arg3; 137 252 138 253 // call relevant kernel function to move data 139 error = dev_fbf_move_ data( operation , arg0 , length , offset);254 error = dev_fbf_move_window( wid, l_zero, p_zero ); 140 255 141 256 if( error ) … … 143 258 144 259 #if DEBUG_SYSCALLS_ERROR 145 printk("\n[ERROR] in %s : cannot move data for %s / buffer %x / thread[%x,%x]\n", 146 __FUNCTION__ , dev_fbf_cmd_str(operation), arg0, process->pid, this->trdid ); 147 #endif 148 this->errno = EINVAL; 149 return -1; 150 } 151 260 printk("\n[ERROR] in %s : cannot move window / thread[%x,%x]\n", 261 __FUNCTION__ , dev_fbf_cmd_str(operation), process->pid, this->trdid ); 262 #endif 263 this->errno = EINVAL; 264 } 265 break; 266 } 267 /////////////////////// 268 case FBF_RESIZE_WINDOW: 269 { 270 uint32_t wid = arg1; 271 uint32_t width = arg2; 272 uint32_t height = arg3; 273 274 // call relevant kernel function to move data 275 error = dev_fbf_resize_window( wid , width , height ); 276 277 if( error ) 278 { 279 280 #if DEBUG_SYSCALLS_ERROR 281 printk("\n[ERROR] in %s : cannot move window / thread[%x,%x]\n", 282 __FUNCTION__ , dev_fbf_cmd_str(operation), process->pid, this->trdid ); 283 #endif 284 this->errno = EINVAL; 285 } 152 286 break; 153 287 } … … 161 295 #endif 162 296 this->errno = EINVAL; 163 return -1; 164 } 297 error = -1; 298 } 299 break; 165 300 } // end switch on operation 166 301 … … 173 308 #if DEBUG_SYS_FBF 174 309 if( DEBUG_SYS_FBF < tm_end ) 175 printk("\n[%s] thread[%x,%x] exit for %s / cost = %d / cycle %d\n", 176 __FUNCTION__, process->pid, this->trdid, dev_fbf_cmd_str( operation ), 177 (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 310 printk("\n[%s] thread[%x,%x] exit for %s / cycle %d\n", 311 __FUNCTION__, process->pid, this->trdid, dev_fbf_cmd_str( operation ), (uint32_t)tm_end ); 178 312 #endif 179 313 … … 183 317 #endif 184 318 185 return 0;319 return error; 186 320 187 321 } // end sys_fbf()
Note: See TracChangeset
for help on using the changeset viewer.