Changeset 437 for trunk/kernel/kern/rpc.c
- Timestamp:
- Mar 28, 2018, 2:40:29 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/kern/rpc.c
r436 r437 1 1 /* 2 * rpc.c - RPC relatedoperations implementation.2 * rpc.c - RPC operations implementation. 3 3 * 4 * Author Alain Greiner (2016,2017 )4 * Author Alain Greiner (2016,2017,2018) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 52 52 if( cycle > CONFIG_DEBUG_RPC_MARSHALING ) \ 53 53 printk("\n[DBG] %s : enter thread %x on core[%x,%d] / cycle %d\n", \ 54 __FUNCTION__ , CURRENT_THREAD ->trdid, local_cxy, CURRENT_THREAD->core->lid , cycle );54 __FUNCTION__ , CURRENT_THREAD , local_cxy, CURRENT_THREAD->core->lid , cycle ); 55 55 56 56 #define RPC_DEBUG_EXIT \ … … 58 58 if( cycle > CONFIG_DEBUG_RPC_MARSHALING ) \ 59 59 printk("\n[DBG] %s : exit thread %x on core[%x,%d] / cycle %d\n", \ 60 __FUNCTION__ , CURRENT_THREAD ->trdid, local_cxy, CURRENT_THREAD->core->lid , cycle );60 __FUNCTION__ , CURRENT_THREAD , local_cxy, CURRENT_THREAD->core->lid , cycle ); 61 61 62 62 #else … … 129 129 uint32_t cycle = (uint32_t)hal_get_cycles(); 130 130 if( CONFIG_DEBUG_RPC_SEND < cycle ) 131 printk("\n[DBG] %s : thread %x enter for rpc[%d] / rpc_ptr %x / cycle %d\n",132 __FUNCTION__, CURRENT_THREAD, rpc->index, rpc, cycle );131 printk("\n[DBG] %s : thread %x in cluster %x enter for rpc[%d] / rpc_ptr %x / cycle %d\n", 132 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index, rpc, cycle ); 133 133 #endif 134 134 … … 174 174 cycle = (uint32_t)hal_get_cycles(); 175 175 if( CONFIG_DEBUG_RPC_SEND < cycle ) 176 printk("\n[DBG] %s : thread %x busy waiting / rpc[%d] / server = %x/ cycle %d\n",177 __FUNCTION__, CURRENT_THREAD, rpc->index , server_cxy, cycle );176 printk("\n[DBG] %s : thread %x in cluster %x busy waiting / rpc[%d] / cycle %d\n", 177 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index , cycle ); 178 178 #endif 179 179 … … 183 183 cycle = (uint32_t)hal_get_cycles(); 184 184 if( CONFIG_DEBUG_RPC_SEND < cycle ) 185 printk("\n[DBG] %s : thread % resume / rpc[%d] / cycle %d\n",186 __FUNCTION__, CURRENT_THREAD, rpc->index, cycle );185 printk("\n[DBG] %s : thread % in cluster %x resume / rpc[%d] / cycle %d\n", 186 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index, cycle ); 187 187 #endif 188 188 } … … 193 193 cycle = (uint32_t)hal_get_cycles(); 194 194 if( CONFIG_DEBUG_RPC_SEND < cycle ) 195 printk("\n[DBG] %s : thread %x block & deschedule / rpc[%d] / server = %x/ cycle %d\n",196 __FUNCTION__, CURRENT_THREAD, rpc->index , server_cxy, cycle );195 printk("\n[DBG] %s : thread %x in cluster %x deschedule / rpc[%d] / cycle %d\n", 196 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index , cycle ); 197 197 #endif 198 198 thread_block( XPTR( local_cxy , this ) , THREAD_BLOCKED_RPC ); … … 202 202 cycle = (uint32_t)hal_get_cycles(); 203 203 if( CONFIG_DEBUG_RPC_SEND < cycle ) 204 printk("\n[DBG] %s : thread % resume / rpcr[%d] / cycle %d\n",205 __FUNCTION__, CURRENT_THREAD, rpc->index, cycle );204 printk("\n[DBG] %s : thread % in cluster %x resume / rpcr[%d] / cycle %d\n", 205 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index, cycle ); 206 206 #endif 207 207 } … … 219 219 cycle = (uint32_t)hal_get_cycles(); 220 220 if( CONFIG_DEBUG_RPC_SEND < cycle ) 221 printk("\n[DBG] %s : non blocking rpc[%d] => thread return / cycle %d\n",221 printk("\n[DBG] %s : non blocking rpc[%d] => thread %x return / cycle %d\n", 222 222 __FUNCTION__, rpc->index, CURRENT_THREAD, cycle ); 223 223 #endif … … 355 355 uint32_t cycle = (uint32_t)hal_get_cycles(); 356 356 if( CONFIG_DEBUG_RPC_SERVER < cycle ) 357 printk("\n[DBG] %s : RPC thread %x takes RPC fifo ownership / cluster %x/ cycle %d\n",357 printk("\n[DBG] %s : RPC thread %x in cluster %x takes RPC fifo ownership / cycle %d\n", 358 358 __FUNCTION__, this, local_cxy, cycle ); 359 359 #endif … … 378 378 desc_ptr = GET_PTR( desc_xp ); 379 379 380 index = desc_ptr->index;381 blocking = desc_ptr->blocking;380 index = hal_remote_lw( XPTR( desc_cxy , &desc_ptr->index ) ); 381 blocking = hal_remote_lw( XPTR( desc_cxy , &desc_ptr->blocking ) ); 382 382 383 383 #if CONFIG_DEBUG_RPC_SERVER 384 384 cycle = (uint32_t)hal_get_cycles(); 385 385 if( CONFIG_DEBUG_RPC_SERVER < cycle ) 386 printk("\n[DBG] %s : RPC thread %x got rpc[%d] / rpc_ptr %x / cycle %d\n",387 __FUNCTION__, this, index, desc_ptr, cycle );386 printk("\n[DBG] %s : RPC thread %x in cluster %x got rpc[%d] / rpc_ptr %x / cycle %d\n", 387 __FUNCTION__, this, local_cxy, index, desc_ptr, cycle ); 388 388 #endif 389 389 // call the relevant server function … … 393 393 cycle = (uint32_t)hal_get_cycles(); 394 394 if( CONFIG_DEBUG_RPC_SERVER < cycle ) 395 printk("\n[DBG] %s : RPC thread %x completes rpc %d in cluster %x / cycle %d\n",396 __FUNCTION__, this, index, local_cxy, cycle );395 printk("\n[DBG] %s : RPC thread %x in cluster %x completes rpc[%d] / rpc_ptr %x / cycle %d\n", 396 __FUNCTION__, this, local_cxy, index, cycle ); 397 397 #endif 398 398 // increment handled RPCs counter … … 435 435 uint32_t cycle = (uint32_t)hal_get_cycles(); 436 436 if( CONFIG_DEBUG_RPC_SERVER < cycle ) 437 printk("\n[DBG] %s : RPC thread %x suicides in cluster %x/ cycle %d\n",437 printk("\n[DBG] %s : RPC thread %x in cluster %x suicides / cycle %d\n", 438 438 __FUNCTION__, this, local_cxy, cycle ); 439 439 #endif … … 450 450 uint32_t cycle = (uint32_t)hal_get_cycles(); 451 451 if( CONFIG_DEBUG_RPC_SERVER < cycle ) 452 printk("\n[DBG] %s : RPC thread %x deschedules in cluster %x/ cycle %d\n",452 printk("\n[DBG] %s : RPC thread %x in cluster %x deschedules / cycle %d\n", 453 453 __FUNCTION__, this, local_cxy, cycle ); 454 454 #endif … … 460 460 cycle = (uint32_t)hal_get_cycles(); 461 461 if( CONFIG_DEBUG_RPC_SERVER < cycle ) 462 printk("\n[DBG] %s : RPC thread %x resumes in cluster %x/ cycle %d\n",462 printk("\n[DBG] %s : RPC thread %x in cluster %x resumes / cycle %d\n", 463 463 __FUNCTION__, this, local_cxy, cycle ); 464 464 #endif … … 478 478 page_t ** page ) // out 479 479 { 480 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",481 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,482 CURRENT_THREAD->core->lid , hal_time_stamp() );483 480 484 481 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); … … 499 496 *page = (page_t *)(intptr_t)rpc.args[1]; 500 497 501 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",502 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,503 CURRENT_THREAD->core->lid , hal_time_stamp() );504 498 } 505 499 … … 507 501 void rpc_pmem_get_pages_server( xptr_t xp ) 508 502 { 509 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",510 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,511 CURRENT_THREAD->core->lid , hal_time_stamp() );512 503 513 504 // get client cluster identifier and pointer on RPC descriptor … … 524 515 hal_remote_swd( XPTR( cxy , &desc->args[1] ) , (uint64_t)(intptr_t)page ); 525 516 526 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",527 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,528 CURRENT_THREAD->core->lid , hal_time_stamp() );529 517 } 530 518 … … 537 525 page_t * page ) // out 538 526 { 539 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",540 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,541 CURRENT_THREAD->core->lid , hal_time_stamp() );542 527 543 528 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); … … 555 540 rpc_send( cxy , &rpc ); 556 541 557 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",558 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,559 CURRENT_THREAD->core->lid , hal_time_stamp() );560 542 } 561 543 … … 563 545 void rpc_pmem_release_pages_server( xptr_t xp ) 564 546 { 565 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",566 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,567 CURRENT_THREAD->core->lid , hal_time_stamp() );568 547 569 548 // get client cluster identifier and pointer on RPC descriptor … … 580 559 kmem_free( &req ); 581 560 582 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",583 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,584 CURRENT_THREAD->core->lid , hal_time_stamp() );585 561 } 586 562 … … 601 577 error_t * error ) // out 602 578 { 603 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",604 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,605 CURRENT_THREAD->core->lid , hal_time_stamp() );606 607 579 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 608 580 … … 625 597 *error = (error_t)rpc.args[4]; 626 598 627 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",628 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,629 CURRENT_THREAD->core->lid , hal_time_stamp() );630 599 } 631 600 … … 633 602 void rpc_process_make_fork_server( xptr_t xp ) 634 603 { 635 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",636 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,637 CURRENT_THREAD->core->lid , hal_time_stamp() );638 604 639 605 xptr_t ref_process_xp; // extended pointer on reference parent process … … 662 628 hal_remote_swd( XPTR( client_cxy , &desc->args[4] ) , (uint64_t)error ); 663 629 664 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",665 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,666 CURRENT_THREAD->core->lid , hal_time_stamp() );667 630 } 668 631 … … 688 651 error_t * error ) // out 689 652 { 690 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",691 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,692 CURRENT_THREAD->core->lid , hal_time_stamp() );693 694 653 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 695 654 … … 713 672 *error = (error_t)rpc.args[5]; 714 673 715 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",716 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,717 CURRENT_THREAD->core->lid , hal_time_stamp() );718 674 } 719 675 … … 721 677 void rpc_thread_user_create_server( xptr_t xp ) 722 678 { 723 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",724 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,725 CURRENT_THREAD->core->lid , hal_time_stamp() );726 679 727 680 pthread_attr_t * attr_ptr; // pointer on attributes structure in client cluster … … 764 717 hal_remote_swd( XPTR( client_cxy , &desc->args[5] ) , (uint64_t)error ); 765 718 766 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",767 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,768 CURRENT_THREAD->core->lid , hal_time_stamp() );769 719 } 770 720 … … 781 731 error_t * error ) // out 782 732 { 783 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",784 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,785 CURRENT_THREAD->core->lid , hal_time_stamp() );786 787 733 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 788 734 … … 805 751 *error = (error_t)rpc.args[4]; 806 752 807 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",808 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,809 CURRENT_THREAD->core->lid , hal_time_stamp() );810 753 } 811 754 … … 813 756 void rpc_thread_kernel_create_server( xptr_t xp ) 814 757 { 815 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",816 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,817 CURRENT_THREAD->core->lid , hal_time_stamp() );818 819 758 thread_t * thread_ptr; // local pointer on thread descriptor 820 759 xptr_t thread_xp; // extended pointer on thread descriptor … … 842 781 hal_remote_swd( XPTR( client_cxy , &desc->args[2] ) , (uint64_t)thread_xp ); 843 782 844 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",845 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,846 CURRENT_THREAD->core->lid , hal_time_stamp() );847 783 } 848 784 … … 962 898 error_t * error ) // out 963 899 { 964 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",965 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,966 CURRENT_THREAD->core->lid , hal_time_stamp() );967 968 900 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 969 901 … … 991 923 *error = (error_t)rpc.args[9]; 992 924 993 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",994 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,995 CURRENT_THREAD->core->lid , hal_time_stamp() );996 925 } 997 926 … … 1010 939 error_t error; 1011 940 1012 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1013 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1014 CURRENT_THREAD->core->lid , hal_time_stamp() );1015 1016 941 // get client cluster identifier and pointer on RPC descriptor 1017 942 cxy_t client_cxy = GET_CXY( xp ); … … 1043 968 hal_remote_swd( XPTR( client_cxy , &desc->args[9] ) , (uint64_t)error ); 1044 969 1045 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1046 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1047 CURRENT_THREAD->core->lid , hal_time_stamp() );1048 970 } 1049 971 … … 1056 978 struct vfs_inode_s * inode ) 1057 979 { 1058 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1059 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1060 CURRENT_THREAD->core->lid , hal_time_stamp() );1061 1062 980 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1063 981 … … 1074 992 rpc_send( cxy , &rpc ); 1075 993 1076 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1077 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1078 CURRENT_THREAD->core->lid , hal_time_stamp() );1079 994 } 1080 995 … … 1083 998 { 1084 999 vfs_inode_t * inode; 1085 1086 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1087 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1088 CURRENT_THREAD->core->lid , hal_time_stamp() );1089 1000 1090 1001 // get client cluster identifier and pointer on RPC descriptor … … 1098 1009 vfs_inode_destroy( inode ); 1099 1010 1100 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1101 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1102 CURRENT_THREAD->core->lid , hal_time_stamp() );1103 1011 } 1104 1012 … … 1115 1023 error_t * error ) // out 1116 1024 { 1117 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1118 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1119 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1025 RPC_DEBUG_ENTER 1120 1026 1121 1027 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); … … 1139 1045 *error = (error_t)rpc.args[4]; 1140 1046 1141 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1142 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1143 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1047 RPC_DEBUG_EXIT 1144 1048 } 1145 1049 … … 1153 1057 error_t error; 1154 1058 1059 RPC_DEBUG_ENTER 1060 1155 1061 char name_copy[CONFIG_VFS_MAX_NAME_LENGTH]; 1156 1157 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1158 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1159 CURRENT_THREAD->core->lid , hal_time_stamp() );1160 1062 1161 1063 // get client cluster identifier and pointer on RPC descriptor … … 1181 1083 hal_remote_swd( XPTR( client_cxy , &desc->args[4] ) , (uint64_t)error ); 1182 1084 1183 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1184 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1185 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1085 RPC_DEBUG_EXIT 1186 1086 } 1187 1087 … … 1195 1095 vfs_dentry_t * dentry ) 1196 1096 { 1197 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1198 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1199 CURRENT_THREAD->core->lid , hal_time_stamp() );1200 1201 1097 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1202 1098 … … 1213 1109 rpc_send( cxy , &rpc ); 1214 1110 1215 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1216 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1217 CURRENT_THREAD->core->lid , hal_time_stamp() );1218 1111 } 1219 1112 … … 1222 1115 { 1223 1116 vfs_dentry_t * dentry; 1224 1225 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1226 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1227 CURRENT_THREAD->core->lid , hal_time_stamp() );1228 1117 1229 1118 // get client cluster identifier and pointer on RPC descriptor … … 1237 1126 vfs_dentry_destroy( dentry ); 1238 1127 1239 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1240 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1241 CURRENT_THREAD->core->lid , hal_time_stamp() );1242 1128 } 1243 1129 … … 1254 1140 error_t * error ) // out 1255 1141 { 1256 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1257 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1258 CURRENT_THREAD->core->lid , hal_time_stamp() );1259 1260 1142 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1261 1143 … … 1277 1159 *error = (error_t)rpc.args[3]; 1278 1160 1279 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1280 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1281 CURRENT_THREAD->core->lid , hal_time_stamp() );1282 1161 } 1283 1162 … … 1289 1168 xptr_t file_xp; 1290 1169 error_t error; 1291 1292 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1293 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1294 CURRENT_THREAD->core->lid , hal_time_stamp() );1295 1170 1296 1171 // get client cluster identifier and pointer on RPC descriptor … … 1311 1186 hal_remote_swd( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)error ); 1312 1187 1313 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1314 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1315 CURRENT_THREAD->core->lid , hal_time_stamp() );1316 1188 } 1317 1189 … … 1324 1196 vfs_file_t * file ) 1325 1197 { 1326 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1327 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1328 CURRENT_THREAD->core->lid , hal_time_stamp() );1329 1330 1198 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1331 1199 … … 1342 1210 rpc_send( cxy , &rpc ); 1343 1211 1344 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1345 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1346 CURRENT_THREAD->core->lid , hal_time_stamp() );1347 1212 } 1348 1213 … … 1351 1216 { 1352 1217 vfs_file_t * file; 1353 1354 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1355 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1356 CURRENT_THREAD->core->lid , hal_time_stamp() );1357 1218 1358 1219 // get client cluster identifier and pointer on RPC descriptor … … 1366 1227 vfs_file_destroy( file ); 1367 1228 1368 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1369 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1370 CURRENT_THREAD->core->lid , hal_time_stamp() );1371 1229 } 1372 1230 … … 1382 1240 error_t * error ) // out 1383 1241 { 1384 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1385 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1386 CURRENT_THREAD->core->lid , hal_time_stamp() );1387 1388 1242 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1389 1243 … … 1405 1259 *error = (error_t)rpc.args[3]; 1406 1260 1407 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1408 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1409 CURRENT_THREAD->core->lid , hal_time_stamp() );1410 1261 } 1411 1262 … … 1420 1271 char name_copy[CONFIG_VFS_MAX_NAME_LENGTH]; 1421 1272 1422 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1423 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1424 CURRENT_THREAD->core->lid , hal_time_stamp() );1425 1426 1273 // get client cluster identifier and pointer on RPC descriptor 1427 1274 cxy_t client_cxy = GET_CXY( xp ); … … 1443 1290 hal_remote_swd( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)error ); 1444 1291 1445 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1446 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1447 CURRENT_THREAD->core->lid , hal_time_stamp() );1448 1292 } 1449 1293 … … 1457 1301 error_t * error ) // out 1458 1302 { 1459 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1460 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1461 CURRENT_THREAD->core->lid , hal_time_stamp() );1462 1463 1303 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1464 1304 … … 1478 1318 *error = (error_t)rpc.args[1]; 1479 1319 1480 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1481 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1482 CURRENT_THREAD->core->lid , hal_time_stamp() );1483 1320 } 1484 1321 … … 1489 1326 vfs_inode_t * inode; 1490 1327 1491 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1492 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1493 CURRENT_THREAD->core->lid , hal_time_stamp() );1494 1495 1328 // get client cluster identifier and pointer on RPC descriptor 1496 1329 cxy_t client_cxy = GET_CXY( xp ); … … 1506 1339 hal_remote_swd( XPTR( client_cxy , &desc->args[1] ) , (uint64_t)error ); 1507 1340 1508 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1509 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1510 CURRENT_THREAD->core->lid , hal_time_stamp() );1511 1341 } 1512 1342 … … 1523 1353 error_t * error ) // out 1524 1354 { 1525 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1526 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1527 CURRENT_THREAD->core->lid , hal_time_stamp() );1528 1529 1355 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1530 1356 … … 1547 1373 *error = (error_t)rpc.args[4]; 1548 1374 1549 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1550 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1551 CURRENT_THREAD->core->lid , hal_time_stamp() );1552 1375 } 1553 1376 … … 1561 1384 error_t error; 1562 1385 1563 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1564 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1565 CURRENT_THREAD->core->lid , hal_time_stamp() );1566 1567 1386 // get client cluster identifier and pointer on RPC descriptor 1568 1387 cxy_t client_cxy = GET_CXY( xp ); … … 1581 1400 hal_remote_swd( XPTR( client_cxy , &desc->args[4] ) , (uint64_t)error ); 1582 1401 1583 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1584 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1585 CURRENT_THREAD->core->lid , hal_time_stamp() );1586 1402 } 1587 1403 … … 1597 1413 error_t * error ) // out 1598 1414 { 1599 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1600 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1601 CURRENT_THREAD->core->lid , hal_time_stamp() );1602 1603 1415 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1604 1416 … … 1620 1432 *error = (error_t)rpc.args[3]; 1621 1433 1622 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1623 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1624 CURRENT_THREAD->core->lid , hal_time_stamp() );1625 1434 } 1626 1435 … … 1633 1442 xptr_t vseg_xp; 1634 1443 error_t error; 1635 1636 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1637 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1638 CURRENT_THREAD->core->lid , hal_time_stamp() );1639 1444 1640 1445 // get client cluster identifier and pointer on RPC descriptor … … 1654 1459 hal_remote_swd( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)error ); 1655 1460 1656 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1657 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1658 CURRENT_THREAD->core->lid , hal_time_stamp() );1659 1461 } 1660 1462 … … 1673 1475 error_t * error ) // out 1674 1476 { 1675 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1676 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1677 CURRENT_THREAD->core->lid , hal_time_stamp() );1678 1679 1477 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1680 1478 … … 1698 1496 *error = (error_t)rpc.args[5]; 1699 1497 1700 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1701 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1702 CURRENT_THREAD->core->lid , hal_time_stamp() );1703 1498 } 1704 1499 … … 1712 1507 ppn_t ppn; 1713 1508 error_t error; 1714 1715 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1716 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1717 CURRENT_THREAD->core->lid , hal_time_stamp() );1718 1509 1719 1510 // get client cluster identifier and pointer on RPC descriptor … … 1734 1525 hal_remote_swd( XPTR( client_cxy , &desc->args[5] ) , (uint64_t)error ); 1735 1526 1736 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1737 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1738 CURRENT_THREAD->core->lid , hal_time_stamp() );1739 1527 } 1740 1528 … … 1748 1536 xptr_t * buf_xp ) // out 1749 1537 { 1750 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1751 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1752 CURRENT_THREAD->core->lid , hal_time_stamp() );1753 1754 1538 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1755 1539 … … 1769 1553 *buf_xp = (xptr_t)rpc.args[1]; 1770 1554 1771 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1772 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1773 CURRENT_THREAD->core->lid , hal_time_stamp() );1774 1555 } 1775 1556 … … 1777 1558 void rpc_kcm_alloc_server( xptr_t xp ) 1778 1559 { 1779 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1780 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1781 CURRENT_THREAD->core->lid , hal_time_stamp() );1782 1783 1560 // get client cluster identifier and pointer on RPC descriptor 1784 1561 cxy_t client_cxy = GET_CXY( xp ); … … 1798 1575 hal_remote_swd( XPTR( client_cxy , &desc->args[1] ) , (uint64_t)buf_xp ); 1799 1576 1800 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1801 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1802 CURRENT_THREAD->core->lid , hal_time_stamp() );1803 1577 } 1804 1578 … … 1812 1586 uint32_t kmem_type ) // in 1813 1587 { 1814 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1815 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1816 CURRENT_THREAD->core->lid , hal_time_stamp() );1817 1818 1588 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1819 1589 … … 1831 1601 rpc_send( cxy , &rpc ); 1832 1602 1833 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1834 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1835 CURRENT_THREAD->core->lid , hal_time_stamp() );1836 1603 } 1837 1604 … … 1839 1606 void rpc_kcm_free_server( xptr_t xp ) 1840 1607 { 1841 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1842 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1843 CURRENT_THREAD->core->lid , hal_time_stamp() );1844 1845 1608 // get client cluster identifier and pointer on RPC descriptor 1846 1609 cxy_t client_cxy = GET_CXY( xp ); … … 1857 1620 kmem_free( &req ); 1858 1621 1859 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1860 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1861 CURRENT_THREAD->core->lid , hal_time_stamp() );1862 1622 } 1863 1623 … … 1876 1636 error_t * error ) // out 1877 1637 { 1878 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1879 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1880 CURRENT_THREAD->core->lid , hal_time_stamp() );1881 1882 1638 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1883 1639 … … 1902 1658 *error = (error_t)rpc.args[6]; 1903 1659 1904 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1905 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1906 CURRENT_THREAD->core->lid , hal_time_stamp() );1907 1660 } 1908 1661 … … 1918 1671 uint32_t size; 1919 1672 error_t error; 1920 1921 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1922 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1923 CURRENT_THREAD->core->lid , hal_time_stamp() );1924 1673 1925 1674 // get client cluster identifier and pointer on RPC descriptor … … 1959 1708 hal_remote_swd( XPTR( client_cxy , &desc->args[6] ) , (uint64_t)error ); 1960 1709 1961 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1962 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1963 CURRENT_THREAD->core->lid , hal_time_stamp() );1964 1710 } 1965 1711 … … 1974 1720 page_t ** page ) // out 1975 1721 { 1976 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1977 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,1978 CURRENT_THREAD->core->lid , hal_time_stamp() );1979 1980 1722 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1981 1723 … … 1996 1738 *page = (page_t *)(intptr_t)rpc.args[2]; 1997 1739 1998 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1999 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2000 CURRENT_THREAD->core->lid , hal_time_stamp() );2001 1740 } 2002 1741 … … 2004 1743 void rpc_mapper_get_page_server( xptr_t xp ) 2005 1744 { 2006 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2007 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2008 CURRENT_THREAD->core->lid , hal_time_stamp() );2009 2010 1745 // get client cluster identifier and pointer on RPC descriptor 2011 1746 cxy_t cxy = GET_CXY( xp ); … … 2022 1757 hal_remote_swd( XPTR( cxy , &desc->args[1] ) , (uint64_t)(intptr_t)page ); 2023 1758 2024 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2025 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2026 CURRENT_THREAD->core->lid , hal_time_stamp() );2027 1759 } 2028 1760 … … 2043 1775 struct vseg_s ** vseg ) 2044 1776 { 2045 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2046 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2047 CURRENT_THREAD->core->lid , hal_time_stamp() );2048 2049 1777 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 2050 1778 … … 2071 1799 *vseg = (vseg_t *)(intptr_t)rpc.args[8]; 2072 1800 2073 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2074 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2075 CURRENT_THREAD->core->lid , hal_time_stamp() );2076 1801 } 2077 1802 … … 2079 1804 void rpc_vmm_create_vseg_server( xptr_t xp ) 2080 1805 { 2081 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2082 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2083 CURRENT_THREAD->core->lid , hal_time_stamp() );2084 2085 1806 // get client cluster identifier and pointer on RPC descriptor 2086 1807 cxy_t cxy = GET_CXY( xp ); … … 2110 1831 hal_remote_swd( XPTR( cxy , &desc->args[8] ) , (uint64_t)(intptr_t)vseg ); 2111 1832 2112 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2113 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2114 CURRENT_THREAD->core->lid , hal_time_stamp() );2115 1833 } 2116 1834 … … 2123 1841 lid_t lid) 2124 1842 { 2125 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2126 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2127 CURRENT_THREAD->core->lid , hal_time_stamp() );2128 2129 1843 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 2130 1844 … … 2141 1855 rpc_send( cxy , &rpc ); 2142 1856 2143 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2144 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2145 CURRENT_THREAD->core->lid , hal_time_stamp() );2146 1857 } 2147 1858 … … 2149 1860 void rpc_sched_display_server( xptr_t xp ) 2150 1861 { 2151 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2152 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2153 CURRENT_THREAD->core->lid , hal_time_stamp() );2154 2155 1862 // get client cluster identifier and pointer on RPC descriptor 2156 1863 cxy_t cxy = GET_CXY( xp ); … … 2163 1870 sched_display( lid ); 2164 1871 2165 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2166 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2167 CURRENT_THREAD->core->lid , hal_time_stamp() );2168 1872 } 2169 1873 … … 2176 1880 process_t * process ) 2177 1881 { 2178 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2179 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2180 CURRENT_THREAD->core->lid , hal_time_stamp() );2181 2182 1882 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 2183 1883 … … 2194 1894 rpc_send( cxy , &rpc ); 2195 1895 2196 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2197 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2198 CURRENT_THREAD->core->lid , hal_time_stamp() );2199 1896 } 2200 1897 … … 2202 1899 void rpc_vmm_set_cow_server( xptr_t xp ) 2203 1900 { 2204 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2205 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2206 CURRENT_THREAD->core->lid , hal_time_stamp() );2207 2208 1901 process_t * process; 2209 1902 … … 2218 1911 vmm_set_cow( process ); 2219 1912 2220 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2221 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2222 CURRENT_THREAD->core->lid , hal_time_stamp() );2223 1913 } 2224 1914 … … 2232 1922 bool_t detailed ) 2233 1923 { 2234 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2235 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2236 CURRENT_THREAD->core->lid , hal_time_stamp() );2237 2238 1924 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 2239 1925 … … 2251 1937 rpc_send( cxy , &rpc ); 2252 1938 2253 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",2254 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2255 CURRENT_THREAD->core->lid , hal_time_stamp() );2256 1939 } 2257 1940 … … 2259 1942 void rpc_vmm_display_server( xptr_t xp ) 2260 1943 { 2261 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",2262 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy,2263 CURRENT_THREAD->core->lid , hal_time_stamp() );2264 2265 1944 process_t * process; 2266 1945 bool_t detailed; … … 2277 1956 vmm_display( process , detailed ); 2278 1957 2279 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 2280 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 2281 CURRENT_THREAD->core->lid , hal_time_stamp() ); 2282 } 2283 2284 1958 } 1959 1960
Note: See TracChangeset
for help on using the changeset viewer.