public inbox for ecos-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug 1001568] New: fis load reads incorrect data if bad blocks are present
@ 2012-04-22  3:43 bugzilla-daemon
  0 siblings, 0 replies; 2+ messages in thread
From: bugzilla-daemon @ 2012-04-22  3:43 UTC (permalink / raw)
  To: unassigned

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.


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Bug 1001568] New: fis load reads incorrect data if bad blocks are present
@ 2012-04-22  3:43 bugzilla-daemon
  0 siblings, 0 replies; 2+ messages in thread
From: bugzilla-daemon @ 2012-04-22  3:43 UTC (permalink / raw)
  To: ecos-bugs

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 on the CC list for the bug.


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2012-04-22  3:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-22  3:43 [Bug 1001568] New: fis load reads incorrect data if bad blocks are present bugzilla-daemon
2012-04-22  3:43 bugzilla-daemon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).