Changeset 590


Ignore:
Timestamp:
Jul 8, 2015, 4:00:08 PM (9 years ago)
Author:
alain
Message:

Introduce support for the new POSIX-like FAT32 library.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_boot/boot.c

    r578 r590  
    132132////////////////////////////////////////////////////////////////////////////
    133133
    134 // FAT internal representation for boot code 
    135 __attribute__((section(".kdata")))
    136 fat32_fs_t  _fat   __attribute__((aligned(512)));
    137 
    138134// Temporaty buffer used to load one complete .elf file 
    139135__attribute__((section(".kdata")))
    140 char  _boot_elf_buffer[GIET_ELF_BUFFER_SIZE] __attribute__((aligned(512)));
     136unsigned char  _boot_elf_buffer[GIET_ELF_BUFFER_SIZE] __attribute__((aligned(64)));
    141137
    142138// Physical memory allocators array (one per cluster)
    143139__attribute__((section(".kdata")))
    144140pmem_alloc_t  boot_pmem_alloc[X_SIZE][Y_SIZE];
    145 
    146 // Distributed kernel heap (one per cluster)
    147 // __attribute__((section(".kdata")))
    148 // kernel_heap_t       kernel_heap[X_SIZE][Y_SIZE];
    149141
    150142// Schedulers virtual base addresses array (one per processor)
     
    13361328void boot_mapping_init()
    13371329{
    1338     // open file "map.bin"
    1339     int fd_id = _fat_open( 0, "map.bin", 0 );    // no IRQ / no creation
    1340 
    1341     if ( fd_id == -1 )
     1330    // load map.bin file into buffer
     1331    if ( _fat_load_no_cache( "map.bin",
     1332                             SEG_BOOT_MAPPING_BASE,
     1333                             SEG_BOOT_MAPPING_SIZE ) )
    13421334    {
    13431335        _printf("\n[BOOT ERROR] : map.bin file not found \n");
    13441336        _exit();
    13451337    }
    1346 
    1347 #if BOOT_DEBUG_MAPPING
    1348 _printf("\n[BOOT] map.bin file successfully open at cycle %d\n",
    1349         _get_proctime() );
    1350 #endif
    1351 
    1352     // get "map.bin" file size (from fat) and check it
    1353     unsigned int size    = _fat.fd[fd_id].file_size;
    1354 
    1355     if ( size > SEG_BOOT_MAPPING_SIZE )
    1356     {
    1357         _printf("\n[BOOT ERROR] : segment too small for map.bin file\n");
    1358         _exit();
    1359     }
    1360 
    1361 #if BOOT_DEBUG_MAPPING
    1362 _printf("\n[BOOT] map.bin buf_pbase = %x / buf_size = %x / file_size = %x\n",
    1363         SEG_BOOT_MAPPING_BASE , SEG_BOOT_MAPPING_SIZE , size );
    1364 #endif
    1365 
    1366     // load "map.bin" file into buffer
    1367     unsigned int nblocks = size >> 9;
    1368     unsigned int offset  = size & 0x1FF;
    1369     if ( offset ) nblocks++;
    1370 
    1371     unsigned int ok = _fat_read( 0,        // No IRQ
    1372                                  fd_id,
    1373                                  (unsigned int*)SEG_BOOT_MAPPING_BASE,
    1374                                  nblocks,       
    1375                                  0 );      // offset
    1376     if ( ok == -1 )
    1377     {
    1378         _printf("\n[BOOT ERROR] : unable to load map.bin file \n");
    1379         _exit();
    1380     }
    1381 
    1382 #if BOOT_DEBUG_MAPPING
    1383 _printf("\n[BOOT] map.bin file successfully loaded at cycle %d\n", _get_proctime() );
    1384 #endif
    13851338
    13861339    // check mapping signature, number of clusters, number of vspaces 
     
    13911344         (header->vspaces   > GIET_NB_VSPACE_MAX)    )
    13921345    {
    1393         _printf("\n[BOOT ERROR] Illegal mapping signature: %x\n", header->signature );
     1346        _printf("\n[BOOT ERROR] Illegal mapping : signature = %x\n", header->signature );
    13941347        _exit();
    13951348    }
     
    14011354for ( line = 0 ; line < 8 ; line++ )
    14021355{
    1403     _printf(" | %x | %x | %x | %x | %x | %x | %x | %x |\n",
     1356    _printf(" | %X | %X | %X | %X | %X | %X | %X | %X |\n",
    14041357            *(pointer + 0),
    14051358            *(pointer + 1),
     
    14151368#endif
    14161369
    1417 #if BOOT_DEBUG_MAPPING
    1418 _printf("\n[BOOT] map.bin file checked at cycle %d\n", _get_proctime() );
    1419 #endif
    1420 
    1421     // close file "map.bin"
    1422     _fat_close( fd_id );
    1423    
    14241370} // end boot_mapping_init()
    14251371
     
    15171463    Elf32_Ehdr* elf_header_ptr = NULL;  //  avoid a warning
    15181464
    1519     int fd_id = 0;                      //  avoid a warning
    1520 
    1521     // only P[0,0,0] load file from FAT
     1465    // only P[0,0,0] load file
    15221466    if ( (cxy == 0) && (p == 0) )
    15231467    {
    1524         // open .elf file
    1525         fd_id = _fat_open( 0 , pathname , 0 );  // no IRQ / no creation
    1526 
    1527         if ( fd_id < 0 )
    1528         {
    1529             _printf("\n[BOOT ERROR] load_one_elf_file() : %s not found\n",
    1530                     pathname );
    1531             _exit();
    1532         }
    1533 
    1534         // check buffer size versus file size
    1535         if ( _fat.fd[fd_id].file_size > GIET_ELF_BUFFER_SIZE )
    1536         {
    1537             _printf("\n[BOOT ERROR] in load_one_elf_file() : %s / size = %x "
    1538                     "larger than GIET_ELF_BUFFER_SIZE = %x\n",
    1539                     pathname , _fat.fd[fd_id].file_size , GIET_ELF_BUFFER_SIZE );
    1540             _exit();
    1541         }
    1542 
    1543         // compute number of sectors
    1544         unsigned int nbytes   = _fat.fd[fd_id].file_size;
    1545         unsigned int nsectors = nbytes>>9;
    1546         if( nbytes & 0x1FF) nsectors++;
    1547 
    1548         // load file to elf buffer
    1549         if( _fat_read( 0,                    // no IRQ
    1550                        fd_id,
    1551                        _boot_elf_buffer,
    1552                        nsectors,
    1553                        0 ) != nsectors )     // offset
    1554         {
    1555             _printf("\n[BOOT ERROR] load_one_elf_file() : unexpected EOF for %s\n",
    1556                     pathname );
     1468        if ( _fat_load_no_cache( pathname,
     1469                                 (unsigned int)_boot_elf_buffer,
     1470                                 GIET_ELF_BUFFER_SIZE ) )
     1471        {
     1472            _printf("\n[BOOT ERROR] in load_one_elf_file() : %s\n", pathname );
    15571473            _exit();
    15581474        }
     
    16561572                    {
    16571573                        _printf("\n[BOOT ERROR] in load_one_elf_file() : vseg %s "
    1658                                 "is to small for loadable segment %x in file %s\n",
    1659                                 vseg[vseg_id].name , seg_vaddr , pathname );
     1574                                "is too small for segment %x\n"
     1575                                "  file = %s / vseg_size = %x / seg_file_size = %x\n",
     1576                                vseg[vseg_id].name , seg_vaddr , pathname,
     1577                                seg_size , seg_filesz );
    16601578                        _exit();
    16611579                    }
     
    17081626    //////////////////////////////////////////////
    17091627
    1710     // only P[0,0,0] close the file
     1628    // only P[0,0,0] signals completion
    17111629    if ( (cxy == 0) && (p == 0) )
    17121630    {
    1713         // close .elf file
    1714         _fat_close( fd_id );
    1715 
    17161631        _printf("\n[BOOT] File %s loaded at cycle %d\n",
    17171632                pathname , _get_proctime() );
     
    18851800
    18861801        // initialises the FAT
    1887         _fat_init( 0 );          // no IRQ
     1802        _fat_init( 0 );          // don't use Inode-Tree, Fat-Cache, etc.
    18881803
    18891804        _printf("\n[BOOT] FAT initialised at cycle %d\n", _get_proctime() );
Note: See TracChangeset for help on using the changeset viewer.