Changeset 435 for trunk/kernel
- Timestamp:
- Feb 20, 2018, 5:32:17 PM (7 years ago)
- Location:
- trunk/kernel
- Files:
-
- 30 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/devices/dev_txt.c
r433 r435 38 38 extern chdev_directory_t chdev_dir; // allocated in kernel_init.c 39 39 40 #if CONFIG_READ_DEBUG40 #if (CONFIG_DEBUG_SYS_READ & 1) 41 41 extern uint32_t enter_txt_read; 42 42 extern uint32_t exit_txt_read; 43 43 #endif 44 45 #if (CONFIG_DEBUG_SYS_WRITE & 1) 46 extern uint32_t enter_txt_write; 47 extern uint32_t exit_txt_write; 48 #endif 49 50 //////////////////////////////////////// 51 char * dev_txt_type_str( uint32_t type ) 52 { 53 if ( type == TXT_SYNC_WRITE ) return "TXT_SYNC_WRITE"; 54 else if( type == TXT_READ ) return "TXT_READ"; 55 else if( type == TXT_WRITE ) return "TXT_WRITE"; 56 else return "undefined"; 57 } 44 58 45 59 ////////////////////////////////// … … 117 131 thread_t * this = CURRENT_THREAD; 118 132 133 #if (CONFIG_DEBUG_SYS_READ & 1) 134 enter_txt_read = hal_time_stamp(); 135 #endif 136 137 #if (CONFIG_DEBUG_SYS_WRITE & 1) 138 enter_txt_write = hal_time_stamp(); 139 #endif 140 119 141 #if CONFIG_DEBUG_DEV_TXT 120 142 uint32_t cycle = (uint32_t)hal_get_cycles(); … … 151 173 #endif 152 174 175 #if (CONFIG_DEBUG_SYS_READ & 1) 176 exit_txt_read = hal_time_stamp(); 177 #endif 178 179 #if (CONFIG_DEBUG_SYS_WRITE & 1) 180 exit_txt_write = hal_time_stamp(); 181 #endif 182 153 183 // return I/O operation status from calling thread descriptor 154 184 return this->txt_cmd.error; … … 160 190 uint32_t count ) 161 191 { 162 error_t error = dev_txt_access( TXT_WRITE , channel , buffer , count ); 163 return error; 192 return dev_txt_access( TXT_WRITE , channel , buffer , count ); 164 193 } 165 194 … … 168 197 char * buffer ) 169 198 { 170 171 #if CONFIG_READ_DEBUG 172 enter_txt_read = hal_time_stamp(); 173 #endif 174 175 error_t error = dev_txt_access( TXT_READ , channel , buffer , 1 ); 176 177 #if CONFIG_READ_DEBUG 178 exit_txt_read = hal_time_stamp(); 179 #endif 180 181 return error; 182 199 return dev_txt_access( TXT_READ , channel , buffer , 1 ); 183 200 } 184 201 … … 201 218 202 219 // build arguments structure 203 txt_ aux_t args;220 txt_sync_args_t args; 204 221 args.dev_xp = dev_xp; 205 222 args.buffer = buffer; -
trunk/kernel/devices/dev_txt.h
r422 r435 82 82 TXT_READ = 0, 83 83 TXT_WRITE = 1, 84 TXT_SYNC_WRITE = 2, 84 85 }; 85 86 … … 87 88 { 88 89 xptr_t dev_xp; /*! extended pointer on the relevant TXT device descriptor */ 89 uint32_t type; /*! TXT_READ / TXT_WRITE / TXT_SYNC_WRITE*/90 uint32_t type; /*! TXT_READ / TXT_WRITE */ 90 91 xptr_t buf_xp; /*! extended pointer on characters array */ 91 92 uint32_t count; /*! number of characters in buffer (must be 1 if to_mem) */ … … 99 100 *****************************************************************************************/ 100 101 101 typedef struct txt_ aux_s102 typedef struct txt_sync_args_s 102 103 { 103 xptr_t dev_xp; /*! extended pointer on the TXT0 device descriptor */104 xptr_t dev_xp; /*! extended pointer on the TXT0_TX device descriptor */ 104 105 char * buffer; /*! local pointer on characters array */ 105 106 uint32_t count; /*! number of characters in buffer */ 106 107 } 107 txt_aux_t; 108 txt_sync_args_t; 109 110 /****************************************************************************************** 111 * This function returns a printable string for the comman type. 112 ****************************************************************************************** 113 * @ type : command type (TXT_READ / TXT_WRITE / TXT_SYNC_WRITE) 114 *****************************************************************************************/ 115 char * dev_txt_type_str( uint32_t type ); 108 116 109 117 /****************************************************************************************** … … 157 165 * As it is used for debug, the command arguments <buffer> and <count> are registerd 158 166 * in a specific "dbg_cmd" field of the calling thread. 159 * other TXT accesses.160 167 **************************************************************************************** 161 168 * @ buffer : local pointer on source buffer containing the string. -
trunk/kernel/fs/devfs.c
r433 r435 42 42 extern chdev_directory_t chdev_dir; // allocated in kernel_init.c 43 43 44 #if CONFIG_READ_DEBUG 45 extern uint32_t enter_devfs_move; 46 extern uint32_t exit_devfs_move; 44 #if (CONFIG_DEBUG_SYS_READ & 1) 45 extern uint32_t enter_devfs_read; 46 extern uint32_t exit_devfs_read; 47 #endif 48 49 #if (CONFIG_DEBUG_SYS_WRITE & 1) 50 extern uint32_t enter_devfs_write; 51 extern uint32_t exit_devfs_write; 47 52 #endif 48 53 … … 375 380 char k_buf[CONFIG_TXT_KBUF_SIZE]; // local kernel buffer 376 381 382 #if (CONFIG_DEBUG_SYS_READ & 1) 383 enter_devfs_read = hal_time_stamp(); 384 #endif 385 386 #if (CONFIG_DEBUG_SYS_WRITE & 1) 387 enter_devfs_write = hal_time_stamp(); 388 #endif 389 377 390 #if CONFIG_DEBUG_DEVFS_MOVE 378 391 uint32_t cycle = (uint32_t)hal_get_cycles(); … … 380 393 printk("\n[DBG] %s : thread %x enter / to_mem %d / cycle %d\n", 381 394 __FUNCTION__ , CURRENT_THREAD , to_buffer , cycle ); 382 #endif383 384 #if CONFIG_READ_DEBUG385 enter_devfs_move = hal_time_stamp();386 395 #endif 387 396 … … 424 433 #endif 425 434 426 #if CONFIG_READ_DEBUG427 exit_devfs_ move= hal_time_stamp();435 #if (CONFIG_DEBUG_SYS_READ & 1) 436 exit_devfs_read = hal_time_stamp(); 428 437 #endif 429 438 return size; … … 448 457 #endif 449 458 459 #if (CONFIG_DEBUG_SYS_WRITE & 1) 460 exit_devfs_write = hal_time_stamp(); 461 #endif 450 462 return size; 451 463 } -
trunk/kernel/fs/fatfs.c
r407 r435 262 262 "no FAT access required for first page\n"); 263 263 264 fatfs_dmsg("\n[DBG] %s : core[%x,%d] enters / first_cluster_id = %d / searched_index = %d\n", 265 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, first_cluster_id, searched_page_index ); 264 #if CONFIG_DEBUG_FATFS_GET_CLUSTER 265 uint32_t cycle = (uint32_t)hal_get_cycles(); 266 if( CONFIG_DEBUG_FATFS_GET_CLUSTER < cycle ) 267 printk("\n[DBG] %s : thread %x enter / first_cluster_id %d / searched_index / cycle %d\n", 268 __FUNCTION__, CURRENT_THREAD, first_cluster_id, searched_page_index, cycle ); 269 #endif 266 270 267 271 // get number of FAT slots per page … … 289 293 next_cluster_id = current_page_buffer[current_page_offset]; 290 294 291 fatfs_dmsg("\n[DBG] %s : core[%x,%d] traverse FAT / current_page_index = %d\n" 295 #if (CONFIG_DEBUG_FATFS_GET_CLUSTER & 1) 296 if( CONFIG_DEBUG_FATFS_GET_CLUSTER < cycle ) 297 printk("\n[DBG] %s : traverse FAT / current_page_index = %d\n" 292 298 "current_page_offset = %d / next_cluster_id = %d\n", 293 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, current_page_index,294 current_page_offset , next_cluster_id ); 299 __FUNCTION__, current_page_index, current_page_offset , next_cluster_id ); 300 #endif 295 301 296 302 // update loop variables … … 302 308 if( next_cluster_id == 0xFFFFFFFF ) return EIO; 303 309 304 fatfs_dmsg("\n[DBG] %s : core[%x;%d] exit / cluster_id = %d\n", 305 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, next_cluster_id ); 310 #if CONFIG_DEBUG_FATFS_GET_CLUSTER 311 cycle = (uint32_t)hal_get_cycles(); 312 if( CONFIG_DEBUG_FATFS_GET_CLUSTER < cycle ) 313 printk("\n[DBG] %s : thread %x exit / searched_cluster_id = %d / cycle %d\n", 314 __FUNCTION__, CURRENT_THREAD, next_cluster_id / cycle ); 315 #endif 306 316 307 317 *searched_cluster_id = next_cluster_id; … … 335 345 uint8_t * buffer; 336 346 337 fatfs_dmsg("\n[DBG] %s : enter for fatfs_ctx = %x\n", 338 __FUNCTION__ , fatfs_ctx ); 347 #if CONFIG_DEBUG_FATFS_INIT 348 uint32_t cycle = (uint32_t)hal_get_cycles(); 349 if( CONFIG_DEBUG_FATFS_INIT < cycle ) 350 printk("\n[DBG] %s : thread %x enter for fatfs_ctx = %x / cycle %d\n", 351 __FUNCTION__ , CURRENT_THREAD , fatfs_ctx , cycle ); 352 #endif 339 353 340 354 assert( (fatfs_ctx != NULL) , __FUNCTION__ , 341 355 "cannot allocate memory for FATFS context\n" ); 342 356 343 357 // allocate a 512 bytes buffer to store the boot record … … 347 361 348 362 assert( (buffer != NULL) , __FUNCTION__ , 349 363 "cannot allocate memory for 512 bytes buffer\n" ); 350 364 351 fatfs_dmsg("\n[DBG] %s : allocated 512 bytes buffer\n", __FUNCTION__ );352 353 365 // load the boot record from device 354 366 // using a synchronous access to IOC device 355 367 error = dev_ioc_sync_read( buffer , 0 , 1 ); 356 368 357 fatfs_dmsg("\n[DBG] %s : buffer loaded\n", __FUNCTION__ ); 358 359 assert( (error == 0) , __FUNCTION__ , "cannot access boot record\n" ); 360 361 #if (CONFIG_FATFS_DEBUG & 0x1) 362 if( hal_time_stamp() > CONFIG_FATFS_DEBUG ) 369 assert( (error == 0) , __FUNCTION__ , 370 "cannot access boot record\n" ); 371 372 #if (CONFIG_DEBUG_FATFS_INIT & 0x1) 373 if( CONFIG_DEBUG_FATFS_INIT < cycle ) 363 374 { 364 375 uint32_t line; … … 389 400 390 401 assert( (nb_sectors == 8) , __FUNCTION__ , 391 402 "cluster size must be 8 sectors\n" ); 392 403 393 404 // check number of FAT copies from boot record … … 395 406 396 407 assert( (nb_fats == 1) , __FUNCTION__ , 397 408 "number of FAT copies must be 1\n" ); 398 409 399 410 // get & check number of sectors in FAT from boot record … … 401 412 402 413 assert( ((fat_sectors & 0xF) == 0) , __FUNCTION__ , 403 414 "FAT not multiple of 16 sectors\n"); 404 415 405 416 // get and check root cluster from boot record … … 407 418 408 419 assert( (root_cluster == 2) , __FUNCTION__ , 409 420 "root cluster index must be 2\n"); 410 421 411 422 // get FAT lba from boot record … … 417 428 kmem_free( &req ); 418 429 419 fatfs_dmsg("\n[DBG] %s : boot record read & released\n",420 __FUNCTION__ );421 422 430 // allocate a mapper for the FAT itself 423 431 mapper_t * fat_mapper = mapper_create( FS_TYPE_FATFS ); 424 432 425 assert( (fat_mapper != NULL) , __FUNCTION__ , "no memory for FAT mapper" ); 433 assert( (fat_mapper != NULL) , __FUNCTION__ , 434 "no memory for FAT mapper" ); 426 435 427 436 // WARNING : the inode field MUST be NULL for the FAT mapper … … 439 448 fatfs_ctx->fat_mapper_xp = XPTR( local_cxy , fat_mapper ); 440 449 441 fatfs_dmsg("\n[DBG] %s : exit for fatfs_ctx = %x\n", __FUNCTION__ , fatfs_ctx ); 450 #if CONFIG_DEBUG_FATFS_INIT 451 cycle = (uint32_t)hal_get_cycles(); 452 if( CONFIG_DEBUG_FATFS_INIT < cycle ) 453 printk("\n[DBG] %s : thread %x exit for fatfs_ctx = %x / cycle %d\n", 454 __FUNCTION__ , CURRENT_THREAD , fatfs_ctx , cycle ); 455 #endif 442 456 443 457 } // end fatfs_ctx_init() … … 472 486 inode = mapper->inode; 473 487 474 fatfs_dmsg("\n[DBG] %s : core[%x,%d] enter for page %d / inode %x / mapper %x\n", 475 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , index , inode , mapper ); 488 #if CONFIG_DEBUG_FATFS_MOVE 489 uint32_t cycle = (uint32_t)hal_get_cycles(); 490 if( CONFIG_DEBUG_FATFS_MOVE < cycle ) 491 printk("\n[DBG] %s : thread %x enter / page %d / inode %x / mapper %x / cycle %d\n", 492 __FUNCTION__ , CURRENT_THREAD , index , inode , mapper , cycle ); 493 #endif 476 494 477 495 // get page base address … … 489 507 lba = fatfs_ctx->fat_begin_lba + (count * index); 490 508 491 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access FAT on device / lba = %d\n", 492 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , lba ); 509 #if (CONFIG_DEBUG_FATFS_MOVE & 0x1) 510 if( CONFIG_DEBUG_FATFS_MOVE < cycle ) 511 printk("\n[DBG] %s : access FAT on device / lba = %d\n", __FUNCTION__ , lba ); 512 #endif 493 513 494 514 // access device … … 521 541 { 522 542 523 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access local FAT mapper\n" 543 #if (CONFIG_DEBUG_FATFS_MOVE & 0x1) 544 if( CONFIG_DEBUG_FATFS_MOVE < cycle ) 545 print("\n[DBG] %s : access local FAT mapper\n" 524 546 "fat_mapper_cxy = %x / fat_mapper_ptr = %x / first_cluster_id = %d / index = %d\n", 525 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , 526 fat_mapper_cxy , fat_mapper_ptr , first_cluster_id , index ); 527 547 __FUNCTION__ , fat_mapper_cxy , fat_mapper_ptr , first_cluster_id , index ); 548 #endif 528 549 error = fatfs_get_cluster( fat_mapper_ptr, 529 550 first_cluster_id, … … 534 555 { 535 556 536 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access remote FAT mapper\n" 557 #if (CONFIG_DEBUG_FATFS_MOVE & 0x1) 558 if( CONFIG_DEBUG_FATFS_MOVE < cycle ) 559 printk("\n[DBG] %s : access remote FAT mapper\n" 537 560 "fat_mapper_cxy = %x / fat_mapper_ptr = %x / first_cluster_id = %d / index = %d\n", 538 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , 539 fat_mapper_cxy , fat_mapper_ptr , first_cluster_id , index ); 540 561 __FUNCTION__ , fat_mapper_cxy , fat_mapper_ptr , first_cluster_id , index ); 562 #endif 541 563 rpc_fatfs_get_cluster_client( fat_mapper_cxy, 542 564 fat_mapper_ptr, … … 550 572 } 551 573 552 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access device for inode %x / cluster_id %d\n", 553 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , inode , searched_cluster_id ); 574 #if (CONFIG_DEBUG_FATFS_MOVE & 0x1) 575 if( CONFIG_DEBUG_FATFS_MOVE < cycle ) 576 printk("\n[DBG] %s : access device for inode %x / cluster_id %d\n", 577 __FUNCTION__ , inode , searched_cluster_id ); 578 #endif 554 579 555 580 // get lba from cluster_id … … 563 588 } 564 589 565 fatfs_dmsg("\n[DBG] %s : core[%x,%d] exit for page %d / inode %x / mapper %x\n", 566 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , index , inode , mapper ); 567 568 #if (CONFIG_FATFS_DEBUG & 0x1) 569 if( hal_time_stamp() > CONFIG_FATFS_DEBUG ) 590 #if CONFIG_DEBUG_FATFS_MOVE 591 cycle = (uint32_t)hal_get_cycles(); 592 if( CONFIG_DEBUG_FATFS_MOVE < cycle ) 593 printk("\n[DBG] %s : thread %x exit / page %d / inode %x / mapper %x / cycle %d\n", 594 __FUNCTION__ , CURRENT_THREAD , index , inode , mapper , cycle ); 595 #endif 596 597 #if (CONFIG_DEBUG_FATFS_MOVE & 0x1) 598 if( CONFIG_DEBUG_FATFS_MOVE < cycle ) 570 599 { 571 600 uint32_t * tab = (uint32_t *)buffer; … … 594 623 // - scan the directory entries in each 4 Kbytes page 595 624 596 fatfs_dmsg("\n[DBG] %s : enter for child <%s> in parent inode %l\n", 597 __FUNCTION__ , name , XPTR( local_cxy , parent_inode ) ); 625 #if CONFIG_DEBUG_FATFS_LOAD 626 uint32_t cycle = (uint32_t)hal_get_cycles(); 627 if( CONFIG_DEBUG_FATFS_LOAD < cycle ) 628 printk("\n[DBG] %s : thread %x enter for child <%s> in parent inode %x / cycle %d\n", 629 __FUNCTION__ , CURRENT_THREAD , name , parent_inode , cycle ); 630 #endif 598 631 599 632 mapper_t * mapper = parent_inode->mapper; … … 632 665 base = (uint8_t *)GET_PTR( base_xp ); 633 666 634 #if (CONFIG_ FATFS_DEBUG& 0x1)635 if( hal_time_stamp() > CONFIG_FATFS_DEBUG)667 #if (CONFIG_DEBUG_FATFS_LOAD & 0x1) 668 if( CONFIG_DEBUG_FATFS_LOAD < cycle ) 636 669 { 637 670 uint32_t * buf = (uint32_t *)base; … … 716 749 { 717 750 718 fatfs_dmsg("\n[DBG] %s : exit / child <%s> not found in parent inode %l\n", 719 __FUNCTION__ , name , XPTR( local_cxy , parent_inode ) ); 751 #if CONFIG_DEBUG_FATFS_LOAD 752 cycle = (uint32_t)hal_get_cycles(); 753 if( CONFIG_DEBUG_FATFS_LOAD < cycle ) 754 printk("\n[DBG] %s : thread %x exit / child <%s> not found / cycle %d\n", 755 __FUNCTION__ , CURRENT_THREAD, name, cycle ); 756 #endif 720 757 721 758 return ENOENT; … … 734 771 hal_remote_sw( XPTR( child_cxy , &child_ptr->extend ) , cluster ); 735 772 736 fatfs_dmsg("\n[DBG] %s : exit / child <%s> found in parent inode %l\n", 737 __FUNCTION__ , name , XPTR( local_cxy , parent_inode ) ); 773 #if CONFIG_DEBUG_FATFS_LOAD 774 cycle = (uint32_t)hal_get_cycles(); 775 if( CONFIG_DEBUG_FATFS_LOAD < cycle ) 776 printk("\n[DBG] %s : thread %x exit / child <%s> loaded / cycle %d\n", 777 __FUNCTION__ , CURRENT_THREAD, name, cycle ); 778 #endif 738 779 739 780 return 0; -
trunk/kernel/kern/chdev.c
r433 r435 39 39 extern chdev_directory_t chdev_dir; // allocated in kernel_init.c 40 40 41 #if CONFIG_READ_DEBUG 42 extern uint32_t enter_chdev_cmd; 43 extern uint32_t exit_chdev_cmd; 44 extern uint32_t enter_chdev_server; 45 extern uint32_t exit_chdev_server; 41 #if (CONFIG_DEBUG_SYS_READ & 1) 42 extern uint32_t enter_chdev_cmd_read; 43 extern uint32_t exit_chdev_cmd_read; 44 extern uint32_t enter_chdev_server_read; 45 extern uint32_t exit_chdev_server_read; 46 #endif 47 48 #if (CONFIG_DEBUG_SYS_WRITE & 1) 49 extern uint32_t enter_chdev_cmd_write; 50 extern uint32_t exit_chdev_cmd_write; 51 extern uint32_t enter_chdev_server_write; 52 extern uint32_t exit_chdev_server_write; 46 53 #endif 47 54 … … 123 130 uint32_t save_sr; // for critical section 124 131 125 #if CONFIG_READ_DEBUG 126 enter_chdev_cmd = hal_time_stamp(); 132 #if (CONFIG_DEBUG_SYS_READ & 1) 133 enter_chdev_cmd_read = (uint32_t)hal_get_cycles(); 134 #endif 135 136 #if (CONFIG_DEBUG_SYS_WRITE & 1) 137 enter_chdev_cmd_write = (uint32_t)hal_get_cycles(); 127 138 #endif 128 139 … … 178 189 if( different ) dev_pic_send_ipi( chdev_cxy , lid ); 179 190 191 // deschedule 192 assert( thread_can_yield( this ) , __FUNCTION__ , "illegal sched_yield\n" ); 193 sched_yield("blocked on I/O"); 194 195 // exit critical section 196 hal_restore_irq( save_sr ); 197 180 198 #if CONFIG_DEBUG_CHDEV_REGISTER_COMMAND 181 199 cycle = (uint32_t)hal_get_cycles(); … … 185 203 #endif 186 204 187 // deschedule 188 assert( thread_can_yield( this ) , __FUNCTION__ , "illegal sched_yield\n" ); 189 sched_yield("blocked on I/O"); 190 191 // exit critical section 192 hal_restore_irq( save_sr ); 193 194 #if CONFIG_DEBUG_CHDEV_REGISTER_COMMAND 195 cycle = (uint32_t)hal_get_cycles(); 196 if( CONFIG_DEBUG_CHDEV_REGISTER_COMMAND < cycle ) 197 printk("\n[DBG] %s : client_thread %x (%s) resumes / cycle %d\n", 198 __FUNCTION__, this, thread_type_str(this->type) , cycle ); 199 #endif 200 201 #if CONFIG_READ_DEBUG 202 exit_chdev_cmd = hal_time_stamp(); 205 #if (CONFIG_DEBUG_SYS_READ & 1) 206 exit_chdev_cmd_read = (uint32_t)hal_get_cycles(); 207 #endif 208 209 #if (CONFIG_DEBUG_SYS_WRITE & 1) 210 exit_chdev_cmd_write = (uint32_t)hal_get_cycles(); 203 211 #endif 204 212 … … 240 248 remote_spinlock_unlock( lock_xp ); 241 249 242 chdev_dmsg("\n[DBG] %s : thread %x deschedule /cycle %d\n",243 __FUNCTION__ , server , hal_time_stamp() );244 245 250 // deschedule 246 251 sched_yield("I/O queue empty"); 247 248 chdev_dmsg("\n[DBG] %s : thread %x resume /cycle %d\n",249 __FUNCTION__ , server , hal_time_stamp() );250 251 252 } 252 253 else // waiting queue not empty 253 254 { 254 255 255 #if CONFIG_READ_DEBUG 256 enter_chdev_server = hal_time_stamp(); 257 #endif 256 #if (CONFIG_DEBUG_SYS_READ & 1) 257 enter_chdev_server_read = (uint32_t)hal_get_cycles(); 258 #endif 259 260 #if (CONFIG_DEBUG_SYS_WRITE & 1) 261 enter_chdev_server_write = (uint32_t)hal_get_cycles(); 262 #endif 263 258 264 // release lock 259 265 remote_spinlock_unlock( lock_xp ); … … 284 290 #endif 285 291 286 #if CONFIG_READ_DEBUG 287 exit_chdev_server = hal_time_stamp(); 292 #if (CONFIG_DEBUG_SYS_READ & 1) 293 exit_chdev_server_read = (uint32_t)hal_get_cycles(); 294 #endif 295 296 #if (CONFIG_DEBUG_SYS_WRITE & 1) 297 exit_chdev_server_write = (uint32_t)hal_get_cycles(); 288 298 #endif 289 299 -
trunk/kernel/kern/kernel_init.c
r428 r435 123 123 124 124 125 // TODO remove these debug variables used dans sys_read()125 // these debug variables are used to analyse the sys_read() syscall timing 126 126 127 127 #if CONFIG_READ_DEBUG … … 129 129 uint32_t exit_sys_read; 130 130 131 uint32_t enter_devfs_ move;132 uint32_t exit_devfs_ move;131 uint32_t enter_devfs_read; 132 uint32_t exit_devfs_read; 133 133 134 134 uint32_t enter_txt_read; 135 135 uint32_t exit_txt_read; 136 136 137 uint32_t enter_chdev_cmd; 138 uint32_t exit_chdev_cmd; 139 140 uint32_t enter_chdev_server; 141 uint32_t exit_chdev_server; 142 143 uint32_t enter_tty_cmd; 144 uint32_t exit_tty_cmd; 145 146 uint32_t enter_tty_isr; 147 uint32_t exit_tty_isr; 137 uint32_t enter_chdev_cmd_read; 138 uint32_t exit_chdev_cmd_read; 139 140 uint32_t enter_chdev_server_read; 141 uint32_t exit_chdev_server_read; 142 143 uint32_t enter_tty_cmd_read; 144 uint32_t exit_tty_cmd_read; 145 146 uint32_t enter_tty_isr_read; 147 uint32_t exit_tty_isr_read; 148 #endif 149 150 // these debug variables are used to analyse the sys_write() syscall timing 151 152 #if CONFIG_WRITE_DEBUG 153 uint32_t enter_sys_write; 154 uint32_t exit_sys_write; 155 156 uint32_t enter_devfs_write; 157 uint32_t exit_devfs_write; 158 159 uint32_t enter_txt_write; 160 uint32_t exit_txt_write; 161 162 uint32_t enter_chdev_cmd_write; 163 uint32_t exit_chdev_cmd_write; 164 165 uint32_t enter_chdev_server_write; 166 uint32_t exit_chdev_server_write; 167 168 uint32_t enter_tty_cmd_write; 169 uint32_t exit_tty_cmd_write; 170 171 uint32_t enter_tty_isr_write; 172 uint32_t exit_tty_isr_write; 148 173 #endif 149 174 -
trunk/kernel/kern/process.c
r433 r435 51 51 #include <elf.h> 52 52 #include <syscalls.h> 53 #include <s ignal.h>53 #include <shared_syscalls.h> 54 54 55 55 ////////////////////////////////////////////////////////////////////////////////////////// … … 114 114 // get model process cluster and local pointer 115 115 model_cxy = GET_CXY( model_xp ); 116 model_ptr = (process_t *)GET_PTR( model_xp );116 model_ptr = GET_PTR( model_xp ); 117 117 118 118 // get parent process cluster and local pointer 119 119 parent_cxy = GET_CXY( parent_xp ); 120 parent_ptr = (process_t *)GET_PTR( parent_xp );120 parent_ptr = GET_PTR( parent_xp ); 121 121 122 122 // get model_pid and parent_pid … … 209 209 // get cluster and local pointer on chdev 210 210 chdev_cxy = GET_CXY( chdev_xp ); 211 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp );211 chdev_ptr = GET_PTR( chdev_xp ); 212 212 213 213 // get TXT terminal index … … 289 289 // get reference process cluster and local pointer 290 290 cxy_t ref_cxy = GET_CXY( reference_process_xp ); 291 process_t * ref_ptr = (process_t *)GET_PTR( reference_process_xp );291 process_t * ref_ptr = GET_PTR( reference_process_xp ); 292 292 293 293 // initialize PID, REF_XP, PARENT_XP, and STATE … … 364 364 process_t * parent_ptr; 365 365 cxy_t parent_cxy; 366 xptr_t parent_thread_xp;367 366 xptr_t children_lock_xp; 368 367 xptr_t copies_lock_xp; … … 450 449 } 451 450 452 //////////////////////////////////////// ////453 void process_sigaction( p rocess_t * process,451 //////////////////////////////////////// 452 void process_sigaction( pid_t pid, 454 453 uint32_t action_type ) 455 454 { … … 467 466 rpc_desc_t rpc; // rpc descriptor allocated in stack 468 467 468 thread_t * client = CURRENT_THREAD; 469 469 470 #if CONFIG_DEBUG_PROCESS_SIGACTION 470 471 uint32_t cycle = (uint32_t)hal_get_cycles(); 471 472 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 472 printk("\n[DBG] %s : thread %x enter to %s process %x in cluster %x / cycle %d\n", 473 __FUNCTION__ , CURRENT_THREAD, process_action_str( action_type ) , 474 process->pid , local_cxy , cycle ); 475 #endif 476 477 thread_t * client = CURRENT_THREAD; 473 printk("\n[DBG] %s : thread %x enter to %s process %x / cycle %d\n", 474 __FUNCTION__ , client, process_action_str( action_type ) , pid , cycle ); 475 #endif 478 476 479 477 // get local pointer on local cluster manager … … 481 479 482 480 // get owner cluster identifier and process lpid 483 owner_cxy = CXY_FROM_PID( p rocess->pid );484 lpid = LPID_FROM_PID( p rocess->pid );485 486 // checkowner cluster487 assert( (owner_cxy == local_cxy) , __FUNCTION__ , "must be executed in owner cluster\n" );488 489 // get number of remote copies490 responses = cluster->pmgr.copies_nr[lpid] - 1; 481 owner_cxy = CXY_FROM_PID( pid ); 482 lpid = LPID_FROM_PID( pid ); 483 484 // get root of list of copies, lock, and number of copies from owner cluster 485 responses = hal_remote_lw ( XPTR( owner_cxy , &cluster->pmgr.copies_nr[lpid] ) ); 486 root_xp = hal_remote_lwd( XPTR( owner_cxy , &cluster->pmgr.copies_root[lpid] ) ); 487 lock_xp = hal_remote_lwd( XPTR( owner_cxy , &cluster->pmgr.copies_lock[lpid] ) ); 488 491 489 rsp_count = 0; 492 490 … … 502 500 rpc.thread = client; 503 501 504 // get extended pointers on copies root and lock505 root_xp = XPTR( local_cxy , &cluster->pmgr.copies_root[lpid] );506 lock_xp = XPTR( local_cxy , &cluster->pmgr.copies_lock[lpid] );507 508 502 // take the lock protecting the copies 509 503 remote_spinlock_lock( lock_xp ); … … 514 508 process_xp = XLIST_ELEMENT( iter_xp , process_t , copies_list ); 515 509 process_cxy = GET_CXY( process_xp ); 516 process_ptr = (process_t *)GET_PTR( process_xp ); 517 518 // send RPC to remote clusters 519 if( process_cxy != local_cxy ) 520 { 510 process_ptr = GET_PTR( process_xp ); 521 511 522 512 #if CONFIG_DEBUG_PROCESS_SIGACTION 523 513 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 524 printk("\n[DBG] %s : send RPC to remote cluster %x\n", __FUNCTION__ , process_cxy ); 525 #endif 526 527 rpc.args[0] = (uint64_t)action_type; 528 rpc.args[1] = (uint64_t)(intptr_t)process_ptr; 529 rpc_process_sigaction_client( process_cxy , &rpc ); 530 rsp_count++; 531 } 514 printk("\n[DBG] %s : send RPC to cluster %x\n", __FUNCTION__ , process_cxy ); 515 #endif 516 517 // check PID 518 assert( (hal_remote_lw( XPTR( process_cxy , &process_ptr->pid) ) == pid), 519 __FUNCTION__ , "unconsistent PID value\n" ); 520 521 rpc.args[0] = (uint64_t)action_type; 522 rpc.args[1] = (uint64_t)pid; 523 rpc_process_sigaction_client( process_cxy , &rpc ); 524 rsp_count++; 532 525 } 533 526 … … 540 533 rsp_count , responses ); 541 534 542 // block and deschedule to wait RPC responses if required 543 if( responses ) 544 { 545 thread_block( CURRENT_THREAD , THREAD_BLOCKED_RPC ); 546 sched_yield("BLOCKED on RPC_PROCESS_SIGACTION"); 547 } 548 549 #if CONFIG_DEBUG_PROCESS_SIGACTION 550 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 551 printk("\n[DBG] %s : make action in owner cluster %x\n", __FUNCTION__ , local_cxy ); 552 #endif 553 554 // call directly the relevant function in local owner cluster 555 if (action_type == DELETE_ALL_THREADS ) process_delete_threads ( process ); 556 else if (action_type == BLOCK_ALL_THREADS ) process_block_threads ( process ); 557 else if (action_type == UNBLOCK_ALL_THREADS ) process_unblock_threads( process ); 535 // block and deschedule to wait RPC responses 536 thread_block( CURRENT_THREAD , THREAD_BLOCKED_RPC ); 537 sched_yield("BLOCKED on RPC_PROCESS_SIGACTION"); 558 538 559 539 #if CONFIG_DEBUG_PROCESS_SIGACTION … … 561 541 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 562 542 printk("\n[DBG] %s : thread %x exit after %s process %x in cluster %x / cycle %d\n", 563 __FUNCTION__ , CURRENT_THREAD, process_action_str( action_type ) ,543 __FUNCTION__ , client, process_action_str( action_type ) , 564 544 process->pid , local_cxy , cycle ); 565 545 #endif … … 778 758 { 779 759 process_xp = XLIST_ELEMENT( iter , process_t , local_list ); 780 process_ptr = (process_t *)GET_PTR( process_xp );760 process_ptr = GET_PTR( process_xp ); 781 761 if( process_ptr->pid == pid ) 782 762 { … … 838 818 839 819 // get reference process cluster and local pointer 840 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp );820 process_t * ref_ptr = GET_PTR( ref_xp ); 841 821 cxy_t ref_cxy = GET_CXY( ref_xp ); 842 822 … … 858 838 // get reference process cluster and local pointer 859 839 xptr_t ref_xp = process->ref_xp; 860 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp );840 process_t * ref_ptr = GET_PTR( ref_xp ); 861 841 cxy_t ref_cxy = GET_CXY( ref_xp ); 862 842 … … 900 880 xptr_t ref_xp = process->ref_xp; 901 881 cxy_t ref_cxy = GET_CXY( ref_xp ); 902 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp );882 process_t * ref_ptr = GET_PTR( ref_xp ); 903 883 904 884 // access reference process descriptor … … 925 905 // get cluster and local pointer for src fd_array 926 906 cxy_t src_cxy = GET_CXY( src_xp ); 927 fd_array_t * src_ptr = (fd_array_t *)GET_PTR( src_xp );907 fd_array_t * src_ptr = GET_PTR( src_xp ); 928 908 929 909 // get cluster and local pointer for dst fd_array 930 910 cxy_t dst_cxy = GET_CXY( dst_xp ); 931 fd_array_t * dst_ptr = (fd_array_t *)GET_PTR( dst_xp );911 fd_array_t * dst_ptr = GET_PTR( dst_xp ); 932 912 933 913 // get the remote lock protecting the src fd_array … … 1044 1024 // get cluster and local pointer for parent process 1045 1025 cxy_t parent_process_cxy = GET_CXY( parent_process_xp ); 1046 process_t * parent_process_ptr = (process_t *)GET_PTR( parent_process_xp );1026 process_t * parent_process_ptr = GET_PTR( parent_process_xp ); 1047 1027 1048 1028 // get parent process PID and extended pointer on .elf file … … 1349 1329 } // end process_make_exec() 1350 1330 1351 ////////////////////////////////////////////1352 void process_make_kill( process_t * process,1353 bool_t is_exit,1354 uint32_t exit_status )1355 {1356 thread_t * this = CURRENT_THREAD;1357 1358 assert( (CXY_FROM_PID( process->pid ) == local_cxy) , __FUNCTION__ ,1359 "must be executed in process owner cluster\n" );1360 1361 assert( ( this->type == THREAD_RPC ) , __FUNCTION__ ,1362 "must be executed by an RPC thread\n" );1363 1364 #if CONFIG_DEBUG_PROCESS_MAKE_KILL1365 uint32_t cycle = (uint32_t)hal_get_cycles();1366 if( CONFIG_DEBUG_PROCESS_MAKE_KILL < cycle )1367 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n",1368 __FUNCTION__, this , process->pid , cycle );1369 #endif1370 1371 // register exit_status in owner process descriptor1372 if( is_exit ) process->term_state = exit_status;1373 1374 // atomically update owner process descriptor flags1375 if( is_exit ) hal_atomic_or( &process->term_state , PROCESS_FLAG_EXIT );1376 else hal_atomic_or( &process->term_state , PROCESS_FLAG_KILL );1377 1378 // remove TXT ownership from owner process descriptor1379 process_txt_reset_ownership( XPTR( local_cxy , process ) );1380 1381 // block all process threads in all clusters1382 process_sigaction( process , BLOCK_ALL_THREADS );1383 1384 // mark all process threads in all clusters for delete1385 process_sigaction( process , DELETE_ALL_THREADS );1386 1387 /* unused if sys_wait deschedules without blocking [AG]1388 1389 // get cluster and pointers on reference parent process1390 xptr_t parent_xp = process->parent_xp;1391 process_t * parent_ptr = GET_PTR( parent_xp );1392 cxy_t parent_cxy = GET_CXY( parent_xp );1393 1394 // get loal pointer on parent main thread1395 thread_t * main_ptr = hal_remote_lpt( XPTR( parent_cxy , &parent_ptr->th_tbl[0] ) );1396 1397 // reset THREAD_BLOCKED_WAIT bit in parent process main thread1398 thread_unblock( XPTR( parent_cxy , main_ptr ) , THREAD_BLOCKED_WAIT );1399 */1400 1401 #if CONFIG_DEBUG_PROCESS_MAKE_KILL1402 cycle = (uint32_t)hal_get_cycles();1403 if( CONFIG_DEBUG_PROCESS_MAKE_KILL < cycle )1404 printk("\n[DBG] %s : thread %x exit for process %x / cycle %d\n",1405 __FUNCTION__, this, process->pid , cycle );1406 #endif1407 1408 } // end process_make_kill()1409 1410 1331 /////////////////////////////////////////////// 1411 1332 void process_zero_create( process_t * process ) … … 1679 1600 if( CONFIG_DEBUG_PROCESS_TXT_ATTACH < cycle ) 1680 1601 printk("\n[DBG] %s : thread %x enter for process %x / txt_id = %d / cycle %d\n", 1681 __FUNCTION__, CURRENT_THREAD, process ->pid, txt_id, cycle );1602 __FUNCTION__, CURRENT_THREAD, process, txt_id, cycle ); 1682 1603 #endif 1683 1604 … … 1708 1629 if( CONFIG_DEBUG_PROCESS_TXT_ATTACH < cycle ) 1709 1630 printk("\n[DBG] %s : thread %x exit for process %x / txt_id = %d / cycle %d\n", 1710 __FUNCTION__, CURRENT_THREAD, process ->pid, txt_id , cycle );1631 __FUNCTION__, CURRENT_THREAD, process, txt_id , cycle ); 1711 1632 #endif 1712 1633 … … 1721 1642 xptr_t lock_xp; // extended pointer on list lock in chdev 1722 1643 1723 #if CONFIG_DEBUG_PROCESS_TXT_ DETACH1644 #if CONFIG_DEBUG_PROCESS_TXT_ATTACH 1724 1645 uint32_t cycle = (uint32_t)hal_get_cycles(); 1725 if( CONFIG_DEBUG_PROCESS_TXT_ DETACH < cycle )1646 if( CONFIG_DEBUG_PROCESS_TXT_ATTACH < cycle ) 1726 1647 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n", 1727 __FUNCTION__, CURRENT_THREAD, process ->pid, cycle );1648 __FUNCTION__, CURRENT_THREAD, process, cycle ); 1728 1649 #endif 1729 1650 … … 1745 1666 remote_spinlock_unlock( lock_xp ); 1746 1667 1747 #if CONFIG_DEBUG_PROCESS_TXT_ DETACH1748 cycle = (uint32_t)hal_get_cycles(); 1749 if( CONFIG_DEBUG_PROCESS_TXT_ DETACH < cycle )1668 #if CONFIG_DEBUG_PROCESS_TXT_ATTACH 1669 cycle = (uint32_t)hal_get_cycles(); 1670 if( CONFIG_DEBUG_PROCESS_TXT_ATTACH < cycle ) 1750 1671 printk("\n[DBG] %s : thread %x exit for process %x / cycle %d\n", 1751 __FUNCTION__, CURRENT_THREAD, process ->pid, cycle );1672 __FUNCTION__, CURRENT_THREAD, process, cycle ); 1752 1673 #endif 1753 1674 … … 1766 1687 // get cluster and local pointer on process 1767 1688 process_cxy = GET_CXY( process_xp ); 1768 process_ptr = (process_t *)GET_PTR( process_xp );1689 process_ptr = GET_PTR( process_xp ); 1769 1690 1770 1691 // get extended pointer on stdin pseudo file … … 1774 1695 txt_xp = chdev_from_file( file_xp ); 1775 1696 txt_cxy = GET_CXY( txt_xp ); 1776 txt_ptr = (chdev_t *)GET_PTR( txt_xp );1697 txt_ptr = GET_PTR( txt_xp ); 1777 1698 1778 1699 // set owner field in TXT chdev … … 1804 1725 // get cluster and local pointer on process 1805 1726 process_cxy = GET_CXY( process_xp ); 1806 process_ptr = (process_t *)GET_PTR( process_xp );1727 process_ptr = GET_PTR( process_xp ); 1807 1728 1808 1729 // get extended pointer on stdin pseudo file … … 1831 1752 current_ptr = GET_PTR( current_xp ); 1832 1753 parent_xp = hal_remote_lwd( XPTR( current_cxy , ¤t_ptr->parent_xp ) ); 1833 1834 1754 parent_cxy = GET_CXY( parent_xp ); 1835 1755 parent_ptr = GET_PTR( parent_xp ); 1836 1756 ppid = hal_remote_lw( XPTR( parent_cxy , &parent_ptr->pid ) ); 1757 1758 printk("\n@@@ %s : pid = %x / process = %x\n", __FUNCTION__ , current_ptr->pid, current_ptr ); 1837 1759 1838 1760 if( ppid == 1 ) // current is KSH … … 1849 1771 1850 1772 1851 1773 ////////////////////////////////////////////////////// 1774 inline pid_t process_get_txt_owner( uint32_t channel ) 1775 { 1776 xptr_t txt_rx_xp = chdev_dir.txt_rx[channel]; 1777 cxy_t txt_rx_cxy = GET_CXY( txt_rx_xp ); 1778 chdev_t * txt_rx_ptr = GET_PTR( txt_rx_xp ); 1779 1780 xptr_t process_xp = (xptr_t)hal_remote_lwd( XPTR( txt_rx_cxy, 1781 &txt_rx_ptr->ext.txt.owner_xp ) ); 1782 1783 cxy_t process_cxy = GET_CXY( process_xp ); 1784 process_t * process_ptr = GET_PTR( process_xp ); 1785 1786 return (pid_t)hal_remote_lw( XPTR( process_cxy , &process_ptr->pid ) ); 1787 } 1788 1789 /////////////////////////////////////////// 1790 void process_txt_display( uint32_t txt_id ) 1791 { 1792 xptr_t chdev_xp; 1793 cxy_t chdev_cxy; 1794 chdev_t * chdev_ptr; 1795 xptr_t root_xp; 1796 xptr_t lock_xp; 1797 xptr_t current_xp; 1798 xptr_t iter_xp; 1799 1800 // check terminal index 1801 assert( (txt_id < LOCAL_CLUSTER->nb_txt_channels) , 1802 __FUNCTION__ , "illegal TXT terminal index" ); 1803 1804 // get pointers on TXT_RX[txt_id] chdev 1805 chdev_xp = chdev_dir.txt_rx[txt_id]; 1806 chdev_cxy = GET_CXY( chdev_xp ); 1807 chdev_ptr = GET_PTR( chdev_xp ); 1808 1809 // get extended pointer on root & lock of attached process list 1810 root_xp = XPTR( chdev_cxy , &chdev_ptr->ext.txt.root ); 1811 lock_xp = XPTR( chdev_cxy , &chdev_ptr->ext.txt.lock ); 1812 1813 // display header 1814 printk("\n***** processes attached to TXT_%d\n", txt_id ); 1815 1816 // get lock 1817 remote_spinlock_lock( lock_xp ); 1818 1819 // scan attached process list to find KSH process 1820 XLIST_FOREACH( root_xp , iter_xp ) 1821 { 1822 current_xp = XLIST_ELEMENT( iter_xp , process_t , txt_list ); 1823 process_display( current_xp ); 1824 } 1825 1826 // release lock 1827 remote_spinlock_unlock( lock_xp ); 1828 1829 } // end process_txt_display -
trunk/kernel/kern/process.h
r433 r435 36 36 #include <hal_atomic.h> 37 37 #include <vmm.h> 38 #include <signal.h>39 38 #include <cluster.h> 40 39 #include <vfs.h> … … 63 62 DELETE_ALL_THREADS = 33, 64 63 }; 65 66 /*********************************************************************************************67 * The termination state is a 32 bits word:68 * - the 8 LSB bits contain the user defined exit status69 * - the 24 other bits contain the flags defined below70 ********************************************************************************************/71 72 #define PROCESS_FLAG_BLOCK 0x100 /*! process received as SIGSTOP signal */73 #define PROCESS_FLAG_KILL 0x200 /*! process terminated by a sys_kill() */74 #define PROCESS_FLAG_EXIT 0x400 /*! process terminated by a sys_exit() */75 #define PROCESS_FLAG_WAIT 0x800 /*! parent process executed successfully a sys_wait() */76 64 77 65 /********************************************************************************************* … … 291 279 292 280 /********************************************************************************************* 293 * This function allows a client thread running in the owner cluster of a process identified294 * by the <process> argument to block, unblock or delete all threads of the target process,295 * depending on the<action_type> argument. The scenario is the following:281 * This function allows a client thread running in any cluster to block, unblock or delete 282 * all threads of a process identified by the <pid> argument, depending on the 283 * <action_type> argument. The scenario is the following: 296 284 * - It uses the multicast, non blocking rpc_process_sigaction_client() function to send 297 285 * parallel requests to all remote clusters containing a process copy. Then it blocks … … 305 293 * It is used by the sys_kill() & sys_exit() functions to handle the "kill" & "exit" syscalls. 306 294 * It is also used by the process_make_exec() function to handle the "exec" syscall. 307 * WARNING : the DELETE and the BLOCK actions are NOT executed on the client thread. 308 ********************************************************************************************* 309 * @ process : pointer on the process descriptor in owner cluster. 295 * It is also called by the TXT device to execute the ctrl C & ctrl Z commands. 296 * WARNING : the DELETE action is NOT executed on the main thread (thread 0 in owner cluster). 297 ********************************************************************************************* 298 * @ pid : target process identifier. 310 299 * @ action_type : BLOCK_ALL_THREADS / UNBLOCK_ALL_THREADS / DELETE_ALL_THREADS 311 300 ********************************************************************************************/ 312 void process_sigaction( p rocess_t * process,301 void process_sigaction( pid_t pid, 313 302 uint32_t action_type ); 314 303 … … 403 392 struct thread_s ** child_thread_ptr ); 404 393 405 /*********************************************************************************************406 * This function is called by both the sys_kill() and sys_exit() system calls.407 * It must be executed by an RPC thread running in the target process owner cluster.408 * It uses twice the process_sigaction() function:409 * - first, to block all target process threads, in all clusters.410 * - second, to delete all target process threads in all clusters.411 * Finally, it synchronizes with the parent process sys_wait() function that MUST be called412 * by the parent process main thread.413 *********************************************************************************************414 * @ process : pointer on process descriptor in owner cluster.415 * @ is_exit : true when called by sys_exit() / false when called by sys_kill().416 * @ exit_status : exit status, when called by sys_exit().417 ********************************************************************************************/418 void process_make_kill( process_t * process,419 bool_t is_exit,420 uint32_t exit_status );421 422 394 423 395 /******************** File Management Operations ****************************************/ … … 573 545 void process_txt_reset_ownership( xptr_t process_xp ); 574 546 547 /********************************************************************************************* 548 * This function returns the terminal owner process (foreground process) 549 * for a given TXT terminal identified by its <channel> index. 550 ********************************************************************************************* 551 * @ channel : TXT terminal channel. 552 * @ return owner process identifier. 553 ********************************************************************************************/ 554 pid_t process_get_txt_owner( uint32_t channel ); 555 556 /********************************************************************************************* 557 * This debug function diplays on the kernel terminal the list of processes attached 558 * to a given terminal identified by the <txt_id> argument. 559 ********************************************************************************************* 560 * @ txt_id : TXT terminal channel. 561 ********************************************************************************************/ 562 void process_txt_display( uint32_t txt_id ); 563 564 575 565 #endif /* _PROCESS_H_ */ -
trunk/kernel/kern/rpc.c
r433 r435 39 39 #include <vfs.h> 40 40 #include <fatfs.h> 41 #include <signal.h>42 41 #include <rpc.h> 43 42 … … 80 79 &rpc_process_make_fork_server, // 3 81 80 &rpc_undefined, // 4 unused slot 82 &rpc_ process_make_kill_server, // 581 &rpc_undefined, // 5 unused slot 83 82 &rpc_thread_user_create_server, // 6 84 83 &rpc_thread_kernel_create_server, // 7 … … 610 609 611 610 ///////////////////////////////////////////////////////////////////////////////////////// 612 // [5] Marshaling functions attached to RPC_PROCESS_MAKE_KILL (blocking) 613 ///////////////////////////////////////////////////////////////////////////////////////// 614 615 /////////////////////////////////////////////////// 616 void rpc_process_make_kill_client( cxy_t cxy, 617 process_t * process, 618 bool_t is_exit, 619 uint32_t status ) 620 { 621 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 622 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 623 CURRENT_THREAD->core->lid , hal_time_stamp() ); 624 625 // initialise RPC descriptor header 626 rpc_desc_t rpc; 627 rpc.index = RPC_PROCESS_MAKE_KILL; 628 rpc.response = 1; 629 rpc.blocking = true; 630 631 // set input arguments in RPC descriptor 632 rpc.args[0] = (uint64_t)(intptr_t)process; 633 rpc.args[1] = (uint64_t)is_exit; 634 rpc.args[2] = (uint64_t)status; 635 636 // register RPC request in remote RPC fifo (blocking function) 637 rpc_send( cxy , &rpc ); 638 639 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 640 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 641 CURRENT_THREAD->core->lid , hal_time_stamp() ); 642 } 643 644 ////////////////////////////////////////////// 645 void rpc_process_make_kill_server( xptr_t xp ) 646 { 647 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 648 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 649 CURRENT_THREAD->core->lid , hal_time_stamp() ); 650 651 process_t * process; 652 bool_t is_exit; 653 uint32_t status; 654 655 // get client cluster identifier and pointer on RPC descriptor 656 cxy_t client_cxy = (cxy_t)GET_CXY( xp ); 657 rpc_desc_t * desc = (rpc_desc_t *)GET_PTR( xp ); 658 659 // get arguments from RPC descriptor 660 process = (process_t *)(intptr_t)hal_remote_lwd( XPTR( client_cxy , &desc->args[0] ) ); 661 is_exit = (bool_t) hal_remote_lwd( XPTR( client_cxy , &desc->args[1] ) ); 662 status = (uint32_t) hal_remote_lwd( XPTR( client_cxy , &desc->args[2] ) ); 663 664 // call local kernel function 665 process_make_kill( process , is_exit , status ); 666 667 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 668 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 669 CURRENT_THREAD->core->lid , hal_time_stamp() ); 670 } 611 // [5] undefined slot 612 ///////////////////////////////////////////////////////////////////////////////////////// 671 613 672 614 ///////////////////////////////////////////////////////////////////////////////////////// … … 906 848 rpc_desc_t * rpc_ptr ) 907 849 { 908 sigaction_dmsg("\n[DBG] %s : enter to %s process %x in cluster %x / cycle %d\n",850 rpc_dmsg("\n[DBG] %s : enter to %s process %x in cluster %x / cycle %d\n", 909 851 __FUNCTION__ , process_action_str( (uint32_t)rpc_ptr->args[0] ) , 910 852 ((process_t *)(intptr_t)rpc_ptr->args[1])->pid , cxy , (uint32_t)hal_get_cycles() ); … … 913 855 rpc_send( cxy , rpc_ptr ); 914 856 915 sigaction_dmsg("\n[DBG] %s : exit after %s process %x in cluster %x / cycle %d\n",857 rpc_dmsg("\n[DBG] %s : exit after %s process %x in cluster %x / cycle %d\n", 916 858 __FUNCTION__ , process_action_str( (uint32_t)rpc_ptr->args[0] ) , 917 859 ((process_t *)(intptr_t)rpc_ptr->args[1])->pid , cxy , (uint32_t)hal_get_cycles() ); … … 921 863 void rpc_process_sigaction_server( xptr_t xp ) 922 864 { 865 pid_t pid; // target process identifier 923 866 process_t * process; // pointer on local process descriptor 924 867 uint32_t action; // sigaction index … … 934 877 935 878 // get arguments from RPC descriptor 936 action = (uint32_t) 937 p rocess = (process_t *)(intptr_t)hal_remote_lwd( XPTR( client_cxy , &rpc->args[1] ) );879 action = (uint32_t) hal_remote_lwd( XPTR( client_cxy , &rpc->args[0] ) ); 880 pid = (pid_t) hal_remote_lwd( XPTR( client_cxy , &rpc->args[1] ) ); 938 881 client_ptr = (thread_t *)hal_remote_lpt( XPTR( client_cxy , &rpc->thread ) ); 882 883 rpc_dmsg("\n[DBG] %s : enter to %s process %x / cycle %d\n", 884 __FUNCTION__ , process_action_str( action ) , pid , (uint32_t)hal_get_cycles() ); 885 886 // get local process descriptor 887 process = process_get_local_copy( pid ); 939 888 940 889 // build extended pointer on client thread 941 890 client_xp = XPTR( client_cxy , client_ptr ); 942 943 sigaction_dmsg("\n[DBG] %s : enter to %s process %x / cycle %d\n",944 __FUNCTION__ , process_action_str( action ) , process->pid , (uint32_t)hal_get_cycles() );945 891 946 892 // call relevant kernel function … … 958 904 } 959 905 960 sigaction_dmsg("\n[DBG] %s : exit after %s process %x / cycle %d\n",961 __FUNCTION__ , process_action_str( action ) , p rocess->pid , (uint32_t)hal_get_cycles() );906 rpc_dmsg("\n[DBG] %s : exit after %s process %x / cycle %d\n", 907 __FUNCTION__ , process_action_str( action ) , pid , (uint32_t)hal_get_cycles() ); 962 908 } 963 909 -
trunk/kernel/kern/rpc.h
r433 r435 32 32 #include <vseg.h> 33 33 #include <remote_fifo.h> 34 #include <signal.h>35 34 36 35 /**** Forward declarations ****/ … … 65 64 RPC_PROCESS_MAKE_FORK = 3, 66 65 RPC_UNDEFINED_4 = 4, 67 RPC_ PROCESS_MAKE_KILL= 5,66 RPC_UNDEFINED_5 = 5, 68 67 RPC_THREAD_USER_CREATE = 6, 69 68 RPC_THREAD_KERNEL_CREATE = 7, … … 242 241 243 242 /*********************************************************************************** 244 * [5] The RPC_PROCESS_MAKE_KILL can be called by any thread to request the owner 245 * cluster to execute the process_make_kill() function for a target process. 246 *********************************************************************************** 247 * @ cxy : owner cluster identifier. 248 * @ process : pointer on process in owner cluster. 249 * @ is_exit : true if called by sys_exit() / false if called by sys_kill() 250 * @ status : exit status (only when called by sys_exit() 251 **********************************************************************************/ 252 void rpc_process_make_kill_client( cxy_t cxy, 253 struct process_s * process, 254 bool_t is_exit, 255 uint32_t status ); 256 257 void rpc_process_make_kill_server( xptr_t xp ); 243 * [5] undefined slot 244 **********************************************************************************/ 258 245 259 246 /*********************************************************************************** … … 314 301 /*********************************************************************************** 315 302 * [9] The RPC_PROCESS_SIGACTION allows the owner cluster to request any other 316 * cluster to execute a given sigaction (BLOCK / UNBLOCK / DELETE) for all threads317 * of a given process.303 * cluster to execute a given sigaction (BLOCK / UNBLOCK / DELETE) for all 304 * threads of a given process. 318 305 * 319 306 * WARNING : It is implemented as a NON BLOCKING multicast RPC, that can be sent -
trunk/kernel/kern/scheduler.c
r433 r435 280 280 } 281 281 282 // enter critical section / save SR in current thread context283 hal_disable_irq( & current->save_sr );282 // enter critical section / save SR in current thread descriptor 283 hal_disable_irq( &CURRENT_THREAD->save_sr ); 284 284 285 285 // loop on threads to select next thread … … 321 321 } 322 322 323 // switch CPU from c allingthread context to new thread context323 // switch CPU from current thread context to new thread context 324 324 hal_do_cpu_switch( current->cpu_context, next->cpu_context ); 325 325 } … … 330 330 uint32_t cycle = (uint32_t)hal_get_cycles(); 331 331 if( CONFIG_DEBUG_SCHED_YIELD < cycle ) 332 printk("\n[DBG] %s : core[%x,%d] / cause = %s / thread %x (%s) (%x,%x) continue / cycle %d\n", 332 printk("\n[DBG] %s : core[%x,%d] / cause = %s\n" 333 " thread %x (%s) (%x,%x) continue / cycle %d\n", 333 334 __FUNCTION__, local_cxy, core->lid, cause, 334 335 current, thread_type_str(current->type), current->process->pid, current->trdid, cycle ); … … 340 341 sched_handle_signals( core ); 341 342 342 // exit critical section / restore SR from next thread context343 hal_restore_irq( next->save_sr );343 // exit critical section / restore SR from current thread descriptor 344 hal_restore_irq( CURRENT_THREAD->save_sr ); 344 345 345 346 } // end sched_yield() -
trunk/kernel/kern/signal.h
r409 r435 28 28 29 29 #include <hal_types.h> 30 31 #define SIG_DEFAULT (void*)0L32 #define SIG_IGNORE (void*)1L33 #define SIG_ERROR -1L34 35 #define SIGHUP 1 /*! hangup */36 #define SIGINT 2 /*! interrupt */37 #define SIGQUIT 3 /*! quit */38 #define SIGILL 4 /*! illegal instruction (not reset when caught) */39 #define SIGTRAP 5 /*! trace trap (not reset when caught) */40 #define SIGIOT 6 /*! IOT instruction */41 #define SIGABRT 6 /*! used by abort, replace SIGIOT in the future */42 #define SIGEMT 7 /*! EMT instruction */43 #define SIGFPE 8 /*! floating point exception */44 #define SIGKILL 9 /*! kill (cannot be caught or ignored) */45 #define SIGBUS 10 /*! bus error */46 #define SIGSEGV 11 /*! segmentation violation */47 #define SIGSYS 12 /*! bad argument to system call */48 #define SIGPIPE 13 /*! write on a pipe with no one to read it */49 #define SIGALRM 14 /*! alarm clock */50 #define SIGTERM 15 /*! software termination signal from kill */51 #define SIGURG 16 /*! urgent condition on IO channel */52 #define SIGSTOP 17 /*! sendable stop signal not from tty */53 #define SIGTSTP 18 /*! stop signal from tty */54 #define SIGCONT 19 /*! continue a stopped process */55 #define SIGCHLD 20 /*! to parent on child stop or exit */56 #define SIGCLD 20 /*! System V name for SIGCHLD */57 #define SIGTTIN 21 /*! to readers pgrp upon background tty read */58 #define SIGTTOU 22 /*! like TTIN for output if (tp->t_local<OSTOP) */59 #define SIGIO 23 /*! input/output possible signal */60 #define SIGPOLL SIGIO /*! System V name for SIGIO */61 #define SIGXCPU 24 /*! exceeded CPU time limit */62 #define SIGXFSZ 25 /*! exceeded file size limit */63 #define SIGVTALRM 26 /*! virtual time alarm */64 #define SIGPROF 27 /*! profiling time alarm */65 #define SIGWINCH 28 /*! window changed */66 #define SIGLOST 29 /*! resource lost (eg, record-lock lost) */67 #define SIGUSR1 30 /*! user defined signal 1 */68 #define SIGUSR2 31 /*! user defined signal 2 */69 #define SIG_NR 32 /*! signal 0 implied */70 71 #define SIG_DEFAULT_MASK 0xFFEEFFFF72 30 73 31 -
trunk/kernel/libk/xlist.h
r24 r435 72 72 * extended double linked list, identified by the extended pointer on 73 73 * the root xlist_entry_t. 74 * WARNING : check list non empty before using this macro. 74 75 * @ root_xp : extended pointer on the root xlist_entry_t 75 76 * @ type : type of the linked elements … … 85 86 * extended double linked list, identified by the extended pointer on 86 87 * the root xlist_entry_t. 88 * WARNING : check list non empty before using this macro. 87 89 * @ root_xp : extended pointer on the root xlist_entry_t 88 90 * @ type : type of the linked elements -
trunk/kernel/mm/kcm.c
r433 r435 48 48 { 49 49 50 #if CONFIG_DEBUG_KCM _ALLOC50 #if CONFIG_DEBUG_KCM 51 51 uint32_t cycle = (uint32_t)hal_get_cycles(); 52 if( CONFIG_DEBUG_KCM _ALLOC< cycle )52 if( CONFIG_DEBUG_KCM < cycle ) 53 53 printk("\n[DBG] %s : thread %x enters for %s / page %x / count %d / active %d\n", 54 54 __FUNCTION__ , CURRENT_THREAD , kmem_type_str( kcm->type ) , … … 85 85 + (index * kcm->block_size) ); 86 86 87 #if CONFIG_DEBUG_KCM _ALLOC87 #if CONFIG_DEBUG_KCM 88 88 cycle = (uint32_t)hal_get_cycles(); 89 if( CONFIG_DEBUG_KCM _ALLOC< cycle )89 if( CONFIG_DEBUG_KCM < cycle ) 90 90 printk("\n[DBG] %s : thread %x exit / type %s / ptr %p / page %x / count %d\n", 91 91 __FUNCTION__ , CURRENT_THREAD , kmem_type_str( kcm->type ) , ptr , -
trunk/kernel/mm/kmem.c
r433 r435 145 145 assert( ((type > 1) && (type < KMEM_TYPES_NR) ) , __FUNCTION__ , "illegal KCM type" ); 146 146 147 kmem_dmsg("\n[DBG] %s : enters / KCM type %s missing in cluster %x\n", 148 __FUNCTION__ , kmem_type_str( type ) , local_cxy ); 147 #if CONFIG_DEBUG_KMEM 148 uint32_t cycle = (uint32_t)hal_get_cycles(); 149 if( CONFIG_DEBUG_KMEM < cycle ) 150 printk("\n[DBG] %s : thread %x enter / KCM type %s missing in cluster %x / cycle %d\n", 151 __FUNCTION__, CURRENT_THREAD, kmem_type_str( type ), local_cxy, cycle ); 152 #endif 149 153 150 154 cluster_t * cluster = LOCAL_CLUSTER; … … 169 173 hal_fence(); 170 174 171 kmem_dmsg("\n[DBG] %s : exit / KCM type %s created in cluster %x\n", 172 __FUNCTION__ , kmem_type_str( type ) , local_cxy ); 175 #if CONFIG_DEBUG_KMEM 176 cycle = (uint32_t)hal_get_cycles(); 177 if( CONFIG_DEBUG_KMEM < cycle ) 178 printk("\n[DBG] %s : thread %x exit / cycle %d\n", 179 __FUNCTION__, CURRENT_THREAD, cycle ); 180 #endif 173 181 174 182 return 0; … … 192 200 assert( (type < KMEM_TYPES_NR) , __FUNCTION__ , "illegal KMEM request type" ); 193 201 194 kmem_dmsg("\n[DBG] %s : enters in cluster %x for type %s\n", 195 __FUNCTION__ , local_cxy , kmem_type_str( type ) ); 202 #if CONFIG_DEBUG_KMEM 203 uint32_t cycle = (uint32_t)hal_get_cycles(); 204 if( CONFIG_DEBUG_KMEM < cycle ) 205 printk("\n[DBG] %s : thread %x enter / type %s / cluster %x / cycle %d\n", 206 __FUNCTION__, CURRENT_THREAD, kmem_type_str( type ), local_cxy, cycle ); 207 #endif 196 208 197 209 // analyse request type 198 210 if( type == KMEM_PAGE ) // PPM allocator 199 211 { 200 201 #if CONFIG_DEBUG_KMEM_ALLOC202 if( CONFIG_DEBUG_KMEM_ALLOC < (uint32_t)hal_get_cycles() )203 printk("\n[DBG] in %s : thread %x enter for %d page(s)\n",204 __FUNCTION__ , CURRENT_THREAD , 1<<size );205 #endif206 207 212 // allocate the number of requested pages 208 213 ptr = (void *)ppm_alloc_pages( size ); … … 217 222 if( flags & AF_ZERO ) page_zero( (page_t *)ptr ); 218 223 219 kmem_dmsg("\n[DBG] %s : exit in cluster %x for type %s / page = %x / base = %x\n", 220 __FUNCTION__, local_cxy , kmem_type_str( type ) , 221 (intptr_t)ptr , (intptr_t)ppm_page2base( ptr ) ); 222 223 #if CONFIG_DEBUG_KMEM_ALLOC 224 if( CONFIG_DEBUG_KMEM_ALLOC < (uint32_t)hal_get_cycles() ) 225 printk("\n[DBG] in %s : thread %x exit / %d page(s) allocated / ppn = %x\n", 226 __FUNCTION__ , CURRENT_THREAD , 1<<size , ppm_page2ppn( XPTR( local_cxy , ptr ) ) ); 224 #if CONFIG_DEBUG_KMEM 225 cycle = (uint32_t)hal_get_cycles(); 226 if( CONFIG_DEBUG_KMEM < cycle ) 227 printk("\n[DBG] %s : thread %x exit / %d page(s) allocated / ppn %x / cycle %d\n", 228 __FUNCTION__, CURRENT_THREAD, 1<<size, ppm_page2ppn(XPTR(local_cxy,ptr)), cycle ); 227 229 #endif 228 230 … … 242 244 if( flags & AF_ZERO ) memset( ptr , 0 , size ); 243 245 244 kmem_dmsg("\n[DBG] %s : exit in cluster %x for type %s / base = %x / size = %d\n", 245 __FUNCTION__, local_cxy , kmem_type_str( type ) , 246 (intptr_t)ptr , req->size ); 246 #if CONFIG_DEBUG_KMEM 247 cycle = (uint32_t)hal_get_cycles(); 248 if( CONFIG_DEBUG_KMEM < cycle ) 249 printk("\n[DBG] %s : thread %x exit / type %s allocated / base %x / size %d / cycle %d\n", 250 __FUNCTION__, CURRENT_THREAD, kmem_type_str( type ), (intptr_t)ptr, size, cycle ); 251 #endif 252 247 253 } 248 254 else // KCM allocator … … 269 275 if( flags & AF_ZERO ) memset( ptr , 0 , kmem_type_size( type ) ); 270 276 271 kmem_dmsg("\n[DBG] %s : exit in cluster %x for type %s / base = %x / size = %d\n", 272 __FUNCTION__, local_cxy , kmem_type_str( type ) , 273 (intptr_t)ptr , kmem_type_size( type ) ); 277 #if CONFIG_DEBUG_KMEM 278 cycle = (uint32_t)hal_get_cycles(); 279 if( CONFIG_DEBUG_KMEM < cycle ) 280 printk("\n[DBG] %s : thread %x exit / type %s allocated / base %x / size %d / cycle %d\n", 281 __FUNCTION__, CURRENT_THREAD, kmem_type_str(type), (intptr_t)ptr, 282 kmem_type_size(type), cycle ); 283 #endif 284 274 285 } 275 286 -
trunk/kernel/mm/mapper.c
r408 r435 143 143 error_t error; 144 144 145 mapper_dmsg("\n[DBG] %s : core[%x,%d] enters for page %d / mapper %x\n", 146 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , index , mapper ); 145 #if CONFIG_DEBUG_MAPPER_GET_PAGE 146 uint32_t cycle = (uint32_t)hal_get_cycles(); 147 if( CONFIG_DEBUG_MAPPER_GET_PAGE < cycle ) 148 printk("\n[DBG] %s : thread %x enter for page %d / mapper %x / cycle %d\n", 149 __FUNCTION__ , CURRENT_THREAD , index , mapper , cycle ); 150 #endif 147 151 148 152 thread_t * this = CURRENT_THREAD; … … 171 175 { 172 176 173 mapper_dmsg("\n[DBG] %s : core[%x,%d] missing page => load from device\n", 174 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid ); 175 177 #if (CONFIG_DEBUG_MAPPER_GET_PAGE & 1) 178 if( CONFIG_DEBUG_MAPPER_GET_PAGE < cycle ) 179 printk("\n[DBG] %s : missing page => load from device\n", __FUNCTION__ ); 180 #endif 176 181 // allocate one page from PPM 177 182 req.type = KMEM_PAGE; … … 230 235 // reset the page INLOAD flag to make the page available to all readers 231 236 page_clear_flag( page , PG_INLOAD ); 232 233 mapper_dmsg("\n[DBG] %s : missing page loaded / ppn = %x\n",234 __FUNCTION__ , ppm_page2ppn(XPTR(local_cxy,page)) );235 236 237 } 237 238 else if( page_is_flag( page , PG_INLOAD ) ) // page is loaded by another thread … … 256 257 } 257 258 258 mapper_dmsg("\n[DBG] %s : exit for page %d / mapper %x / page_desc = %x\n", 259 __FUNCTION__ , index , mapper , page ); 259 #if CONFIG_DEBUG_MAPPER_GET_PAGE 260 cycle = (uint32_t)hal_get_cycles(); 261 if( CONFIG_DEBUG_MAPPER_GET_PAGE < cycle ) 262 printk("\n[DBG] %s : thread %x exit for page %d / ppn %x / cycle %d\n", 263 __FUNCTION__, CURRENT_THREAD, index, ppm_page2ppn(XPTR(local_cxy, page)), cycle ); 264 #endif 260 265 261 266 return page; … … 312 317 uint8_t * buf_ptr; // current buffer address 313 318 314 mapper_dmsg("\n[DBG] %s : enters / to_buf = %d / buffer = %x\n", 315 __FUNCTION__ , to_buffer , buffer ); 319 #if CONFIG_DEBUG_MAPPER_MOVE_USER 320 uint32_t cycle = (uint32_t)hal_get_cycles(); 321 if( CONFIG_DEBUG_MAPPER_MOVE_USER < cycle ) 322 printk("\n[DBG] %s : thread %x enter / to_buf %d / buffer %x / cycle %d\n", 323 __FUNCTION__ , CURRENT_THREAD , to_buffer , buffer , cycle ); 324 #endif 316 325 317 326 // compute offsets of first and last bytes in file … … 338 347 else page_count = CONFIG_PPM_PAGE_SIZE; 339 348 340 mapper_dmsg("\n[DBG] %s : index = %d / offset = %d / count = %d\n", 341 __FUNCTION__ , index , page_offset , page_count ); 349 #if (CONFIG_DEBUG_MAPPER_MOVE_USER & 1) 350 if( CONFIG_DEBUG_MAPPER_MOVE_USER < cycle ) 351 printk("\n[DBG] %s : index = %d / offset = %d / count = %d\n", 352 __FUNCTION__ , index , page_offset , page_count ); 353 #endif 342 354 343 355 // get page descriptor … … 353 365 buf_ptr = (uint8_t *)buffer + done; 354 366 355 mapper_dmsg("\n[DBG] %s : index = %d / buf_ptr = %x / map_ptr = %x\n",356 __FUNCTION__ , index , buf_ptr , map_ptr );357 358 367 // move fragment 359 368 if( to_buffer ) … … 370 379 } 371 380 372 mapper_dmsg("\n[DBG] %s : exit for buffer %x\n", 373 __FUNCTION__, buffer ); 381 #if CONFIG_DEBUG_MAPPER_MOVE_USER 382 cycle = (uint32_t)hal_get_cycles(); 383 if( CONFIG_DEBUG_MAPPER_MOVE_USER < cycle ) 384 printk("\n[DBG] %s : thread %x exit / to_buf %d / buffer %x / cycle %d\n", 385 __FUNCTION__ , CURRENT_THREAD , to_buffer , buffer , cycle ); 386 #endif 374 387 375 388 return 0; … … 399 412 uint8_t * buffer_ptr = (uint8_t *)GET_PTR( buffer_xp ); 400 413 401 mapper_dmsg("\n[DBG] %s : core[%x,%d] / to_buf = %d / buf_cxy = %x / buf_ptr = %x / size = %x\n", 402 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, to_buffer, buffer_cxy, buffer_ptr, size ); 414 #if CONFIG_DEBUG_MAPPER_MOVE_KERNEL 415 uint32_t cycle = (uint32_t)hal_get_cycles(); 416 if( CONFIG_DEBUG_MAPPER_MOVE_KERNEL < cycle ) 417 printk("\n[DBG] %s : thread %x enter / to_buf %d / buf_cxy %x / buf_ptr %x / cycle %d\n", 418 __FUNCTION__ , CURRENT_THREAD , to_buffer , buffer_cxy , buffer_ptr , cycle ); 419 #endif 403 420 404 421 // compute offsets of first and last bytes in file … … 410 427 uint32_t last = max_byte >> CONFIG_PPM_PAGE_SHIFT; 411 428 412 mapper_dmsg("\n[DBG] %s : core[%x,%d] / first_page = %d / last_page = %d\n", 413 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, first, last ); 429 #if (CONFIG_DEBUG_MAPPER_MOVE_KERNEL & 1) 430 if( CONFIG_DEBUG_MAPPER_MOVE_KERNEL < cycle ) 431 printk("\n[DBG] %s : first_page %d / last_page %d\n", __FUNCTION__, first, last ); 432 #endif 414 433 415 434 // compute source and destination clusters … … 440 459 else page_count = CONFIG_PPM_PAGE_SIZE; 441 460 442 mapper_dmsg("\n[DBG] %s : core[%x;%d] / page_index = %d / offset = %d / bytes = %d\n", 443 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, index, page_offset, page_count ); 461 #if (CONFIG_DEBUG_MAPPER_MOVE_KERNEL & 1) 462 if( CONFIG_DEBUG_MAPPER_MOVE_KERNEL < cycle ) 463 printk("\n[DBG] %s : page_index = %d / offset = %d / bytes = %d\n", 464 __FUNCTION__ , index , page_offset , page_count ); 465 #endif 444 466 445 467 // get page descriptor … … 472 494 } 473 495 474 mapper_dmsg("\n[DBG] %s : core_cxy[%x,%d] / exit / buf_cxy = %x / buf_ptr = %x / size = %x\n", 475 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, buffer_cxy, buffer_ptr, size ); 496 #if CONFIG_DEBUG_MAPPER_MOVE_KERNEL 497 cycle = (uint32_t)hal_get_cycles(); 498 if( CONFIG_DEBUG_MAPPER_MOVE_KERNEL < cycle ) 499 printk("\n[DBG] %s : thread %x exit / to_buf %d / buf_cxy %x / buf_ptr %x / cycle %d\n", 500 __FUNCTION__ , CURRENT_THREAD , to_buffer , buffer_cxy , buffer_ptr , cycle ); 501 #endif 476 502 477 503 return 0; -
trunk/kernel/mm/vmm.c
r433 r435 1643 1643 #if CONFIG_DEBUG_VMM_GET_PTE 1644 1644 uint32_t cycle = (uint32_t)hal_get_cycles(); 1645 if( CONFIG_DEBUG_VMM_GET_PTE >cycle )1645 if( CONFIG_DEBUG_VMM_GET_PTE < cycle ) 1646 1646 printk("\n[DBG] %s : thread %x enter for vpn = %x / process %x / cow = %d / cycle %d\n", 1647 1647 __FUNCTION__ , CURRENT_THREAD , vpn , process->pid , cow , cycle ); … … 1800 1800 error_t error; 1801 1801 1802 #if CONFIG_DEBUG_VMM_GET_PTE 1803 uint32_t cycle = (uint32_t)hal_get_cycles(); 1804 if( CONFIG_DEBUG_VMM_GET_PTE < cycle ) 1805 printk("\n[DBG] %s : thread %x enter for vpn %x / process %x / cycle %d\n", 1806 __FUNCTION__ , CURRENT_THREAD , vpn , process->pid , cycle ); 1807 #endif 1808 1802 1809 // get reference process cluster and local pointer 1803 1810 cxy_t ref_cxy = GET_CXY( process->ref_xp ); … … 1833 1840 } 1834 1841 1842 #if CONFIG_DEBUG_VMM_GET_PTE 1843 cycle = (uint32_t)hal_get_cycles(); 1844 if( CONFIG_DEBUG_VMM_GET_PTE < cycle ) 1845 printk("\n[DBG] %s : thread %x exit for vpn %x / process %x / cycle %d\n", 1846 __FUNCTION__ , CURRENT_THREAD , vpn , process->pid , cycle ); 1847 #endif 1848 1835 1849 return error; 1836 1850 … … 1845 1859 error_t error; 1846 1860 1861 #if CONFIG_DEBUG_VMM_GET_PTE 1862 uint32_t cycle = (uint32_t)hal_get_cycles(); 1863 if( CONFIG_DEBUG_VMM_GET_PTE < cycle ) 1864 printk("\n[DBG] %s : thread %x enter for vpn %x / process %x / cycle %d\n", 1865 __FUNCTION__ , CURRENT_THREAD , vpn , process->pid , cycle ); 1866 #endif 1847 1867 1848 1868 // get reference process cluster and local pointer … … 1879 1899 } 1880 1900 1901 #if CONFIG_DEBUG_VMM_GET_PTE 1902 cycle = (uint32_t)hal_get_cycles(); 1903 if( CONFIG_DEBUG_VMM_GET_PTE < cycle ) 1904 printk("\n[DBG] %s : thread %x exit for vpn %x / process %x / cycle %d\n", 1905 __FUNCTION__ , CURRENT_THREAD , vpn , process->pid , cycle ); 1906 #endif 1907 1881 1908 return error; 1882 1909 -
trunk/kernel/syscalls/shared_syscalls.h
r421 r435 321 321 typedef enum 322 322 { 323 DISPLAY_STRING = 0, 324 DISPLAY_VMM = 1, 325 DISPLAY_SCHED = 2, 326 DISPLAY_PROCESS = 3, 327 DISPLAY_VFS = 4, 328 DISPLAY_CHDEV = 5, 323 DISPLAY_STRING = 0, 324 DISPLAY_VMM = 1, 325 DISPLAY_SCHED = 2, 326 DISPLAY_CLUSTER_PROCESSES = 3, 327 DISPLAY_VFS = 4, 328 DISPLAY_CHDEV = 5, 329 DISPLAY_TXT_PROCESSES = 6, 329 330 } 330 331 display_type_t; … … 391 392 392 393 394 /********************************************************************************************* 395 * These macros can be used by the parent process to analyze a child process 396 * termination status, as returned by the wait() syscall. 397 * The termination state is a 32 bits word: 398 * - the 8 LSB bits contain the user defined exit status 399 * - the 24 other bits contain the flags defined below 400 ********************************************************************************************/ 401 402 #define PROCESS_TERM_STOP 0x100 /*! process received a SIGSTOP signal */ 403 #define PROCESS_TERM_KILL 0x200 /*! process killed by a SIGKILL signal */ 404 #define PROCESS_TERM_EXIT 0x400 /*! process terminated by a sys_exit() */ 405 #define PROCESS_TERM_WAIT 0x800 /*! parent process executed a sys_wait() */ 406 407 #define WIFEXITED( status ) (status & PROCESS_TERM_EXIT) 408 #define WIFSIGNALED( status ) (status & PROCESS_TERM_KILL) 409 #define WIFSTOPPED( status ) (status & PROCESS_TERM_STOP) 410 #define WEXITSTATUS( status ) (status & 0xFF) 411 393 412 394 413 #endif // _SHARED_SYSCALLS_H_ -
trunk/kernel/syscalls/sys_display.c
r433 r435 142 142 } 143 143 } 144 else if( type == DISPLAY_ PROCESS )144 else if( type == DISPLAY_CLUSTER_PROCESSES ) 145 145 { 146 146 cxy_t cxy = (cxy_t)arg0; … … 155 155 156 156 cluster_processes_display( cxy ); 157 } 158 else if( type == DISPLAY_TXT_PROCESSES ) 159 { 160 uint32_t txt_id = (uint32_t)arg0; 161 162 // check argument 163 if( txt_id >= LOCAL_CLUSTER->nb_txt_channels ) 164 { 165 printk("\n[ERROR] in %s : undefined TXT channel %x\n", 166 __FUNCTION__ , txt_id ); 167 return -1; 168 } 169 170 process_txt_display( txt_id ); 157 171 } 158 172 else if( type == DISPLAY_VFS ) -
trunk/kernel/syscalls/sys_exec.c
r433 r435 221 221 printk("\n[ERROR] in %s : cannot access args\n", __FUNCTION__ ); 222 222 #endif 223 this->errno = error;223 this->errno = EINVAL; 224 224 return -1; 225 225 } … … 235 235 printk("\n[ERROR] in %s : cannot access envs\n", __FUNCTION__ ); 236 236 #endif 237 this->errno = error;237 this->errno = EINVAL; 238 238 return -1; 239 239 } … … 248 248 #if CONFIG_DEBUG_SYSCALLS_ERROR 249 249 printk("\n[ERROR] in %s : cannot create process %x in cluster %x\n", 250 __FUNCTION__, pid, CXY_FROM_PID( pid);250 __FUNCTION__, pid, CXY_FROM_PID(pid) ); 251 251 #endif 252 252 this->errno = error; -
trunk/kernel/syscalls/sys_exit.c
r433 r435 29 29 #include <printk.h> 30 30 #include <process.h> 31 #include <s ignal.h>31 #include <shared_syscalls.h> 32 32 #include <cluster.h> 33 33 #include <rpc.h> … … 51 51 #endif 52 52 53 // get cluster and pointers on process in owner cluster 54 xptr_t owner_xp = cluster_get_owner_process_from_pid( pid ); 55 cxy_t owner_cxy = GET_CXY( owner_xp ); 56 process_t * owner_ptr = GET_PTR( owner_xp ); 53 // get owner cluster 54 cxy_t owner_cxy = CXY_FROM_PID( pid ); 57 55 58 assert( (owner_xp != XPTR_NULL) , __FUNCTION__ , "owner_xp cannot be NULL\n" ); 56 // exit must be called by the main thread 57 if( (owner_cxy != local_cxy) || (LTID_FROM_TRDID( this->trdid ) != 0) ) 58 { 59 60 #if CONFIG_DEBUG_SYSCALLS_ERROR 61 printk("\n[ERROR] %s must be called by thread 0 in process owner cluster\n" 62 " trdid = %x / pid = %x / local_cxy = %x\n", 63 __FUNCTION__, this->trdid, pid, local_cxy ); 64 #endif 65 this->errno = EINVAL; 66 return -1; 67 } 59 68 60 69 // enable IRQs 61 70 hal_enable_irq( &save_sr ); 62 71 63 // the process_make_kill() function must be executed 64 // by an RPC thread in reference cluster 65 rpc_process_make_kill_client( owner_cxy, owner_ptr, true , status ); 72 // register exit_status in owner process descriptor 73 process->term_state = status; 74 75 // remove TXT ownership from owner process descriptor 76 process_txt_reset_ownership( XPTR( local_cxy , process ) ); 77 78 // block all process threads in all clusters 79 process_sigaction( pid , BLOCK_ALL_THREADS ); 80 81 // mark all process threads in all clusters for delete 82 process_sigaction( pid , DELETE_ALL_THREADS ); 66 83 67 84 // restore IRQs 68 85 hal_restore_irq( save_sr ); 69 86 87 // atomically update owner process descriptor term_state 88 hal_remote_atomic_or( XPTR( local_cxy , &process->term_state ) , 89 PROCESS_TERM_EXIT ); 70 90 hal_fence(); 71 91 -
trunk/kernel/syscalls/sys_fork.c
r433 r435 81 81 if( hal_remote_atomic_add( children_xp , 1 ) >= CONFIG_PROCESS_MAX_CHILDREN ) 82 82 { 83 printk("\n[ERROR] in %s : too much children processes\n", __FUNCTION__); 83 84 #if CONFIG_DEBUG_SYSCALLS_ERROR 85 printk("\n[ERROR] in %s : too much children processes\n", __FUNCTION__); 86 #endif 84 87 hal_remote_atomic_add ( children_xp , -1 ); 85 88 parent_thread_ptr->errno = EAGAIN; … … 119 122 if( error ) 120 123 { 121 printk("\n[ERROR] in %s : cannot fork process %x in cluster %x\n", 122 __FUNCTION__, parent_pid, local_cxy ); 124 125 #if CONFIG_DEBUG_SYSCALLS_ERROR 126 printk("\n[ERROR] in %s : cannot fork process %x in cluster %x\n", 127 __FUNCTION__, parent_pid, local_cxy ); 128 #endif 123 129 parent_thread_ptr->errno = EAGAIN; 124 130 return -1; -
trunk/kernel/syscalls/sys_get_config.c
r421 r435 35 35 int sys_get_config( uint32_t * x_size, 36 36 uint32_t * y_size, 37 uint32_t * y_width,38 37 uint32_t * ncores ) 39 38 { … … 41 40 uint32_t k_x_size; 42 41 uint32_t k_y_size; 43 uint32_t k_y_width;44 42 uint32_t k_ncores; 45 43 … … 49 47 process_t * process = this->process; 50 48 49 #if CONFIG_DEBUG_SYS_GET_CONFIG 50 uint64_t tm_start; 51 uint64_t tm_end; 52 tm_start = hal_get_cycles(); 53 if( CONFIG_DEBUG_SYS_GET_CONFIG < tm_start ) 54 printk("\n[DBG] %s : thread %x enter / process %x / cycle %d\n", 55 __FUNCTION__, this, process->pid, (uint32_t)tm_start ); 56 #endif 57 51 58 // check buffer in user space 52 59 error |= vmm_v2p_translate( false , x_size , &paddr ); 53 60 error |= vmm_v2p_translate( false , y_size , &paddr ); 54 error |= vmm_v2p_translate( false , y_width , &paddr );55 61 error |= vmm_v2p_translate( false , ncores , &paddr ); 56 62 57 63 if( error ) 58 64 { 59 printk("\n[ERROR] in %s : user buffer unmapped for thread %x in process %x\n", 60 __FUNCTION__ , this->trdid , process->pid ); 65 66 #if CONFIG_DEBUG_SYSCALLS_ERROR 67 printk("\n[ERROR] in %s : user buffer unmapped for thread %x in process %x\n", 68 __FUNCTION__ , this->trdid , process->pid ); 69 #endif 61 70 this->errno = EFAULT; 62 71 return -1; … … 66 75 k_x_size = LOCAL_CLUSTER->x_size; 67 76 k_y_size = LOCAL_CLUSTER->y_size; 68 k_y_width = LOCAL_CLUSTER->y_width;69 77 k_ncores = LOCAL_CLUSTER->cores_nr; 70 78 … … 72 80 hal_copy_to_uspace( x_size , &k_x_size , sizeof(uint32_t) ); 73 81 hal_copy_to_uspace( y_size , &k_y_size , sizeof(uint32_t) ); 74 hal_copy_to_uspace( y_width , &k_y_width , sizeof(uint32_t) );75 82 hal_copy_to_uspace( ncores , &k_ncores , sizeof(uint32_t) ); 83 84 hal_fence(); 85 86 #if CONFIG_DEBUG_SYS_GET_CONFIG 87 tm_end = hal_get_cycles(); 88 if( CONFIG_DEBUG_SYS_GET_CONFIG < tm_end ) 89 printk("\n[DBG] %s : thread %x exit / process %x / cost %d / tycle %d\n", 90 __FUNCTION__, this, process->pid, (uint32_t)(tm_end-tm_start), (uint32_t)tm_end ); 91 #endif 76 92 77 93 return 0; -
trunk/kernel/syscalls/sys_kill.c
r433 r435 48 48 49 49 thread_t * this = CURRENT_THREAD; 50 process_t * process = this->process; 50 51 51 52 #if CONFIG_DEBUG_SYS_KILL … … 58 59 #endif 59 60 60 // get cluster and pointers on owner process 61 // process cannot kill itself 62 if( pid == process->pid ) 63 { 64 65 #if CONFIG_DEBUG_SYSCALLS_ERROR 66 printk("\n[ERROR] in %s : process %d cannot kill itself\n", __FUNCTION__ , pid ); 67 #endif 68 this->errno = EINVAL; 69 return -1; 70 } 71 72 // get cluster and pointers on owner target process descriptor 61 73 owner_xp = cluster_get_owner_process_from_pid( pid ); 62 74 owner_cxy = GET_CXY( owner_xp ); … … 67 79 { 68 80 69 syscall_dmsg("\n[ERROR] in %s : process %x not found\n", __FUNCTION__ , pid ); 70 81 #if CONFIG_DEBUG_SYSCALLS_ERROR 82 printk("\n[ERROR] in %s : process %x not found\n", __FUNCTION__ , pid ); 83 #endif 71 84 this->errno = EINVAL; 72 85 return -1; … … 79 92 ppid = hal_remote_lw( XPTR( parent_cxy , &parent_ptr->pid ) ); 80 93 81 // processes INIT and processes KSH cannot be stoped or killed82 if( p pid < 2)94 // processes INIT 95 if( pid == 1 ) 83 96 { 84 97 85 syscall_dmsg("\n[ERROR] in %s : process %x cannot be killed\n", __FUNCTION__ , pid ); 86 98 #if CONFIG_DEBUG_SYSCALLS_ERROR 99 printk("\n[ERROR] in %s : process_init cannot be killed\n", __FUNCTION__ ); 100 #endif 87 101 this->errno = EINVAL; 88 102 return -1; … … 92 106 hal_enable_irq( &save_sr ); 93 107 94 // analyse signal type 95 // supported values are : 0, SIGSTOP, SIGCONT, SIGKILL 108 // analyse signal type / supported values are : 0, SIGSTOP, SIGCONT, SIGKILL 96 109 switch( sig_id ) 97 110 { … … 108 121 109 122 // block all threads in all clusters 110 process_sigaction( owner_ptr, BLOCK_ALL_THREADS );123 process_sigaction( pid , BLOCK_ALL_THREADS ); 111 124 112 // atomically update referenceprocess termination state125 // atomically update owner process termination state 113 126 hal_remote_atomic_or( XPTR( owner_cxy , &owner_ptr->term_state ) , 114 PROCESS_ FLAG_BLOCK);127 PROCESS_TERM_STOP ); 115 128 116 129 retval = 0; … … 120 133 { 121 134 // unblock all threads in all clusters 122 process_sigaction( owner_ptr, UNBLOCK_ALL_THREADS );135 process_sigaction( pid , UNBLOCK_ALL_THREADS ); 123 136 124 137 // atomically update reference process termination state 125 138 hal_remote_atomic_and( XPTR( owner_cxy , &owner_ptr->term_state ) , 126 ~PROCESS_ FLAG_BLOCK);139 ~PROCESS_TERM_STOP ); 127 140 retval = 0; 128 141 break; … … 131 144 case SIGKILL: 132 145 { 133 // the process_make_kill() function must be executed 134 // by an RPC thread in process owner cluster 135 // It deletes all target process threads in all clusters, 136 // and updates the process termination state 137 rpc_process_make_kill_client( owner_cxy , owner_ptr , false , 0 ); 146 // remove TXT ownership from owner process descriptor 147 process_txt_reset_ownership( owner_xp ); 148 149 // block all process threads in all clusters 150 process_sigaction( pid , BLOCK_ALL_THREADS ); 151 152 // mark all process threads in all clusters for delete 153 process_sigaction( pid , DELETE_ALL_THREADS ); 154 155 // atomically update owner process descriptor flags 156 hal_remote_atomic_or( XPTR( owner_cxy , &owner_ptr->term_state ) , 157 PROCESS_TERM_KILL ); 138 158 139 159 retval = 0; … … 143 163 { 144 164 145 syscall_dmsg("\n[ERROR] in %s : illegal signal type %d for process %x\n", 146 __FUNCTION__ , sig_id, pid );147 165 #if CONFIG_DEBUG_SYSCALLS_ERROR 166 printk("\n[ERROR] in %s : illegal signal %d / process %x\n", __FUNCTION__, sig_id, pid ); 167 #endif 148 168 this->errno = EINVAL; 149 169 retval = -1; -
trunk/kernel/syscalls/sys_mmap.c
r407 r435 25 25 #include <hal_types.h> 26 26 #include <hal_uspace.h> 27 #include <hal_irqmask.h> 27 28 #include <shared_syscalls.h> 28 29 #include <errno.h> … … 44 45 error_t error; 45 46 paddr_t paddr; // unused, but required for user space checking 46 47 uint64_t tm_start; 48 uint64_t tm_end; 49 50 tm_start = hal_get_cycles(); 47 reg_t save_sr; // required to enable IRQs 51 48 52 49 thread_t * this = CURRENT_THREAD; 53 50 process_t * process = this->process; 54 51 52 #if CONFIG_DEBUG_SYS_MMAP 53 uint64_t tm_start; 54 uint64_t tm_end; 55 tm_start = hal_get_cycles(); 56 if ( CONFIG_DEBUG_SYS_MMAP < tm_start ) 57 printk("\n[DBG] %s : thread %x enter / process %x / cycle %d\n", 58 __FUNCTION__, this, process->pid, (uint32_t)tm_start ); 59 #endif 60 55 61 // check arguments in user space 56 62 error = vmm_v2p_translate( false , attr , &paddr ); … … 58 64 if ( error ) 59 65 { 60 printk("\n[ERROR] in %s : arguments not in used space = %x\n", 61 __FUNCTION__ , (intptr_t)attr ); 66 67 #if CONFIG_DEBUG_SYSCALLS_ERROR 68 printk("\n[ERROR] in %s : arguments not in used space = %x\n", __FUNCTION__ , (intptr_t)attr ); 69 #endif 62 70 this->errno = EINVAL; 63 71 return -1; … … 82 90 if( map_fixed ) 83 91 { 84 printk("\n[ERROR] in %s : MAP_FIXED not supported\n", __FUNCTION__ ); 92 93 #if CONFIG_DEBUG_SYSCALLS_ERROR 94 printk("\n[ERROR] in %s : MAP_FIXED not supported\n", __FUNCTION__ ); 95 #endif 85 96 this->errno = EINVAL; 86 97 return -1; … … 89 100 if( map_shared == map_private ) 90 101 { 91 printk("\n[ERROR] in %s : MAP_SHARED xor MAP_PRIVATE\n", __FUNCTION__ ); 102 103 #if CONFIG_DEBUG_SYSCALLS_ERROR 104 printk("\n[ERROR] in %s : MAP_SHARED xor MAP_PRIVATE\n", __FUNCTION__ ); 105 #endif 92 106 this->errno = EINVAL; 93 107 return -1; … … 108 122 if( fdid >= CONFIG_PROCESS_FILE_MAX_NR ) 109 123 { 110 printk("\n[ERROR] in %s: bad file descriptor = %d\n", __FUNCTION__ , fdid ); 124 125 #if CONFIG_DEBUG_SYSCALLS_ERROR 126 printk("\n[ERROR] in %s: bad file descriptor = %d\n", __FUNCTION__ , fdid ); 127 #endif 111 128 this->errno = EBADFD; 112 129 return -1; … … 118 135 if( file_xp == XPTR_NULL ) 119 136 { 120 printk("\n[ERROR] in %s: file %d not found\n", __FUNCTION__ , fdid ); 137 138 #if CONFIG_DEBUG_SYSCALLS_ERROR 139 printk("\n[ERROR] in %s: file %d not found\n", __FUNCTION__ , fdid ); 140 #endif 121 141 this->errno = EBADFD; 122 142 return -1; … … 138 158 if( (offset + length) > size) 139 159 { 140 printk("\n[ERROR] in %s: offset (%d) + len (%d) >= file's size (%d)\n", 141 __FUNCTION__, k_attr.offset, k_attr.length, size ); 160 161 #if CONFIG_DEBUG_SYSCALLS_ERROR 162 printk("\n[ERROR] in %s: offset (%d) + len (%d) >= file's size (%d)\n", 163 __FUNCTION__, k_attr.offset, k_attr.length, size ); 164 #endif 142 165 this->errno = ERANGE; 143 166 return -1; … … 148 171 (prot_write && !(file_attr & FD_ATTR_WRITE_ENABLE)) ) 149 172 { 150 printk("\n[ERROR] in %s: prot = %x / file_attr = %x)\n", 151 __FUNCTION__ , k_attr.prot , file_attr ); 173 174 #if CONFIG_DEBUG_SYSCALLS_ERROR 175 printk("\n[ERROR] in %s: prot = %x / file_attr = %x)\n", 176 __FUNCTION__ , k_attr.prot , file_attr ); 177 #endif 152 178 this->errno = EACCES; 153 179 return -1; … … 178 204 if( cluster_is_undefined( vseg_cxy ) ) 179 205 { 180 printk("\n[ERROR] in %s : illegal cxy for MAP_REMOTE\n", __FUNCTION__ ); 206 207 #if CONFIG_DEBUG_SYSCALLS_ERROR 208 printk("\n[ERROR] in %s : illegal cxy for MAP_REMOTE\n", __FUNCTION__ ); 209 #endif 181 210 this->errno = EINVAL; 182 211 return -1; … … 184 213 } 185 214 } 215 216 // enable IRQs 217 hal_enable_irq( &save_sr ); 186 218 187 219 // get reference process cluster and local pointer … … 216 248 } 217 249 250 // restore IRQs 251 hal_restore_irq( save_sr ); 252 218 253 if( vseg == NULL ) 219 254 { 220 printk("\n[ERROR] in %s : cannot create vseg\n", __FUNCTION__ ); 255 256 #if CONFIG_DEBUG_SYSCALLS_ERROR 257 printk("\n[ERROR] in %s : cannot create vseg\n", __FUNCTION__ ); 258 #endif 221 259 this->errno = ENOMEM; 222 260 return -1; … … 226 264 hal_copy_to_uspace( &attr->addr , &vseg->min , sizeof(intptr_t) ); 227 265 228 tm_end = hal_get_cycles(); 229 230 syscall_dmsg("\n[DBG] %s : core[%x,%d] created vseg %s in cluster %x / cycle %d\n" 231 " base = %x / length = %x / cost = %d\n", 232 __FUNCTION__, local_cxy , this->core->lid , vseg_type_str(vseg->type) , 233 vseg->cxy , (uint32_t)tm_start , vseg->min , length , (uint32_t)(tm_end - tm_start) ); 266 hal_fence(); 267 268 #if CONFIG_DEBUG_SYS_MMAP 269 tm_end = hal_get_cycles(); 270 if ( CONFIG_DEBUG_SYS_MMAP < tm_start ) 271 printk("\n[DBG] %s : thread %x enter / process %x / cycle %d\n" 272 "vseg %s / cluster %x / base %x / size %x / cost %d\n", 273 __FUNCTION__, this, process->pid, (uint32_t)tm_end, 274 vseg_type_str(vseg->type), vseg->cxy, vseg->min, length, (uint32_t)(tm_end - tm_start) ); 275 #endif 234 276 235 277 return 0; -
trunk/kernel/syscalls/sys_read.c
r433 r435 36 36 // TODO: concurrent user page(s) munmap need to be handled [AG] 37 37 38 // TODO : remove these debug variables39 38 extern uint32_t enter_sys_read; 40 39 extern uint32_t enter_devfs_move; … … 64 63 reg_t save_sr; // required to enable IRQs during syscall 65 64 66 #if CONFIG_READ_DEBUG65 #if (CONFIG_DEBUG_SYS_READ & 1) 67 66 enter_sys_read = (uint32_t)tm_start; 68 67 #endif … … 76 75 tm_start = hal_get_cycles(); 77 76 if( CONFIG_DEBUG_SYS_READ < tm_start ) 78 printk("\n[DBG] %s : thread % denter / process %x / vaddr = %x / count %d / cycle %d\n",77 printk("\n[DBG] %s : thread %x enter / process %x / vaddr = %x / count %d / cycle %d\n", 79 78 __FUNCTION__, this, process->pid, vaddr, count, (uint32_t)tm_start ); 80 79 #endif … … 83 82 if( file_id >= CONFIG_PROCESS_FILE_MAX_NR ) 84 83 { 85 printk("\n[ERROR] in %s : illegal file descriptor index = %d\n", 86 __FUNCTION__ , file_id ); 84 85 #if CONFIG_DEBUG_SYSCALLS_ERROR 86 printk("\n[ERROR] in %s : illegal file descriptor index = %d\n", __FUNCTION__ , file_id ); 87 #endif 87 88 this->errno = EBADFD; 88 89 return -1; … … 94 95 if ( error ) 95 96 { 96 printk("\n[ERROR] in %s : user buffer unmapped = %x\n", 97 __FUNCTION__ , (intptr_t)vaddr ); 97 98 #if CONFIG_DEBUG_SYSCALLS_ERROR 99 printk("\n[ERROR] in %s : user buffer unmapped = %x\n", 100 __FUNCTION__ , (intptr_t)vaddr ); 101 #endif 98 102 this->errno = EINVAL; 99 103 return -1; … … 108 112 if( file_xp == XPTR_NULL ) 109 113 { 110 printk("\n[ERROR] in %s : undefined file descriptor index = %d in process %x\n", 111 __FUNCTION__ , file_id , process->pid ); 114 115 #if CONFIG_DEBUG_SYSCALLS_ERROR 116 printk("\n[ERROR] in %s : undefined fd_id %d in process %x\n", 117 __FUNCTION__ , file_id , process->pid ); 118 #endif 112 119 this->errno = EBADFD; 113 120 return -1; … … 122 129 if( (attr & FD_ATTR_READ_ENABLE) == 0 ) 123 130 { 124 printk("\n[ERROR] in %s : file %d not readable in process %x\n", 125 __FUNCTION__ , file_id , process->pid ); 131 132 #if CONFIG_DEBUG_SYSCALLS_ERROR 133 printk("\n[ERROR] in %s : file %d not readable in process %x\n", 134 __FUNCTION__ , file_id , process->pid ); 135 #endif 126 136 this->errno = EBADFD; 127 137 return -1; … … 138 148 if( (attr & FD_ATTR_READ_ENABLE) == 0 ) 139 149 { 140 printk("\n[ERROR] in %s : file %d not readable in process %x\n", 141 __FUNCTION__ , file_id , process->pid ); 150 151 #if CONFIG_DEBUG_SYSCALLS_ERROR 152 printk("\n[ERROR] in %s : file %d not readable in process %x\n", 153 __FUNCTION__ , file_id , process->pid ); 154 #endif 142 155 this->errno = EBADFD; 143 156 return -1; … … 166 179 if( XPTR( local_cxy , process ) != owner_xp ) 167 180 { 168 printk("\n[ERROR] in %s : process %x not in foreground for TXT%d\n", 169 __FUNCTION__, process->pid, hal_remote_lw( XPTR(chdev_cxy,&chdev_ptr->channel) ) ); 181 182 #if CONFIG_DEBUG_SYSCALLS_ERROR 183 printk("\n[ERROR] in %s : process %x not in foreground for TXT%d\n", 184 __FUNCTION__, process->pid, hal_remote_lw( XPTR(chdev_cxy,&chdev_ptr->channel) ) ); 185 #endif 170 186 this->errno = EBADFD; 171 187 return -1; … … 180 196 if( nbytes != count ) 181 197 { 182 printk("\n[ERROR] in %s cannot read data from file %d in process %x\n", 183 __FUNCTION__ , file_id , process->pid ); 198 199 #if CONFIG_DEBUG_SYSCALLS_ERROR 200 printk("\n[ERROR] in %s cannot read data from file %d in process %x\n", 201 __FUNCTION__ , file_id , process->pid ); 202 #endif 184 203 this->errno = error; 185 204 return -1; … … 194 213 tm_end = hal_get_cycles(); 195 214 if( CONFIG_DEBUG_SYS_READ < tm_end ) 196 printk("\n[DBG] %s : thread %x / process %x / cycle %d\n"215 printk("\n[DBG] %s : thread %x exit / process %x / cycle %d\n" 197 216 "nbytes = %d / first byte = %c / file_id = %d / cost = %d\n", 198 217 __FUNCTION__ , local_cxy , this->core->lid , this->trdid , this->process->pid , … … 201 220 #endif 202 221 203 #if (CONFIG_ READ_DEBUG & 0x1)222 #if (CONFIG_DEBUG_SYS_READ & 1) 204 223 exit_sys_read = (uint32_t)tm_end; 205 224 206 225 printk("\n@@@@@@@@@@@@ timing to read character %c\n" 207 " - enter_sys_read = %d / delta %d\n"208 " - enter_devfs_ move= %d / delta %d\n"209 " - enter_txt_read = %d / delta %d\n"210 " - enter_chdev_cmd = %d / delta %d\n"211 " - enter_chdev_server = %d / delta %d\n"212 " - enter_tty_cmd = %d / delta %d\n"213 " - enter_tty_isr = %d / delta %d\n"214 " - exit_tty_isr = %d / delta %d\n"215 " - exit_tty_cmd = %d / delta %d\n"216 " - exit_chdev_server = %d / delta %d\n"217 " - exit_chdev_cmd = %d / delta %d\n"218 " - exit_txt_read = %d / delta %d\n"219 " - exit_devfs_ move= %d / delta %d\n"220 " - exit_sys_read = %d / delta %d\n",226 " - enter_sys_read = %d / delta %d\n" 227 " - enter_devfs_read = %d / delta %d\n" 228 " - enter_txt_read = %d / delta %d\n" 229 " - enter_chdev_cmd_read = %d / delta %d\n" 230 " - enter_chdev_server_read = %d / delta %d\n" 231 " - enter_tty_cmd_read = %d / delta %d\n" 232 " - enter_tty_isr_read = %d / delta %d\n" 233 " - exit_tty_isr_read = %d / delta %d\n" 234 " - exit_tty_cmd_read = %d / delta %d\n" 235 " - exit_chdev_server_read = %d / delta %d\n" 236 " - exit_chdev_cmd_read = %d / delta %d\n" 237 " - exit_txt_read = %d / delta %d\n" 238 " - exit_devfs_read = %d / delta %d\n" 239 " - exit_sys_read = %d / delta %d\n", 221 240 *((char *)(intptr_t)paddr) , 222 enter_sys_read , 0 ,223 enter_devfs_ move , enter_devfs_move - enter_sys_read,224 enter_txt_read , enter_txt_read - enter_devfs_move,225 enter_chdev_cmd , enter_chdev_cmd - enter_txt_read,226 enter_chdev_server , enter_chdev_server - enter_chdev_cmd ,227 enter_tty_cmd , enter_tty_cmd - enter_chdev_server,228 enter_tty_isr , enter_tty_isr - enter_tty_cmd ,229 exit_tty_isr , exit_tty_isr - enter_tty_isr,230 exit_tty_cmd , exit_tty_cmd - exit_tty_isr,231 exit_chdev_server , exit_chdev_server - exit_tty_cmd ,232 exit_chdev_cmd , exit_chdev_cmd - exit_chdev_server,233 exit_txt_read , exit_txt_read - exit_chdev_cmd ,234 exit_devfs_ move , exit_devfs_move - exit_txt_read,235 exit_sys_read , exit_sys_read - exit_devfs_move);241 enter_sys_read , 0 , 242 enter_devfs_read , enter_devfs_read - enter_sys_read , 243 enter_txt_read , enter_txt_read - enter_devfs_read , 244 enter_chdev_cmd_read , enter_chdev_cmd_read - enter_txt_read , 245 enter_chdev_server_read , enter_chdev_server_read - enter_chdev_cmd_read , 246 enter_tty_cmd_read , enter_tty_cmd_read - enter_chdev_server_read , 247 enter_tty_isr_read , enter_tty_isr_read - enter_tty_cmd_read , 248 exit_tty_isr_read , exit_tty_isr_read - enter_tty_isr_read , 249 exit_tty_cmd_read , exit_tty_cmd_read - exit_tty_isr_read , 250 exit_chdev_server_read , exit_chdev_server_read - exit_tty_cmd_read , 251 exit_chdev_cmd_read , exit_chdev_cmd_read - exit_chdev_server_read , 252 exit_txt_read , exit_txt_read - exit_chdev_cmd_read , 253 exit_devfs_read , exit_devfs_read - exit_txt_read , 254 exit_sys_read , exit_sys_read - exit_devfs_read ); 236 255 #endif 237 256 -
trunk/kernel/syscalls/sys_signal.c
r409 r435 27 27 #include <thread.h> 28 28 #include <printk.h> 29 #include <signal.h>30 29 31 30 ////////////////////////////////// -
trunk/kernel/syscalls/sys_wait.c
r433 r435 24 24 #include <hal_types.h> 25 25 #include <hal_uspace.h> 26 #include <hal_irqmask.h> 26 27 #include <core.h> 27 28 #include <thread.h> … … 42 43 int child_state; 43 44 thread_t * child_thread; 45 reg_t save_sr; 44 46 45 47 thread_t * this = CURRENT_THREAD; … … 61 63 if( error ) 62 64 { 63 printk("\n[ERROR] in %s : status buffer unmapped for thread %x in process %x\n", 64 __FUNCTION__ , this->trdid , process->pid ); 65 66 #if CONFIG_DEBUG_SYSCALLS_ERROR 67 printk("\n[ERROR] in %s : status buffer unmapped for thread %x in process %x\n", 68 __FUNCTION__ , this->trdid , process->pid ); 69 #endif 65 70 this->errno = EFAULT; 66 71 return -1; … … 85 90 while( 1 ) 86 91 { 92 // enable IRQS 93 hal_enable_irq( &save_sr ); 94 87 95 // get lock protecting children list 88 96 remote_spinlock_lock( children_lock_xp ); … … 101 109 // test if child process is terminated, 102 110 // but termination not yet reported to parent process 103 if( ((child_state & PROCESS_ FLAG_EXIT)||104 (child_state & PROCESS_ FLAG_KILL)||105 (child_state & PROCESS_ FLAG_BLOCK)) &&106 ((child_state & PROCESS_ FLAG_WAIT) == 0) )111 if( ((child_state & PROCESS_TERM_EXIT) || 112 (child_state & PROCESS_TERM_KILL) || 113 (child_state & PROCESS_TERM_STOP)) && 114 ((child_state & PROCESS_TERM_WAIT) == 0) ) 107 115 { 108 116 // get pointer on main thread and PID from child owner process … … 112 120 // set the PROCESS_FLAG_WAIT in owner child descriptor 113 121 hal_remote_atomic_or( XPTR( child_cxy , &child_ptr->term_state ), 114 PROCESS_ FLAG_WAIT );122 PROCESS_TERM_WAIT ); 115 123 116 124 // set the THREAD_FLAG_REQ_DELETE in child main thread … … 118 126 THREAD_FLAG_REQ_DELETE ); 119 127 128 // release lock protecting children list 129 remote_spinlock_unlock( children_lock_xp ); 130 120 131 #if CONFIG_DEBUG_SYS_WAIT 121 132 tm_end = hal_get_cycles(); 122 133 if( CONFIG_DEBUG_SYS_WAIT < tm_end ) 123 printk("\n[DBG] %s : thread %x exit / p rocess%x / cycle %d\n",124 __FUNCTION__, this, process->pid, (uint32_t)tm_end );134 printk("\n[DBG] %s : thread %x exit / parent %x / child %x / cycle %d\n", 135 __FUNCTION__, this, process->pid, child_pid, (uint32_t)tm_end ); 125 136 #endif 126 127 137 // return relevant info to calling parent process 128 138 hal_copy_to_uspace( status , &child_state , sizeof(int) ); … … 131 141 } 132 142 133 // release lock 143 // release lock protecting children list 134 144 remote_spinlock_unlock( children_lock_xp ); 135 145 136 146 // deschedule without blocking 137 147 sched_yield( "parent wait children termination" ); 138 } 148 149 } // end while 139 150 140 151 // never executed -
trunk/kernel/syscalls/sys_write.c
r433 r435 41 41 { 42 42 error_t error; 43 paddr_t paddr; // unused, butrequired for user space checking43 paddr_t paddr; // required for user space checking 44 44 xptr_t file_xp; // remote file extended pointer 45 45 uint32_t nbytes; // number of bytes actually written 46 46 reg_t save_sr; // required to enable IRQs during syscall 47 48 #if (CONFIG_DEBUG_SYS_WRITE_DEBUG & 1) 49 enter_sys_read = (uint32_t)tm_start; 50 #endif 47 51 48 52 thread_t * this = CURRENT_THREAD; … … 54 58 tm_start = hal_get_cycles(); 55 59 if( CONFIG_DEBUG_SYS_WRITE < tm_start ) 56 printk("\n[DBG] %s : thread %x / process %x / vaddr %x / count %d / cycle %d\n",60 printk("\n[DBG] %s : thread %x enter / process %x / vaddr %x / count %d / cycle %d\n", 57 61 __FUNCTION__, this, process->pid, vaddr, count, (uint32_t)tm_start ); 58 62 #endif … … 162 166 tm_end = hal_get_cycles(); 163 167 if( CONFIG_DEBUG_SYS_WRITE < tm_end ) 164 printk("\n[DBG] %s : thread %x inprocess %x / cycle %d\n"168 printk("\n[DBG] %s : thread %x exit / process %x / cycle %d\n" 165 169 "nbytes = %d / first byte = %c / file_id = %d / cost = %d\n", 166 170 __FUNCTION__, this, process->pid, (uint32_t)tm_start, … … 168 172 #endif 169 173 174 #if (CONFIG_DEBUG_SYS_WRITE & 1) 175 exit_sys_write = (uint32_t)tm_end; 176 177 printk("\n@@@@@@@@@@@@ timing to write string %c\n" 178 " - enter_sys_write = %d / delta %d\n" 179 " - enter_devfs_write = %d / delta %d\n" 180 " - enter_txt_write = %d / delta %d\n" 181 " - enter_chdev_cmd_write = %d / delta %d\n" 182 " - enter_chdev_server_write = %d / delta %d\n" 183 " - enter_tty_cmd_write = %d / delta %d\n" 184 " - enter_tty_isr_write = %d / delta %d\n" 185 " - exit_tty_isr_write = %d / delta %d\n" 186 " - exit_tty_cmd_write = %d / delta %d\n" 187 " - exit_chdev_server_write = %d / delta %d\n" 188 " - exit_chdev_cmd_write = %d / delta %d\n" 189 " - exit_txt_write = %d / delta %d\n" 190 " - exit_devfs_write = %d / delta %d\n" 191 " - exit_sys_write = %d / delta %d\n", 192 *((char *)(intptr_t)paddr) , 193 enter_sys_write , 0 , 194 enter_devfs_write , enter_devfs_write - enter_sys_write , 195 enter_txt_write , enter_txt_write - enter_devfs_write , 196 enter_chdev_cmd_write , enter_chdev_cmd_write - enter_txt_write , 197 enter_chdev_server_write , enter_chdev_server_write - enter_chdev_cmd_write , 198 enter_tty_cmd_write , enter_tty_cmd_write - enter_chdev_server_write , 199 enter_tty_isr_write , enter_tty_isr_write - enter_tty_cmd_write , 200 exit_tty_isr_write , exit_tty_isr_write - enter_tty_isr_write , 201 exit_tty_cmd_write , exit_tty_cmd_write - exit_tty_isr_write , 202 exit_chdev_server_write , exit_chdev_server_write - exit_tty_cmd_write , 203 exit_chdev_cmd_write , exit_chdev_cmd_write - exit_chdev_server_write , 204 exit_txt_write , exit_txt_write - exit_chdev_cmd_write , 205 exit_devfs_write , exit_devfs_write - exit_txt_write , 206 exit_sys_write , exit_sys_write - exit_devfs_write ); 207 #endif 208 170 209 return nbytes; 171 210 -
trunk/kernel/syscalls/syscalls.h
r433 r435 508 508 * The following macros can be used to extract information from status: 509 509 * - WIFEXITED(status) : is true if the child process terminated with an exit(). 510 * - WIFSIGNALED(status) : is true if the child process terminated by a signal.510 * - WIFSIGNALED(status) : is true if the child process killed by a signal. 511 511 * - WIFSTOPPED(status) : is true if the child process is stopped by a signal. 512 512 * - WEXITSTATUS(status) : returns the low-order 8 bits of the exit() argument. … … 558 558 * [43] This debug function displays on the kernel terminal TXT0 an user defined string, 559 559 * or the current state of a kernel structure, identified by the <type> argument. 560 * The <arg0> and <arg1> arguments depends on the structure type. It can be: 561 * - VMM : VSL and GPT for a process identified by <pid>. 562 * - SCHED : all threads allocated to a scheduler identified by <cxy> & <lid>. 563 * - PROCESS : all processes registered in a cluster identified by <cxy>. 564 * - VFS : all files registered in the VFS cache. 565 * - CHDEV : all registered channel devices. 566 ****************************************************************************************** 567 * type : [in] STRING / VMM / SCHED / PROCESS / VSEG / VFS 560 * The <arg0> and <arg1> arguments depends on the structure type: 561 * - DISPLAY_STRING : an user defined string 562 * - DISPLAY_VMM : VSL and GPT for a process identified by <pid>. 563 * - DISPLAY_SCHED : all threads allocated to a scheduler <cxy> & <lid>. 564 * - DISPLAY_CLUSTER_PROCESS : all processes registered in a cluster identified by <cxy>. 565 * - DISPLAY_TXT_PROCESS : all processes registered in a cluster identified by <cxy>. 566 * - DISPLAY_VFS : all files registered in the VFS cache. 567 * - DISPLAY_CHDEV : all registered channel devices. 568 ****************************************************************************************** 569 * type : [in] type of display 568 570 * arg0 : [in] type dependant argument. 569 571 * arg1 : [in] type dependant argument.
Note: See TracChangeset
for help on using the changeset viewer.