Mercurial > ecos
diff packages/redboot/current/src/flash.c @ 1312:08edfb52f9cd
Improve FIS directory handling - should work with small block size devices
| author | gthomas |
|---|---|
| date | Wed, 15 Oct 2003 15:52:02 +0000 |
| parents | 25b536d4b2bc |
| children | 4444f5b3be7b |
line wrap: on
line diff
--- a/packages/redboot/current/src/flash.c +++ b/packages/redboot/current/src/flash.c @@ -463,8 +463,7 @@ fis_list(int argc, char *argv[]) #else i = 1; #endif - if (!scan_opts(argc, argv, 2, opts, i, 0, 0, "")) - { + if (!scan_opts(argc, argv, 2, opts, i, 0, 0, "")) { return; } flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr); @@ -1315,6 +1314,7 @@ do_flash_init(void) void *err_addr; if (!__flash_init) { + __flash_init = 1; if ((stat = flash_init((void *)(workspace_end-FLASH_MIN_WORKSPACE), FLASH_MIN_WORKSPACE, diag_printf)) != 0) { diag_printf("FLASH: driver init failed: %s\n", flash_errmsg(stat)); @@ -1326,18 +1326,19 @@ do_flash_init(void) flash_get_block_info(&flash_block_size, &flash_num_blocks); workspace_end = (unsigned char *)(workspace_end-FLASH_MIN_WORKSPACE); #ifdef CYGOPT_REDBOOT_FIS + fisdir_size = CYGNUM_REDBOOT_FIS_DIRECTORY_ENTRY_COUNT * CYGNUM_REDBOOT_FIS_DIRECTORY_ENTRY_SIZE; + fisdir_size = ((fisdir_size + flash_block_size - 1) / flash_block_size) * flash_block_size; # ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER fis_work_block = fis_zlib_common_buffer; - if(CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE < flash_block_size) { + if(CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE < fisdir_size) { diag_printf("FLASH: common buffer too small\n"); workspace_end += FLASH_MIN_WORKSPACE; return false; } # else - workspace_end = (unsigned char *)(workspace_end-flash_block_size); + workspace_end = (unsigned char *)(workspace_end-fisdir_size); fis_work_block = workspace_end; # endif - fisdir_size = flash_block_size; if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) { fis_addr = (void *)((CYG_ADDRESS)flash_end + 1 + (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); @@ -1345,9 +1346,12 @@ do_flash_init(void) fis_addr = (void *)((CYG_ADDRESS)flash_start + (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); } + if (((CYG_ADDRESS)fis_addr + fisdir_size - 1) > (CYG_ADDRESS)flash_end) { + diag_printf("FIS directory doesn't fit\n"); + return false; + } flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr); #endif - __flash_init = 1; } return true; }
