Jivin b2112 lays it down ...
> I am using the 2.4 kernel with the Coldfire MCF5275 and I've found an
> issue using the netflash application with programming files above 4meg. At
> 4megs the following segfault error occurs.
I am guessing you have 128K sectors (* 32 = 4MB), and you are overflowing
the bitmap (with is only 32 bits).
Try the attached patch (completely untested ;-)
Cheers,
Davidm
> -----------------------------------------------------------------------------------
> Write of 58388 bytes at pos 4194304 (data at 00540000)
> bad frame format: 00000000
> PC: [<040f5e00>]
> SR: 2014 SP: 005a3f4c a2: f30ba003
> d0: 00000000 d1: 00000061 d2: 000006ff d3: ffffe703
> d4: 00000004 d5: 00000000 a0: 00448010 a1: 005a2000
> Process netflash (pid: 54, stackpage=005a3000)
> Frame format=5
> Stack from 005a3f80:
> 005745e0 03f30ba0 00000006 03e23dfc 005a3fc4 00047326 005745e0
> 03f30ba0
> 00000006 03e23dfc 00000036 00047128 00000001 00400000 03e20e14
> 03e214f8
> 03e23f14 03e23f14 00023af6 00000004 00000006 03e23dfc 00000001
> 00000000
> 00000006 00000004 00400000 ffffffda 00000036 00000000 40800000
> 003a0e94
> Call Trace:
> [<00047326>] [<00047128>] [<00023af6>]
> Code: bad frame format: 00000000
> PC: [<00022234>]
> SR: 2714 SP: 005a3ec4 a2: 005a4000
> d0: 00000000 d1: 00000f58 d2: 00000000 d3: 003a0e94
> d4: 005a4000 d5: 00000000 a0: 040f5e00 a1: 00109178
> Process netflash (pid: 54, stackpage=005a3000)
> Frame format=4 Stack from 005a3f00:
> 00000004 00028730 005a3f2c 0002260c 005a3f4c 000e7fd5 005a223c
> 00000036
> 005a3000 f30ba003 e23dfc00 005a3f40 00021f42 000e7d1c 005a3f4c
> 00000000
> 5a3f9000 00023a30 005a3f4c 00000061 000006ff ffffe703 00000004
> 00000000
> 00448010 005a2000 f30ba003 00000000 ffffffff 00000000 54082014
> 040f5e00
> 005745e0 03f30ba0 00000006 03e23dfc 005a3fc4 00047326 005745e0
> 03f30ba0
> 00000006 03e23dfc 00000036 00047128 00000001 00400000 03e20e14
> 03e214f8
> Call Trace:
> [<00028730>] [<0002260c>] [<000e7fd5>] [<00021f42>]
> [<000e7d1c>] [<00023a30>] [<00047326>] [<00047128>]
> [<00023af6>]
> Code: 3030 2a00 2f00 4879 000e 7eb6 4eb9 0002 8730 508f
> SIGSEGV
> ---------------------------------------------------------------------------------------------
>
>
> I was able to narrow down the exact function causing the problem in
> /linux-2.4.x/drivers/block/blkmem.c In general_program_func(), the function
> call to set_bit() is causing the segfault.
>
> When the function is commented out, the application works fine. I'm still
> working on the work around for this problem, but if anyone is aware of a
> solution if you could let me know so I can update it.
>
> int general_program_func(struct inode * inode, struct file * file, struct
> arena_t * a, struct blkmem_program_t * prog)
> {
> unsigned long i,block;
> unsigned long erased = 0;
>
> /* Mandatory flush of all dirty buffers */
> fsync_dev(inode->i_rdev);
> invalidate_buffers(inode->i_rdev);
>
> for(i=0;i<prog->blocks;i++) {
> int min= prog->block[i].pos / a->blksize;
> int max = (prog->block[i].pos + prog->block[i].length - 1) / a->blksize;
> for(block=min; block <= max; block++) {
> if (!test_bit(block, &erased)) {
> printk("Erase of sector at pos %lx of arena %d (address
> %p)\n", block * a->blksize, MINOR(inode->i_rdev),
> (void*)(a->address+block*a->blksize));
>
> /* Invoke erase function */
> a->erase_func(a, block * a->blksize);
> *//set_bit(block, &erased);
> * }
> }
>
> printk("Write of %lu bytes at pos %lu (data at %p)\n",
> prog->block[i].length, prog->block[i].pos, prog->block[i].data);
>
> a->write_func(a, prog->block[i].pos, prog->block[i].length,
> prog->block[i].data);
>
> schedule();
> }
>
> #ifdef CONFIG_UCLINUX
> if (prog->reset)
> HARD_RESET_NOW();
> #endif
> return 0;
> }
>
> Thanks
> Bruce
> _______________________________________________
> uClinux-dev mailing list
> [email protected]
> http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
> This message was resent by [email protected]
> To unsubscribe see:
> http://mailman.uclinux.org/mailman/options/uclinux-dev
--
David McCullough, [email protected], Ph:+61 734352815
McAfee - SnapGear http://www.snapgear.com http://www.uCdot.org
Index: linux-2.4.x/drivers/block/blkmem.c
===================================================================
RCS file: /cvs/sw/linux-2.4.x/drivers/block/blkmem.c,v
retrieving revision 1.61
diff -u -r1.61 blkmem.c
--- linux-2.4.x/drivers/block/blkmem.c 1 Oct 2008 13:16:33 -0000 1.61
+++ linux-2.4.x/drivers/block/blkmem.c 28 May 2009 22:51:18 -0000
@@ -2623,7 +2623,9 @@
int general_program_func(struct inode * inode, struct file * file, struct arena_t * a, struct blkmem_program_t * prog)
{
int i,block;
- unsigned int erased = 0;
+ unsigned int erased[8]; /* enough for 32MBs of flash */
+
+ memset(erased, 0, sizeof(erased));
/* Mandatory flush of all dirty buffers */
fsync_dev(inode->i_rdev);
@@ -2633,6 +2635,11 @@
int min= prog->block[i].pos / a->blksize;
int max = (prog->block[i].pos + prog->block[i].length - 1) / a->blksize;
for(block=min; block <= max; block++) {
+ if (block >= sizeof(erased) * 8) {
+ printk("%s,%d: bitmap is too small for this flash (%s blocks)\n"
+ __FILE__, __LINE__, __FUNCTION__, blocks);
+ continue;
+ }
if (!test_bit(block, &erased)) {
printk("Erase of sector at pos %lx of arena %d (address %p)\n", block * a->blksize, MINOR(inode->i_rdev), (void*)(a->address+block*a->blksize));
_______________________________________________
uClinux-dev mailing list
[email protected]
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by [email protected]
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev