This is the mail archive of the ecos-bugs@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug 1001568] New: fis load reads incorrect data if bad blocks arepresent


Please do not reply to this email. Use the web interface provided at:
http://bugs.ecos.sourceware.org/show_bug.cgi?id=1001568

           Summary: fis load reads incorrect data if bad blocks are
                    present
           Product: eCos
           Version: unknown
          Platform: All
        OS/Version: All
            Status: UNCONFIRMED
          Severity: major
          Priority: low
         Component: RedBoot
        AssignedTo: unassigned@bugs.ecos.sourceware.org
        ReportedBy: trent.lillehaugen@red.com
                CC: ecos-bugs@ecos.sourceware.org
             Class: Advice Request


Note: I found this bug in an older version of red boot and have not confirmed
the bug in the latest code and therefore am not able to submit a patch. 
However, after examining the source code via CVSweb it certainly appears as
though the bug does still exist.

I came across the problem when trying to load a kernel image using 'fis load'. 
If there happened to be a bad block within the region of the kernel image - the
image would not run.  I traced it down to the function 'cyg_flash_read' in
ecos/packages/io/flash/current/src/flash.c

In this function there is a while loop that will call 'dev->funs->flash_read'
for each block in the region to be read.  The driver function will skip bad
blocks correctly, however, 'cyg_flash_read' is unaware that the driver skipped
any bad blocks and incorrectly increments 'addr' by 'this_read'.  If there is a
bad block the block immediately after the bad block ends up being read twice
and the image is corrupted.

My fix was to not limit 'this_read' to the size of a block.  In my case I
verified that the driver function would work with sizes larger than one block -
I have not looked through the current code to see if that is guaranteed or not.
 That way, instead of looping and calling 'dev->funs->flash_read' multiple
times, I simply called it once with the entire length.   Since the driver code
correctly handled skipping over bad blocks my image was no longer being
corrupted when I called 'fis load'.

-- 
Configure bugmail: http://bugs.ecos.sourceware.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]