This is the mail archive of the
ecos-bugs@sourceware.org
mailing list for the eCos project.
[Bug 1001568] New: fis load reads incorrect data if bad blocks arepresent
- From: bugzilla-daemon at bugs dot ecos dot sourceware dot org
- To: ecos-bugs at ecos dot sourceware dot org
- Date: Sun, 22 Apr 2012 04:42:43 +0100
- Subject: [Bug 1001568] New: fis load reads incorrect data if bad blocks arepresent
- Auto-submitted: auto-generated
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.