@ -77,6 +77,77 @@ uint32_t compute_crc32(uint32_t crc, off_t start, size_t compute_len, int fd)
return crc ;
return crc ;
}
}
int
trx_fixup ( int fd , const char * name )
{
struct mtd_info_user mtdInfo ;
unsigned long len ;
void * ptr , * scan ;
int bfd ;
struct bcm_tag * tag ;
ssize_t res ;
uint32_t cfelen , imagelen , imagestart , rootfslen ;
uint32_t imagecrc , rootfscrc , headercrc ;
uint32_t offset = 0 ;
cfelen = imagelen = imagestart = imagecrc = rootfscrc = headercrc = rootfslen = 0 ;
if ( ioctl ( fd , MEMGETINFO , & mtdInfo ) < 0 ) {
fprintf ( stderr , " Failed to get mtd info \n " ) ;
goto err ;
}
len = mtdInfo . size ;
if ( mtdInfo . size < = 0 ) {
fprintf ( stderr , " Invalid MTD device size \n " ) ;
goto err ;
}
bfd = mtd_open ( name , true ) ;
ptr = mmap ( NULL , len , PROT_READ | PROT_WRITE , MAP_SHARED , bfd , 0 ) ;
if ( ! ptr | | ( ptr = = ( void * ) - 1 ) ) {
perror ( " mmap " ) ;
goto err1 ;
}
tag = ( struct bcm_tag * ) ( ptr ) ;
cfelen = strntoul ( & tag - > cfeLength [ 0 ] , NULL , 10 , IMAGE_LEN ) ;
if ( cfelen ) {
fprintf ( stderr , " Non-zero CFE length. This is currently unsupported. \n " ) ;
exit ( 1 ) ;
}
headercrc = compute_crc32 ( CRC_START , offset , offsetof ( struct bcm_tag , headerCRC ) , fd ) ;
if ( headercrc ! = * ( uint32_t * ) ( & tag - > headerCRC [ 0 ] ) ) {
fprintf ( stderr , " Tag verify failed. This may not be a valid image. \n " ) ;
exit ( 1 ) ;
}
sprintf ( & tag - > rootLength [ 0 ] , " %lu " , 0 ) ;
strncpy ( & tag - > totalLength [ 0 ] , & tag - > kernelLength [ 0 ] , IMAGE_LEN ) ;
imagestart = sizeof ( tag ) ;
memcpy ( & tag - > imageCRC [ 0 ] , & tag - > kernelCRC [ 0 ] , CRC_LEN ) ;
memcpy ( & tag - > fskernelCRC [ 0 ] , & tag - > kernelCRC [ 0 ] , CRC_LEN ) ;
rootfscrc = CRC_START ;
memcpy ( & tag - > rootfsCRC [ 0 ] , & rootfscrc , sizeof ( uint32_t ) ) ;
headercrc = crc32 ( CRC_START , tag , offsetof ( struct bcm_tag , headerCRC ) ) ;
memcpy ( & tag - > headerCRC [ 0 ] , & headercrc , sizeof ( uint32_t ) ) ;
msync ( ptr , sizeof ( struct bcm_tag ) , MS_SYNC | MS_INVALIDATE ) ;
munmap ( ptr , len ) ;
close ( bfd ) ;
return 0 ;
err1 :
close ( bfd ) ;
err :
fprintf ( stderr , " Error fixing up imagetag header \n " ) ;
return - 1 ;
}
int
int
trx_check ( int imagefd , const char * mtd , char * buf , int * len )
trx_check ( int imagefd , const char * mtd , char * buf , int * len )
{
{