- Timestamp:
- May 6, 2019, 1:28:01 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/fs/fatfs.c
r627 r628 442 442 443 443 ////////////////////////////////////////////////////////////////////////////////////////// 444 // This static function is called by both the fatfs_free_clusters_increment(), 445 // and the fatfs_free_cluster_decrement() functions defined below. 446 // It synchronously updates the "free_clusters" and "free_cluster_hint" variables 447 // in FS_INFO sector on the IOC device, each times these variables are modified. 448 ////////////////////////////////////////////////////////////////////////////////////////// 449 // @ fatfs_ctx_xp : extended pointer on fatfs context in FAT cluster. 450 // @ free_clusters : new free_clusters value. 451 // @ free_cluster_hint : new free_cluster_hint value. 444 // This static function synchronously updates the FAT on IOC device. 445 // It scan the FAT mapper to copy on IOC device all dirty pages in the interval 446 // defined by the <page_min> & <page_max> arguments. 447 // It can be called by a thread running in any cluster. 448 // WARNING : We don't take the lock protecting the FAT mapper, because the FAT lock 449 // (in FATFS context) must be taken by the calling function. 450 ////////////////////////////////////////////////////////////////////////////////////////// 451 // @ fatfs_ctx_xp : extended pointer on FATFS context in FAT cluster. 452 // @ page_min : first page to be checked. 453 // @ page_max : last page to be checked 452 454 // @ return 0 if success, return -1 if the FS_INFO sector cannot be updated. 453 455 ////////////////////////////////////////////////////////////////////////////////////////// 454 static error_t fatfs_free_clusters_update_ioc( xptr_t fatfs_ctx_xp, 455 uint32_t free_clusters, 456 uint32_t free_cluster_hint ) 456 static error_t fatfs_update_ioc_fat( xptr_t fatfs_ctx_xp, 457 uint32_t page_min, 458 uint32_t page_max ) 459 { 460 461 #if DEBUG_FATFS_UPDATE_IOC 462 uint32_t cycle = (uint32_t)hal_get_cycles(); 463 thread_t * this = CURRENT_THREAD; 464 if( DEBUG_FATFS_UPDATE_IOC < cycle ) 465 printk("\n[%s] thread[%x,%x] enter / page_min %d / page_max %d / cycle %d\n", 466 __FUNCTION__ , this->process->pid, this->trdid, page_min, page_max, cycle ); 467 #endif 468 469 error_t error; 470 cxy_t fat_cxy; // FAT cluster identifier 471 fatfs_ctx_t * fatfs_ctx; // local pointer on FATFS context in FAT cluster 472 xptr_t fat_mapper_xp; // extended pointer on FAT mapper 473 mapper_t * fat_mapper_ptr; // local pointer on FAT mapper 474 uint32_t page_id; // current page index in FAT mapper 475 xptr_t rt_xp; // extended pointer on FAT mapper radix tree 476 xptr_t page_xp; // extended pointer on current page in FAT mapper 477 page_t * page_ptr; // local pointer on current page 478 uint32_t flags; // current page flags 479 480 // get pointer and cluster on FATFS context in FAT cluster 481 fat_cxy = GET_CXY( fatfs_ctx_xp ); 482 fatfs_ctx = GET_PTR( fatfs_ctx_xp ); 483 484 // get FAT mapper pointers from FATFS context 485 fat_mapper_xp = hal_remote_l64( XPTR( fat_cxy , &fatfs_ctx->fat_mapper_xp ) ); 486 fat_mapper_ptr = GET_PTR( fat_mapper_xp ); 487 488 // check FAT cluster 489 assert( (fat_cxy == GET_CXY( fat_mapper_xp )) , "unconsistent FAT cluster" ); 490 491 // build extended pointer on FAT mapper radix tree 492 rt_xp = XPTR( fat_cxy , &fat_mapper_ptr->rt ); 493 494 // scan all pages in [min,max] interval 495 for( page_id = page_min ; page_id <= page_max ; page_id++ ) 496 { 497 // get extended pointer on page descriptor from FAT mapper 498 page_xp = grdxt_remote_lookup( rt_xp , page_id ); 499 500 // check only existing pages 501 if ( page_xp != XPTR_NULL ) 502 { 503 page_ptr = GET_PTR( page_xp ); 504 flags = hal_remote_l32( XPTR( fat_cxy , &page_ptr->flags ) ); 505 506 // copy only dirty pages 507 if ( flags & PG_DIRTY ) 508 { 509 510 #if (DEBUG_FATFS_UPDATE_IOC & 1) 511 if( DEBUG_FATFS_UPDATE_IOC < cycle ) 512 printk("\n[%s] thread[%x,%x] copy page %d from FAT mapper to IOC device\n", 513 __FUNCTION__, page_id ); 514 #endif 515 // move page from mapper to device 516 error = fatfs_move_page( page_xp , IOC_SYNC_WRITE ); 517 518 if ( error ) return -1; 519 520 // reset page dirty flag 521 ppm_page_undo_dirty( page_xp ); 522 } 523 } 524 } // end loop on pages 525 526 #if DEBUG_FATFS_UPDATE_IOC 527 cycle = (uint32_t)hal_get_cycles(); 528 if( DEBUG_FATFS_UPDATE_IOC < cycle ) 529 printk("\n[%s] thread[%x,%x] exit / cycle %d\n", 530 __FUNCTION__ , this->process->pid, this->trdid, cycle ); 531 #endif 532 533 return 0; 534 535 } // end fatfs_update_ioc_fat() 536 537 ////////////////////////////////////////////////////////////////////////////////////////// 538 // This static function synchronously updates the FS_INFO sector on IOC device, 539 // from values contained in the FATFS context in FAT cluster. 540 // It uses and updates the FS_INFO buffer allocated in the FAT cluster. 541 // It can be called by a thread running in any cluster. 542 ////////////////////////////////////////////////////////////////////////////////////////// 543 // @ fatfs_ctx_xp : extended pointer on FATFS context in FAT cluster. 544 // @ return 0 if success, return -1 if the FS_INFO sector cannot be updated. 545 ////////////////////////////////////////////////////////////////////////////////////////// 546 static error_t fatfs_update_ioc_fsinfo( xptr_t fatfs_ctx_xp ) 457 547 { 458 548 cxy_t fat_cxy; // FAT cluster identifier 459 549 fatfs_ctx_t * fatfs_ctx_ptr; // local pointer on fatfs context in FAT cluster 550 uint32_t free_clusters; // current vale of "free_clusters" in fatfs context 551 uint32_t free_cluster_hint; // current vale of "free_cluster_hint" in fatfs context 460 552 uint8_t * fs_info_buffer_ptr; // local pointer on FS_INFO buffer in FAT cluster 461 553 xptr_t fs_info_buffer_xp; // extended pointer on FS_INFO buffer in FAT cluster … … 466 558 fatfs_ctx_ptr = GET_PTR( fatfs_ctx_xp ); 467 559 468 // get pointers on FS_INFO buffer in FAT cluster 560 // force FATFS context update 561 hal_fence(); 562 563 // get relevant info from fatfs context in FAT cluster 564 fs_info_lba = hal_remote_l32( XPTR( fat_cxy , &fatfs_ctx_ptr->fs_info_lba ) ); 565 free_clusters = hal_remote_l32( XPTR( fat_cxy , &fatfs_ctx_ptr->free_clusters ) ); 566 free_cluster_hint = hal_remote_l32( XPTR( fat_cxy , &fatfs_ctx_ptr->free_cluster_hint ) ); 469 567 fs_info_buffer_ptr = hal_remote_lpt( XPTR( fat_cxy , &fatfs_ctx_ptr->fs_info_buffer ) ); 568 569 // build extended pointer on FS_INFO buffer in FAT cluster 470 570 fs_info_buffer_xp = XPTR( fat_cxy , fs_info_buffer_ptr ); 471 472 // get lba of FS_INFO sector on IOC device from fatfs context 473 fs_info_lba = hal_remote_l32( XPTR( fat_cxy , &fatfs_ctx_ptr->fs_info_lba ) ); 474 571 475 572 // update the FS_INFO buffer in FAT cluster 476 573 fatfs_set_remote_record( FS_FREE_CLUSTERS , fs_info_buffer_xp , free_clusters ); … … 480 577 return dev_ioc_sync_write( fs_info_buffer_xp , fs_info_lba , 1 ); 481 578 482 } // fatfs_free_clusters_update_ioc()579 } // end fatfs_update_ioc_fsinfo() 483 580 484 581 ////////////////////////////////////////////////////////////////////////////////////////// … … 488 585 // It scan all slots in the FAT mapper seen as an array of 32 bits words, looking for the 489 586 // first free slot larger than the <cluster> argument, to update "free_cluster_hint". 490 // It calls the fatfs_free_clusters_update_ioc() function to synchronously update the 491 // FS_INFO sector on the IOC device. It can be called by a thead running in any cluster. 492 // 493 // WARNING : The lock protecting exclusive access to these variables 494 // must be taken by the calling function. 587 // It synchronously updates the FS_INFO sector on the IOC device. 588 // It can be called by a thead running in any cluster. 589 // The lock protecting exclusive access to the FAT must be taken by the calling function. 495 590 ////////////////////////////////////////////////////////////////////////////////////////// 496 591 // @ fatfs_ctx_xp : extended pointer on FATFS context in FAT cluster. … … 502 597 { 503 598 error_t error; 504 cxy_t fat_cxy; // FAT cluster identifier505 fatfs_ctx_t * fat_ctx_ptr; // local pointer on fatfs context in FAT cluster506 xptr_t mapper_xp;// extended pointer on FAT mapper507 xptr_t hint_xp; // extended pointer on "free_cluster_hint" shared variable508 xptr_t numb_xp; // extended pointer on "free_clusters" shared variable509 uint32_t numb; // "free_clusters" variable current value510 uint32_t hint; // "free_cluster_hint" variable current value511 uint32_t page_id; // page index in FAT mapper512 uint32_t slot_id; // slot index in one page of FAT (1024 slots per page)513 uint32_t page_max; // max number of pages in FAT mapper514 xptr_t page_xp; // extended pointer on current page in FAT mapper515 xptr_t base_xp; // extended pointer on current page base516 xptr_t slot_xp; // extended pointer on current slot in FAT mapper599 cxy_t fat_cxy; // FAT cluster identifier 600 fatfs_ctx_t * fat_ctx_ptr; // local pointer on fatfs context in FAT cluster 601 xptr_t fat_mapper_xp; // extended pointer on FAT mapper 602 xptr_t hint_xp; // extended pointer on "free_cluster_hint" shared variable 603 xptr_t numb_xp; // extended pointer on "free_clusters" shared variable 604 uint32_t numb; // "free_clusters" variable current value 605 uint32_t hint; // "free_cluster_hint" variable current value 606 uint32_t page_id; // page index in FAT mapper 607 uint32_t slot_id; // slot index in one page of FAT (1024 slots per page) 608 uint32_t page_max; // max number of pages in FAT mapper 609 xptr_t page_xp; // extended pointer on current page in FAT mapper 610 xptr_t base_xp; // extended pointer on current page base 611 xptr_t slot_xp; // extended pointer on current slot in FAT mapper 517 612 518 613 #if DEBUG_FATFS_FREE_CLUSTERS … … 537 632 538 633 // get extended pointer on FAT mapper 539 mapper_xp = hal_remote_l64( XPTR( fat_cxy , &fat_ctx_ptr->fat_mapper_xp ) );634 fat_mapper_xp = hal_remote_l64( XPTR( fat_cxy , &fat_ctx_ptr->fat_mapper_xp ) ); 540 635 541 636 // initialise variables to scan the FAT mapper … … 549 644 { 550 645 // get current page from mapper 551 page_xp = mapper_remote_get_page( mapper_xp , page_id );646 page_xp = mapper_remote_get_page( fat_mapper_xp , page_id ); 552 647 553 648 if( page_xp == XPTR_NULL ) … … 574 669 575 670 // update FS_INFO sector on IOC device 576 error = fatfs_free_clusters_update_ioc( fatfs_ctx_xp , numb , hint ); 671 error = fatfs_update_ioc_fat( fatfs_ctx_xp, 672 page_id, 673 page_id ); 577 674 578 675 if( error ) … … 585 682 cycle = (uint32_t)hal_get_cycles(); 586 683 if( DEBUG_FATFS_FREE_CLUSTERS < (uint32_t)hal_get_cycles() ) 587 printk("\n[%s] thread[%x,%x] updated free cluster info / hint %x / number %x\n",684 printk("\n[%s] thread[%x,%x] exit / hint %x / free %x / cycle %d\n", 588 685 __FUNCTION__, this->process->pid, this->trdid, 589 hal_remote_l32(hint_xp), hal_remote_l32(numb_xp) );686 hal_remote_l32(hint_xp), hal_remote_l32(numb_xp), cycle ); 590 687 #endif 591 688 return 0; … … 612 709 // This static function increments the "free_clusters" variable, and updates the 613 710 // "free_cluster_hint" variables in the FATFS context in FAT cluster, identified 614 // by the <fat_ctx_xp> argument, when a cluster is released to FAT.711 // by the <fat_ctx_xp> argument, when a FATFS cluster is released. 615 712 // If the released cluster index is smaller than the current (hint) value, 616 713 // it set "free_cluster_hint" <= cluster. 617 // It calls the fatfs_free_clusters_update_ioc() function to synchronously update the 618 // FS_INFO sector on the IOC device. It can be called by a thead running in any cluster. 619 // 620 // WARNING : The lock protecting exclusive access to these variables 621 // must be taken by the calling function. 714 // It does NOT update the FS_INFO sector on the IOC device. 715 // It can be called by a thead running in any cluster. 716 // The lock protecting exclusive access to the FAT must be taken by the calling function. 622 717 ////////////////////////////////////////////////////////////////////////////////////////// 623 718 // @ fatfs_ctx_xp : extended pointer on FATFS context in FAT cluster. … … 665 760 666 761 // update FS_INFO sector on IOC device 667 error = fatfs_ free_clusters_update_ioc( fatfs_ctx_xp , numb , hint);762 error = fatfs_update_ioc_fsinfo( fatfs_ctx_xp ); 668 763 669 764 if( error ) … … 674 769 675 770 #if DEBUG_FATFS_FREE_CLUSTERS 676 thread_t * this = CURRENT_THREAD;771 cycle = (uint32_t)hal_get_cycles(); 677 772 if( DEBUG_FATFS_FREE_CLUSTERS < (uint32_t)hal_get_cycles() ) 678 printk("\n[%s] thread[%x,%x] updated free cluster info : hint %x / number %x\n",773 printk("\n[%s] thread[%x,%x] exit / hint %x / free %x / cycle %d\n", 679 774 __FUNCTION__, this->process->pid, this->trdid, 680 hal_remote_l32( hint_xp ), hal_remote_l32( numb_xp ) );775 hal_remote_l32( hint_xp ), hal_remote_l32( numb_xp ), cycle ); 681 776 #endif 682 777 … … 686 781 687 782 ////////////////////////////////////////////////////////////////////////////////////////// 688 // This recursive function is called by the generic function fatfs_release_all_clusters() 689 // It release all clusters allocated to a given inode in the FAT mapper. 690 // The removal is done in reverse order of the linked list (from last to first). 691 // It does NOT update the FS on the IOC device. 692 ////////////////////////////////////////////////////////////////////////////////////////// 693 // @ mapper_cxy : FAT mapper cluster identifier. 694 // @ mapper_ptr : local pointer on FAT mapper. 695 // @ fatfs_ctx : local pointer on FATFS context in FAT cluster. 696 // @ cluster : index of cluster to be released from FAT mapper. 697 // @ return 0 if success / return -1 if error (cannot access FAT) 698 ////////////////////////////////////////////////////////////////////////////////////////// 699 static error_t fatfs_recursive_release( cxy_t mapper_cxy, 700 mapper_t * mapper_ptr, 701 fatfs_ctx_t * fatfs_ctx, 702 uint32_t cluster ) 703 { 704 uint32_t next; 705 706 // build extended pointer on FAT mapper 707 xptr_t mapper_xp = XPTR( mapper_cxy , mapper_ptr ); 783 // This recursive function is called by the generic function fatfs_release_inode(). 784 // It release all FATFS clusters allocated to a given inode to the FAT mapper. 785 // It can be called by a thread running in any cluster, as it use remote pointers 786 // to access both the FAT mapper and the FATFS context in the FAT cluster, defined 787 // by the <fat_mapper_xp> and <fatfs_ctx_xp> arguments. 788 // The removal is done in reverse order of the linked list (from last cluster to first). 789 // It returns in the <dirty_page_min> and <dirty_page_max> buffers the indexes of the 790 // modified pages in the FAT mapper. 791 // It updates the FAT mapper and the free_cluster info in the FATFS context, but does NOT 792 // update the FAT and the FS_INFO on IOC device. 793 ////////////////////////////////////////////////////////////////////////////////////////// 794 // @ fat_mapper_xp : [in] extended pointer on FAT mapper. 795 // @ fatfs_ctx_xp : [in] extended pointer on FATFS context in FAT cluster. 796 // @ cluster : [in] index of cluster to be released from FAT mapper. 797 // @ dirty_page_min : [out] pointer on buffer for min dirty page index. 798 // @ dirty_page_max : [out] pointer on buffer for max dirty page index. 799 // @ return 0 if success / return -1 if error. 800 ////////////////////////////////////////////////////////////////////////////////////////// 801 static error_t fatfs_recursive_release( xptr_t fat_mapper_xp, 802 xptr_t fatfs_ctx_xp, 803 uint32_t cluster, 804 uint32_t * dirty_page_min, 805 uint32_t * dirty_page_max ) 806 { 807 uint32_t next; // next cluster index 808 uint32_t page_id; // page index in FAT mapper 809 uint32_t word_id; // word index in page 810 811 // get page index and word index from cluster 812 page_id = cluster >> 10; 813 word_id = cluster & 0x3FF; 708 814 709 815 // get next cluster index from FAT mapper 710 if ( mapper_remote_get_32( mapper_xp, 711 cluster, 816 if ( mapper_remote_get_32( fat_mapper_xp, 817 page_id, 818 word_id, 712 819 &next ) ) return -1; 713 820 … … 722 829 { 723 830 // call fatfs_recursive_release() on next cluster 724 if ( fatfs_recursive_release( mapper_cxy, 725 mapper_ptr, 726 fatfs_ctx, 727 next ) ) return -1; 831 if ( fatfs_recursive_release( fat_mapper_xp, 832 fatfs_ctx_xp, 833 next, 834 dirty_page_min, 835 dirty_page_max ) ) return -1; 728 836 } 729 837 730 // update current cluster in FAT mapper 731 if ( mapper_remote_set_32( mapper_xp, 732 cluster, 838 // update FAT mapper 839 if ( mapper_remote_set_32( fat_mapper_xp, 840 page_id, 841 word_id, 733 842 FREE_CLUSTER ) ) return -1; 734 843 735 // Update free_cluster info in FATFS context and in FS_INFO sector 736 return fatfs_free_clusters_increment( XPTR( mapper_cxy , fatfs_ctx ) , cluster ); 844 // update dirty_page_min / dirty_page_max buffers 845 if( page_id < *dirty_page_min ) *dirty_page_min = page_id; 846 if( page_id > *dirty_page_max ) *dirty_page_max = page_id; 847 848 // Update free_cluster info in FATFS context 849 return fatfs_free_clusters_increment( fatfs_ctx_xp , cluster ); 737 850 738 851 } // end fatfs_recursive_release() … … 1109 1222 fatfs_ctx->fs_info_buffer = buffer; 1110 1223 1111 remote_rwlock_init( XPTR( local_cxy , &fatfs_ctx->lock ) , LOCK_FATFS_F REE);1224 remote_rwlock_init( XPTR( local_cxy , &fatfs_ctx->lock ) , LOCK_FATFS_FAT ); 1112 1225 1113 1226 #if (DEBUG_FATFS_CTX_INIT & 0x1) … … 1760 1873 error_t error; 1761 1874 1762 char dir_name[CONFIG_VFS_MAX_NAME_LENGTH];1875 char dir_name[CONFIG_VFS_MAX_NAME_LENGTH]; 1763 1876 1764 1877 // check arguments … … 2158 2271 } // end fatfs_sync_inode() 2159 2272 2273 2274 2275 2276 2277 2160 2278 ////////////////////////////// 2161 2279 error_t fatfs_sync_fat( void ) … … 2278 2396 ioc_free_cluster_hint = fatfs_get_remote_record( FS_FREE_CLUSTER_HINT , tmp_buf_xp ); 2279 2397 2398 #if DEBUG_FATFS_SYNC_FSINFO 2399 if( DEBUG_FATFS_SYNC_FSINFO < cycle ) 2400 printk("\n[%s] thread[%x,%x] / ctx_free %x / ioc_free %x / ctx_hint %x / ioc_hint %x\n", 2401 __FUNCTION__ , this->process->pid, this->trdid, 2402 ctx_free_clusters, ioc_free_clusters, ctx_free_cluster_hint, ioc_free_cluster_hint ); 2403 #endif 2404 2280 2405 // check values 2281 2406 if( (ioc_free_clusters != ctx_free_clusters) || … … 2327 2452 fatfs_ctx_t * loc_fatfs_ctx; // local pointer on local FATFS context 2328 2453 fatfs_ctx_t * fat_fatfs_ctx; // local pointer on FATFS context in FAT cluster 2329 xptr_t mapper_xp;// extended pointer on FAT mapper2454 xptr_t fat_mapper_xp; // extended pointer on FAT mapper 2330 2455 cxy_t fat_cxy; // Fat mapper cluster identifier 2331 2456 xptr_t page_xp; // extended pointer on current page descriptor in mapper … … 2350 2475 2351 2476 // get extended pointer on FAT mapper 2352 mapper_xp = loc_fatfs_ctx->fat_mapper_xp;2477 fat_mapper_xp = loc_fatfs_ctx->fat_mapper_xp; 2353 2478 2354 2479 // get FAT cluster 2355 fat_cxy = GET_CXY( mapper_xp );2480 fat_cxy = GET_CXY( fat_mapper_xp ); 2356 2481 2357 2482 // get local pointer on FATFS context in FAT cluster … … 2394 2519 2395 2520 // get relevant page descriptor from FAT mapper 2396 page_xp = mapper_remote_get_page( mapper_xp , page_id );2521 page_xp = mapper_remote_get_page( fat_mapper_xp , page_id ); 2397 2522 2398 2523 if( page_xp == XPTR_NULL ) … … 2427 2552 hal_remote_s32( slot_xp , END_OF_CHAIN_CLUSTER_MAX ); 2428 2553 2429 // synchronously update FAT on device 2554 // we don't mark the FAT mapper page as dirty, 2555 // because we synchronously update FAT on IOC device 2430 2556 error = fatfs_move_page( page_xp , IOC_SYNC_WRITE ); 2431 2557 … … 2457 2583 vfs_ctx_t * vfs_ctx; // local pointer on VFS context (same in all clusters). 2458 2584 fatfs_ctx_t * loc_fatfs_ctx; // local pointer on local FATFS context 2459 fatfs_ctx_t * fat_fatfs_ctx; // local pointer on FATFS context in FAT cluster 2460 xptr_t mapper_xp; // extended pointer on FAT mapper 2461 cxy_t mapper_cxy; // Fat mapper cluster identifier 2462 mapper_t * mapper_ptr; // local pointer on FAT mapper 2463 xptr_t lock_xp; // extended pointer on lock protecting free clusters info. 2585 cxy_t fat_cxy; // FAT cluster identifier 2586 xptr_t fatfs_ctx_xp; // extended pointer on FATFS context in FAT cluster 2587 fatfs_ctx_t * fatfs_ctx_ptr; // local pointer on FATFS context in FAT cluster 2588 xptr_t fat_mapper_xp; // extended pointer on FAT mapper 2589 mapper_t * fat_mapper_ptr; // local pointer on FAT mapper 2590 xptr_t lock_xp; // extended pointer on lock protecting FAT. 2464 2591 xptr_t first_xp; // extended pointer on inode extension 2465 2592 uint32_t first_cluster; // first cluster index for released inode 2466 2593 vfs_inode_t * inode_ptr; // local pointer on target inode 2467 2594 cxy_t inode_cxy; // target inode cluster identifier 2595 error_t error; 2468 2596 2469 2597 // check inode pointer … … 2491 2619 #endif 2492 2620 2493 #if (DEBUG_FATFS_RELEASE_INODE & 1)2494 fatfs_display_fat( 0 , 512 );2495 #endif2496 2497 2621 // get local pointer on VFS context (same in all clusters) 2498 2622 vfs_ctx = &fs_context[FS_TYPE_FATFS]; … … 2501 2625 loc_fatfs_ctx = vfs_ctx->extend; 2502 2626 2503 // get pointers and clusteron FAT mapper2504 mapper_xp = loc_fatfs_ctx->fat_mapper_xp;2505 mapper_cxy = GET_CXY(mapper_xp );2506 mapper_ptr = GET_PTR(mapper_xp );2627 // get pointers on FAT mapper 2628 fat_mapper_xp = loc_fatfs_ctx->fat_mapper_xp; 2629 fat_cxy = GET_CXY( fat_mapper_xp ); 2630 fat_mapper_ptr = GET_PTR( fat_mapper_xp ); 2507 2631 2508 // get local pointer on FATFS context in FAT cluster 2509 fat_fatfs_ctx = hal_remote_lpt( XPTR( mapper_cxy , &vfs_ctx->extend ) ); 2632 // get pointers on FATFS context in FAT cluster 2633 fatfs_ctx_ptr = hal_remote_lpt( XPTR( fat_cxy , &vfs_ctx->extend ) ); 2634 fatfs_ctx_xp = XPTR( fat_cxy , fatfs_ctx_ptr ); 2510 2635 2511 2636 // get extended pointer on FAT lock in FAT cluster 2512 lock_xp = XPTR( mapper_cxy , &fat_fatfs_ctx->lock );2637 lock_xp = XPTR( fat_cxy , &fatfs_ctx_ptr->lock ); 2513 2638 2514 2639 // take FAT lock in write mode 2515 2640 remote_rwlock_wr_acquire( lock_xp ); 2516 2641 2642 #if (DEBUG_FATFS_RELEASE_INODE & 0x11 == 0x11) 2643 mapper_display_page( fat_mapper_xp , 0 , 4096 ); 2644 #endif 2645 2517 2646 // call the recursive function to release all clusters from FAT mapper 2518 if ( fatfs_recursive_release( mapper_cxy, 2519 mapper_ptr, 2520 fat_fatfs_ctx, 2521 first_cluster ) ) 2647 uint32_t dirty_page_min = 0xFFFFFFFF; 2648 uint32_t dirty_page_max = 0; 2649 2650 if ( fatfs_recursive_release( fat_mapper_xp, 2651 fatfs_ctx_xp, 2652 first_cluster, 2653 &dirty_page_min, 2654 &dirty_page_max ) ) 2522 2655 { 2523 2656 printk("\n[ERROR] in %s : cannot update FAT mapper\n", __FUNCTION__ ); … … 2531 2664 #endif 2532 2665 2666 #if (DEBUG_FATFS_RELEASE_INODE & 0x11 == 0x11) 2667 mapper_display_page( fat_mapper_xp , 0 , 4096 ); 2668 #endif 2669 2533 2670 // update FAT on IOC device (from FAT mapper) 2534 if ( fatfs_sync_fat() ) 2535 { 2536 printk("\n[ERROR] in %s : cannot update FAT on device\n", __FUNCTION__ ); 2671 error = fatfs_update_ioc_fat( fatfs_ctx_xp, 2672 dirty_page_min, 2673 dirty_page_max ); 2674 2675 if( error ) 2676 { 2677 printk("\n[ERROR] in %s : cannot update FAT on IOC device\n", __FUNCTION__ ); 2537 2678 remote_rwlock_wr_release( lock_xp ); 2538 2679 return -1; … … 2544 2685 #endif 2545 2686 2546 // update FS-INFO sector on IOC device (from FATFS context) 2547 if ( fatfs_sync_free_info() ) 2548 { 2549 printk("\n[ERROR] in %s: cannot update FS_INFO on device\n", __FUNCTION__ ); 2687 // update FS-INFO on IOC device (from FATFS context) 2688 error = fatfs_update_ioc_fsinfo( fatfs_ctx_xp ); 2689 2690 if( error ) 2691 { 2692 printk("\n[ERROR] in %s: cannot update FSINFO on IOC device\n", __FUNCTION__ ); 2550 2693 remote_rwlock_wr_release( lock_xp ); 2551 2694 return -1; 2552 2695 } 2696 2697 #if (DEBUG_FATFS_RELEASE_INODE & 1) 2698 if( DEBUG_FATFS_RELEASE_INODE < cycle ) 2699 printk("\n[%s] updated FS_INFO on IOC device for >%s>\n", __FUNCTION__, name ); 2700 #endif 2553 2701 2554 2702 // release FAT lock -
trunk/kernel/fs/fatfs.h
r627 r628 180 180 * functions to modify the FAT in both the FAT mapper and on IOC device. 181 181 * 182 * WARNING é : Almost all fields are constant values, but the <free_cluster_hint>, 183 * <free_clusters> and <lock> are shared variables. The <fs_info_buffer>, only 184 * allocated in cluster 0, contains a copy of the FS_INFO sector. It is used by all 185 * kernel instances to synchronously update the free clusters info on IOC device. 186 * For these four variables, all kernel instances must use the values in cluster 0, 187 * containing the FAT mapper. 182 * WARNING 2 : Most fields are constant values, but the <free_cluster_hint>, 183 * <free_clusters>, <dirty_page_min>, <dirty_page_max>, <lock>, and the <fs_info_buffer> 184 * are shared variables, that can be modified by any thread running in any cluster. 185 * The <fs_info_buffer> contains a copy of the FS_INFO sector, and is only allocated in 186 * the FAT cluster (i.e. in cluster 0). It is used by all to synchronously update the 187 * free clusters info on IOC device. 188 * => For all these variables, only the values stored in the FAT cluster must be used. 188 189 ****************************************************************************************/ 189 190 … … 201 202 202 203 /* shared variables (only the copy in FAT cluster must be used) */ 204 uint32_t dirty_page_min; /*! min dirty page index in FAT mapper */ 205 uint32_t dirty_page_max; /*! max dirty page index in FAT mapper */ 203 206 uint32_t free_cluster_hint; /*! cluster[hint+1] is the first free */ 204 207 uint32_t free_clusters; /*! free clusters number */ -
trunk/kernel/fs/vfs.c
r626 r628 815 815 assert( (inode_type == INODE_TYPE_FILE), "bad inode type" ); 816 816 817 // get mapper pointer and file offset from file descriptor 818 file_offset = hal_remote_l32( XPTR( file_cxy , &file_ptr->offset ) ); 819 mapper = hal_remote_lpt( XPTR( file_cxy , &file_ptr->mapper ) ); 820 817 821 #if DEBUG_VFS_USER_MOVE 818 822 char name[CONFIG_VFS_MAX_NAME_LENGTH]; … … 824 828 { 825 829 if( to_buffer ) 826 printk("\n[%s] thread[%x,%x] enter / %d bytes / map per(%s) -> buffer(%x)/ cycle %d\n",827 __FUNCTION__ , this->process->pid, this->trdid, size, name, buffer, cycle );830 printk("\n[%s] thread[%x,%x] enter / %d bytes / map(%s) -> buf(%x) / offset %d / cycle %d\n", 831 __FUNCTION__ , this->process->pid, this->trdid, size, name, buffer, file_offset, cycle ); 828 832 else 829 printk("\n[%s] thread[%x,%x] enter / %d bytes / buf fer(%x) -> mapper(%s)/ cycle %d\n",830 __FUNCTION__ , this->process->pid, this->trdid, size, buffer, name, cycle );833 printk("\n[%s] thread[%x,%x] enter / %d bytes / buf(%x) -> map(%s) / offset %d / cycle %d\n", 834 __FUNCTION__ , this->process->pid, this->trdid, size, buffer, name, file_offset, cycle ); 831 835 } 832 836 #endif 833 834 // get mapper pointer and file offset from file descriptor835 file_offset = hal_remote_l32( XPTR( file_cxy , &file_ptr->offset ) );836 mapper = hal_remote_lpt( XPTR( file_cxy , &file_ptr->mapper ) );837 837 838 838 // move data between mapper and buffer … … 856 856 { 857 857 if( to_buffer ) 858 printk("\n[%s] thread[%x,%x] exit / %d bytes / mapper(%s) -> buffer(%x) /cycle %d\n",859 __FUNCTION__ , this->process->pid, this->trdid, size, name, buffer,cycle );858 printk("\n[%s] thread[%x,%x] exit / cycle %d\n", 859 __FUNCTION__ , this->process->pid, cycle ); 860 860 else 861 printk("\n[%s] thread[%x,%x] exit / %d bytes / buffer(%x) -> mapper(%s) /cycle %d\n",862 __FUNCTION__ , this->process->pid, this->trdid, size, buffer, name,cycle );861 printk("\n[%s] thread[%x,%x] exit / cycle %d\n", 862 __FUNCTION__ , this->process->pid, cycle ); 863 863 } 864 864 #endif … … 2538 2538 #if (DEBUG_VFS_LOOKUP & 1) 2539 2539 if( DEBUG_VFS_LOOKUP < cycle ) 2540 printk("\n[%s] thread[%x,%x] look for<%s> in <%s> / last = %d\n",2540 printk("\n[%s] thread[%x,%x] search <%s> in <%s> / last = %d\n", 2541 2541 __FUNCTION__, process->pid, this->trdid, name, pathname, last ); 2542 2542 #endif -
trunk/kernel/kern/kernel_init.c
r626 r628 162 162 "PROCESS_USERSYNC", // 26 163 163 "PROCESS_FDARRAY", // 27 164 " FATFS_FREE",// 28165 " PROCESS_DIR",// 29164 "PROCESS_DIR", // 28 165 "unused_29", // 29 166 166 167 167 "PROCESS_THTBL", // 30 … … 173 173 "VMM_GPT", // 35 174 174 "VFS_MAIN", // 36 175 "FATFS_FAT", // 37 175 176 }; 176 177 -
trunk/kernel/kern/rpc.c
r625 r628 1735 1735 error_t * error ) // out 1736 1736 { 1737 #if DEBUG_RPC_VFS_FS_ GET_DENTRY1738 thread_t * this = CURRENT_THREAD; 1739 uint32_t cycle = (uint32_t)hal_get_cycles(); 1740 if( cycle > DEBUG_RPC_VFS_FS_ GET_DENTRY )1737 #if DEBUG_RPC_VFS_FS_NEW_DENTRY 1738 thread_t * this = CURRENT_THREAD; 1739 uint32_t cycle = (uint32_t)hal_get_cycles(); 1740 if( cycle > DEBUG_RPC_VFS_FS_NEW_DENTRY ) 1741 1741 printk("\n[%s] thread[%x,%x] on core %d enter / cycle %d\n", 1742 1742 __FUNCTION__, this->process->pid, this->trdid, this->core->lid , cycle ); … … 1747 1747 // initialise RPC descriptor header 1748 1748 rpc_desc_t rpc; 1749 rpc.index = RPC_VFS_FS_ GET_DENTRY;1749 rpc.index = RPC_VFS_FS_NEW_DENTRY; 1750 1750 rpc.blocking = true; 1751 1751 rpc.rsp = &responses; … … 1762 1762 *error = (error_t)rpc.args[3]; 1763 1763 1764 #if DEBUG_RPC_VFS_FS_ GET_DENTRY1765 cycle = (uint32_t)hal_get_cycles(); 1766 if( cycle > DEBUG_RPC_VFS_FS_ GET_DENTRY )1764 #if DEBUG_RPC_VFS_FS_NEW_DENTRY 1765 cycle = (uint32_t)hal_get_cycles(); 1766 if( cycle > DEBUG_RPC_VFS_FS_NEW_DENTRY ) 1767 1767 printk("\n[%s] thread[%x,%x] on core %d exit / cycle %d\n", 1768 1768 __FUNCTION__, this->process->pid, this->trdid, this->core->lid , cycle ); … … 1773 1773 void rpc_vfs_fs_new_dentry_server( xptr_t xp ) 1774 1774 { 1775 #if DEBUG_RPC_VFS_FS_ GET_DENTRY1776 thread_t * this = CURRENT_THREAD; 1777 uint32_t cycle = (uint32_t)hal_get_cycles(); 1778 if( cycle > DEBUG_RPC_VFS_FS_ GET_DENTRY )1775 #if DEBUG_RPC_VFS_FS_NEW_DENTRY 1776 thread_t * this = CURRENT_THREAD; 1777 uint32_t cycle = (uint32_t)hal_get_cycles(); 1778 if( cycle > DEBUG_RPC_VFS_FS_NEW_DENTRY ) 1779 1779 printk("\n[%s] thread[%x,%x] on core %d enter / cycle %d\n", 1780 1780 __FUNCTION__, this->process->pid, this->trdid, this->core->lid , cycle ); … … 1807 1807 hal_remote_s64( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)error ); 1808 1808 1809 #if DEBUG_RPC_VFS_FS_ GET_DENTRY1810 cycle = (uint32_t)hal_get_cycles(); 1811 if( cycle > DEBUG_RPC_VFS_FS_ GET_DENTRY )1809 #if DEBUG_RPC_VFS_FS_NEW_DENTRY 1810 cycle = (uint32_t)hal_get_cycles(); 1811 if( cycle > DEBUG_RPC_VFS_FS_NEW_DENTRY ) 1812 1812 printk("\n[%s] thread[%x,%x] on core %d exit / cycle %d\n", 1813 1813 __FUNCTION__, this->process->pid, this->trdid, this->core->lid , cycle ); -
trunk/kernel/kern/rpc.h
r625 r628 77 77 RPC_VFS_FILE_CREATE = 14, 78 78 RPC_VFS_FILE_DESTROY = 15, 79 RPC_VFS_FS_ GET_DENTRY = 16,79 RPC_VFS_FS_NEW_DENTRY = 16, 80 80 RPC_VFS_FS_ADD_DENTRY = 17, 81 81 RPC_VFS_FS_REMOVE_DENTRY = 18, -
trunk/kernel/kernel_config.h
r625 r628 91 91 #define DEBUG_FATFS_SYNC_INODE 0 92 92 #define DEBUG_FATFS_UPDATE_DENTRY 0 93 #define DEBUG_FATFS_UPDATE_IOC 0 93 94 94 95 #define DEBUG_HAL_CONTEXT 0 … … 150 151 #define DEBUG_RPC_THREAD_USER_CREATE 0 151 152 #define DEBUG_RPC_THREAD_KERNEL_CREATE 0 153 #define DEBUG_RPC_VFS_DENTRY_CREATE 0 154 #define DEBUG_RPC_VFS_DENTRY_DESTROY 0 155 #define DEBUG_RPC_VFS_DEVICE_GET_DENTRY 0 156 #define DEBUG_RPC_VFS_FILE_CREATE 0 157 #define DEBUG_RPC_VFS_FILE_DESTROY 0 158 #define DEBUG_RPC_VFS_FS_NEW_DENTRY 0 159 #define DEBUG_RPC_VFS_FS_ADD_DENTRY 0 152 160 #define DEBUG_RPC_VFS_INODE_CREATE 0 153 161 #define DEBUG_RPC_VFS_INODE_DESTROY 0 154 #define DEBUG_RPC_VFS_DENTRY_CREATE 0155 #define DEBUG_RPC_VFS_DENTRY_DESTROY 0156 #define DEBUG_RPC_VFS_FILE_CREATE 0157 #define DEBUG_RPC_VFS_FILE_DESTROY 0158 #define DEBUG_RPC_VFS_DEVICE_GET_DENTRY 0159 162 #define DEBUG_RPC_VMM_CREATE_VSEG 0 160 163 #define DEBUG_RPC_VMM_GET_PTE 0 … … 298 301 #define LOCK_PROCESS_USERSYNC 26 // remote (Q) protect lists of user synchros in process 299 302 #define LOCK_PROCESS_FDARRAY 27 // remote (Q) protect array of open files in owner process 300 #define LOCK_FATFS_FREE 28 // remote (Q) protect the FATFS context (free clusters) 301 #define LOCK_PROCESS_DIR 29 // remote (Q) protect xlist of open directories in process 303 #define LOCK_PROCESS_DIR 28 // remote (Q) protect xlist of open directories in process 302 304 303 305 #define LOCK_PROCESS_THTBL 30 // local (RW) protect local array of threads in a process … … 309 311 #define LOCK_VMM_GPT 35 // remote (RW) protect GPT (local page table) 310 312 #define LOCK_VFS_MAIN 36 // remote (RW) protect vfs traversal (in root inode) 313 #define LOCK_FATFS_FAT 37 // remote (RW) protect exclusive access to the FATFS FAT 311 314 312 315 -
trunk/kernel/mm/mapper.c
r626 r628 395 395 { 396 396 uint32_t page_offset; // first byte to move to/from a mapper page 397 uint32_t page_ count; // number of bytes to move to/from a mapper page397 uint32_t page_bytes; // number of bytes to move to/from a mapper page 398 398 uint32_t page_id; // current mapper page index 399 399 uint32_t done; // number of moved bytes … … 420 420 #endif 421 421 422 // compute offsets of first and last bytes in file422 // compute indexes of first and last bytes in file 423 423 uint32_t min_byte = file_offset; 424 424 uint32_t max_byte = file_offset + size - 1; … … 444 444 445 445 // compute number of bytes in page 446 if ( first == last ) page_ count= size;447 else if ( page_id == first ) page_ count= CONFIG_PPM_PAGE_SIZE - page_offset;448 else if ( page_id == last ) page_ count= (max_byte & CONFIG_PPM_PAGE_MASK) + 1;449 else page_ count= CONFIG_PPM_PAGE_SIZE;446 if ( first == last ) page_bytes = size; 447 else if ( page_id == first ) page_bytes = CONFIG_PPM_PAGE_SIZE - page_offset; 448 else if ( page_id == last ) page_bytes = (max_byte & CONFIG_PPM_PAGE_MASK) + 1; 449 else page_bytes = CONFIG_PPM_PAGE_SIZE; 450 450 451 451 #if (DEBUG_MAPPER_MOVE_USER & 1) 452 452 if( DEBUG_MAPPER_MOVE_USER < cycle ) 453 453 printk("\n[%s] thread[%x,%x] : page_id %d / page_offset %d / bytes %d\n", 454 __FUNCTION__, this->process->pid, this->trdid, page_id , page_offset , page_ count);455 #endif 456 457 // get extended pointer on page descriptor 454 __FUNCTION__, this->process->pid, this->trdid, page_id , page_offset , page_bytes ); 455 #endif 456 457 // get extended pointer on page descriptor in mapper 458 458 page_xp = mapper_remote_get_page( mapper_xp , page_id ); 459 459 … … 476 476 if( to_buffer ) 477 477 { 478 hal_copy_to_uspace( map_cxy , map_ptr , buf_ptr , page_count);478 hal_copy_to_uspace( map_cxy , map_ptr + page_offset , buf_ptr , page_bytes ); 479 479 480 480 #if DEBUG_MAPPER_MOVE_USER & 1 481 481 if( DEBUG_MAPPER_MOVE_USER < cycle ) 482 482 printk("\n[%s] thread[%x,%x] moved %d bytes / mapper %s (%x,%x) -> user buffer(%x,%x)\n", 483 __FUNCTION__, this->process->pid, this->trdid, page_ count,484 name, map_cxy, map_ptr , local_cxy, buf_ptr );483 __FUNCTION__, this->process->pid, this->trdid, page_bytes, 484 name, map_cxy, map_ptr + page_offset, local_cxy, buf_ptr ); 485 485 #endif 486 486 … … 489 489 { 490 490 ppm_page_do_dirty( page_xp ); 491 hal_copy_from_uspace( map_cxy , map_ptr , buf_ptr , page_count);491 hal_copy_from_uspace( map_cxy , map_ptr + page_offset , buf_ptr , page_bytes ); 492 492 493 493 #if DEBUG_MAPPER_MOVE_USER & 1 494 494 if( DEBUG_MAPPER_MOVE_USER < cycle ) 495 495 printk("\n[%s] thread[%x,%x] moved %d bytes / user buffer(%x,%x) -> mapper %s (%x,%x)\n", 496 __FUNCTION__, this->process->pid, this->trdid, page_ count,497 local_cxy, buf_ptr, name, map_cxy, map_ptr );496 __FUNCTION__, this->process->pid, this->trdid, page_bytes, 497 local_cxy, buf_ptr, name, map_cxy, map_ptr + page_offset ); 498 498 mapper_display_page( mapper_xp , page_id, 128 ); 499 499 #endif … … 501 501 } 502 502 503 done += page_ count;503 done += page_bytes; 504 504 } 505 505 … … 529 529 { 530 530 uint32_t page_offset; // first byte to move to/from a mapper page 531 uint32_t page_ count; // number of bytes to move to/from a mapper page531 uint32_t page_bytes; // number of bytes to move to/from a mapper page 532 532 uint32_t page_id; // current mapper page index 533 533 uint32_t done; // number of moved bytes … … 588 588 589 589 // compute number of bytes to move in page 590 if ( first == last ) page_ count= size;591 else if ( page_id == first ) page_ count= CONFIG_PPM_PAGE_SIZE - page_offset;592 else if ( page_id == last ) page_ count= (max_byte & CONFIG_PPM_PAGE_MASK) + 1;593 else page_ count= CONFIG_PPM_PAGE_SIZE;590 if ( first == last ) page_bytes = size; 591 else if ( page_id == first ) page_bytes = CONFIG_PPM_PAGE_SIZE - page_offset; 592 else if ( page_id == last ) page_bytes = (max_byte & CONFIG_PPM_PAGE_MASK) + 1; 593 else page_bytes = CONFIG_PPM_PAGE_SIZE; 594 594 595 595 // get extended pointer on page descriptor … … 621 621 if( to_buffer ) 622 622 printk("\n[%s] mapper <%s> page %d => buffer(%x,%x) / %d bytes\n", 623 __FUNCTION__, name, page_id, dst_cxy, dst_ptr, page_ count);623 __FUNCTION__, name, page_id, dst_cxy, dst_ptr, page_bytes ); 624 624 else 625 625 printk("\n[%s] buffer(%x,%x) => mapper <%s> page %d / %d bytes\n", 626 __FUNCTION__, src_cxy, src_ptr, name, page_id, page_ count);626 __FUNCTION__, src_cxy, src_ptr, name, page_id, page_bytes ); 627 627 } 628 628 #endif 629 629 630 630 // move fragment 631 hal_remote_memcpy( XPTR( dst_cxy , dst_ptr ), XPTR( src_cxy , src_ptr ), page_ count);632 633 done += page_ count;631 hal_remote_memcpy( XPTR( dst_cxy , dst_ptr ), XPTR( src_cxy , src_ptr ), page_bytes ); 632 633 done += page_bytes; 634 634 } 635 635 … … 647 647 /////////////////////////////////////////////////// 648 648 error_t mapper_remote_get_32( xptr_t mapper_xp, 649 uint32_t page_id, 649 650 uint32_t word_id, 650 uint32_t * p_value ) 651 { 652 uint32_t page_id; // page index in file 653 uint32_t local_id; // word index in page 651 uint32_t * value ) 652 { 654 653 xptr_t page_xp; // extended pointer on searched page descriptor 655 654 xptr_t base_xp; // extended pointer on searched page base 656 657 655 658 // get page index and local word index659 page_id = word_id >> 10;660 local_id = word_id & 0x3FF;661 662 656 // get page containing the searched word 663 657 page_xp = mapper_remote_get_page( mapper_xp , page_id ); … … 669 663 670 664 // get the value from mapper 671 * p_value = hal_remote_l32( base_xp + (local_id<<2) );665 *value = hal_remote_l32( base_xp + (word_id<<2) ); 672 666 673 667 return 0; … … 677 671 /////////////////////////////////////////////////// 678 672 error_t mapper_remote_set_32( xptr_t mapper_xp, 673 uint32_t page_id, 679 674 uint32_t word_id, 680 675 uint32_t value ) 681 676 { 682 683 uint32_t page_id; // page index in file684 uint32_t local_id; // word index in page685 677 xptr_t page_xp; // extended pointer on searched page descriptor 686 678 xptr_t base_xp; // extended pointer on searched page base 687 679 688 // get page index and local vord index689 page_id = word_id >> 10;690 local_id = word_id & 0x3FF;691 692 680 // get page containing the searched word 693 681 page_xp = mapper_remote_get_page( mapper_xp , page_id ); … … 699 687 700 688 // set value to mapper 701 hal_remote_s32( (base_xp + ( local_id << 2)) , value );702 703 // set the dirty flag 689 hal_remote_s32( (base_xp + (word_id << 2)) , value ); 690 691 // set the dirty flag in page descriptor 704 692 ppm_page_do_dirty( page_xp ); 705 693 -
trunk/kernel/mm/mapper.h
r626 r628 206 206 ******************************************************************************************* 207 207 * @ mapper_xp : [in] extended pointer on the mapper. 208 * @ word_id : [in] 32 bits word index in file. 209 * @ p_value : [out] local pointer on destination buffer. 208 * @ page_id : [in] page index in mapper. 209 * @ word_id : [in] 32 bits word index in page. 210 * @ value : [out] local pointer on destination buffer. 210 211 * @ returns 0 if success / return -1 if error. 211 212 ******************************************************************************************/ 212 213 error_t mapper_remote_get_32( xptr_t mapper_xp, 214 uint32_t page_id, 213 215 uint32_t word_id, 214 uint32_t * p_value );216 uint32_t * value ); 215 217 216 218 /******************************************************************************************* … … 220 222 * In case of miss, it takes the mapper lock in WRITE_MODE, load the missing 221 223 * page from device to mapper, and release the mapper lock. 224 * It does not update the FAT on IOC device. 222 225 ******************************************************************************************* 223 226 * @ mapper_xp : [in] extended pointer on the mapper. 224 * @ word_id : [in] 32 bits word index in file. 227 * @ page_id : [in] page index in mapper. 228 * @ word_id : [in] 32 bits word index in page. 225 229 * @ value : [in] value to be written. 226 230 * @ returns 0 if success / return -1 if error. 227 231 ******************************************************************************************/ 228 232 error_t mapper_remote_set_32( xptr_t mapper_xp, 233 uint32_t page_id, 229 234 uint32_t word_id, 230 235 uint32_t value ); -
trunk/libs/mini-libc/stdio.c
r625 r628 51 51 } 52 52 53 /////////////////////////////////////////////////// 53 //////////////////////////////////////////////////////////////////////////////////////// 54 // This static function analyses the <format> and the <args> to build a formated 55 // string in the buffer defined by <string> and <length>. 56 // It does NOT add a terminating NUL character in the <string buffer>. 57 // If success, it returns the number of bytes actually copied in the string buffer. 58 // It returns -1 in case of illegal format, or if the formated string exceeds the 59 // the length argument. 60 //////////////////////////////////////////////////////////////////////////////////////// 54 61 static int xprintf( char * string, 55 62 int length, … … 57 64 va_list * args ) 58 65 { 59 int ps = 0; // write index tothe string buffer66 int ps = 0; // index in the string buffer 60 67 61 68 #define TO_STREAM(x) do { string[ps] = (x); ps++; if(ps==length) return -1; } while(0); … … 83 90 84 91 { 85 char buf[30]; // buffer to displayone number92 char buf[30]; // buffer to store the string for one number 86 93 char * pbuf; // pointer on first char to display 87 94 unsigned int len = 0; // number of char to display -
trunk/params-hard.mk
r627 r628 2 2 3 3 ARCH = /users/alain/soc/tsar-trunk-svn-2013/platforms/tsar_generic_iob 4 X_SIZE = 45 Y_SIZE = 46 NB_PROCS = 14 X_SIZE = 2 5 Y_SIZE = 2 6 NB_PROCS = 4 7 7 NB_TTYS = 3 8 8 IOC_TYPE = IOC_BDV -
trunk/user/fft/fft.c
r596 r628 28 28 // - RANDOM : data points have pseudo random values 29 29 // 30 // This application uses 4 shared data arrays, that are distributed 31 // in all clusters (one buffer per cluster): 30 // The main parameters for this generic application are the following: 31 // - M : N = 2**M = number of data points / M must be an even number. 32 // - T : nthreads = ncores defined by the hardware / must be power of 2. 33 // 34 // This application uses 4 shared data arrays, that are dynamically 35 // allocated an distributed, using the remote_malloc() function, with 36 // one sub-buffer per cluster: 32 37 // - data[N] contains N input data points, with 2 double per point. 33 38 // - trans[N] contains N intermediate data points, 2 double per point. … … 36 41 // For data, trans, twid, each sub-buffer contains (N/nclusters) points. 37 42 // For umain, each sub-buffer contains (rootN/nclusters) points. 38 //39 // The main parameters for this generic application are the following:40 // - M : N = 2**M = number of data points / M must be an even number.41 // - T : nthreads = ncores defined by the hardware / must be power of 2.42 43 // 43 44 // There is one thread per core. … … 50 51 // - DEBUG_MAIN : Display intermediate results in main() 51 52 // - DEBUG_FFT1D : Display intermediate results in FFT1D() 52 // - DEBUG_ROW :53 // - DEBUG_ROW : Display intermedite results in FFTrow() 53 54 // 54 55 // Regarding final instrumentation: … … 87 88 88 89 #define DEFAULT_M 12 // 4096 data points 89 #define MODE COSIN 90 #define CHECK 0 91 #define DEBUG_MAIN 2 // trace main() function (detailed if odd) 92 #define DEBUG_SLAVE 2 // trace slave() function (detailed if odd) 93 #define DEBUG_FFT1D 2 // trace FFT1D() function (detailed if odd) 90 #define USE_DQT_BARRIER 0 // use DDT barrier if non zero 91 #define MODE COSIN // DATA array initialisation mode 92 #define CHECK 0 93 #define DEBUG_MAIN 1 // trace main() function (detailed if odd) 94 #define DEBUG_SLAVE 0 // trace slave() function (detailed if odd) 95 #define DEBUG_FFT1D 0 // trace FFT1D() function (detailed if odd) 94 96 #define DEBUG_ROW 0 // trace FFTRow() function (detailed if odd) 95 97 #define PRINT_ARRAY 0 … … 138 140 // synchronisation barrier (all threads) 139 141 pthread_barrier_t barrier; 140 pthread_barrierattr_t barrier attr;142 pthread_barrierattr_t barrier_attr; 141 143 142 144 // threads identifiers, attributes, and arguments … … 213 215 void main ( void ) 214 216 { 217 int error; 218 215 219 unsigned int main_cxy; // main thread cluster 216 220 unsigned int main_x; // main thread X coordinate … … 240 244 if( get_config( &x_size , &y_size , &ncores ) ) 241 245 { 242 printf("\n[ FFT ERROR] cannot get hardware configuration\n");246 printf("\n[fft error] cannot get hardware configuration\n"); 243 247 exit( 0 ); 244 248 } … … 247 251 if( (ncores != 1) && (ncores != 2) && (ncores != 4) ) 248 252 { 249 printf("\n[ FFT ERROR] number of cores per cluster must be 1/2/4\n");253 printf("\n[fft error] number of cores per cluster must be 1/2/4\n"); 250 254 exit( 0 ); 251 255 } … … 254 258 if( (x_size != 1) && (x_size != 2) && (x_size != 4) && (x_size != 8) && (x_size != 16) ) 255 259 { 256 printf("\n[ FFT ERROR] x_size must be 1/2/4/8/16\n");260 printf("\n[fft error] x_size must be 1/2/4/8/16\n"); 257 261 exit( 0 ); 258 262 } … … 261 265 if( (y_size != 1) && (y_size != 2) && (y_size != 4) && (y_size != 8) && (y_size != 16) ) 262 266 { 263 printf("\n[ FFT ERROR] y_size must be 1/2/4/8/16\n");267 printf("\n[fft error] y_size must be 1/2/4/8/16\n"); 264 268 exit( 0 ); 265 269 } … … 277 281 if( rootN < nthreads ) 278 282 { 279 printf("\n[ FFT ERROR] sqrt(N) must be larger than T\n");283 printf("\n[fft error] sqrt(N) must be larger than T\n"); 280 284 exit( 0 ); 281 285 } … … 287 291 main_tid = (((main_x * y_size) + main_y) * ncores) + main_lid; 288 292 289 printf("\n[ FFT] starts on core[%x,%d] / %d complex points / %d thread(s) / PID %x\n",293 printf("\n[fft] starts on core[%x,%d] / %d complex points / %d thread(s) / PID %x\n", 290 294 main_cxy, main_lid, N, nthreads, getpid() ); 291 295 … … 308 312 } 309 313 310 printf("\n[ FFT] main completes remote_malloc\n");314 printf("\n[fft] main completes remote_malloc\n"); 311 315 312 316 // arrays initialisation … … 315 319 InitT( twid ); 316 320 317 printf("\n[ FFT] main completes arrays init\n");321 printf("\n[fft] main completes arrays init\n"); 318 322 319 323 #if CHECK … … 335 339 336 340 // initialise barrier 337 barrierattr.x_size = x_size; 338 barrierattr.y_size = y_size; 339 barrierattr.nthreads = ncores; 340 if( pthread_barrier_init( &barrier, &barrierattr , nthreads) ) 341 { 342 printf("\n[FFT ERROR] cannot initialize barrier\n"); 341 if( USE_DQT_BARRIER ) 342 { 343 barrier_attr.x_size = x_size; 344 barrier_attr.y_size = y_size; 345 barrier_attr.nthreads = ncores; 346 error = pthread_barrier_init( &barrier, &barrier_attr , nthreads ); 347 } 348 else 349 { 350 error = pthread_barrier_init( &barrier, NULL , nthreads ); 351 } 352 353 if( error ) 354 { 355 printf("\n[fft error] cannot initialize barrier\n"); 343 356 exit( 0 ); 344 357 } 345 358 346 printf("\n[ FFT] main completes barrier init\n");359 printf("\n[fft] main completes barrier init\n"); 347 360 348 361 // launch other threads to execute the slave() function … … 377 390 &args[tid]) ) // pointer on function arguments 378 391 { 379 printf("\n[ FFT ERROR] creating thread %x\n", tid );392 printf("\n[fft error] creating thread %x\n", tid ); 380 393 exit( 0 ); 381 394 } 382 #if DEBUG_MAIN395 #if (DEBUG_MAIN & 1) 383 396 unsigned long long debug_cycle; 384 397 get_cycle( &debug_cycle ); 385 printf("\n[ FFT] main created thread %xon core[%x,%d] / cycle %d\n",398 printf("\n[fft] main created thread %d on core[%x,%d] / cycle %d\n", 386 399 tid, cxy, lid, (unsigned int)debug_cycle ); 387 400 #endif … … 390 403 } 391 404 } 405 392 406 393 407 // register sequencial initalisation completion cycle … … 395 409 init_time = (unsigned int)(end_init_cycle - start_init_cycle); 396 410 397 printf("\n[ FFT] main enters parallel execution\n");411 printf("\n[fft] main completes threads creation\n"); 398 412 399 413 // main itself executes the slave() function … … 414 428 if( pthread_join( trdid[tid] , NULL ) ) 415 429 { 416 printf("\n[ FFT ERROR] in main thread joining thread %x\n", tid );430 printf("\n[fft error] in main thread joining thread %x\n", tid ); 417 431 exit( 0 ); 418 432 } 419 433 420 #if DEBUG_MAIN421 printf("\n[ FFT] main thread %d joined thread %d\n", main_tid, tid );434 #if (DEBUG_MAIN & 1) 435 printf("\n[fft] main thread %d joined thread %d\n", main_tid, tid ); 422 436 #endif 423 437 … … 441 455 442 456 // instrumentation 457 char name[64]; 458 char path[128]; 443 459 char string[256]; 444 445 snprintf( string , 256 , "/home/fft_%d_%d_%d_%d", x_size , y_size , ncores , N ); 460 int ret; 461 462 // build file name 463 if( USE_DQT_BARRIER ) 464 snprintf( name , 64 , "fft_dqt_%d_%d_%d_%d", x_size , y_size , ncores , N ); 465 else 466 snprintf( name , 64 , "fft_smp_%d_%d_%d_%d", x_size , y_size , ncores , N ); 467 468 // build pathname 469 snprintf( path , 128 , "/home/%s", name ); 446 470 447 471 // open instrumentation file 448 // FILE * f = fopen( string , NULL ); 449 // if ( f == NULL ) 450 // { 451 // printf("\n[FFT ERROR] cannot open instrumentation file %s\n", string ); 452 // exit( 0 ); 453 // } 454 455 snprintf( string , 256 , "\n[FFT] instrumentation : (%dx%dx%d) threads / %d points\n", 456 x_size, y_size, ncores , N ); 457 458 // display on terminal, and save to instrumentation file 459 printf( "%s" , string ); 460 // fprintf( f , string ); 461 472 FILE * f = fopen( path , NULL ); 473 if ( f == NULL ) 474 { 475 printf("\n[fft error] cannot open instrumentation file <%s>\n", path ); 476 exit( 0 ); 477 } 478 printf("\n[fft] file <%s> open\n", path ); 479 480 // display header on terminal, and save to file 481 printf("\n----- %s -----\n", name ); 482 483 ret = fprintf( f , "\n----- %s -----\n", name ); 484 if( ret < 0 ) 485 { 486 printf("\n[fft error] cannot write header to file <%s>\n", path ); 487 exit(0); 488 } 489 490 // display results for each thread on terminal, and save to file 462 491 for (tid = 0 ; tid < nthreads ; tid++) 463 492 { 464 snprintf( string , 256 , " \ntid %d : Init %d / Parallel %d / Sync%d\n",493 snprintf( string , 256 , "- tid %d : Sequencial %d / Parallel %d / Barrier %d\n", 465 494 tid, init_time, parallel_time[tid], sync_time[tid] ); 466 495 467 496 // display on terminal, and save to instrumentation file 468 497 printf("%s" , string ); 469 // fprintf( f , string ); 470 } 471 472 // close instrumentation file and exit 473 // fclose( f ); 474 475 476 /* 477 long min_para = parallel_time[0]; 478 long max_para = parallel_time[0]; 479 long min_sync = sync_time[0]; 480 long max_sync = sync_time[0]; 498 fprintf( f , "%s" , string ); 499 if( ret < 0 ) 500 { 501 printf("\n[fft error] cannot write thread %d to file <%s>\n", tid, path ); 502 exit(0); 503 } 504 } 505 506 // display MIN/MAX values on terminal and save to file 507 unsigned int min_para = parallel_time[0]; 508 unsigned int max_para = parallel_time[0]; 509 unsigned int min_sync = sync_time[0]; 510 unsigned int max_sync = sync_time[0]; 481 511 482 512 for (tid = 1 ; tid < nthreads ; tid++) … … 488 518 } 489 519 490 snprintf( string , 256 , "\n Init ParallelBarrier\n"520 snprintf( string , 256 , "\n Sequencial Parallel Barrier\n" 491 521 "MIN : %d\t | %d\t | %d\t (cycles)\n" 492 522 "MAX : %d\t | %d\t | %d\t (cycles)\n", 493 523 (int)init_time, (int)min_para, (int)min_sync, 494 524 (int)init_time, (int)max_para, (int)max_sync ); 495 */ 496 497 pthread_exit( NULL ); 525 printf("%s", string ); 526 ret = fprintf( f , "%s", string ); 527 if( ret < 0 ) 528 { 529 printf("\n[fft error] cannot write MIN/MAX to file <%s>\n", path ); 530 exit(0); 531 } 532 533 // close instrumentation file 534 ret = fclose( f ); 535 if( ret ) 536 { 537 printf("\n[fft error] cannot close file <%s>\n", path ); 538 exit(0); 539 } 540 printf("\n[sort] file <%s> closed\n", path ); 541 542 exit( 0 ); 498 543 499 544 } // end main() … … 525 570 526 571 #if DEBUG_SLAVE 527 printf("\n[ FFT] %s : thread %x enter / cycle %d\n",572 printf("\n[fft] %s : thread %x enter / cycle %d\n", 528 573 __FUNCTION__, MyNum, (unsigned int)parallel_start ); 529 574 #endif … … 569 614 570 615 #if DEBUG_SLAVE 571 printf("\n[FFT] %s : thread %x exit / parallel_time %d / sync_time %d / cycle %d\n", 572 __FUNCTION__, MyNum, parallel_time[MyNum], sync_time[MyNum], (unsigned int)parallel_stop ); 616 printf("\n[fft] %s : thread %x exit / cycle %d\n", __FUNCTION__, MyNum, parallel_stop ); 573 617 #endif 574 618 … … 805 849 unsigned long long cycle; 806 850 get_cycle( &cycle ); 807 printf("\n[ FFT] %s : thread %x enter / first %d / last %d / cycle %d\n",851 printf("\n[fft] %s : thread %x enter / first %d / last %d / cycle %d\n", 808 852 __FUNCTION__, MyNum, MyFirst, MyLast, (unsigned int)cycle ); 809 853 #endif … … 814 858 #if( DEBUG_FFT1D & 1 ) 815 859 get_cycle( &cycle ); 816 printf("\n[ FFT] %s : thread %x after first transpose / cycle %d\n",860 printf("\n[fft] %s : thread %x after first transpose / cycle %d\n", 817 861 __FUNCTION__, MyNum, (unsigned int)cycle ); 818 862 if( PRINT_ARRAY ) PrintArray( tmp , N ); … … 827 871 #if( DEBUG_FFT1D & 1 ) 828 872 get_cycle( &cycle ); 829 printf("\n[ FFT] %s : thread %x exit barrier after first transpose / cycle %d\n",873 printf("\n[fft] %s : thread %x exit barrier after first transpose / cycle %d\n", 830 874 __FUNCTION__, MyNum, (unsigned int)cycle ); 831 875 #endif … … 840 884 841 885 #if( DEBUG_FFT1D & 1 ) 842 printf("\n[ FFT] %s : thread %x after first twiddle\n", __FUNCTION__, MyNum);886 printf("\n[fft] %s : thread %x after first twiddle\n", __FUNCTION__, MyNum); 843 887 if( PRINT_ARRAY ) PrintArray( tmp , N ); 844 888 #endif … … 850 894 851 895 #if( DEBUG_FFT1D & 1 ) 852 printf("\n[ FFT] %s : thread %x exit barrier after first twiddle\n", __FUNCTION__, MyNum);896 printf("\n[fft] %s : thread %x exit barrier after first twiddle\n", __FUNCTION__, MyNum); 853 897 #endif 854 898 … … 859 903 860 904 #if( DEBUG_FFT1D & 1 ) 861 printf("\n[ FFT] %s : thread %x after second transpose\n", __FUNCTION__, MyNum);905 printf("\n[fft] %s : thread %x after second transpose\n", __FUNCTION__, MyNum); 862 906 if( PRINT_ARRAY ) PrintArray( x , N ); 863 907 #endif … … 869 913 870 914 #if( DEBUG_FFT1D & 1 ) 871 printf("\n[ FFT] %s : thread %x exit barrier after second transpose\n", __FUNCTION__, MyNum);915 printf("\n[fft] %s : thread %x exit barrier after second transpose\n", __FUNCTION__, MyNum); 872 916 #endif 873 917 … … 882 926 883 927 #if( DEBUG_FFT1D & 1 ) 884 printf("\n[ FFT] %s : thread %x after FFT on rows\n", __FUNCTION__, MyNum);928 printf("\n[fft] %s : thread %x after FFT on rows\n", __FUNCTION__, MyNum); 885 929 if( PRINT_ARRAY ) PrintArray( x , N ); 886 930 #endif … … 892 936 893 937 #if( DEBUG_FFT1D & 1 ) 894 printf("\n[ FFT] %s : thread %x exit barrier after FFT on rows\n", __FUNCTION__, MyNum);938 printf("\n[fft] %s : thread %x exit barrier after FFT on rows\n", __FUNCTION__, MyNum); 895 939 #endif 896 940 sync_time[MyNum] += (long)(barrier_stop - barrier_start); … … 900 944 901 945 #if( DEBUG_FFT1D & 1 ) 902 printf("\n[ FFT] %s : thread %x after third transpose\n", __FUNCTION__, MyNum);946 printf("\n[fft] %s : thread %x after third transpose\n", __FUNCTION__, MyNum); 903 947 if( PRINT_ARRAY ) PrintArray( x , N ); 904 948 #endif … … 910 954 911 955 #if( DEBUG_FFT1D & 1 ) 912 printf("\n[ FFT] %s : thread %x exit barrier after third transpose\n", __FUNCTION__, MyNum);956 printf("\n[fft] %s : thread %x exit barrier after third transpose\n", __FUNCTION__, MyNum); 913 957 #endif 914 958 … … 920 964 921 965 #if DEBUG_FFT1D 922 printf("\n[ FFT] %s : thread %x completed\n", __FUNCTION__, MyNum);966 printf("\n[fft] %s : thread %x completed\n", __FUNCTION__, MyNum); 923 967 if( PRINT_ARRAY ) PrintArray( x , N ); 924 968 #endif … … 1111 1155 #if DEBUG_ROW 1112 1156 unsigned int p; 1113 printf("\n[ FFT] ROW data in / %d points / offset = %d\n", rootN , offset_x );1157 printf("\n[fft] ROW data in / %d points / offset = %d\n", rootN , offset_x ); 1114 1158 1115 1159 for ( p = 0 ; p < rootN ; p++ ) … … 1127 1171 1128 1172 #if DEBUG_ROW 1129 printf("\n[ FFT] ROW data after reverse / %d points / offset = %d\n", rootN , offset_x );1173 printf("\n[fft] ROW data after reverse / %d points / offset = %d\n", rootN , offset_x ); 1130 1174 1131 1175 for ( p = 0 ; p < rootN ; p++ ) … … 1198 1242 1199 1243 #if DEBUG_ROW 1200 printf("\n[ FFT] ROW data out / %d points / offset = %d\n", rootN , offset_x );1244 printf("\n[fft] ROW data out / %d points / offset = %d\n", rootN , offset_x ); 1201 1245 for ( p = 0 ; p < rootN ; p++ ) 1202 1246 { -
trunk/user/ksh/ksh.c
r626 r628 1178 1178 #endif 1179 1179 1180 /* 1181 // Lauch one or several commands without interactive mode 1182 1183 // 1. first command 1180 1181 /* 1. first direct command 1184 1182 if( sem_wait( &semaphore ) ) 1185 1183 { … … 1189 1187 else 1190 1188 { 1191 printf("\n[ksh] display fat 0 32\n");1189 printf("\n[ksh] load bin/user/sort.elf\n"); 1192 1190 } 1193 1191 1194 strcpy( cmd , " display fat 0 32" );1192 strcpy( cmd , "load bin/user/sort.elf" ); 1195 1193 execute( cmd ); 1196 1197 // 2. second command 1194 */ 1195 1196 1197 1198 /* 2. second direct command 1198 1199 if( sem_wait( &semaphore ) ) 1199 1200 { … … 1203 1204 else 1204 1205 { 1205 printf("\n[ksh] load bin/user/pgcd.elf\n");1206 printf("\n[ksh] rm home/fft_1_2_1_4096\n"); 1206 1207 } 1207 1208 1208 strcpy( cmd , " load bin/user/pgcd.elf" );1209 strcpy( cmd , "rm home/fft_1_2_1_4096" ); 1209 1210 execute( cmd ); 1210 1211 // end non-interactive mode1212 1211 */ 1212 1213 1213 1214 1214 1215 enum fsm_states -
trunk/user/sort/sort.c
r627 r628 29 29 #include <hal_macros.h> 30 30 31 #define ARRAY_LENGTH 4096// number of items31 #define ARRAY_LENGTH 1024 // number of items 32 32 #define MAX_THREADS 1024 // 16 * 16 * 4 33 33 … … 35 35 #define DISPLAY_ARRAY 0 // display items values before and after 36 36 #define DEBUG_MAIN 1 // trace main function 37 #define DEBUG_SORT 0// trace sort function37 #define DEBUG_SORT 1 // trace sort function 38 38 #define INTERACTIVE_MODE 0 // activate idbg() during instrumentation 39 39 #define CHECK_RESULT 0 // for debug … … 337 337 338 338 #if DEBUG_MAIN 339 printf("\n[sort] main completes barrier init\n"); 339 if( USE_DQT_BARRIER ) printf("\n[sort] main completes DQT barrier init\n"); 340 else printf("\n[sort] main completes simple barrier init\n"); 340 341 #endif 341 342
Note: See TracChangeset
for help on using the changeset viewer.