I can confirm this bug : I also had it on my 2.6.25 kernel when a user space program was using the system() call to start another program. Thank you for you post with this patch it has fixed my issue.
If it can help anybody else here is the patch adapted from the previous one for my uclinux 2.6.25 kernel :
diff --git a/arch/m68k/coldfire/entry.S b/arch/m68k/coldfire/entry.S
index 1aaca64..7d997aa 100755
--- a/arch/m68k/coldfire/entry.S
+++ b/arch/m68k/coldfire/entry.S
@@ -82,7 +82,12 @@ ENTRY(buserr)
#ifdef CONFIG_COLDFIRE_FOO
movew #0x2700,%sr /* lock interrupts */
#endif
+ movew #0x2700,%sr
SAVE_ALL_INT
+ move.w 54(%sp),%d3
+ ori.l #0x2000,%d3
+ move.w %d3,%sr
+
#ifdef CONFIG_COLDFIRE_FOO
movew PT_SR(%sp),%d3 /* get original %sr */
oril #0x2000,%d3 /* set supervisor mode in it */
diff --git a/arch/m68k/coldfire/ints.c b/arch/m68k/coldfire/ints.c
index 461b96a..bb7f84c 100755
--- a/arch/m68k/coldfire/ints.c
+++ b/arch/m68k/coldfire/ints.c
@@ -485,16 +485,15 @@ void m547x_8x_irq_enable(unsigned int irq)
irq -= 64;
/* JKM -- re-add EPORT later */
-#if 0
/* check for eport */
if ((irq > 0) && (irq < 8)) {
/* enable eport */
MCF_EPPAR &= ~(3 << (irq*2)); /* level */
+ MCF_EPPAR |= (2 << (irq*2)); /* Edge */
//MCF_EPORT_EPDDR &= ~(1 << irq); /* input */
MCF_EPDDR &= ~(1 << irq); /* input */
MCF_EPIER |= 1 << irq; /* irq enabled */
}
-#endif
if (irq < 32) {
/* *grumble* don't set low bit of IMRL */
diff --git a/include/asm-m68k/cf_548x_cacheflush.h b/include/asm-m68k/cf_548x_cacheflush.h
index 9a529e8..32bf37d 100755
--- a/include/asm-m68k/cf_548x_cacheflush.h
+++ b/include/asm-m68k/cf_548x_cacheflush.h
@@ -241,6 +241,7 @@ static inline void copy_to_user_page(struct vm_area_struct *vma,
struct page *page, unsigned long vaddr,
void *dst, void *src, int len)
{
+ flush_dcache();
memcpy(dst, src, len);
flush_icache_user_page(vma, page, vaddr, len);
}
diff --git a/include/asm-m68k/entry.h b/include/asm-m68k/entry.h
index f8f6b18..7346f6b 100755
--- a/include/asm-m68k/entry.h
+++ b/include/asm-m68k/entry.h
@@ -71,6 +71,8 @@ PT_DTRACE_BIT = 2
* that the stack frame is NOT for syscall
*/
.macro save_all_int
+ movel MMUSR,%sp@-
+ movel MMUAR,%sp@-
clrl %sp@- | stk_adj
pea -1:w | orig d0
movel %d0,%sp@- | d0
@@ -78,6 +80,8 @@ PT_DTRACE_BIT = 2
.endm
.macro save_all_sys
+ movel MMUSR,%sp@-
+ movel MMUAR,%sp@-
clrl %sp@- | stk_adj
movel %d0,%sp@- | orig d0
movel %d0,%sp@- | d0
@@ -89,6 +93,7 @@ PT_DTRACE_BIT = 2
movel %sp@+,%d0
addql #4,%sp | orig d0
addl %sp@+,%sp | stk adj
+ addql #8,%sp
rte
.endm