diff -ubBwr linux.store/linux.arm/arch/arm/drivers/net/ether3.c linux/arch/arm/drivers/net/ether3.c
--- linux.store/linux.arm/arch/arm/drivers/net/ether3.c	Sat Mar  2 18:11:39 1996
+++ linux/arch/arm/drivers/net/ether3.c	Tue Mar  5 12:52:29 1996
@@ -89,7 +89,7 @@
 	outw (priv->regs.command | CMD_FIFOWRITE, REG_COMMAND);
 	while ((inw (REG_STATUS) & STAT_FIFOEMPTY) == 0)
 	    if (!timeout--) {
-		printk ("settxlim_16 broken\n");
+		printk ("%s: writebuf broken\n", dev->name);
 		priv->broken = 1;
 		return;
 	    }
@@ -114,7 +114,7 @@
 	outw (priv->regs.command | CMD_FIFOWRITE, REG_COMMAND);
 	while ((inw( REG_STATUS) & STAT_FIFOEMPTY) == 0)
 	    if (!timeout--) {
-		printk ("setrxlim_16 broken\n");
+		printk ("%s: readbuf broken\n", dev->name);
 		priv->broken = 1;
 		return;
 	    }
@@ -562,7 +562,8 @@
 	if (priv->broken) {
 	    dev_kfree_skb(skb, FREE_WRITE);
 	    priv->stats.tx_dropped ++;
-	    return 1;
+	    dev->tbusy = 0;
+	    return 0;
 	}
 
 	thisstart = priv->txinsert;
@@ -584,9 +585,9 @@
 
 	save_flags(flags);
 	cli();
-	ether3_ledincrementuse (dev);
-	ether3_writebuffer(dev, skb->data, thisdata, length&1?(length+1):length);
+	ether3_writebuffer(dev, skb->data, thisdata, (length & 1) ? (length + 1) : length);
 	ether3_writebuffer(dev, &nexthdr, -1, 4);
+	ether3_ledincrementuse (dev);
 	ether3_writebuffer(dev, &thishdr, thisstart, 4);
 
 	if ((inw (REG_STATUS) & STAT_TXON) == 0) {
@@ -609,11 +610,11 @@
 {
     struct device *dev = (struct device *)(irq2dev_map[irq]);
     struct dev_priv *priv;
-    int boguscount = 20, done = 0;
+    int boguscount = 20, done;
 
 #if NET_DEBUG > 1
     if(net_debug & DEBUG_INT)
-	printk("ether3_interrupt: irq %d\n", irq);
+	printk("eth3irq: %d ", irq);
 #endif
 
     if (dev == NULL) {
@@ -627,6 +628,8 @@
 
     do {
     	unsigned int status;
+
+    	done = 0;
 	status = inw(REG_STATUS);
 	outw ((status & (STAT_INTRX|STAT_INTTX|STAT_INTBUFWIN))
 		| priv->regs.command, REG_COMMAND);
@@ -645,7 +648,7 @@
 
 #if NET_DEBUG > 1
     if(net_debug & DEBUG_INT)
-	printk("ether3_interrupt: done\n", irq);
+	printk("done\n");
 #endif
 }
 
@@ -763,16 +767,17 @@
 {
     unsigned long txhdr;
     unsigned char *buffer = (unsigned char *)&txhdr;
-    unsigned int txptr;
+    unsigned int txptr, marked;
 
     txptr = priv->regs.transmitptr;
+    marked = 0;
 
     do {
     	/*
     	 * Read the packet header
     	 */
 	if (txptr + 4 > TX_END) {
-	    int len = TX_END - priv->regs.transmitptr;
+	    int len = TX_END - txptr;
 	    if (len)
 		ether3_readbuffer (dev, buffer, txptr, len);
 	    ether3_readbuffer (dev, buffer + len, 0, 4 - len);
@@ -814,6 +819,7 @@
 	if (txptr != ntohs (txhdr & TX_NEXT)) {
 	    printk ("%s: TX: bad next pointer - %04X instead of %04X\n",
 		dev->name, ntohs (txhdr & TX_NEXT), txptr);
+	    priv->regs.transmitptr = txptr;
 	    return;
 	}
 
@@ -827,6 +833,9 @@
 
 	ether3_leddecrementuse (dev);
 
+	if (marked)
+	    continue;
+	marked = 1;
 	mark_bh (NET_BH);	/* Inform upper layers. */
     } while (1);
 }
diff -ubBwr linux.store/linux.arm/arch/arm/kernel/ecard.c linux/arch/arm/kernel/ecard.c
--- linux.store/linux.arm/arch/arm/kernel/ecard.c	Sat Feb 24 18:16:01 1996
+++ linux/arch/arm/kernel/ecard.c	Mon Mar  4 14:03:19 1996
@@ -69,7 +69,7 @@
 
 static void expansioncard_irq_expmask (int intr_no, struct pt_regs *regs)
 {
-    int i;
+    int i, ns = 0;
 #if 0
     int oldexpmask;
 #endif
@@ -99,6 +99,7 @@
 		    sti ();
 #endif
 		    do_fast_IRQ (expcard[i].irq);
+		    ns ++;
 #if 0
 		    cli ();
 		    ioc[0x28] &= ~(1 << 5);
@@ -115,6 +116,8 @@
 	    }
 	}
     }
+    if (ns == 0)
+	printk ("ecard: unknown interrupt\n");
 }
 
 void ecard_enableirq (unsigned int intr_no)
diff -ubBwr linux.store/linux.arm/arch/arm/kernel/process.c linux/arch/arm/kernel/process.c
--- linux.store/linux.arm/arch/arm/kernel/process.c	Thu Feb 22 13:45:02 1996
+++ linux/arch/arm/kernel/process.c	Sun Mar  3 22:41:05 1996
@@ -119,7 +119,7 @@
 
 /* changed the size calculations - should hopefully work better. lbt */
     dump->magic = CMAGIC;
-    dump->start_code = 0;
+    dump->start_code = 32768;
     dump->start_stack = regs->ARM_sp & ~(PAGE_SIZE - 1);
     dump->u_tsize = (((unsigned long) current->mm->end_code) - 32768) >> PAGE_SHIFT;
     dump->u_dsize = (((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) - 32768) >> PAGE_SHIFT;
diff -ubBwr linux.store/linux.arm/arch/arm/kernel/sys-arm.c linux/arch/arm/kernel/sys-arm.c
--- linux.store/linux.arm/arch/arm/kernel/sys-arm.c	Sun Mar  3 13:07:31 1996
+++ linux/arch/arm/kernel/sys-arm.c	Sun Mar  3 16:34:10 1996
@@ -182,6 +179,8 @@
 asmlinkage int
 sys_arm_init_module (char *module_name, char *code, unsigned codesize, unsigned long *__p)
 {
+    extern int sys_init_module (char *, char *, unsigned, struct mod_routes *,
+    		struct symbol_table *);
     return sys_init_module (module_name, code, codesize, (struct mod_routines *)__p[0],
     		(struct symbol_table *)__p[1]);
 }
@@ -190,11 +189,13 @@
 sys_arm_llseek (unsigned int fd, unsigned long offset_high, unsigned long offset_low,
 		unsigned long *__p)
 {
+    extern int sys_llseek (unsigned int, unsigned long, unsigned long, loff_t *, unsigned int);
     return sys_llseek (fd, offset_high, offset_low, (loff_t *)__p[0], (unsigned int)__p[1]);
 }
 
 asmlinkage int
 sys_arm_mount (char *devname, char *dirname, char *type, unsigned long *__p)
 {
+    extern int sys_mount (char *, char *, char *, unsigned long, void *);
     return sys_mount (devname, dirname, type, __p[0], (void *)__p[1]);
 }
diff -ubBwr linux.store/linux.arm/arch/arm/kernel/traps.c linux/arch/arm/kernel/traps.c
--- linux.store/linux.arm/arch/arm/kernel/traps.c	Mon Mar  4 13:12:41 1996
+++ linux/arch/arm/kernel/traps.c	Tue Mar  5 12:53:07 1996
@@ -94,6 +94,11 @@
     died = 1;
 
     mode = regs->ARM_pc & 3;
+    if (mode == 0) {	/* if user mode, we don't do anything */
+    	died = 0;
+    	return;
+    }
+
     pc = regs->ARM_pc & ~0xfc000003;
 
     switch (mode) {
@@ -170,6 +175,7 @@
 {
     current->tss.error_code = 0;
     current->tss.trap_no = 6;
+    send_sig (SIGILL, current, 1);
     die_if_kernel("Oops - undefined instruction", regs, mode, SIGILL);
 }
 
@@ -177,6 +183,7 @@
 {
     current->tss.error_code = 0;
     current->tss.trap_no = 11;
+    send_sig (SIGBUS, current, 1);
     die_if_kernel("Oops - address exception", regs, mode, SIGBUS);
 }
 
diff -ubBwr linux.store/linux.arm/fs/exec.c linux/fs/exec.c
--- linux.store/linux.arm/fs/exec.c	Sun Feb 11 13:50:43 1996
+++ linux/fs/exec.c	Sun Mar  3 22:44:54 1996
@@ -178,6 +178,8 @@
 	struct user dump;
 #ifdef __alpha__
 #       define START_DATA(u)	(u.start_data)
+#elif defined(__arm__)
+#	define START_DATA(u)	((u.u_tsize << PAGE_SHIFT) + u.start_code)
 #else
 #       define START_DATA(u)	(u.u_tsize << PAGE_SHIFT)
 #endif
diff -ubBwr linux.store/linux.arm/kernel/fork.c linux/kernel/fork.c
--- linux.store/linux.arm/kernel/fork.c	Sun Feb 11 09:33:02 1996
+++ linux/kernel/fork.c	Mon Mar  4 14:50:31 1996
@@ -214,6 +214,7 @@
 	new_stack = get_free_page(GFP_KERNEL);
 #else
 	new_stack = (unsigned long) kmalloc(4096, GFP_KERNEL);
+	memset ((void *)new_stack, 0, 4096);
 #endif
 	if (!new_stack)
 		goto bad_fork_free_p;
