diff -u --recursive --new-file v1.0.4/linux/Makefile linux/Makefile
--- v1.0.4/linux/Makefile	Mon Mar 28 17:43:13 1994
+++ linux/Makefile	Sat Mar 26 14:14:50 1994
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 0
-SUBLEVEL = 4
+SUBLEVEL = 5
 
 all:	Version zImage
 
@@ -74,6 +74,7 @@
 
 AS	=as
 LD	=ld
+LDFLAGS	=#-qmagic
 HOSTCC	=gcc
 CC	=gcc -D__KERNEL__
 MAKE	=make
diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/README linux/drivers/FPU-emu/README
--- v1.0.4/linux/drivers/FPU-emu/README	Mon Feb 14 13:10:44 1994
+++ linux/drivers/FPU-emu/README	Sat Mar 26 14:04:23 1994
@@ -47,7 +47,7 @@
 
 
 --Bill Metzenthen
-  Feb 1994
+  March 1994
 
 
 ----------------------- Internals of wm-FPU-emu -----------------------
@@ -92,7 +92,7 @@
 ----------------------- Limitations of wm-FPU-emu -----------------------
 
 There are a number of differences between the current wm-FPU-emu
-(version beta 1.10) and the 80486 FPU (apart from bugs). Some of the
+(version beta 1.11) and the 80486 FPU (apart from bugs). Some of the
 more important differences are listed below:
 
 The Roundup flag does not have much meaning for the transcendental
@@ -144,6 +144,17 @@
 exception. For this case, the emulator cannot emulate the behaviour of
 an 80486DX.
 
+Handling of the address size override prefix byte (0x67) has not been
+extensively tested yet. A major problem exists because using it in
+vm86 mode can cause a general protection fault. Address offsets
+greater than 0xffff appear to be illegal in vm86 mode but are quite
+acceptable (and work) in real mode. A small test program developed to
+check the addressing, and which runs successfully in real mode,
+crashes dosemu under Linux and also brings Windows down with a general
+protection fault message when run under the MS-DOS prompt of Windows
+3.1. (The program simply reads data from a valid address).
+
+
 ----------------------- Performance of wm-FPU-emu -----------------------
 
 Speed.
@@ -310,6 +321,7 @@
 Hamish Coleman, t933093@minyos.xx.rmit.oz.au
 Bruce Evans, bde@kralizec.zeta.org.au
 Timo Korvola, Timo.Korvola@hut.fi
+Rick Lyons, rick@razorback.brisnet.org.au
  
 ...and numerous others who responded to my request for help with
 a real 80486.
diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/fpu_emu.h linux/drivers/FPU-emu/fpu_emu.h
--- v1.0.4/linux/drivers/FPU-emu/fpu_emu.h	Wed Feb 16 13:07:55 1994
+++ linux/drivers/FPU-emu/fpu_emu.h	Sat Mar 26 14:04:23 1994
@@ -87,6 +87,7 @@
 #define PREFIX_FS_ 4
 #define PREFIX_GS_ 5
 #define PREFIX_SS_ 6
+#define PREFIX_DEFAULT 7
 
 /* These are to defeat the default action, giving the instruction
    no net effect: */
diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/fpu_entry.c linux/drivers/FPU-emu/fpu_entry.c
--- v1.0.4/linux/drivers/FPU-emu/fpu_entry.c	Fri Mar 18 10:21:32 1994
+++ linux/drivers/FPU-emu/fpu_entry.c	Sat Mar 26 14:04:24 1994
@@ -239,7 +239,7 @@
 
   RE_ENTRANT_CHECK_OFF;
   FPU_code_verify_area(1);
-  FPU_modrm = get_fs_byte((unsigned short *) FPU_EIP);
+  FPU_modrm = get_fs_byte((unsigned char *) FPU_EIP);
   RE_ENTRANT_CHECK_ON;
   FPU_EIP++;
 
@@ -281,6 +281,9 @@
 
 	  FPU_EIP = FPU_ORIG_EIP;	/* Point to current FPU instruction. */
 
+	  if ( addr_modes.vm86 )
+	    FPU_EIP -= FPU_CS << 4;
+
 	  RE_ENTRANT_CHECK_OFF;
 	  current->tss.trap_no = 16;
 	  current->tss.error_code = 0;
@@ -303,6 +306,7 @@
 	get_address_16(FPU_modrm, &FPU_EIP, addr_modes);
       else
 	get_address(FPU_modrm, &FPU_EIP, addr_modes);
+
       if ( !(byte1 & 1) )
 	{
 	  unsigned short status1 = partial_status;
@@ -563,7 +567,7 @@
   unsigned char byte;
   unsigned char *ip = *fpu_eip;
 
-  *override = (overrides) { 0, 0, PREFIX_DS_ };       /* defaults */
+  *override = (overrides) { 0, 0, PREFIX_DEFAULT };       /* defaults */
 
   RE_ENTRANT_CHECK_OFF;
   FPU_code_verify_area(1);
@@ -597,9 +601,9 @@
 	case PREFIX_GS:
 	  override->segment = PREFIX_GS_;
 	  goto do_next_byte;
-
-	case PREFIX_DS:   /* Redundant unless preceded by another override. */
+	case PREFIX_DS:
 	  override->segment = PREFIX_DS_;
+	  goto do_next_byte;
 
 /* lock is not a valid prefix for FPU instructions,
    let the cpu handle it to generate a SIGILL. */
diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/get_address.c linux/drivers/FPU-emu/get_address.c
--- v1.0.4/linux/drivers/FPU-emu/get_address.c	Wed Feb 16 13:07:56 1994
+++ linux/drivers/FPU-emu/get_address.c	Sat Mar 26 14:04:24 1994
@@ -45,7 +45,8 @@
 	offsetof(struct info,___vm86_es),
 	offsetof(struct info,___vm86_fs),
 	offsetof(struct info,___vm86_gs),
-	offsetof(struct info,___ss)
+	offsetof(struct info,___ss),
+	offsetof(struct info,___vm86_ds)
       };
 
 #define VM86_REG_(x) (*(unsigned short *) \
@@ -285,9 +286,13 @@
       break;
     case 2:
       offset += FPU_info->___ebp + FPU_info->___esi;
+      if ( addr_modes.override.segment == PREFIX_DEFAULT )
+	addr_modes.override.segment = PREFIX_SS_;
       break;
     case 3:
       offset += FPU_info->___ebp + FPU_info->___edi;
+      if ( addr_modes.override.segment == PREFIX_DEFAULT )
+	addr_modes.override.segment = PREFIX_SS_;
       break;
     case 4:
       offset += FPU_info->___esi;
@@ -297,6 +302,8 @@
       break;
     case 6:
       offset += FPU_info->___ebp;
+      if ( addr_modes.override.segment == PREFIX_DEFAULT )
+	addr_modes.override.segment = PREFIX_SS_;
       break;
     case 7:
       offset += FPU_info->___ebx;
@@ -313,4 +320,3 @@
 
   FPU_data_address = (void *)offset ;
 }
-
diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/version.h linux/drivers/FPU-emu/version.h
--- v1.0.4/linux/drivers/FPU-emu/version.h	Mon Feb 14 13:10:47 1994
+++ linux/drivers/FPU-emu/version.h	Sat Mar 26 14:04:24 1994
@@ -9,5 +9,5 @@
  |                                                                           |
  +---------------------------------------------------------------------------*/
 
-#define FPU_VERSION "wm-FPU-emu version Beta 1.10"
+#define FPU_VERSION "wm-FPU-emu version Beta 1.11"
 
diff -u --recursive --new-file v1.0.4/linux/drivers/char/tty_ioctl.c linux/drivers/char/tty_ioctl.c
--- v1.0.4/linux/drivers/char/tty_ioctl.c	Tue Mar  1 19:00:15 1994
+++ linux/drivers/char/tty_ioctl.c	Sat Mar 26 15:13:09 1994
@@ -487,7 +487,10 @@
 					     sizeof (pid_t));
 			if (retval)
 				return retval;
-			if (current->tty != termios_dev)
+			/* If a master pty, return the slave's tpgid.
+			   If not, only return the tpgid if this is
+			   the controlling tty. */
+			if (tty == termios_tty && current->tty != dev)
 				return -ENOTTY;
 			put_fs_long(termios_tty->pgrp, (pid_t *) arg);
 			return 0;
diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/Makefile linux/drivers/scsi/Makefile
--- v1.0.4/linux/drivers/scsi/Makefile	Wed Dec  1 14:44:15 1993
+++ linux/drivers/scsi/Makefile	Sat Mar 26 15:08:15 1994
@@ -9,7 +9,7 @@
 #AHA152X	= -DDEBUG -DAUTOCONF -DIRQ=11 -DSCSI_ID=7 -DRECONNECT=0 \
 #          -DPORTBASE=0x340 -DSKIP_BIOSTEST -DDONT_SNARF
 
-AHA152X	= -DDEBUG -DAUTOCONF
+AHA152X	= -DDEBUG_AHA152X -DAUTOCONF
 
 SCSI_OBJS =
 SCSI_SRCS =
diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/aha152x.c linux/drivers/scsi/aha152x.c
--- v1.0.4/linux/drivers/scsi/aha152x.c	Mon Jan  3 07:45:32 1994
+++ linux/drivers/scsi/aha152x.c	Sat Mar 26 15:08:16 1994
@@ -1,6 +1,6 @@
 /* aha152x.c -- Adaptec AHA-152x driver
  * Author: Juergen E. Fischer, fischer@server.et-inf.fho-emden.de
- * Copyright 1993 Juergen E. Fischer
+ * Copyright 1993, 1994 Juergen E. Fischer
  *
  *
  * This driver is based on
@@ -20,10 +20,17 @@
  * General Public License for more details.
  
  *
- * $Id: aha152x.c,v 0.101 1993/12/13 01:16:27 root Exp $
+ * $Id: aha152x.c,v 1.0 1994/03/25 12:52:00 root Exp $
  *
 
  * $Log: aha152x.c,v $
+ * Revision 1.0  1994/03/25  12:52:00  root
+ * - Fixed "more data than expected" problem
+ * - added new BIOS signatures
+ *
+ * Revision 0.102  1994/01/31  20:44:12  root
+ * - minor changes in insw/outsw handling
+ *
  * Revision 0.101  1993/12/13  01:16:27  root
  * - fixed STATUS phase (non-GOOD stati were dropped sometimes;
  *   fixes problems with CD-ROM sector size detection & media change)
@@ -189,7 +196,7 @@
 /* I use this when I'm looking for weird bugs */
 #define DEBUG_TIMING 
 
-#if defined(DEBUG)
+#if defined(DEBUG_AHA152X)
 
 #undef  SKIP_PORTS              /* don't display ports */
 
@@ -228,7 +235,7 @@
 #define P_BUSFREE  1
 #define P_PARITY   2
 
-char *aha152x_id = "Adaptec 152x SCSI driver; $Revision: 0.101 $\n";
+static char *aha152x_id = AHA152X_REVID;
 
 static int port_base      = 0;
 static int this_host      = 0;
@@ -308,27 +315,26 @@
 /* possible interrupt channels */
 static unsigned short ints[] = { 9, 10, 11, 12 };
 
-/* signatures for various AIC-6260 based controllers */
+/* signatures for various AIC-6[23]60 based controllers.
+   The point in detecting signatures is to avoid useless
+   and maybe harmful probes on ports. I'm not sure that
+   all listed boards pass auto-configuration. For those
+   which fail the BIOS signature is obsolete, because
+   user intervention to supply the configuration is 
+   needed anyway. */
 static struct signature {
   char *signature;
   int  sig_offset;
   int  sig_length;
 } signatures[] =
 {
-  {
-    "Adaptec AHA-1520 BIOS\r\n\0\
-Version 1.4      \r\n\0\
-Copyright 1990 Adaptec, Inc.\r\n\
-All Rights Reserved\r\n \r\n \r\n", 0x102e, 101
-  },                                                          /* Adaptec 152x */
-  {
-    "Adaptec ASW-B626 BIOS\r\n\0\
-Version 1.0      \r\n\0\
-Copyright 1990 Adaptec, Inc.\r\n\
-All Rights Reserved\r\n\0 \r\n \r\n", 0x1029, 102
-  },                                                   /* on-board controller */
-  { "Adaptec BIOS: ASW-B626", 0x0F, 22},               /* on-board controller */
-  { "Adaptec ASW-B626 S2 BIOS", 0x2e6c, 24},           /* on-board controller */
+  { "Adaptec AHA-1520 BIOS",      0x102e, 21 },  /* Adaptec 152x */
+  { "Adaptec ASW-B626 BIOS",      0x1029, 21 },  /* on-board controller */
+  { "Adaptec BIOS: ASW-B626",       0x0f, 22 },  /* on-board controller */
+  { "Adaptec ASW-B626 S2",        0x2e6c, 19 },  /* on-board controller */
+  { "Adaptec BIOS:AIC-6360",         0xc, 21 },  /* on-board controller */
+  { "ScsiPro SP-360 BIOS",        0x2873, 19 },  /* ScsiPro-Controller with AIC-6360 */
+  { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },  /* Gigabyte Local-Bus-SCSI */
 };
 #define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature ))
 
@@ -498,11 +504,9 @@
   enter_driver("detect");
 #endif
   
-  printk("aha152x: Probing: ");
-
   if(setup_called)
     {
-      printk("processing commandline: ");
+      printk("aha152x: processing commandline: ");
    
       if(setup_called!=4)
         {
@@ -551,12 +555,11 @@
           printk("reconnect %d should be 0 or 1\n", can_disconnect);
           panic("aha152x panics in line %d", __LINE__);
         }
-      printk("ok, ");
+      printk("ok\n");
     }
   else
     {
 #if !defined(SKIP_BIOSTEST)
-      printk("BIOS test: ");
       ok=0;
       for( i=0; i < ADDRESS_COUNT && !ok; i++)
         for( j=0; (j < SIGNATURE_COUNT) && !ok; j++)
@@ -572,7 +575,9 @@
           printk("failed\n");
           return 0;
         }
-      printk("ok, ");
+      printk("aha152x: BIOS test: passed, ");
+#else
+      printk("aha152x: ");
 #endif /* !SKIP_BIOSTEST */
  
 #if !defined(PORTBASE)
@@ -685,14 +690,6 @@
  */
 const char *aha152x_info(void)
 {
-#if defined(DEBUG_RACE)
-  enter_driver("info");
-  leave_driver("info");
-#else
-#if defined(DEBUG_INFO)
-  printk("\naha152x: info()\n");
-#endif
-#endif
   return(aha152x_id);
 }
 
@@ -791,7 +788,7 @@
   cli();
 
 #if defined(DEBUG_ABORT)
-  printk("aha152x: abort(), SCpnt=0x%08x, ", (unsigned long) SCpnt );
+  printk("aha152x: abort(), SCpnt=0x%08x, ", (unsigned int) SCpnt );
 #endif
 
   show_queues();
@@ -962,16 +959,8 @@
  */
 int aha152x_biosparam( int size, int dev, int *info_array )
 {
-#if defined(DEBUG_RACE)
-  enter_driver("biosparam");
-#else
-#if defined(DEBUG_BIOSPARAM)
-  printk("\naha152x: biosparam(), ");
-#endif
-#endif
-
 #if defined(DEBUG_BIOSPARAM)
-  printk("dev=%x, size=%d, ", dev, size);
+  printk("aha152x_biosparam: dev=%x, size=%d, ", dev, size);
 #endif
   
 /* I took this from other SCSI drivers, since it provides
@@ -986,9 +975,6 @@
   printk("WARNING: check, if the bios geometry is correct.\n");
 #endif
 
-#if defined(DEBUG_RACE)
-  leave_driver("biosparam");
-#endif
   return 0;
 }
 
@@ -1708,7 +1694,7 @@
               ;
 
             if( TESTHI( DMASTAT, DFIFOFULL ) )
-              fifodata=132;
+              fifodata=GETPORT(FIFOSTAT);
             else
               {
                 /* wait for SCSI fifo to get empty */
@@ -1786,13 +1772,18 @@
                   } 
               }
  
-            /* rare (but possible) status bytes (probably also DISCONNECT 
-               messages) get transfered in the data phase, so I assume 1
-               additional byte is ok */
-            if(fifodata>1)
+            /*
+             * Fifo should be empty
+             */
+            if(fifodata>0)
               {
                 printk("aha152x: more data than expected (%d bytes)\n",
                        GETPORT(FIFOSTAT));
+                SETBITS(DMACNTRL0, _8BIT );
+                printk("aha152x: data ( ");
+                while(fifodata--)
+                  printk("%2x ", GETPORT( DATAPORT ));
+                printk(")\n");
               }
 
 #if defined(DEBUG_DATAI)
@@ -2302,7 +2293,7 @@
   int i;
 
   printk("0x%08x: target=%d; lun=%d; cmnd=( ",
-         (unsigned long) ptr, ptr->target, ptr->lun);
+         (unsigned int) ptr, ptr->target, ptr->lun);
   
   for(i=0; i<COMMAND_SIZE(ptr->cmnd[0]); i++)
     printk("%02x ", ptr->cmnd[i]);
@@ -2346,7 +2337,7 @@
       if(ptr->SCp.phase & (1<<16))
         printk("; phaseend");
     }
-  printk("; next=0x%08x\n", (unsigned long) ptr->host_scribble);
+  printk("; next=0x%08x\n", (unsigned int) ptr->host_scribble);
 }
  
 /*
diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/aha152x.h linux/drivers/scsi/aha152x.h
--- v1.0.4/linux/drivers/scsi/aha152x.h	Wed Dec  1 14:44:16 1993
+++ linux/drivers/scsi/aha152x.h	Sat Mar 26 15:08:16 1994
@@ -2,7 +2,7 @@
 #define _AHA152X_H
 
 /*
- * $Id: aha152x.h,v 0.2 1993/10/03 00:58:03 root Exp $
+ * $Id: aha152x.h,v 1.0 1994/03/25 12:52:00 root Exp $
  */
 
 #include "../block/blk.h"
@@ -22,8 +22,10 @@
    (unless we support more than 1 cmd_per_lun this should do) */
 #define AHA152X_MAXQUEUE	7		
 
+#define AHA152X_REVID	"Adaptec 152x SCSI driver; $Revision: 1.0 $"
+
 /* Initial value of Scsi_Host entry */
-#define AHA152X       { /* name */		"Adaptec 152x SCSI driver", \
+#define AHA152X       { /* name */		AHA152X_REVID, \
 			/* detect */		aha152x_detect,             \
 			/* info */		aha152x_info,               \
 			/* command */		aha152x_command,            \
diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/aha1542.c linux/drivers/scsi/aha1542.c
--- v1.0.4/linux/drivers/scsi/aha1542.c	Mon Feb 14 22:06:26 1994
+++ linux/drivers/scsi/aha1542.c	Sat Mar 26 15:58:41 1994
@@ -95,28 +95,51 @@
   printk("status=%x intrflags=%x\n", s, i, WAITnexttimeout-WAITtimeout); */
 }
 
+/* This is a bit complicated, but we need to make sure that an interrupt
+   routine does not send something out while we are in the middle of this.
+   Fortunately, it is only at boot time that multi-byte messages
+   are ever sent. */
 static int aha1542_out(unsigned int base, unchar *cmdp, int len)
 {
+  if(len == 1) {
+    while(1==1){
+	WAIT(STATUS(base), CDF, 0, CDF);
+	cli();
+	if(inb(STATUS(base)) & CDF) {sti(); continue;}
+	outb(*cmdp, DATA(base));
+	sti();
+	return 0;
+      }
+  } else {
+    cli();
     while (len--)
       {
-	  WAIT(STATUS(base), CDF, 0, CDF);
-	  outb(*cmdp++, DATA(base));
+	WAIT(STATUS(base), CDF, 0, CDF);
+	outb(*cmdp++, DATA(base));
       }
+    sti();
+  }
     return 0;
   fail:
+  sti();
     printk("aha1542_out failed(%d): ", len+1); aha1542_stat();
     return 1;
 }
 
+/* Only used at boot time, so we do not need to worry about latency as much
+   here */
 static int aha1542_in(unsigned int base, unchar *cmdp, int len)
 {
+    cli();
     while (len--)
       {
 	  WAIT(STATUS(base), DF, DF, 0);
 	  *cmdp++ = inb(DATA(base));
       }
+    sti();
     return 0;
   fail:
+    sti();
     printk("aha1542_in failed(%d): ", len+1); aha1542_stat();
     return 1;
 }
diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/fdomain.c linux/drivers/scsi/fdomain.c
--- v1.0.4/linux/drivers/scsi/fdomain.c	Mon Jan 24 13:31:37 1994
+++ linux/drivers/scsi/fdomain.c	Thu Mar 24 06:29:50 1994
@@ -510,7 +510,7 @@
 	 port_base = ports[i];
 	 if (check_region( port_base, 0x10 )) {
 #if DEBUG_DETECT
-	    printf( " (%x inuse),", port_base );
+	    printk( " (%x inuse),", port_base );
 #endif
 	    continue;
 	 }
diff -u --recursive --new-file v1.0.4/linux/fs/proc/array.c linux/fs/proc/array.c
--- v1.0.4/linux/fs/proc/array.c	Thu Feb 17 10:36:54 1994
+++ linux/fs/proc/array.c	Mon Mar 28 11:40:19 1994
@@ -88,28 +88,38 @@
 
 static int get_kstat(char * buffer)
 {
-        return sprintf(buffer,	"cpu  %u %u %u %lu\n"
-        			"disk %u %u %u %u\n"
-        			"page %u %u\n"
-        			"swap %u %u\n"
-        			"intr %u\n"
-        			"ctxt %u\n"
-        			"btime %lu\n",
-                kstat.cpu_user,
-                kstat.cpu_nice,
-                kstat.cpu_system,
-                jiffies - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system),
-                kstat.dk_drive[0],
-                kstat.dk_drive[1],
-                kstat.dk_drive[2],
-                kstat.dk_drive[3],
-                kstat.pgpgin,
-                kstat.pgpgout,
-                kstat.pswpin,
-                kstat.pswpout,
-                kstat.interrupts,
-                kstat.context_swtch,
-                xtime.tv_sec - jiffies / HZ);
+	int i, len;
+	unsigned sum = 0;
+
+	for (i = 0 ; i < 16 ; i++)
+		sum += kstat.interrupts[i];
+	len = sprintf(buffer,
+		"cpu  %u %u %u %lu\n"
+		"disk %u %u %u %u\n"
+		"page %u %u\n"
+		"swap %u %u\n"
+		"%u",
+		kstat.cpu_user,
+		kstat.cpu_nice,
+		kstat.cpu_system,
+		jiffies - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system),
+		kstat.dk_drive[0],
+		kstat.dk_drive[1],
+		kstat.dk_drive[2],
+		kstat.dk_drive[3],
+		kstat.pgpgin,
+		kstat.pgpgout,
+		kstat.pswpin,
+		kstat.pswpout,
+		sum);
+	for (i = 0 ; i < 16 ; i++)
+		len += sprintf(buffer + len, " %u", kstat.interrupts[i]);
+	len += sprintf(buffer + len,
+		"\nctxt %u\n"
+		"btime %lu\n",
+		kstat.context_swtch,
+		xtime.tv_sec - jiffies / HZ);
+	return len;
 }
 
 
diff -u --recursive --new-file v1.0.4/linux/include/linux/fs.h linux/include/linux/fs.h
--- v1.0.4/linux/include/linux/fs.h	Wed Feb 16 09:29:36 1994
+++ linux/include/linux/fs.h	Sat Mar 26 14:44:57 1994
@@ -200,6 +200,7 @@
 		struct nfs_inode_info nfs_i;
 		struct xiafs_inode_info xiafs_i;
 		struct sysv_inode_info sysv_i;
+		void * generic_ip;
 	} u;
 };
 
@@ -260,6 +261,7 @@
 		struct nfs_sb_info nfs_sb;
 		struct xiafs_sb_info xiafs_sb;
 		struct sysv_sb_info sysv_sb;
+		void *generic_sbp;
 	} u;
 };
 
diff -u --recursive --new-file v1.0.4/linux/include/linux/kernel_stat.h linux/include/linux/kernel_stat.h
--- v1.0.4/linux/include/linux/kernel_stat.h	Tue Feb  1 09:19:34 1994
+++ linux/include/linux/kernel_stat.h	Mon Mar 28 11:21:52 1994
@@ -14,7 +14,7 @@
 	unsigned int dk_drive[DK_NDRIVE];
 	unsigned int pgpgin, pgpgout;
 	unsigned int pswpin, pswpout;
-	unsigned int interrupts;
+	unsigned int interrupts[16];
 	unsigned int ipackets, opackets;
 	unsigned int ierrors, oerrors;
 	unsigned int collisions;
diff -u --recursive --new-file v1.0.4/linux/init/main.c linux/init/main.c
--- v1.0.4/linux/init/main.c	Mon Feb  7 16:07:01 1994
+++ linux/init/main.c	Sat Mar 26 14:33:31 1994
@@ -120,6 +120,7 @@
 #define MAX_INIT_ARGS 8
 #define MAX_INIT_ENVS 8
 #define COMMAND_LINE ((char *) (PARAM+2048))
+#define COMMAND_LINE_SIZE 256
 
 extern void time_init(void);
 
@@ -149,7 +150,7 @@
 
 static char fpu_error = 0;
 
-static char command_line[80] = { 0, };
+static char command_line[COMMAND_LINE_SIZE] = { 0, };
 
 char *get_options(char *str, int *ints) 
 {
@@ -329,12 +330,19 @@
 static void copy_options(char * to, char * from)
 {
 	char c = ' ';
+	int len = 0;
 
-	do {
-		if (c == ' ' && !memcmp("mem=", from, 4))
+	for (;;) {
+		if (c == ' ' && *(unsigned long *)from == *(unsigned long *)"mem=")
 			memory_end = simple_strtoul(from+4, &from, 0);
-		c = *(to++) = *(from++);
-	} while (c);
+		c = *(from++);
+		if (!c)
+			break;
+		if (COMMAND_LINE_SIZE <= ++len)
+			break;
+		*(to++) = c;
+	}
+	*to = '\0';
 }
 
 static void copro_timeout(void)
diff -u --recursive --new-file v1.0.4/linux/kernel/irq.c linux/kernel/irq.c
--- v1.0.4/linux/kernel/irq.c	Tue Feb  1 09:05:00 1994
+++ linux/kernel/irq.c	Mon Mar 28 11:21:52 1994
@@ -201,7 +201,7 @@
 {
 	struct sigaction * sa = irq + irq_sigaction;
 
-	kstat.interrupts++;
+	kstat.interrupts[irq]++;
 	sa->sa_handler((int) regs);
 }
 
@@ -214,7 +214,7 @@
 {
 	struct sigaction * sa = irq + irq_sigaction;
 
-	kstat.interrupts++;
+	kstat.interrupts[irq]++;
 	sa->sa_handler(irq);
 }
 
