diff -u --recursive --new-file v1.1.70/linux/Configure linux/Configure
--- v1.1.70/linux/Configure	Mon Apr 18 11:38:14 1994
+++ linux/Configure	Sat Dec  3 13:16:54 1994
@@ -44,18 +44,6 @@
 }
 
 #
-# change updates the "config.new" file according to the answer
-#
-#	change define old new
-#
-function change () {
-	if [ "$2" != "$3" ]; then
-		sed "s/$1 $2$/$1 $3/" < $CONFIG_NEW > .tmpc
-		mv .tmpc $CONFIG_NEW
-	fi
-}
-
-#
 # comment does some pretty-printing
 #
 #	comment 'xxx'
@@ -73,17 +61,17 @@
 #
 function bool () {
 	ans=""
+	def=$(eval echo "\${$2:-$3}")
 	while [ "$ans" != "y" -a "$ans" != "n" ]; do
-		readln "$1 ($2) [$3] " "$3"
+		readln "$1 ($2) [$def] " "$def"
 	done
 	if [ "$ans" = "y" ]; then
-		echo "  $2 = $2" >>$CONFIG
+		echo "$2=y" >>$CONFIG
 		echo "#define $2 1" >>$CONFIG_H
 	else
 		echo "# $2 is not set" >>$CONFIG
 		echo "#undef  $2" >>$CONFIG_H
 	fi
-	change $2 $3 $ans
 	eval "$2=$ans"
 }
 
@@ -95,23 +83,22 @@
 function int () {
 	# Slimier hack to get bash to rescan a line.
 	ans="x"
+	def=$(eval echo "\${$2:-$3}")
 	while [ $[$ans+0] != "$ans" ]; do
-		readln "$1 ($2) [$3] " "$3"
+		readln "$1 ($2) [$def] " "$def"
 	done
-	echo "  $2 = $ans" >>$CONFIG
+	echo "$2=$ans" >>$CONFIG
 	echo "#define $2 ($ans)" >>$CONFIG_H
 	eval "$2=$ans"
 }
 
 CONFIG=.tmpconfig
 CONFIG_H=.tmpconfig.h
-CONFIG_NEW=config.new
-trap "rm -f $CONFIG $CONFIG_H $CONFIG_NEW ; exit 1" 1 2
+trap "rm -f $CONFIG $CONFIG_H ; exit 1" 1 2
 
 #
 # Make sure we start out with a clean slate.
 #
-cp config.in $CONFIG_NEW
 echo "#" > $CONFIG
 echo "# Automatically generated make config: don't edit" >> $CONFIG
 echo "#" >> $CONFIG
@@ -122,16 +109,24 @@
 
 DEFAULT=$1
 
+if [ -f ./.config ] ; then
+	. ./.config
+	sed -e 's/# \(.*\) is not.*/\1=n/' <./.config >/tmp/conf.$$
+	. /tmp/conf.$$
+	rm /tmp/conf.$$
+fi
 . ./config.in
 
 if [ "$CONFIG_SOUND" = "y" ] ; then
 	$MAKE -C drivers/sound config || exit 1
 fi
 
+rm -f .config.old
+if [ -f .config ]; then
+	mv .config .config.old
+fi
 mv .tmpconfig .config
 mv .tmpconfig.h include/linux/autoconf.h
-mv config.in config.old
-mv config.new config.in
 
 echo
 echo "The linux kernel is now hopefully configured for your setup."
diff -u --recursive --new-file v1.1.70/linux/Makefile linux/Makefile
--- v1.1.70/linux/Makefile	Sat Dec  3 13:05:42 1994
+++ linux/Makefile	Sun Dec  4 20:25:25 1994
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 1
-SUBLEVEL = 70
+SUBLEVEL = 71
 
 ARCH = i386
 
diff -u --recursive --new-file v1.1.70/linux/arch/i386/boot/head.S linux/arch/i386/boot/head.S
--- v1.1.70/linux/arch/i386/boot/head.S	Mon Nov 28 14:21:43 1994
+++ linux/arch/i386/boot/head.S	Sun Dec  4 20:04:49 1994
@@ -95,8 +95,6 @@
  * apply at our cpl of 0 and the stack ought to be aligned already, and
  * we don't need to preserve eflags.
  */
-	movl %esp,%edi		# save stack pointer
-	andl $0xfffffffc,%esp	# align stack to avoid AC fault
 	movl $3,_x86
 	pushfl			# push EFLAGS
 	popl %eax		# get EFLAGS
@@ -121,26 +119,31 @@
 	je is486
 isnew:	pushl %ecx		# restore original EFLAGS
 	popfl
+	/* get processor type */
 	movl $1, %eax		# Use the CPUID instruction to 
 	.byte 0x0f, 0xa2	# check the processor type
 	andl $0xf00, %eax	# Set _x86 with the family
 	shrl $8, %eax		# returned.	
 	movl %eax, _x86
-	movl %edi,%esp		# restore esp
+	/* get vendor info */
+	xorl %eax, %eax			# call CPUID with 0 -> return vendor ID
+	.byte 0x0f, 0xa2		# CPUID
+	movl %ebx, _x86_vendor_id	# lo 4 chars
+	movl %edx, _x86_vendor_id+4	# next 4 chars
+	movl %ecx, _x86_vendor_id+8	# last 4 chars
+
 	movl %cr0,%eax		# 486+
 	andl $0x80000011,%eax	# Save PG,PE,ET
 	orl $0x50022,%eax	# set AM, WP, NE and MP
 	jmp 2f
 is486:	pushl %ecx		# restore original EFLAGS
 	popfl
-	movl %edi,%esp		# restore esp
 	movl %cr0,%eax		# 486
 	andl $0x80000011,%eax	# Save PG,PE,ET
 	orl $0x50022,%eax	# set AM, WP, NE and MP
 	jmp 2f
 is386:	pushl %ecx		# restore original EFLAGS
 	popfl
-	movl %edi,%esp		# restore esp
 	movl %cr0,%eax		# 386
 	andl $0x80000011,%eax	# Save PG,PE,ET
 	orl $2,%eax		# set MP
diff -u --recursive --new-file v1.1.70/linux/arch/i386/config.in linux/arch/i386/config.in
--- v1.1.70/linux/arch/i386/config.in	Sat Dec  3 13:05:42 1994
+++ linux/arch/i386/config.in	Sat Dec  3 12:02:09 1994
@@ -31,9 +31,9 @@
 bool 'TCP/IP networking' CONFIG_INET y
 if [ "$CONFIG_INET" "=" "y" ]; then
 bool 'IP forwarding/gatewaying' CONFIG_IP_FORWARD n
-#bool 'IP multicasting (ALPHA)' CONFIG_IP_MULTICAST n
-#bool 'IP firewalling' CONFIG_IP_FIREWALL n
-#bool 'IP accounting' CONFIG_IP_ACCT n
+bool 'IP multicasting (ALPHA)' CONFIG_IP_MULTICAST n
+bool 'IP firewalling' CONFIG_IP_FIREWALL n
+bool 'IP accounting' CONFIG_IP_ACCT n
 comment '(it is safe to leave these untouched)'
 bool 'PC/TCP compatibility mode' CONFIG_INET_PCTCP n
 bool 'Reverse ARP' CONFIG_INET_RARP n
@@ -100,6 +100,7 @@
 bool 'SLIP (serial line) support' CONFIG_SLIP n
 if [ "$CONFIG_SLIP" = "y" ]; then
   bool ' CSLIP compressed headers' SL_COMPRESSED y
+  bool ' 16 channels instead of 4' SL_SLIP_LOTS n
 #  bool ' SLIP debugging on' SL_DUMP y
 fi
 bool 'PPP (point-to-point) support' CONFIG_PPP n
@@ -112,9 +113,6 @@
 	bool 'SMC Ultra support' CONFIG_ULTRA n
 fi
 bool 'AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE n
-if [ "$CONFIG_LANCE" = "y" ]; then
-	bool '   with PCnet/PCI support' CONFIG_PCI y
-fi
 bool '3COM cards' CONFIG_NET_VENDOR_3COM y
 if [ "$CONFIG_NET_VENDOR_3COM" = "y" ]; then
 	bool '3c501 support' CONFIG_EL1 n
diff -u --recursive --new-file v1.1.70/linux/arch/sparc/boot/boot.S linux/arch/sparc/boot/boot.S
--- v1.1.70/linux/arch/sparc/boot/boot.S	Thu Jan  1 02:00:00 1970
+++ linux/arch/sparc/boot/boot.S	Sun Dec  4 17:59:45 1994
@@ -0,0 +1,454 @@
+#include "boot.h"
+#include "version.h"
+
+	.data
+
+/* First thing to go in the data segment is the interrupt stack */
+
+        .globl  _intstack
+        .globl  _eintstack
+_intstack:
+        .skip   4 * NBPG                ! 16k = 128 128-byte stack frames
+_eintstack:
+
+
+
+/* 
+   The following are used with the prom_vector node-ops to figure out
+   the cpu-type 
+*/
+
+        .globl  _cputyp
+
+_cputyp:
+        .word   1
+
+_cputypval:
+	.asciz "sun4c"
+	.ascii "     "
+
+_cputypvar:
+	.asciz "compatability"
+
+_cputypvallen = _cputypvar - _cputypval
+
+
+/* WARNING: evil messages follow */
+
+	.align 4
+
+sun4_notsup:
+	.asciz  "Sparc-Linux: sun4 support not implemented yet\n\n"
+	.align 4
+
+sun4m_notsup:
+        .asciz  "Sparc-Linux: sun4m support does not exist\n\n"
+	.align 4
+
+sun4d_notsup:
+        .asciz  "Sparc-Linux: sun4d support does not exist\n\n"
+	.align 4
+
+
+/* The following will disappear real soon as the implementation is easy */
+
+v2_prom_notyet:
+	.asciz  "Sparc-Linux: v2 boot-prom support not implemented\n\n"
+	.align 4
+
+
+/*
+   Fill up the prom vector, note in particular the kind first element,
+   no joke.
+*/
+
+			.globl _prom_vector_p
+
+_prom_vector_p:		.skip 4
+prom_magic:  		.skip 4			! magic mushroom, beware...
+prom_rom_vers: 		.skip 4			! interface version (v0 or v2)
+prom_pluginvers:	.skip 4			! XXX help help help
+prom_revision:		.skip 4			! PROM revision (ie. 1.4)
+prom_bootstr:		.skip 4			! what we are invoked with
+prom_putchar:		.skip 4			! void putchar(int ch)  BLOCKING.
+prom_getchar:		.skip 4			! int getchar(void)     BLOCKING.
+prom_nputchar:		.skip 4			! int purchar(int ch)   non-block
+prom_ngetchar:		.skip 4			! int getchar(void)     non-block
+prom_halt:		.skip 4			! void halt(void)  solaris friend
+prom_eval:		.skip 4			! void eval(int len, char* string)
+prom_v0mem_desc:	.skip 4			! V0 memory descriptor list ptr.
+prom_nodefuncs:		.skip 4			! Magical Node functions
+prom_v0devfuncs:	.skip 4			! V0 device operations
+prom_putstring:		.skip 4			! prom putstring()
+prom_bootme:		.skip 4			! reset()
+prom_printf:		.skip 4			! minimal printf()
+prom_abort:		.skip 4			! "L1-A" magic cookie
+						! must be mapped in ALL contexts
+prom_ticks:		.skip 4			! number of ticks since reset
+prom_sync:		.skip 4			! hook in prom for "sync" func
+prom_v0bootarg:		.skip 4			! v0 prom boot arguements
+prom_v2bootarg:		.skip 4			! same as above for v2 proms
+prom_ethaddr_func:	.skip 4			! extract ethernet device address
+prom_v2devfunc:		.skip 4			! ptr to v2 style device ops.
+prom_xtra_array:	.skip 4			! who knows :-( help help
+prom_setcontext:	.skip 4			! set context on sun4c
+prom_stdin:		.skip 4			! prom stdin magic cookie
+prom_stdout:		.skip 4			! prom stdout magic cookie
+
+
+	.align 4
+
+	.globl boot_msg
+
+/*
+   This gets forth eval'd, just 'cause I think forth is neat to have in a boot
+   monitor :-) We may not need no steenkin BIOS but we do need the prom!
+*/
+
+boot_msg:	
+	.ascii "Booting Sparc-Linux V0.00PRE-ALPHA (SUN4C) "
+	.ascii WHO_COMPILED_ME 
+	.asciz " \n"
+	.align 4
+
+	.globl boot_msg2
+
+boot_msg2:
+	.asciz "Booting Sparclinux V0.00 PRE-ALPHA on a (SUN4C)\n\n"
+
+	.align 4
+
+pstring1:
+	.asciz "Prom Magic Cookie: 0x%x  "
+	.align 4
+
+pstring2:
+	.asciz "Interface Version: v%d\n"
+	.align 4
+
+pstring3:
+	.asciz "Prom Revision: V%d\n\n"
+	.align 4
+
+pstring4:
+	.ascii "Total Physical Memory: %d bytes\nVM mapped by Prom: %d bytes\n"
+	.asciz "Available Physical Memory: %d bytes\n"
+	.align 4
+
+
+newline:
+	.asciz "\n"
+	.align 4
+
+	.text
+
+        .globl  _msgbuf
+msgbufsize = NBPG                       ! 1 page for msg buffer
+_msgbuf = KERNBASE + NBPG
+
+
+IE_reg_addr = _msgbuf + msgbufsize      ! this page not used; points to IEreg
+
+/*
+   ignore the following variable settings, I used them when I had
+   no stinkin idea what the linker was doing with the symbols to
+   get them in the right place for load time
+*/
+
+whereis_bootmsg = boot_msg-KERNBASE
+whereis_kernbase = KERNBASE
+whereis_prom_vector_p = _prom_vector_p-KERNBASE
+whereis_prom_eval = prom_eval-KERNBASE
+whereis_prom_halt = prom_halt-KERNBASE
+	
+	.globl	start
+	.globl  _trapbase
+start:
+_trapbase:
+	b dostart; nop; nop; nop	! we never get trap #0 it is special
+					! TRAP code should go here, TODO :>
+
+_msgbufmapped:
+        .word   1
+
+
+        .data
+        .skip   32                      ! alignment byte & negative indicies
+uwtab:  .skip   32                      ! u_char uwtab[-31..31];
+wmask:  .skip   32                      ! u_char wmask[0..31];
+
+        .text
+	
+
+	
+dostart:	mov	%o0, %g7
+		st	%o0, [_prom_vector_p]   ! we will need it later
+		ld	[%g7 + 0x4], %o2
+		cmp	%o2, 2			! a v2 prom?
+		be	_no_v2_here
+		nop
+
+		set	0x4000, %g6
+		cmp	%o0, %g6		! an old sun4?
+		beq	no_sun4_here
+		nop
+
+		ld	[%g7 + 0x1c], %o4
+		ld	[%o4], %o4
+		call 	%o4
+		mov	0, %o0
+		set	_cputypvar, %o1
+		set	_cputypval, %o2
+		ld	[%g7 + 0x1c], %o4
+		ld	[%o4 + 0x0c], %o4
+		call	%o4
+		nop
+
+		set	_cputypval, %o2
+		ldub	[%o2 + 4], %o0
+		cmp	%o0, 'c'
+		beq	is_sun4c
+		nop
+		cmp	%o0, 'm'
+		beq	no_sun4m_here
+		nop
+		b	no_sun4d_here
+		nop
+
+is_sun4c:					! OK, this is a sun4c, yippie
+		mov 	%g7, %g6		! load up them promvec offsets
+		st	%g6, [prom_magic]     	! magic mushroom :>
+		add	%g7, 0x4, %g6
+		st	%g6, [prom_rom_vers]
+		add	%g7, 0x8, %g6
+		st	%g6, [prom_pluginvers]
+		add	%g7, 0xc, %g6
+		st	%g6, [prom_revision]
+		add	%g7, 0x10, %g6
+		st	%g6, [prom_v0mem_desc]
+		add	%g7, 0x1c, %g6
+		st	%g6, [prom_nodefuncs]
+		add	%g7, 0x20, %g6
+		st	%g6, [prom_bootstr]
+		add	%g7, 0x24, %g6
+		st	%g6, [prom_v0devfuncs]
+		add	%g7, 0x48, %g6
+		st	%g6, [prom_stdin]
+		add	%g7, 0x4c, %g6
+		st	%g6, [prom_stdout]
+		add	%g7, 0x54, %g6
+		st	%g6, [prom_putchar]
+		add	%g7, 0x50, %g6
+		st	%g6, [prom_getchar]
+		add	%g7, 0x5c, %g6
+		st	%g6, [prom_nputchar]
+		add	%g7, 0x58, %g6
+		st	%g6, [prom_ngetchar]
+		add	%g7, 0x60, %g6
+		st	%g6, [prom_putstring]
+		add	%g7, 0x64, %g6
+		st	%g6, [prom_bootme]
+		add	%g7, 0x68, %g6
+		st	%g6, [prom_printf]
+		add	%g7, 0x6c, %g6
+		st	%g6, [prom_abort]
+		add	%g7, 0x70, %g6
+		st	%g6, [prom_ticks]
+		add	%g7, 0x74, %g6
+		st	%g6, [prom_halt]
+		add	%g7, 0x78, %g6
+		st	%g6, [prom_sync]
+		add	%g7, 0x7c, %g6
+		st	%g6, [prom_eval]
+		add	%g7, 0x80, %g6
+		st	%g6, [prom_v0bootarg]
+		add	%g7, 0x84, %g6
+		st	%g6, [prom_ethaddr_func]
+		add	%g7, 0x88, %g6
+		st	%g6, [prom_v2bootarg]
+		add	%g7, 0x98, %g6
+		st	%g6, [prom_v2devfunc]
+		add	%g7, 0xc8, %g6
+		st	%g6, [prom_xtra_array]
+		add	%g7, 0x104, %g6
+		st	%g6, [prom_setcontext]
+
+
+		set	boot_msg-KERNBASE, %o0	
+		ld	[prom_printf-KERNBASE], %o2
+		ld	[%o2], %o1
+		call	%o1  			! print boot message #1
+		nop
+		set	newline-KERNBASE, %o0
+		ld	[prom_printf-KERNBASE], %o2
+		ld	[%o2], %o1
+		call	%o1
+		nop
+
+		b	0f
+		nop
+
+
+0:		nop				! duh	
+		set	pstring1-KERNBASE, %o0
+		ld	[prom_printf-KERNBASE], %o3
+		ld	[%o3], %o2
+		ld	[prom_magic-KERNBASE], %o3
+		ld	[%o3], %o1
+		call	%o2
+		nop; nop; nop
+
+		set	pstring2-KERNBASE, %o0
+		ld	[prom_printf-KERNBASE], %o3
+		ld	[%o3], %o2
+		ld	[prom_rom_vers-KERNBASE], %o3
+		ld	[%o3], %o1
+		call 	%o2
+		nop; nop; nop
+
+		set	pstring4-KERNBASE, %o0
+		ld	[prom_printf-KERNBASE], %o5
+		ld	[%o5], %o4
+		ld	[_prom_vector_p], %l1
+		ld	[%l1+16], %l2
+		ld	[%l2], %l3
+		ld	[%l3 + 8], %o1
+
+/*
+		ld	[%l1], %l2
+		ld	[%l2 + 0x8], %o1    ! physical memory accumulator
+*/
+		ld 	[_prom_vector_p], %l1
+		ld	[%l1 + 16], %l2
+		ld	[%l2], %l3
+		ld	[%l3], %l4
+
+/* 		ld	[%l3], %l4  */
+memloop:
+		cmp	%l4, 0
+		be 	mv_to_vmprom		! is there more?
+		nop
+
+		ld	[%l4 + 0x8], %l6	! aparently so...
+		add	%o1, %l6, %o1
+		b	memloop
+		ld	[%l4], %l4
+
+mv_to_vmprom:
+
+		ld	[_prom_vector_p], %l0
+		ld	[%l0 + 20], %l1
+		ld	[%l1], %l2
+		ld	[%l2 + 8], %o2		! memory accumulator
+
+		ld	[_prom_vector_p], %l0
+		ld	[%l0 + 20], %l1
+		ld	[%l1], %l2
+		ld	[%l2], %l4
+
+memloop2:
+		cmp	%l4, 0
+		be 	mv_to_vmprom2		! is there more?
+		nop
+		ld	[%l4 + 0x8], %l6	! aparently so...
+		add	%o2, %l6, %o2
+		b	memloop2
+		ld	[%l4], %l4
+
+mv_to_vmprom2:
+
+		ld	[_prom_vector_p], %l0
+		ld	[%l0 + 24], %l1
+		ld	[%l1], %l2
+		ld	[%l2 + 8], %o3		! memory accumulator
+
+		ld	[_prom_vector_p], %l0
+		ld	[%l0 + 24], %l1
+		ld	[%l1], %l2
+		ld	[%l2], %l4
+
+memloop3:
+		cmp	%l4, 0
+		be 	mv_to_vmprom3		! is there more?
+		nop
+		ld	[%l4 + 0x8], %l6	! aparently so...
+		add	%o3, %l6, %o3
+		b	memloop3
+		ld	[%l4], %l4
+
+mv_to_vmprom3:
+
+		call 	%o4
+		nop; nop; nop
+
+
+		set	newline-KERNBASE, %o0
+		ld	[prom_printf-KERNBASE], %o2
+		ld	[%o2], %o1
+		call	%o1
+		nop
+
+		b	halt_me
+		nop
+
+		.globl _no_v2_here
+_no_v2_here:
+		ld	[%g7 + 0x68], %o1
+		set	v2_prom_notyet-KERNBASE, %o0
+		call    %o1
+		nop
+		b	halt_me
+		nop
+
+no_sun4_here:
+		ld	[%g7 + 0x68], %o1
+		set	sun4_notsup, %o0
+		call	%o1
+		nop
+		b	halt_me
+		nop
+
+no_sun4m_here:
+		ld	[%g7 + 0x68], %o1
+		set	sun4m_notsup, %o0
+		call	%o1
+		nop
+		b	halt_me
+		nop
+
+no_sun4d_here:
+		ld	[%g7 + 0x68], %o1
+		set	sun4d_notsup, %o0
+		call	%o1
+		nop
+		b	halt_me
+		nop
+
+halt_me:
+		ld	[%g7 + 0x74], %o0
+		call	%o0			! get us out of here...
+		nop				! aparently solaris is better
+
+_strlen:
+		mov	%o0, %l1
+		mov	%g0, %l3
+		ldub	[%l1], %l2
+		sll	%l2, 24, %l2
+		sra	%l2, 24, %l2
+len_loop:
+		cmp 	%l2, 0
+		be	len_loop_end
+		nop
+		add	%l3, 0x1, %l3
+		add	%l1, 0x1, %l1
+		ldub	[%l1], %l2
+		sll	%l2, 24, %l2
+		sra	%l2, 24, %l2
+		b	len_loop
+		nop
+
+len_loop_end:
+		mov 	%l3, %o0
+		ret
+		nop
+		
diff -u --recursive --new-file v1.1.70/linux/arch/sparc/boot/boot.h linux/arch/sparc/boot/boot.h
--- v1.1.70/linux/arch/sparc/boot/boot.h	Thu Jan  1 02:00:00 1970
+++ linux/arch/sparc/boot/boot.h	Sun Dec  4 17:59:45 1994
@@ -0,0 +1,6 @@
+#define KERNSIZE	134217728
+#define KERNBASE	-134217728
+#define NBPG		4096	
+#define UPAGES		2
+#define PROM_BASE	-1568768
+
diff -u --recursive --new-file v1.1.70/linux/arch/sparc/boot/version.h linux/arch/sparc/boot/version.h
--- v1.1.70/linux/arch/sparc/boot/version.h	Thu Jan  1 02:00:00 1970
+++ linux/arch/sparc/boot/version.h	Sun Dec  4 17:59:45 1994
@@ -0,0 +1 @@
+#define WHO_COMPILED_ME "someone@somewhere.domain"
diff -u --recursive --new-file v1.1.70/linux/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c
--- v1.1.70/linux/drivers/block/ll_rw_blk.c	Sat Nov 26 18:36:04 1994
+++ linux/drivers/block/ll_rw_blk.c	Sun Dec  4 23:50:05 1994
@@ -219,6 +219,10 @@
 			bh->b_req = 0;
 			return;
 		}
+	/* Uhhuh.. Nasty dead-lock possible here.. */
+	if (bh->b_lock)
+		return;
+	/* Maybe the above fixes it, and maybe it doesn't boot. Life is interesting */
 	lock_buffer(bh);
 	if ((rw == WRITE && !bh->b_dirt) || (rw == READ && bh->b_uptodate)) {
 		unlock_buffer(bh);
diff -u --recursive --new-file v1.1.70/linux/drivers/net/Makefile linux/drivers/net/Makefile
--- v1.1.70/linux/drivers/net/Makefile	Thu Nov  3 17:53:28 1994
+++ linux/drivers/net/Makefile	Mon Dec  5 00:07:40 1994
@@ -180,8 +180,7 @@
 
 net.a: $(NETDRV_OBJS)
 	rm -f net.a
-	ar rc net.a $(NETDRV_OBJS)
-	ranlib net.a
+	ar rcs net.a $(NETDRV_OBJS)
 
 clean:
 	rm -f core *.o *.a *.s
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/53c7,8xx.c linux/drivers/scsi/53c7,8xx.c
--- v1.1.70/linux/drivers/scsi/53c7,8xx.c	Tue Nov 29 18:51:24 1994
+++ linux/drivers/scsi/53c7,8xx.c	Sat Dec  3 12:05:09 1994
@@ -276,16 +276,17 @@
  */
 
 struct pci_chip {
-    short pci_device_id;
+    unsigned short pci_device_id;
     int chip;
     int max_revision;
     int min_revision;
 };
 
-static struct pci_chip pci_chip_ids[3] = { 
+static struct pci_chip pci_chip_ids[] = { 
     {PCI_DEVICE_ID_NCR_53C810, 810, 1, 1}, 
+    {PCI_DEVICE_ID_NCR_53C815, 815, 2, 3},
     {PCI_DEVICE_ID_NCR_53C820, 820, -1, -1},
-    {PCI_DEVICE_ID_NCR_53C825, 825, -1, -1},
+    {PCI_DEVICE_ID_NCR_53C825, 825, -1, -1}
 };
 
 #define NPCI_CHIP_IDS (sizeof (pci_chip_ids) / sizeof(pci_chip_ids[0]))
@@ -413,6 +414,7 @@
     switch (hostdata->chip) {
     case 810:
     case 815:
+    case 820:
     case 825:
     	hostdata->dstat_sir_intr = NCR53c8x0_dstat_sir_intr;
     	hostdata->init_save_regs = NULL;
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/Makefile linux/drivers/scsi/Makefile
--- v1.1.70/linux/drivers/scsi/Makefile	Sat Nov 26 18:36:05 1994
+++ linux/drivers/scsi/Makefile	Sun Dec  4 19:16:28 1994
@@ -6,9 +6,6 @@
 # unless its something special (ie not a .c file).
 #
 
-#AHA152X	= -DDEBUG -DAUTOCONF -DIRQ=11 -DSCSI_ID=7 -DRECONNECT=0 \
-#          -DPORTBASE=0x340 -DSKIP_BIOSTEST -DDONT_SNARF
-
 AHA152X	= -DDEBUG_AHA152X -DAUTOCONF
 
 ifeq (${CFLAGS},)
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/aha1740.c linux/drivers/scsi/aha1740.c
--- v1.1.70/linux/drivers/scsi/aha1740.c	Tue Nov 29 18:51:25 1994
+++ linux/drivers/scsi/aha1740.c	Sun Dec  4 19:31:10 1994
@@ -197,6 +197,12 @@
 		continue;
 	    }
 	    SCtmp = ecbptr->SCpnt;
+	    if (!SCtmp)
+	    {
+		printk("Aha1740 null SCtmp in interrupt (%x,%x,%x,%d)\n",
+			inb(G2STAT),adapstat,inb(G2INTST),number_serviced++);
+		continue;
+	    }
 	    if (SCtmp->host_scribble)
 		scsi_free(SCtmp->host_scribble, 512);
 	  /* Fetch the sense data, and tuck it away, in the required slot.  The
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/buslogic.c linux/drivers/scsi/buslogic.c
--- v1.1.70/linux/drivers/scsi/buslogic.c	Thu Dec  1 19:15:04 1994
+++ linux/drivers/scsi/buslogic.c	Sun Dec  4 19:16:27 1994
@@ -1215,8 +1215,8 @@
 	    if (bus_type == 'V'				    /* 445 */
 		&& firmware_rev[0] <= '3'		    /* S */
 		&& bios != NULL) {			    /* BIOS enabled */
-#if 0
-		/* ??? Once LNZ's forbidden_addr stuff makes it into the higher
+#if 1
+		/* Now that LNZ's forbidden_addr stuff makes it into the higher
 		   level scsi code, we can use this instead. */
 		/* Avoid addresses which "mirror" the BIOS for DMA. */
 		shpnt->forbidden_addr = bios;
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/hosts.c linux/drivers/scsi/hosts.c
--- v1.1.70/linux/drivers/scsi/hosts.c	Thu Dec  1 19:15:04 1994
+++ linux/drivers/scsi/hosts.c	Sun Dec  4 19:16:27 1994
@@ -236,6 +236,8 @@
 	retval->host_wait = NULL;	
 	retval->last_reset = 0;	
 	retval->irq = 0;
+	retval->forbidden_addr = 0;
+	retval->forbidden_size = 0;
 	retval->hostt = tpnt;	
 	retval->next = NULL;
 #ifdef DEBUG
@@ -327,4 +329,22 @@
 
 	max_scsi_hosts = count;
 	return 0;
+}
+
+
+void scsi_mem_init(unsigned long memory_end)
+{
+  struct Scsi_Host *Host;
+  long High8, Low24;
+  for (Host = scsi_hostlist; Host != NULL; Host = Host->next)
+    if (Host->forbidden_addr > 0 && Host->forbidden_size > 0)
+      for (High8 = 1<<24; High8 < memory_end; High8 += 1<<24)
+	for (Low24 = Host->forbidden_addr;
+	     Low24 < Host->forbidden_addr + Host->forbidden_size;
+	     Low24 += PAGE_SIZE)
+	  {
+	    unsigned long ForbiddenAddress = High8 + Low24;
+	    if (ForbiddenAddress >= memory_end) break;
+	    mem_map[MAP_NR(ForbiddenAddress)] = MAP_PAGE_RESERVED;
+	  }
 }
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/hosts.h linux/drivers/scsi/hosts.h
--- v1.1.70/linux/drivers/scsi/hosts.h	Thu Dec  1 19:15:04 1994
+++ linux/drivers/scsi/hosts.h	Sun Dec  4 19:16:27 1994
@@ -252,10 +252,19 @@
 		unsigned char n_io_port;
 		unsigned char irq;
 		unsigned char dma_channel;
+
+		/*
+		  Set these if there are conflicts between memory
+		  in the < 1mb region and regions at 16mb multiples.
+		  The address must be on a page boundary.
+		*/
+		unsigned long forbidden_addr;
+		unsigned long forbidden_size;
+
 		/*
 		  The rest can be copied from the template, or specifically
 		  initialized, as required.
-		  */
+		*/
 		
 		int this_id;
 		int can_queue;
@@ -264,7 +273,7 @@
 		unsigned unchecked_isa_dma:1;
 		/*
 		   True if this host was loaded as a loadable module
-		   */
+		*/
 		unsigned loaded_as_module:1;
 		
 		int hostdata[0];  /* Used for storage of host specific stuff */
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/scsi.c linux/drivers/scsi/scsi.c
--- v1.1.70/linux/drivers/scsi/scsi.c	Thu Dec  1 19:15:04 1994
+++ linux/drivers/scsi/scsi.c	Sun Dec  4 19:16:28 1994
@@ -41,7 +41,7 @@
 static void scsi_done (Scsi_Cmnd *SCpnt);
 static int update_timeout (Scsi_Cmnd *, int);
 static void print_inquiry(unsigned char *data);
-static void scsi_times_out (Scsi_Cmnd * SCpnt);
+static void scsi_times_out (Scsi_Cmnd * SCpnt, int pid);
 
 static int time_start;
 static int time_elapsed;
@@ -525,7 +525,7 @@
 	command, that failing perform a kernel panic.
 */ 
 
-static void scsi_times_out (Scsi_Cmnd * SCpnt)
+static void scsi_times_out (Scsi_Cmnd * SCpnt, int pid)
 	{
 	
  	switch (SCpnt->internal_timeout & (IN_ABORT | IN_RESET))
@@ -537,7 +537,7 @@
 #endif
 			}
 			
-			if (!scsi_abort	(SCpnt, DID_TIME_OUT))
+			if (!scsi_abort	(SCpnt, DID_TIME_OUT, pid))
 				return;				
 		case IN_ABORT:
 			printk("SCSI host %d abort() timed out - resetting\n",
@@ -837,8 +837,6 @@
 	SCpnt->use_sg = 0;
 	SCpnt->cmd_len = COMMAND_SIZE(SCpnt->cmnd[0]);
 	internal_cmnd (SCpnt);
-	SCpnt->use_sg = SCpnt->old_use_sg;
-	SCpnt->cmd_len = SCpnt->old_cmd_len;
 	}
 
 
@@ -1085,6 +1083,13 @@
 #ifdef DEBUG
 	printk("In scsi_done(host = %d, result = %06x)\n", host->host_no, result);
 #endif
+
+	if(SCpnt->flags & WAS_SENSE)
+	{
+		SCpnt->use_sg = SCpnt->old_use_sg;
+		SCpnt->cmd_len = SCpnt->old_cmd_len;
+	}
+
 	switch (host_byte(result))	
 	{
 	case DID_OK:
@@ -1400,7 +1405,7 @@
 */
 
 
-int scsi_abort (Scsi_Cmnd * SCpnt, int why)
+int scsi_abort (Scsi_Cmnd * SCpnt, int why, int pid)
 	{
 	int oldto;
 	struct Scsi_Host * host = SCpnt->host;
@@ -1408,6 +1413,16 @@
 	while(1)	
 		{
 		cli();
+
+		/*
+		 * Protect against races here.  If the command is done, or we are
+		 * on a different command forget it.
+		 */
+		if (SCpnt->request.dev == -1 || pid != SCpnt->pid) {
+		  sti();
+		  return 0;
+		}
+
 		if (SCpnt->internal_timeout & IN_ABORT) 
 			{
 			sti();
@@ -1436,6 +1451,8 @@
 			       SCpnt->pid, SCpnt->host->host_no, (int) SCpnt->target, (int) 
 			       SCpnt->lun);
 			print_command (SCpnt->cmnd);
+			if (SCpnt->request.dev == -1 || pid != SCpnt->pid)
+			  return 0;
 			SCpnt->abort_reason = why;
 			switch(host->hostt->abort(SCpnt)) {
 			  /* We do not know how to abort.  Try waiting another
@@ -1473,6 +1490,7 @@
 			     need to adjust timeout */
 			case SCSI_ABORT_NOT_RUNNING:
 			  SCpnt->internal_timeout &= ~IN_ABORT;
+			  update_timeout(SCpnt, 0);
 			  return 0;
 			case SCSI_ABORT_ERROR:
 			default:
@@ -1513,7 +1531,7 @@
 #if 0				  
 				    if (!(SCpnt1->flags & IS_RESETTING) && 
 				      !(SCpnt1->internal_timeout & IN_ABORT))
-				    scsi_abort(SCpnt1, DID_RESET);
+				    scsi_abort(SCpnt1, DID_RESET, SCpnt->pid);
 #endif
 				    SCpnt1->flags |= IS_RESETTING;
 				  }
@@ -1576,7 +1594,7 @@
 		We must not enter update_timeout with a timeout condition still pending.
 	*/
 
-	int timed_out;
+	int timed_out, pid;
 	struct Scsi_Host * host;
 	Scsi_Cmnd * SCpnt = NULL;
 
@@ -1594,9 +1612,10 @@
 		  for(SCpnt = host->host_queue; SCpnt; SCpnt = SCpnt->next)
 		    if (SCpnt->timeout == -1)
 		      {
-			sti();
 			SCpnt->timeout = 0;
-			scsi_times_out(SCpnt);
+			pid = SCpnt->pid;
+			sti();
+			scsi_times_out(SCpnt, SCpnt);
 			++timed_out; 
 			cli();
 		      }
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/scsi.h linux/drivers/scsi/scsi.h
--- v1.1.70/linux/drivers/scsi/scsi.h	Tue Nov 29 18:51:27 1994
+++ linux/drivers/scsi/scsi.h	Sun Dec  4 19:18:46 1994
@@ -510,7 +510,7 @@
 	DID_ABORT is returned in the hostbyte.
 */
 
-extern int scsi_abort (Scsi_Cmnd *, int code);
+extern int scsi_abort (Scsi_Cmnd *, int code, int pid);
 
 extern void scsi_do_cmd (Scsi_Cmnd *, const void *cmnd ,
                   void *buffer, unsigned bufflen, void (*done)(struct scsi_cmnd *),
@@ -564,6 +564,7 @@
 		up(req->sem);
 	}
 	req->dev = -1;
+	wake_up(&wait_for_request);
 	wake_up(&SCpnt->device->device_wait);
 	return NULL;
 }
diff -u --recursive --new-file v1.1.70/linux/drivers/scsi/sg.c linux/drivers/scsi/sg.c
--- v1.1.70/linux/drivers/scsi/sg.c	Thu Dec  1 19:15:04 1994
+++ linux/drivers/scsi/sg.c	Sun Dec  4 19:16:28 1994
@@ -108,7 +108,9 @@
     }
   if (!scsi_generics[dev].users && scsi_generics[dev].pending && scsi_generics[dev].complete)
    {
-    scsi_free(scsi_generics[dev].buff,scsi_generics[dev].buff_len);
+    if (scsi_generics[dev].buff != NULL)
+      scsi_free(scsi_generics[dev].buff,scsi_generics[dev].buff_len);
+    scsi_generics[dev].buff=NULL;
     scsi_generics[dev].pending=0;
    }
   if (!scsi_generics[dev].users)
@@ -188,6 +190,7 @@
   else
    count=0;
   sg_free(device->buff,device->buff_len);
+  device->buff = NULL;
   device->pending=0;
   wake_up(&device->write_wait);
   return count;
@@ -266,6 +269,7 @@
     device->pending=0;
     wake_up(&device->write_wait);
     sg_free(device->buff,device->buff_len);
+    device->buff = NULL;
     return -EWOULDBLOCK;
    } 
 #ifdef DEBUG
@@ -370,6 +374,7 @@
    scsi_generics[i].generic_wait=NULL;
    scsi_generics[i].read_wait=NULL;
    scsi_generics[i].write_wait=NULL;
+   scsi_generics[i].buff=NULL;
    scsi_generics[i].exclude=0;
    scsi_generics[i].pending=0;
    scsi_generics[i].timeout=SG_DEFAULT_TIMEOUT;
diff -u --recursive --new-file v1.1.70/linux/fs/Makefile linux/fs/Makefile
--- v1.1.70/linux/fs/Makefile	Thu Dec  1 19:15:04 1994
+++ linux/fs/Makefile	Sat Dec  3 12:01:25 1994
@@ -36,6 +36,8 @@
 endif
 ifdef CONFIG_XIA_FS
 FS_SUBDIRS := $(FS_SUBDIRS) xiafs
+else
+MODULE_FS_SUBDIRS := $(MODULE_FS_SUBDIRS) xiafs
 endif
 ifdef CONFIG_UMSDOS_FS
 FS_SUBDIRS := $(FS_SUBDIRS) umsdos
@@ -44,6 +46,8 @@
 endif
 ifdef CONFIG_SYSV_FS
 FS_SUBDIRS := $(FS_SUBDIRS) sysv
+else
+MODULE_FS_SUBDIRS := $(MODULE_FS_SUBDIRS) sysv
 endif
 ifdef CONFIG_HPFS_FS
 FS_SUBDIRS := $(FS_SUBDIRS) hpfs
@@ -95,7 +99,8 @@
 	set -e; for i in $(MODULE_FS_SUBDIRS); do \
 	  test ! -d $$i || \
 	    { $(MAKE) -C $$i; }; done
-
+	(cd ../modules; \
+	 for i in $(MODULE_FS_SUBDIRS); do ln -sf ../fs/$$i/$$i.o .; done)
 
 else
 
diff -u --recursive --new-file v1.1.70/linux/fs/devices.c linux/fs/devices.c
--- v1.1.70/linux/fs/devices.c	Wed Aug 10 09:17:13 1994
+++ linux/fs/devices.c	Sat Dec  3 15:26:48 1994
@@ -66,10 +66,6 @@
 {
 	if (major == 0) {
 		for (major = MAX_CHRDEV-1; major > 0; major--) {
-			if (chrdevs[major].fops == fops)
-				return major;
-		}
-		for (major = MAX_CHRDEV-1; major > 0; major--) {
 			if (chrdevs[major].fops == NULL) {
 				chrdevs[major].name = name;
 				chrdevs[major].fops = fops;
@@ -90,10 +86,6 @@
 int register_blkdev(unsigned int major, const char * name, struct file_operations *fops)
 {
 	if (major == 0) {
-		for (major = MAX_BLKDEV-1; major > 0; major--) {
-			if (blkdevs[major].fops == fops)
-				return major;
-		}
 		for (major = MAX_BLKDEV-1; major > 0; major--) {
 			if (blkdevs[major].fops == NULL) {
 				blkdevs[major].name = name;
diff -u --recursive --new-file v1.1.70/linux/fs/proc/array.c linux/fs/proc/array.c
--- v1.1.70/linux/fs/proc/array.c	Tue Nov 29 18:51:28 1994
+++ linux/fs/proc/array.c	Sun Dec  4 19:52:00 1994
@@ -13,6 +13,9 @@
  *                      bad '!' which forced address recalculation for
  *                      EVERY character on the current page.
  *                      <middelin@polyware.iaf.nl>
+ *
+ * Danny ter Haar    :	Some minor additions for cpuinfo
+ * <danny@ow.nl>
  */
 
 #include <linux/types.h>
@@ -176,6 +179,22 @@
 	return strlen(buffer);
 }
 
+static int get_cpuinfo(char * buffer)
+{
+	return sprintf(buffer,"cpu      : %d86\n"
+			      "vid      : %s\n"
+			      "fdiv_bug : %s\n"
+			      "math     : %s\n"
+			      "hlt      : %s\n"
+			      "wp       : %s\n",
+			      x86, 
+			      x86_vendor_id,
+			      fdiv_bug ? "yes" : "no",
+			      hard_math ? "yes" : "no",
+			      hlt_works_ok ? "yes" : "no",
+			      wp_works_ok ? "yes" : "no");
+}
+
 static struct task_struct ** get_task(pid_t pid)
 {
 	struct task_struct ** p;
@@ -464,6 +483,7 @@
 extern int get_ksyms_list(char *);
 extern int get_irq_list(char *);
 extern int get_dma_list(char *);
+extern int get_cpuinfo(char *);
 
 static int get_root_array(char * page, int type)
 {
@@ -477,6 +497,9 @@
 		case PROC_MEMINFO:
 			return get_meminfo(page);
 
+		case PROC_CPUINFO:
+			return get_cpuinfo(page);
+
 		case PROC_VERSION:
 			return get_version(page);
 
@@ -505,6 +528,7 @@
 
 		case PROC_DMA:
 			return get_dma_list(page);
+
 	}
 	return -EBADF;
 }
diff -u --recursive --new-file v1.1.70/linux/fs/proc/root.c linux/fs/proc/root.c
--- v1.1.70/linux/fs/proc/root.c	Wed Nov  2 12:03:46 1994
+++ linux/fs/proc/root.c	Sat Dec  3 22:10:54 1994
@@ -59,6 +59,7 @@
 	{ PROC_MEMINFO,		7, "meminfo" },
 	{ PROC_KMSG,		4, "kmsg" },
 	{ PROC_VERSION,		7, "version" },
+	{ PROC_CPUINFO,		7, "cpuinfo" },
 	{ PROC_SELF,		4, "self" },	/* will change inode # */
 	{ PROC_NET,		3, "net" },
 #ifdef CONFIG_DEBUG_MALLOC
diff -u --recursive --new-file v1.1.70/linux/fs/sysv/Makefile linux/fs/sysv/Makefile
--- v1.1.70/linux/fs/sysv/Makefile	Wed Nov  9 14:56:35 1994
+++ linux/fs/sysv/Makefile	Sat Dec  3 12:01:33 1994
@@ -7,6 +7,10 @@
 #
 # Note 2! The CFLAGS definitions are now in the main makefile...
 
+ifndef CONFIG_SYSV_FS
+CFLAGS := $(CFLAGS) -DMODULE
+endif
+
 .c.s:
 	$(CC) $(CFLAGS) -S $<
 .c.o:
diff -u --recursive --new-file v1.1.70/linux/fs/sysv/inode.c linux/fs/sysv/inode.c
--- v1.1.70/linux/fs/sysv/inode.c	Wed Nov  9 14:56:36 1994
+++ linux/fs/sysv/inode.c	Sat Dec  3 12:01:39 1994
@@ -30,6 +30,14 @@
 
 #include <asm/segment.h>
 
+#ifdef MODULE
+#include <linux/module.h>
+#include "../../tools/version.h"
+#else
+#define MOD_INC_USE_COUNT
+#define MOD_DEC_USE_COUNT
+#endif
+
 void sysv_put_inode(struct inode *inode)
 {
 	if (inode->i_nlink)
@@ -348,6 +356,7 @@
 		panic("Coherent FS: bad super-block size");
 	if (64 != sizeof (struct sysv_inode))
 		panic("sysv fs: bad i-node size");
+	MOD_INC_USE_COUNT;
 	lock_super(sb);
 	set_blocksize(dev,BLOCK_SIZE);
 
@@ -390,6 +399,8 @@
 	unlock_super(sb);
 	if (!silent)
 		printk("VFS: unable to read Xenix/SystemV/Coherent superblock on device %d/%d\n",MAJOR(dev),MINOR(dev));
+	failed:
+	MOD_DEC_USE_COUNT;
 	return NULL;
 
 	ok:
@@ -413,7 +424,7 @@
 				sb->s_dev = 0;
 				unlock_super(sb);
 				printk("SysV FS: cannot read superblock in 1024 byte mode\n");
-				return NULL;
+				goto failed;
 		}
 	} else {
 		/* Switch to another block size. Unfortunately, we have to
@@ -459,7 +470,7 @@
 				sb->s_dev = 0;
 				unlock_super(sb);
 				printk("SysV FS: cannot read superblock in 512 byte mode\n");
-				return NULL;
+				goto failed;
 		}
 	}
 	sb->sv_ninodes = (sb->sv_firstdatazone - sb->sv_firstinodezone) << sb->sv_inodes_per_block_bits;
@@ -475,8 +486,8 @@
 	sb->s_mounted = iget(sb,SYSV_ROOT_INO);
 	unlock_super(sb);
 	if (!sb->s_mounted) {
-		sysv_put_super(sb);
 		printk("SysV FS: get root inode failed\n");
+		sysv_put_super(sb);
 		return NULL;
 	}
 	sb->s_dirt = 1;
@@ -513,6 +524,7 @@
 		set_blocksize(sb->s_dev,BLOCK_SIZE);
 	sb->s_dev = 0;
 	unlock_super(sb);
+	MOD_DEC_USE_COUNT;
 }
 
 void sysv_statfs(struct super_block *sb, struct statfs *buf)
@@ -949,3 +961,39 @@
         return err;
 }
 
+#ifdef MODULE
+
+/* Every kernel module contains stuff like this. */
+
+char kernel_version[] = UTS_RELEASE;
+
+static struct file_system_type sysv_fs_type[3] = {
+	{sysv_read_super, "xenix", 1, NULL},
+	{sysv_read_super, "sysv", 1, NULL},
+	{sysv_read_super, "coherent", 1, NULL}
+};
+
+int init_module(void)
+{
+	int i;
+
+	for (i = 0; i < 3; i++)
+		register_filesystem(&sysv_fs_type[i]);
+
+	return 0;
+}
+
+void cleanup_module(void)
+{
+	int i;
+
+	if (MOD_IN_USE) {
+		printk("SysV FS cannot be removed, currently in use\n");
+		return;
+	}
+
+	for (i = 0; i < 3; i++)
+		unregister_filesystem(&sysv_fs_type[i]);
+}
+
+#endif
diff -u --recursive --new-file v1.1.70/linux/fs/xiafs/Makefile linux/fs/xiafs/Makefile
--- v1.1.70/linux/fs/xiafs/Makefile	Wed Dec  1 14:44:15 1993
+++ linux/fs/xiafs/Makefile	Sat Dec  3 12:01:43 1994
@@ -7,6 +7,10 @@
 #
 # Note 2! The CFLAGS definitions are now in the main makefile...
 
+ifndef CONFIG_XIA_FS
+CFLAGS := $(CFLAGS) -DMODULE
+endif
+
 .c.s:
 	$(CC) $(CFLAGS) -S $<
 .c.o:
diff -u --recursive --new-file v1.1.70/linux/fs/xiafs/inode.c linux/fs/xiafs/inode.c
--- v1.1.70/linux/fs/xiafs/inode.c	Mon Apr 18 11:38:20 1994
+++ linux/fs/xiafs/inode.c	Sat Dec  3 12:01:47 1994
@@ -19,6 +19,14 @@
 #include <asm/system.h>
 #include <asm/segment.h>
 
+#ifdef MODULE
+#include <linux/module.h>
+#include "../../tools/version.h"
+#else
+#define MOD_INC_USE_COUNT
+#define MOD_DEC_USE_COUNT
+#endif
+
 #include "xiafs_mac.h"
 
 static u_long random_nr;
@@ -43,6 +51,7 @@
     for(i = 0 ; i < _XIAFS_ZMAP_SLOTS ; i++)
         brelse(sb->u.xiafs_sb.s_zmap_buf[i]);
     unlock_super(sb);
+    MOD_DEC_USE_COUNT;
 }
 
 static struct super_operations xiafs_sops = { 
@@ -63,6 +72,7 @@
     struct xiafs_super_block *sp;
     int i, z, dev;
 
+    MOD_INC_USE_COUNT;
     dev=s->s_dev;
     lock_super(s);
 
@@ -72,6 +82,7 @@
         s->s_dev=0;
 	unlock_super(s);
 	printk("XIA-FS: read super_block failed (%s %d)\n", WHERE_ERR);
+	MOD_DEC_USE_COUNT;
 	return NULL;
     }
     sp = (struct xiafs_super_block *) bh->b_data;
@@ -83,6 +94,7 @@
 	if (!silent)
 		printk("VFS: Can't find a xiafs filesystem on dev 0x%04x.\n",
 		   dev);
+	MOD_DEC_USE_COUNT;
 	return NULL;
     }
     s->s_blocksize = sp->s_zone_size;
@@ -93,7 +105,10 @@
       brelse(bh);
       set_blocksize(dev, s->s_blocksize);
       bh = bread (dev, 0,  s->s_blocksize);
-      if(!bh) return NULL;
+      if(!bh) {
+	MOD_DEC_USE_COUNT;
+	return NULL;
+      }
       sp = (struct xiafs_super_block *) (((char *)bh->b_data) + BLOCK_SIZE) ;
     };
     s->u.xiafs_sb.s_nzones = sp->s_nzones;
@@ -152,6 +167,7 @@
     s->s_dev=0;
     unlock_super(s);
     printk("XIA-FS: read bitmaps failed (%s %d)\n", WHERE_ERR);
+    MOD_DEC_USE_COUNT;
     return NULL;
 }
 
@@ -500,3 +516,30 @@
     brelse (bh);
     return err;
 }
+
+#ifdef MODULE
+
+/* Every kernel module contains stuff like this. */
+
+char kernel_version[] = UTS_RELEASE;
+
+static struct file_system_type xiafs_fs_type = {
+	xiafs_read_super, "xiafs", 1, NULL
+};
+
+int init_module(void)
+{
+	register_filesystem(&xiafs_fs_type);
+	return 0;
+}
+
+void cleanup_module(void)
+{
+	if (MOD_IN_USE) {
+		printk("XIA-FS cannot be removed, currently in use\n");
+		return;
+	}
+	unregister_filesystem(&xiafs_fs_type);
+}
+
+#endif
diff -u --recursive --new-file v1.1.70/linux/include/asm-alpha/types.h linux/include/asm-alpha/types.h
--- v1.1.70/linux/include/asm-alpha/types.h	Sat Dec  3 13:05:42 1994
+++ linux/include/asm-alpha/types.h	Sat Dec  3 11:26:55 1994
@@ -20,8 +20,10 @@
  */
 #if ((~0UL) == 0xffffffff)
 
+#ifndef __STRICT_ANSI__
 typedef signed long long __s64;
 typedef unsigned long long __u64;
+#endif
 
 #else
 
diff -u --recursive --new-file v1.1.70/linux/include/asm-i386/system.h linux/include/asm-i386/system.h
--- v1.1.70/linux/include/asm-i386/system.h	Mon Nov 28 14:21:46 1994
+++ linux/include/asm-i386/system.h	Sun Dec  4 20:30:45 1994
@@ -18,8 +18,6 @@
 	"mov %%ax,%%gs" \
 	: /* no outputs */ :"i" (USER_DS), "i" (USER_CS):"ax")
 
-#define sti() __asm__ __volatile__ ("sti": : :"memory")
-#define cli() __asm__ __volatile__ ("cli": : :"memory")
 #define nop() __asm__ __volatile__ ("nop")
 
 /*
@@ -43,6 +41,9 @@
 	__asm__("xchgb %0,%1":"=q" (res),"=m" (*m):"0" (0x1));
 	return res;
 }
+
+#define sti() __asm__ __volatile__ ("sti": : :"memory")
+#define cli() __asm__ __volatile__ ("cli": : :"memory")
 
 #define save_flags(x) \
 __asm__ __volatile__("pushfl ; popl %0":"=r" (x): /* no input */ :"memory")
diff -u --recursive --new-file v1.1.70/linux/include/asm-i386/types.h linux/include/asm-i386/types.h
--- v1.1.70/linux/include/asm-i386/types.h	Sat Dec  3 13:05:43 1994
+++ linux/include/asm-i386/types.h	Sat Dec  3 11:26:30 1994
@@ -15,8 +15,10 @@
 typedef signed long __s32;
 typedef unsigned long __u32;
 
+#ifndef __STRICT_ANSI__
 typedef signed long long __s64;
 typedef unsigned long long __u64;
+#endif
 
 /*
  * These aren't exported outside the kernel to avoid name space clashes
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/bitops.h linux/include/asm-m68k/bitops.h
--- v1.1.70/linux/include/asm-m68k/bitops.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/bitops.h	Tue Nov 29 22:15:49 1994
@@ -0,0 +1,120 @@
+#ifndef _M68K_BITOPS_H
+#define _M68K_BITOPS_H
+/*
+ * Copyright 1992, Linus Torvalds.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file README.legal in the main directory of this archive
+ * for more details.
+ */
+
+/*
+ * Require 68020 or better.
+ *
+ * They don't use the standard m680x0 bit ordering.
+ * Instead, the use the standard m680x0 bitfield ordering.
+ *
+ * Thus, bit 0 is the MSB of addr; bit 32 is the MSB of (addr+1).
+ */
+
+extern __inline__ int set_bit(int nr,void * vaddr)
+{
+	char retval;
+
+	__asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0"
+	     : "=d" (retval) : "d" (nr), "a" (vaddr));
+
+	return retval;
+}
+
+extern __inline__ int clear_bit(int nr, void * vaddr)
+{
+	char retval;
+
+	__asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0"
+	     : "=d" (retval) : "d" (nr), "a" (vaddr));
+
+	return retval;
+}
+
+extern __inline__ int change_bit(int nr, void * vaddr)
+{
+	char retval;
+
+	__asm__ __volatile__ ("bfchg %2@{%1:#1}; sne %0"
+	     : "=d" (retval) : "d" (nr), "a" (vaddr));
+
+	return retval;
+}
+
+extern __inline__ int test_bit(int nr, const void * vaddr)
+{
+	char retval;
+
+	__asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0"
+	     : "=d" (retval) : "d" (nr), "a" (vaddr));
+
+	return retval;
+}
+
+extern inline int find_first_zero_bit(void * vaddr, unsigned size)
+{
+	unsigned long res;
+	unsigned long *p;
+	unsigned long *addr = vaddr;
+
+	if (!size)
+		return 0;
+	__asm__ __volatile__ ("    moveq #-1,d0\n\t"
+			      "1:"
+			      "    cmpl  %1@+,d0\n\t"
+			      "    bne   2f\n\t"
+			      "    subql #1,%0\n\t"
+			      "    bne   1b\n\t"
+			      "    bra   5f\n\t"
+			      "2:"
+			      "    movel %1@-,d0\n\t"
+			      "    notl  d0\n\t"
+			      "    bfffo d0{#0,#0},%0\n\t"
+			      "5:"
+			      : "=d" (res), "=a" (p)
+			      : "0" ((size + 31) >> 5), "1" (addr)
+			      : "d0");
+	return ((p - addr) << 5) + res;
+}
+
+static inline int find_next_zero_bit (void *vaddr, int size,
+				      int offset)
+{
+	unsigned long *addr = vaddr;
+	unsigned long *p = addr + (offset >> 5);
+	int set = 0, bit = offset & 31, res;
+
+	if (bit) {
+		/* Look for zero in first longword */
+		__asm__("bfffo %1{#0,#0},%0"
+			: "=d" (set)
+			: "d" (~*p << bit));
+		if (set < (32 - bit))
+			return set + offset;
+                set = 32 - bit;
+		p++;
+	}
+	/* No zero yet, search remaining full bytes for a zero */
+	res = find_first_zero_bit (p, size - 32 * (p - addr));
+	return (offset + set + res);
+}
+
+/*
+ * ffz = Find First Zero in word. Undefined if no zero exists,
+ * so code should check against ~0UL first..
+ */
+extern inline unsigned long ffz(unsigned long word)
+{
+	__asm__ __volatile__ ("bfffo %1{#0,#0},%0"
+			      : "=d" (word)
+			      : "d" (~(word)));
+	return word;
+}
+
+#endif /* _M68K_BITOPS_H */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/delay.h linux/include/asm-m68k/delay.h
--- v1.1.70/linux/include/asm-m68k/delay.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/delay.h	Mon Nov 28 20:41:29 1994
@@ -0,0 +1,40 @@
+#ifndef _M68K_DELAY_H
+#define _M68K_DELAY_H
+
+/*
+ * Copyright (C) 1994 Hamish Macdonald
+ *
+ * Delay routines, using a pre-computed "loops_per_second" value.
+ */
+
+extern __inline__ void __delay(int loops)
+{
+	__asm__("\n\tmovel %0,d0\n1:\tsubql #1,d0\n\tbpls 1b\n"
+		: /* no outputs */
+		: "g" (loops)
+		: "d0");
+}
+
+/*
+ * division by multiplication: you don't have to worry about
+ * loss of precision.
+ *
+ * Use only for very small delays ( < 1 msec).  Should probably use a
+ * lookup table, really, as the multiplications take much too long with
+ * short delays.  This is a "reasonable" implementation, though (and the
+ * first constant multiplications gets optimized away if the delay is
+ * a constant)  
+ */
+extern __inline__ void udelay(unsigned long usecs)
+{
+	asm ("mulul %1,d0,%0\n\t"
+	     "divul  %2,d0,%0"
+	     : "=d" (usecs)
+	     : "d" (usecs),
+	       "i" (1000000),
+	       "0" (loops_per_sec)
+	     : "d0");
+	__delay(usecs);
+}
+
+#endif /* defined(_M68K_DELAY_H) */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/dma.h linux/include/asm-m68k/dma.h
--- v1.1.70/linux/include/asm-m68k/dma.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/dma.h	Mon Nov 28 21:44:45 1994
@@ -0,0 +1,6 @@
+#ifndef _M68K_DMA_H
+#define _M68K_DMA_H 1
+
+/* dummy for m68k */
+
+#endif /* _M68K_DMA_H */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/io.h linux/include/asm-m68k/io.h
--- v1.1.70/linux/include/asm-m68k/io.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/io.h	Mon Nov 28 20:59:32 1994
@@ -0,0 +1,24 @@
+#ifndef _M68K_IO_H
+#define _M68K_IO_H
+
+static inline unsigned char get_user_byte_io(const char * addr)
+{
+	register unsigned char _v;
+
+	__asm__ __volatile__ ("moveb %1,%0":"=r" (_v):"m" (*addr));
+	return _v;
+}
+#define inb_p(addr) get_user_byte_io((char *)(addr))
+#define inb(addr) get_user_byte_io((char *)(addr))
+
+static inline void put_user_byte_io(char val,char *addr)
+{
+	__asm__ __volatile__ ("moveb %0,%1"
+			      : /* no outputs */
+			      :"r" (val),"m" (*addr)
+			      : "memory");
+}
+#define outb_p(x,addr) put_user_byte_io((x),(char *)(addr))
+#define outb(x,addr) put_user_byte_io((x),(char *)(addr))
+
+#endif /* _M68K_IO_H */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/irq.h linux/include/asm-m68k/irq.h
--- v1.1.70/linux/include/asm-m68k/irq.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/irq.h	Mon Nov 28 21:03:09 1994
@@ -0,0 +1,6 @@
+#ifndef _M68K_IRQ_H_
+#define _M68K_IRQ_H_
+
+/* dummy for m68k */
+
+#endif /* _M68K_IRQ_H_ */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/segment.h linux/include/asm-m68k/segment.h
--- v1.1.70/linux/include/asm-m68k/segment.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/segment.h	Tue Nov 29 22:08:54 1994
@@ -0,0 +1,241 @@
+/*
+ *  linux/include/asm-m68k/segment.h
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file README.legal in the main directory of this archive
+ * for more details.
+ */
+
+/*
+ * 680x0 support added by Hamish Macdonald
+ */
+
+#ifndef _M68K_SEGMENT_H
+#define _M68K_SEGMENT_H
+
+static inline unsigned char get_user_byte(const char * addr)
+{
+	register unsigned char _v;
+
+	__asm__ __volatile__ ("movesb %1,%0":"=r" (_v):"m" (*addr));
+	return _v;
+}
+
+#define get_fs_byte(addr) get_user_byte((char *)(addr))
+
+static inline unsigned short get_user_word(const short *addr)
+{
+	unsigned short _v;
+
+	__asm__ __volatile__ ("movesw %1,%0":"=r" (_v):"m" (*addr));
+	return _v;
+}
+
+#define get_fs_word(addr) get_user_word((short *)(addr))
+
+static inline unsigned long get_user_long(const int *addr)
+{
+	unsigned long _v;
+
+	__asm__ __volatile__ ("movesl %1,%0":"=r" (_v):"m" (*addr)); \
+	return _v;
+}
+
+#define get_fs_long(addr) get_user_long((int *)(addr))
+
+static inline void put_user_byte(char val,char *addr)
+{
+	__asm__ __volatile__ ("movesb %0,%1": /* no outputs */ :"r" (val),"m" (*addr) : "memory");
+}
+
+#define put_fs_byte(x,addr) put_user_byte((x),(char *)(addr))
+
+static inline void put_user_word(short val,short * addr)
+{
+	__asm__ __volatile__ ("movesw %0,%1": /* no outputs */ :"r" (val),"m" (*addr) : "memory");
+}
+
+#define put_fs_word(x,addr) put_user_word((x),(short *)(addr))
+
+static inline void put_user_long(unsigned long val,int * addr)
+{
+	__asm__ __volatile__ ("movesl %0,%1": /* no outputs */ :"r" (val),"m" (*addr) : "memory");
+}
+
+#define put_fs_long(x,addr) put_user_long((x),(int *)(addr))
+
+static inline void __generic_memcpy_tofs(void * to, const void * from, unsigned long n)
+{
+	if (n == 0) return;
+	__asm__ __volatile__ ("1:\n\t"
+			      "moveb %1@+,d0\n\t"
+			      "movesb d0,%2@+\n\t"
+			      "dbra %0,1b\n\t"
+			      "clrw %0\n\t"
+			      "subql #1,%0\n\t"
+			      "bccs 1b"
+			      : "=d" (n), "=a" (from), "=a" (to)
+			      : "1" (from), "2" (to), "0" (n-1)
+			      : "d0", "memory");
+}
+
+static inline void __constant_memcpy_tofs(void * to, const void * from, unsigned long n)
+{
+	if (n == 0) {
+			return;
+	} else if (n == 1) {
+			put_user_byte(*(const char *) from, (char *) to);
+			return;
+	} else if (n == 2) {
+			put_user_word(*(const short *) from, (short *) to);
+			return;
+	} else if (n == 3) {
+			put_user_word(*(const short *) from, (short *) to);
+			put_user_byte(*(2+(const char *) from), 2+(char *) to);
+			return;
+	} else if (n == 4) {
+			put_user_long(*(const int *) from, (int *) to);
+			return;
+	}
+#if 0
+#define COMMON(x) \
+__asm__("cld\n\t" \
+	"push %%es\n\t" \
+	"push %%fs\n\t" \
+	"pop %%es\n\t" \
+	"rep ; movsl\n\t" \
+	x \
+	"pop %%es" \
+	: /* no outputs */ \
+	:"c" (n/4),"D" ((long) to),"S" ((long) from) \
+	:"cx","di","si")
+
+	switch (n % 4) {
+		case 0:
+			COMMON("");
+			return;
+		case 1:
+			COMMON("movsb\n\t");
+			return;
+		case 2:
+			COMMON("movsw\n\t");
+			return;
+		case 3:
+			COMMON("movsw\n\tmovsb\n\t");
+			return;
+	}
+#undef COMMON
+#else
+        __generic_memcpy_tofs(to,from,n);
+#endif
+}
+
+static inline void __generic_memcpy_fromfs(void * to, const void * from, unsigned long n)
+{
+	if (n == 0) return;
+	__asm__ __volatile__ ("1:\n\t"
+			      "movesb %1@+,d0\n\t"
+			      "moveb d0,%2@+\n\t"
+			      "dbra %0,1b\n\t"
+			      "clrw %0\n\t"
+			      "subql #1,%0\n\t"
+			      "bccs 1b"
+			      : "=d" (n), "=a" (from), "=a" (to)
+			      : "1" (from), "2" (to), "0" (n-1)
+			      : "d0", "memory");
+}
+
+static inline void __constant_memcpy_fromfs(void * to, const void * from, unsigned long n)
+{
+	if (n == 0) {
+			return;
+	} else if (n == 1) {
+			*(char *)to = get_user_byte((const char *) from);
+			return;
+	} else if (n == 2) {
+			*(short *)to = get_user_word((const short *) from);
+			return;
+	} else if (n == 3) {
+			*(short *) to = get_user_word((const short *) from);
+			*(2+(char *) to) = get_user_byte(2+(const char *) from);
+			return;
+	} else if (n == 4) {
+			*(int *) to = get_user_long((const int *) from);
+			return;
+	}
+#if 0
+#define COMMON(x) \
+__asm__("cld\n\t" \
+	"rep ; fs ; movsl\n\t" \
+	x \
+	: /* no outputs */ \
+	:"c" (n/4),"D" ((long) to),"S" ((long) from) \
+	:"cx","di","si","memory")
+
+	switch (n % 4) {
+		case 0:
+			COMMON("");
+			return;
+		case 1:
+			COMMON("fs ; movsb");
+			return;
+		case 2:
+			COMMON("fs ; movsw");
+			return;
+		case 3:
+			COMMON("fs ; movsw\n\tfs ; movsb");
+			return;
+	}
+#undef COMMON
+#else
+        __generic_memcpy_fromfs(to,from,n);
+#endif
+}
+
+#define memcpy_fromfs(to, from, n) \
+(__builtin_constant_p(n) ? \
+ __constant_memcpy_fromfs((to),(from),(n)) : \
+ __generic_memcpy_fromfs((to),(from),(n)))
+
+#define memcpy_tofs(to, from, n) \
+(__builtin_constant_p(n) ? \
+ __constant_memcpy_tofs((to),(from),(n)) : \
+ __generic_memcpy_tofs((to),(from),(n)))
+
+/*
+ * Get/set the SFC/DFC registers for MOVES instructions
+ */
+
+static inline unsigned long get_fs(void)
+{
+	unsigned long _v;
+	__asm__ ("movec dfc,%0":"=r" (_v):);
+
+	return _v;
+}
+
+static inline unsigned long get_ds(void)
+{
+    /* return the supervisor data space code */
+    return 0x5;
+}
+
+static inline void set_fs(unsigned long val)
+{
+	__asm__ __volatile__ ("movec %0,sfc\n\t"
+			      "movec %0,dfc\n\t"
+			      : /* no outputs */ : "r" (val), "r" (val) : "memory");
+}
+
+/* define constants */
+/* Address spaces (FC0-FC2) */
+#ifndef USER_DS
+#define USER_DS       (1)
+#endif
+#ifndef KERNEL_DS
+#define KERNEL_DS     (5)
+#endif
+
+#endif /* _M68K_SEGMENT_H */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/string.h linux/include/asm-m68k/string.h
--- v1.1.70/linux/include/asm-m68k/string.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/string.h	Tue Nov 29 17:31:51 1994
@@ -0,0 +1,154 @@
+#ifndef _M68K_STRING_H_
+#define _M68K_STRING_H_
+
+#define __USE_PORTABLE_STRINGS_H_
+
+extern inline char * strcpy(char * dest,const char *src)
+{
+  char *xdest = dest;
+
+  __asm__ __volatile__
+       ("1:\tmoveb %1@+,%0@+\n\t"
+        "bne 1b"
+	: "=a" (dest), "=a" (src)
+        : "0" (dest), "1" (src) : "memory");
+  return xdest;
+}
+
+extern inline void * strncpy(char *dest, const void *src, size_t n)
+{
+  char *xdest = dest;
+
+  if (n == 0)
+    return xdest;
+
+  __asm__
+       ("1:\tmoveb %1@+,%0@+\n\t"
+	"beq 2f\n\t"
+        "subql #1,%3\n\t"
+        "bne 1b\n\t"
+        "2:"
+        : "=a" (dest), "=a" (src), "=d" (n)
+        : "0" (dest), "1" (src), "2" (n)
+        : "memory");
+return dest;
+}
+
+#define __USE_PORTABLE_strcat
+
+#define __USE_PORTABLE_strncat
+
+extern inline int strcmp(const char * cs,const char * ct)
+{
+  char __res;
+
+  __asm__
+       ("1:\tmoveb %0@+,%2\n\t" /* get *cs */
+        "cmpb %1@+,%2\n\t"      /* compare a byte */
+        "bne  2f\n\t"           /* not equal, break out */
+        "tstb %2\n\t"           /* at end of cs? */
+        "bne  1b\n\t"           /* no, keep going */
+        "bra  3f\n\t"		/* strings are equal */
+        "2:\tsubb %1@-,%2\n\t"  /* *cs - *ct */
+        "3:"
+        : "=a" (cs), "=a" (ct), "=d" (__res)
+        : "0" (cs), "1" (ct));
+  return __res;
+}
+
+extern inline int strncmp(const char * cs,const char * ct,size_t count)
+{
+  char __res;
+
+  if (!count)
+    return 0;
+  __asm__
+       ("1:\tmovb %0@+,%3\n\t"          /* get *cs */
+        "cmpb   %1@+,%3\n\t"            /* compare a byte */
+        "bne    3f\n\t"                 /* not equal, break out */
+        "tstb   %3\n\t"                 /* at end of cs? */
+        "beq    4f\n\t"                 /* yes, all done */
+        "subql  #1,%2\n\t"              /* no, adjust count */
+        "bne    1b\n\t"                 /* more to do, keep going */
+        "2:\tmoveq #0,%3\n\t"           /* strings are equal */
+        "bra    4f\n\t"
+        "3:\tsubb %1@-,%3\n\t"          /* *cs - *ct */
+        "4:"
+        : "=a" (cs), "=a" (ct), "=d" (count), "=d" (__res)
+        : "0" (cs), "1" (ct), "2" (count));
+  return __res;
+}
+
+#define __USE_PORTABLE_strchr
+
+#define __USE_PORTABLE_strlen
+
+#define __USE_PORTABLE_strspn
+
+#define __USE_PORTABLE_strpbrk
+
+#define __USE_PORTABLE_strtok
+
+extern inline void * memset(void * s,char c,size_t count)
+{
+  void *xs = s;
+
+  if (!count)
+    return xs;
+  __asm__ __volatile__
+       ("1:\tmoveb %3,%0@+\n\t"
+	"subql #1,%1\n\t"
+        "bne 1b"
+	: "=a" (s), "=d" (count)
+        : "0" (s), "d" (c), "1" (count)
+	: "memory");
+  return xs;
+}
+
+extern inline void * memcpy(void * to, const void * from, size_t n)
+{
+  void *xto = to;
+
+  if (!n)
+    return xto;
+  __asm__ __volatile__
+       ("1:\tmoveb %1@+,%0@+\n\t"
+	"subql #1,%2\n\t"
+        "bne 1b"
+        : "=a" (to), "=a" (from), "=d" (n)
+        : "0" (to), "1" (from), "2" (n)
+        : "memory" );
+  return xto;
+}
+
+extern inline void * memmove(void * dest,const void * src, size_t n)
+{
+  void *xdest = dest;
+
+  if (!n)
+    return xdest;
+
+  if (dest < src)
+    __asm__ __volatile__
+       ("1:\tmoveb %1@+,%0@+\n\t"
+	"subql #1,%2\n\t"
+        "bne 1b"
+        : "=a" (dest), "=a" (src), "=d" (n)
+        : "0" (dest), "1" (src), "2" (n)
+        : "memory" );
+  else
+    __asm__ __volatile__
+       ("1:\tmoveb %1@-,%0@-\n\t"
+	"subql #1,%2\n\t"
+        "bne 1b"
+        : "=a" (dest), "=a" (src), "=d" (n)
+        : "0" (dest+n), "1" (src+n), "2" (n)
+        : "memory" );
+  return xdest;
+}
+
+#define __USE_PORTABLE_memcmp
+
+#define __USE_PORTABLE_memscan
+
+#endif /* _M68K_STRING_H_ */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/system.h linux/include/asm-m68k/system.h
--- v1.1.70/linux/include/asm-m68k/system.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/system.h	Tue Nov 29 16:52:45 1994
@@ -0,0 +1,53 @@
+/*
+ *  linux/include/asm-m68k/system.h
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file README.legal in the main directory of this archive
+ * for more details.
+ */
+
+/*
+ * 680x0 support added by Hamish Macdonald
+ */
+
+#ifndef _M68K_SYSTEM_H
+#define _M68K_SYSTEM_H
+
+#include <linux/autoconf.h> /* get configuration makros */
+
+#if defined(CONFIG_ATARI) && !defined(CONFIG_AMIGA) && !defined(CONFIG_MAC)
+/* block out HSYNC on the atari */
+#define sti() __asm__ __volatile__ ("andiw #0xfbff,sr": : : "memory")
+#else /* portable version */
+#define sti() __asm__ __volatile__ ("andiw #0xf8ff,sr": : : "memory")
+#endif /* machine compilation types */ 
+#define cli() __asm__ __volatile__ ("oriw  #0x0700,sr": : : "memory")
+#define nop() __asm__ __volatile__ ("nop"::)
+
+#define save_flags(x) \
+__asm__ __volatile__("movew sr,%0":"=d" (x) : /* no input */ :"memory")
+
+#define restore_flags(x) \
+__asm__ __volatile__("movew %0,sr": /* no outputs */ :"d" (x) : "memory")
+
+#define iret() __asm__ __volatile__ ("rte": : :"memory", "sp", "cc")
+
+#define move_to_user_mode() \
+    __asm__ __volatile__ ("movel sp,usp\n\t"     /* setup user sp       */ \
+			  "movec %0,msp\n\t"     /* setup kernel sp     */ \
+			  "andiw #0xdfff,sr"     /* return to user mode */ \
+			  : /* no output */                                \
+			  : "r" (current->kernel_stack_page + PAGE_SIZE)   \
+			  : "memory", "sp")
+
+static inline void clear_fpu(void) {
+	unsigned long nilstate = 0;
+	__asm__ __volatile__ ("frestore %0@" : : "a" (&nilstate));
+}
+
+#define halt() \
+        __asm__ __volatile__ ("halt")
+
+#endif /* _M68K_SYSTEM_H */
diff -u --recursive --new-file v1.1.70/linux/include/asm-m68k/unistd.h linux/include/asm-m68k/unistd.h
--- v1.1.70/linux/include/asm-m68k/unistd.h	Thu Jan  1 02:00:00 1970
+++ linux/include/asm-m68k/unistd.h	Mon Nov 28 20:49:07 1994
@@ -0,0 +1,114 @@
+#ifndef _ASM_M68K_UNISTD_H_
+#define _ASM_M68K_UNISTD_H_
+
+/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
+#define _syscall0(type,name) \
+type name(void) \
+{ \
+register long __res __asm__ ("d0") = __NR_##name; \
+__asm__ __volatile__ ("trap  #0" \
+                      : "=g" (__res) \
+                      : "0" (__NR_##name) \
+		      : "d0"); \
+if (__res >= 0) \
+        return (type) __res; \
+errno = -__res; \
+return -1; \
+}
+
+#define _syscall1(type,name,atype,a) \
+type name(atype a) \
+{ \
+register long __res __asm__ ("d0") = __NR_##name; \
+__asm__ __volatile__ ("movel %2,d1\n\t" \
+                      "trap  #0" \
+                      : "=g" (__res) \
+                      : "0" (__NR_##name), "g" ((long)(a)) \
+                      : "d0", "d1"); \
+if (__res >= 0) \
+        return (type) __res; \
+errno = -__res; \
+return -1; \
+}
+
+#define _syscall2(type,name,atype,a,btype,b) \
+type name(atype a,btype b) \
+{ \
+register long __res __asm__ ("d0") = __NR_##name; \
+__asm__ __volatile__ ("movel %2,d1\n\t" \
+                      "movel %3,d2\n\t" \
+                      "trap  #0" \
+                      : "=g" (__res) \
+                      : "0" (__NR_##name), "g" ((long)(a)), \
+                                          "g" ((long)(b)) \
+                      : "d0", "d1", "d2"); \
+if (__res >= 0) \
+        return (type) __res; \
+errno = -__res; \
+return -1; \
+}
+
+#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
+type name(atype a,btype b,ctype c) \
+{ \
+register long __res __asm__ ("d0") = __NR_##name; \
+__asm__ __volatile__ ("movel %2,d1\n\t" \
+                      "movel %3,d2\n\t" \
+                      "movel %4,d3\n\t" \
+                      "trap  #0" \
+                      : "=g" (__res) \
+                      : "0" (__NR_##name), "g" ((long)(a)), \
+                                          "g" ((long)(b)), \
+                                          "g" ((long)(c)) \
+                      : "d0", "d1", "d2", "d3"); \
+if (__res >= 0) \
+        return (type) __res; \
+errno = -__res; \
+return -1; \
+}
+
+#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
+type name (atype a, btype b, ctype c, dtype d) \
+{ \
+register long __res __asm__ ("d0") = __NR_##name; \
+__asm__ __volatile__ ("movel %2,d1\n\t" \
+                      "movel %3,d2\n\t" \
+                      "movel %4,d3\n\t" \
+                      "movel %5,d4\n\t" \
+                      "trap  #0" \
+                      : "=g" (__res) \
+                      : "0" (__NR_##name), "g" ((long)(a)), \
+                                          "g" ((long)(b)), \
+                                          "g" ((long)(c)), \
+                                          "g" ((long)(d))  \
+                      : "d0", "d1", "d2", "d3", "d4"); \
+if (__res >= 0) \
+        return (type) __res; \
+errno = -__res; \
+return -1; \
+}
+
+#define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
+type name (atype a,btype b,ctype c,dtype d,etype e) \
+{ \
+register long __res __asm__ ("d0") = __NR_##name; \
+__asm__ __volatile__ ("movel %2,d1\n\t" \
+                      "movel %3,d2\n\t" \
+                      "movel %4,d3\n\t" \
+                      "movel %5,d4\n\t" \
+                      "movel %6,d5\n\t" \
+                      "trap  #0" \
+                      : "=g" (__res) \
+                      : "0" (__NR_##name), "g" ((long)(a)), \
+                                          "g" ((long)(b)), \
+                                          "g" ((long)(c)), \
+                                          "g" ((long)(d)), \
+                                          "g" ((long)(e))  \
+                      : "d0", "d1", "d2", "d3", "d4", "d5"); \
+if (__res >= 0) \
+        return (type) __res; \
+errno = -__res; \
+return -1; \
+}
+
+#endif /* _ASM_M68K_UNISTD_H_ */
diff -u --recursive --new-file v1.1.70/linux/include/linux/elf.h linux/include/linux/elf.h
--- v1.1.70/linux/include/linux/elf.h	Thu Oct 13 17:11:59 1994
+++ linux/include/linux/elf.h	Sun Dec  4 23:56:28 1994
@@ -1,5 +1,11 @@
-#ifndef _ELF_H
-#define _ELF_H
+#ifndef _LINUX_ELF_H
+#define _LINUX_ELF_H
+
+typedef unsigned long	Elf32_Addr;
+typedef unsigned short	Elf32_Half;
+typedef unsigned long	Elf32_Off;
+typedef long		Elf32_Sword;
+typedef unsigned long	Elf32_Word;
 
 /* These constants are for the segment types stored in the image headers */
 #define PT_NULL    0
@@ -76,13 +82,15 @@
 
 
 typedef struct dynamic{
-  int d_tag;
+  Elf32_Sword d_tag;
   union{
-    int d_val;
-    char * d_ptr;
+    Elf32_Sword	d_val;
+    Elf32_Addr	d_ptr;
   } d_un;
 } Elf32_Dyn;
 
+extern Elf32_Dyn _DYNAMIC [];
+
 /* The following are used with relocations */
 #define ELF32_R_SYM(x) ((x) >> 8)
 #define ELF32_R_TYPE(x) ((x) & 0xff)
@@ -101,53 +109,103 @@
 #define R_386_NUM	11
 
 typedef struct elf32_rel {
-  unsigned int * offset;
-  int info;
+  Elf32_Addr	r_offset;
+  Elf32_Word	r_info;
 } Elf32_Rel;
 
 typedef struct elf32_rela{
-  unsigned int * offset;
-  int info;
-  int addend;
+  Elf32_Addr	r_offset;
+  Elf32_Word	r_info;
+  Elf32_Sword	r_addend;
 } Elf32_Rela;
 
 typedef struct elf32_sym{
-  int st_name;
-  unsigned int st_value;
-  int st_size;
-  unsigned char st_info;
-  unsigned char st_other;
-  short int st_shndx;
+  Elf32_Word	st_name;
+  Elf32_Addr	st_value;
+  Elf32_Word	st_size;
+  unsigned char	st_info;
+  unsigned char	st_other;
+  Elf32_Half	st_shndx;
 } Elf32_Sym;
 
+
+#define EI_NIDENT	16
+
 typedef struct elfhdr{
-  char	e_ident[16];
-  short int e_type;
-  short int e_machine;
-  int   e_version;
-  char *e_entry;  /* Entry point */
-  int   e_phoff;
-  int   e_shoff;
-  int   e_flags;
-  short int e_ehsize;
-  short int e_phentsize;
-  short int e_phnum;
-  short int e_shentsize;
-  short int e_shnum;
-  short int e_shstrndx;
+  unsigned char	e_ident[EI_NIDENT];
+  Elf32_Half	e_type;
+  Elf32_Half	e_machine;
+  Elf32_Word	e_version;
+  Elf32_Addr	e_entry;  /* Entry point */
+  Elf32_Off	e_phoff;
+  Elf32_Off	e_shoff;
+  Elf32_Word	e_flags;
+  Elf32_Half	e_ehsize;
+  Elf32_Half	e_phentsize;
+  Elf32_Half	e_phnum;
+  Elf32_Half	e_shentsize;
+  Elf32_Half	e_shnum;
+  Elf32_Half	e_shstrndx;
 } Elf32_Ehdr;
 
 typedef struct elf_phdr{
-  int p_type;
-  int p_offset;
-  int p_vaddr;
-  int p_paddr;
-  int p_filesz;
-  int p_memsz;
-  int p_flags;
-  int p_align;
+  Elf32_Word	p_type;
+  Elf32_Off	p_offset;
+  Elf32_Addr	p_vaddr;
+  Elf32_Addr	p_paddr;
+  Elf32_Word	p_filesz;
+  Elf32_Word	p_memsz;
+  Elf32_Word	p_flags;
+  Elf32_Word	p_align;
 } Elf32_Phdr;
 
+/* sh_type */
+#define SHT_NULL	0
+#define SHT_PROGBITS	1
+#define SHT_SYMTAB	2
+#define SHT_STRTAB	3
+#define SHT_RELA	4
+#define SHT_HASH	5
+#define SHT_DYNAMIC	6
+#define SHT_NOTE	7
+#define SHT_NOBITS	8
+#define SHT_REL		9
+#define SHT_SHLIB	10
+#define SHT_DYNSYM	11
+#define SHT_NUM		12
+#define SHT_LOPROC	0x70000000
+#define SHT_HIPROC	0x7fffffff
+#define SHT_LOUSER	0x80000000
+#define SHT_HIUSER	0xffffffff
+
+/* sh_flags */
+#define SHF_WRITE	0x1
+#define SHF_ALLOC	0x2
+#define SHF_EXECINSTR	0x4
+#define SHF_MASKPROC	0xf0000000
+
+/* special section indexes */
+#define SHN_UNDEF	0
+#define SHN_LORESERVE	0xff00
+#define SHN_LOPROC	0xff00
+#define SHN_HIPROC	0xff1f
+#define SHN_ABS		0xfff1
+#define SHN_COMMON	0xfff2
+#define SHN_HIRESERVE	0xffff
+ 
+typedef struct {
+  Elf32_Word	sh_name;
+  Elf32_Word	sh_type;
+  Elf32_Word	sh_flags;
+  Elf32_Addr	sh_addr;
+  Elf32_Off	sh_offset;
+  Elf32_Word	sh_size;
+  Elf32_Word	sh_link;
+  Elf32_Word	sh_info;
+  Elf32_Word	sh_addralign;
+  Elf32_Word	sh_entsize;
+} Elf32_Shdr;
+
 #define ELF_START_MMAP 0x80000000
 
-#endif
+#endif /* _LINUX_ELF_H */
diff -u --recursive --new-file v1.1.70/linux/include/linux/pci.h linux/include/linux/pci.h
--- v1.1.70/linux/include/linux/pci.h	Tue Nov 15 15:35:41 1994
+++ linux/include/linux/pci.h	Sat Dec  3 12:02:09 1994
@@ -117,6 +117,7 @@
 
 #define PCI_VENDOR_ID_NCR		0x1000
 #define PCI_DEVICE_ID_NCR_53C810	0x0001
+#define PCI_DEVICE_ID_NCR_53C815	0x0004
 #define PCI_DEVICE_ID_NCR_53C820	0x0002
 #define PCI_DEVICE_ID_NCR_53C825	0x0003
 
diff -u --recursive --new-file v1.1.70/linux/include/linux/proc_fs.h linux/include/linux/proc_fs.h
--- v1.1.70/linux/include/linux/proc_fs.h	Sat Dec  3 13:05:43 1994
+++ linux/include/linux/proc_fs.h	Sat Dec  3 22:10:54 1994
@@ -12,6 +12,7 @@
 	PROC_MEMINFO,
 	PROC_KMSG,
 	PROC_VERSION,
+	PROC_CPUINFO,
 	PROC_SELF,	/* will change inode # */
 	PROC_NET,
 #ifdef CONFIG_DEBUG_MALLOC
diff -u --recursive --new-file v1.1.70/linux/include/linux/sched.h linux/include/linux/sched.h
--- v1.1.70/linux/include/linux/sched.h	Wed Nov  9 14:56:37 1994
+++ linux/include/linux/sched.h	Sat Dec  3 22:10:54 1994
@@ -16,6 +16,8 @@
  */
 extern int hard_math;
 extern int x86;
+extern char x86_vendor_id[13];
+extern fdiv_bug;		
 extern int ignore_irq13;
 extern int wp_works_ok;		/* doesn't work on a 386 */
 extern int hlt_works_ok;	/* problems on some 486Dx4's and old 386's */
diff -u --recursive --new-file v1.1.70/linux/init/main.c linux/init/main.c
--- v1.1.70/linux/init/main.c	Tue Nov 29 18:51:29 1994
+++ linux/init/main.c	Sat Dec  3 22:10:54 1994
@@ -414,7 +414,7 @@
 	static double x = 4195835.0;
 	static double y = 3145727.0;
 	unsigned short control_word;
-	int i;
+	extern int fdiv_bug;
 
 	if (!hard_math) {
 #ifndef CONFIG_MATH_EMULATION
@@ -458,9 +458,9 @@
 		"fistpl %0\n\t"
 		"fwait\n\t"
 		"fninit"
-		: "=m" (*&i)
+		: "=m" (*&fdiv_bug)
 		: "m" (*&x), "m" (*&y));
-	if (!i) {
+	if (!fdiv_bug) {
 		printk("Ok, fpu using exception 16 error reporting.\n");
 		return;
 
diff -u --recursive --new-file v1.1.70/linux/kernel/bios32.c linux/kernel/bios32.c
--- v1.1.70/linux/kernel/bios32.c	Sat Dec  3 13:05:43 1994
+++ linux/kernel/bios32.c	Sat Dec  3 10:48:14 1994
@@ -193,7 +193,7 @@
 	return pcibios_entry ? 1 : 0;
 }
 
-int pcibios_find_class_code (unsigned long class_code, unsigned short index,
+int pcibios_find_class (unsigned long class_code, unsigned short index,
 	unsigned char *bus, unsigned char *device_fn)
 {
 	unsigned long bx;
diff -u --recursive --new-file v1.1.70/linux/kernel/ksyms.c linux/kernel/ksyms.c
--- v1.1.70/linux/kernel/ksyms.c	Sat Dec  3 13:05:43 1994
+++ linux/kernel/ksyms.c	Sat Dec  3 12:01:51 1994
@@ -35,7 +35,10 @@
 #include <linux/netdevice.h>
 #endif
 #ifdef CONFIG_PCI
-#include <pci.h>
+#include <linux/pci.h>
+#endif
+#if defined(CONFIG_MSDOS_FS) && !defined(CONFIG_UMSDOS_FS)
+#include <linux/msdos_fs.h>
 #endif
 
 #include <asm/irq.h>
@@ -265,6 +268,30 @@
 	X(chrdev_inode_operations),
 	X(blkdev_inode_operations),
 	X(read_ahead),
+	X(get_hash_table),
+	X(get_empty_inode),
+	X(insert_inode_hash),
+#if defined(CONFIG_MSDOS_FS) && !defined(CONFIG_UMSDOS_FS)
+	/* support for umsdos fs */
+	X(msdos_create),
+	X(msdos_file_read),
+	X(msdos_file_write),
+	X(msdos_lookup),
+	X(msdos_mkdir),
+	X(msdos_put_inode),
+	X(msdos_put_super),
+	X(msdos_read_inode),
+	X(msdos_read_super),
+	X(msdos_readdir),
+	X(msdos_rename),
+	X(msdos_rmdir),
+	X(msdos_smap),
+	X(msdos_statfs),
+	X(msdos_truncate),
+	X(msdos_unlink),
+	X(msdos_unlink_umsdos),
+	X(msdos_write_inode),
+#endif
 	/********************************************************
 	 * Do not add anything below this line,
 	 * as the stacked modules depend on this!
diff -u --recursive --new-file v1.1.70/linux/kernel/printk.c linux/kernel/printk.c
--- v1.1.70/linux/kernel/printk.c	Sat Aug  6 20:47:32 1994
+++ linux/kernel/printk.c	Sun Dec  4 20:33:06 1994
@@ -173,8 +173,10 @@
 			log_buf[(log_start+log_size) & (LOG_BUF_LEN-1)] = *p;
 			if (log_size < LOG_BUF_LEN)
 				log_size++;
-			else
+			else {
 				log_start++;
+				log_start &= LOG_BUF_LEN-1;
+			}
 			logged_chars++;
 			if (*p == '\n')
 				break;
diff -u --recursive --new-file v1.1.70/linux/kernel/sched.c linux/kernel/sched.c
--- v1.1.70/linux/kernel/sched.c	Mon Nov 28 14:21:47 1994
+++ linux/kernel/sched.c	Sun Dec  4 19:51:18 1994
@@ -70,6 +70,10 @@
  */
 int hard_math = 0;		/* set by boot/head.S */
 int x86 = 0;			/* set by boot/head.S to 3 or 4 */
+int fdiv_bug = 0;		/* set if Pentium(TM) with FP bug */
+
+char x86_vendor_id[13] = "Unknown";
+
 int ignore_irq13 = 0;		/* set if exception 16 works */
 int wp_works_ok = 0;		/* set if paging hardware honours WP */ 
 int hlt_works_ok = 1;		/* set if the "hlt" instruction works */
diff -u --recursive --new-file v1.1.70/linux/kernel/time.c linux/kernel/time.c
--- v1.1.70/linux/kernel/time.c	Thu Oct  6 08:24:13 1994
+++ linux/kernel/time.c	Sat Dec  3 13:09:33 1994
@@ -198,22 +198,23 @@
 /*
  * This version of gettimeofday has near microsecond resolution.
  */
-static inline void do_gettimeofday(struct timeval *tv)
+void do_gettimeofday(struct timeval *tv)
 {
-#ifdef __i386__
+	unsigned long flags;
+
+	save_flags(flags);
 	cli();
+#ifdef __i386__
 	*tv = xtime;
 	tv->tv_usec += do_gettimeoffset();
 	if (tv->tv_usec >= 1000000) {
 		tv->tv_usec -= 1000000;
 		tv->tv_sec++;
 	}
-	sti();
 #else /* not __i386__ */
-	cli();
 	*tv = xtime;
-	sti();
 #endif /* not __i386__ */
+	restore_flags(flags);
 }
 
 asmlinkage int sys_gettimeofday(struct timeval *tv, struct timezone *tz)
diff -u --recursive --new-file v1.1.70/linux/mm/memory.c linux/mm/memory.c
--- v1.1.70/linux/mm/memory.c	Thu Dec  1 19:15:05 1994
+++ linux/mm/memory.c	Sun Dec  4 19:14:00 1994
@@ -58,6 +58,7 @@
 
 extern unsigned long pg0[1024];		/* page table for 0-4MB for everybody */
 
+extern void scsi_mem_init(unsigned long);
 extern void sound_mem_init(void);
 extern void die_if_kernel(char *,struct pt_regs *,long);
 extern void show_net_buffers(void);
@@ -1197,7 +1198,6 @@
 	unsigned long tmp;
 	extern int etext;
 
-	cli();
 	end_mem &= PAGE_MASK;
 	high_memory = end_mem;
 
@@ -1219,6 +1219,9 @@
 		mem_map[MAP_NR(start_mem)] = 0;
 		start_mem += PAGE_SIZE;
 	}
+#ifdef CONFIG_SCSI
+	scsi_mem_init(high_memory);
+#endif
 #ifdef CONFIG_SOUND
 	sound_mem_init();
 #endif
diff -u --recursive --new-file v1.1.70/linux/net/inet/skbuff.c linux/net/inet/skbuff.c
--- v1.1.70/linux/net/inet/skbuff.c	Thu Dec  1 19:15:06 1994
+++ linux/net/inet/skbuff.c	Sat Dec  3 12:02:03 1994
@@ -371,6 +371,7 @@
 				skb->sk->wmem_alloc-=skb->mem_len;
 			if(!skb->sk->dead)
 				skb->sk->write_space(skb->sk);
+			kfree_skbmem(skb,skb->mem_len);
 		}
 	}
 	else
diff -u --recursive --new-file v1.1.70/linux/net/inet/sock.c linux/net/inet/sock.c
--- v1.1.70/linux/net/inet/sock.c	Thu Dec  1 19:15:06 1994
+++ linux/net/inet/sock.c	Sat Dec  3 12:02:09 1994
@@ -61,6 +61,7 @@
  *		Adam Caldwell	:	Missing return in SO_DONTROUTE/SO_DEBUG code
  *		Alan Cox	:	Split IP from generic code
  *		Alan Cox	:	New kfree_skbmem()
+ *		Alan Cox	:	Make SO_DEBUG superuser only.
  *
  * To Fix:
  *
@@ -133,6 +134,8 @@
 		  	return(-ENOPROTOOPT);
 
 		case SO_DEBUG:	
+			if(!suser())
+				return(-EPERM);
 			sk->debug=val?1:0;
 			return 0;
 		case SO_DONTROUTE:
diff -u --recursive --new-file v1.1.70/linux/net/inet/tcp.c linux/net/inet/tcp.c
--- v1.1.70/linux/net/inet/tcp.c	Thu Dec  1 19:15:06 1994
+++ linux/net/inet/tcp.c	Sun Dec  4 20:51:25 1994
@@ -275,30 +275,12 @@
 
 static void tcp_close_pending (struct sock *sk, int timeout) 
 {
-	unsigned long flags;
-	struct sk_buff *p, *old_p;
-
-	save_flags(flags);
-	cli(); 
-	p=skb_peek(&sk->receive_queue);
-
-	if(p==NULL) 
-	{
-		restore_flags(flags);
-		return;
-	}
+	struct sk_buff *skb;
 
-	do
-	{
-		tcp_close (p->sk, timeout);
-		skb_unlink (p);
-		old_p = p;
-		p=p->next;
-		kfree_skb(old_p, FREE_READ);
+	while ((skb = skb_dequeue(&sk->receive_queue)) != NULL) {
+		tcp_close(skb->sk, timeout);
+		kfree_skb(skb, FREE_READ);
 	}
-	while(p!=skb_peek(&sk->receive_queue));
-
-	restore_flags(flags);
 	return;
 }
 
@@ -2355,8 +2337,8 @@
 		case TCP_LISTEN:
 			/* we need to drop any sockets which have been connected,
 			   but have not yet been accepted. */
-			tcp_close_pending(sk, timeout);
 			tcp_set_state(sk,TCP_CLOSE);
+			tcp_close_pending(sk, timeout);
 			release_sock(sk);
 			return;
 		case TCP_CLOSE:
