diff -urN -X dontdiff linux/CREDITS linux-bcp/CREDITS
--- linux/CREDITS	Sat Feb 19 08:24:17 2000
+++ linux-bcp/CREDITS	Sat Feb 19 18:17:51 2000
@@ -42,6 +42,7 @@
 W: http://www.ocston.org/~tigran
 D: BFS filesystem
 D: Intel P6 CPU microcode update support
+D: BCP
 S: United Kingdom
 
 N: Werner Almesberger
diff -urN -X dontdiff linux/Documentation/Configure.help linux-bcp/Documentation/Configure.help
--- linux/Documentation/Configure.help	Sat Feb 19 08:24:17 2000
+++ linux-bcp/Documentation/Configure.help	Sat Feb 19 18:16:41 2000
@@ -1797,6 +1797,20 @@
   Documentation/mca.txt (and especially the web page given there)
   before attempting to build an MCA bus kernel.
 
+BCP support
+CONFIG_BCP
+  BCP is a simple Boot Command Processor that allows to pass 
+  command line parameters to the kernel at very early stages of boot
+  process. It can be used to override the command line prepared by other
+  boot loader (e.g. LILO) or to pass command line in situations where
+  otherwise there is no way to do it, e.g. when booting a kernel image
+  directly from floppy. After the kernel is loaded, you will be given 4
+  seconds to press <ENTER> which will activate BCP. You can press <SPACE>
+  to skip BCP if 4 seconds seem like eternity to you.
+
+  If you are concerned about the fact that any user with access to the
+  console can pass command line to the kernel, then say N. Otherwise, say Y.
+
 SGI Visual Workstation support
 CONFIG_VISWS
   The SGI Visual Workstation series is an IA32-based workstation
diff -urN -X dontdiff linux/Documentation/i386/zero-page.txt linux-bcp/Documentation/i386/zero-page.txt
--- linux/Documentation/i386/zero-page.txt	Mon Aug 30 18:47:02 1999
+++ linux-bcp/Documentation/i386/zero-page.txt	Sat Feb 19 18:16:41 2000
@@ -7,6 +7,7 @@
 
   arch/i386/boot/setup.S
   arch/i386/boot/video.S
+  arch/i386/boot/bcp.S
   arch/i386/kernel/head.S
   arch/i386/kernel/setup.c
  
diff -urN -X dontdiff linux/arch/i386/boot/Makefile linux-bcp/arch/i386/boot/Makefile
--- linux/arch/i386/boot/Makefile	Mon Dec 20 22:43:39 1999
+++ linux-bcp/arch/i386/boot/Makefile	Sat Feb 19 18:16:41 2000
@@ -66,7 +66,7 @@
 setup.o: setup.s
 	$(AS) -o $@ $<
 
-setup.s: setup.S video.S Makefile $(BOOT_INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
+setup.s: setup.S video.S bcp.S Makefile $(BOOT_INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
 	$(CPP) $(CPPFLAGS) -traditional $(SVGA_MODE) $(RAMDISK) $< -o $@
 
 bsetup: bsetup.o
@@ -75,7 +75,7 @@
 bsetup.o: bsetup.s
 	$(AS) -o $@ $<
 
-bsetup.s: setup.S video.S Makefile $(BOOT_INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
+bsetup.s: setup.S video.S bcp.S Makefile $(BOOT_INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
 	$(CPP) $(CPPFLAGS) -D__BIG_KERNEL__ -traditional $(SVGA_MODE) $(RAMDISK) $< -o $@
 
 dep:
diff -urN -X dontdiff linux/arch/i386/boot/bcp.S linux-bcp/arch/i386/boot/bcp.S
--- linux/arch/i386/boot/bcp.S	Thu Jan  1 01:00:00 1970
+++ linux-bcp/arch/i386/boot/bcp.S	Sat Feb 19 18:37:06 2000
@@ -0,0 +1,154 @@
+/*	
+ *	bcp.S
+ *	=====
+ *	Boot Command Processor
+ *	Copyright (C) 2000, Tigran Aivazian <tigran@sco.com>
+ *	Used some ideas from LILO's second.S.
+ */
+
+#define CL_MAGIC_ADDR	0x20
+#define CL_MAGIC	0xa33f
+#define CL_OFFSET	0x22
+
+#define BCP_BUFLEN	0x803	/* 2K for command line + 3 bytes for BCP */
+
+/* bcp - main entry point, called from setup.S before video */
+
+bcp:	pushw	%ds			# %ds must be left intact for video.S
+	pushw	%ds
+	popw	%fs
+	pushw	%cs
+	popw	%ds
+	pushw	%cs
+	popw	%es
+
+	movb	$4, %bl
+	call	getkt			# get a key or timeout after 4 seconds
+
+	cmpb	$0x0d, %al		# ENTER ?
+	jne	bcpx			# no - get out
+
+	leaw	bcpwlcm, %si
+	call	prtstr
+	call	bcp1
+
+bcpx:	popw	%ds			# restore %ds for video.S
+bcpx2:	ret
+
+bcp1:	leaw	bcprmpt, %si		# print [bcp] prompt
+	call	prtstr
+	leaw	bcp_buf, %di		# point %di to our line buffer
+
+bcp2:	call	getkey			# ASCII code returned in %al
+	cmpb	$0x09, %al		# TAB?
+	je	bcph			# yes -> display help
+	cmpb	$0x0d, %al		# ENTER?
+	jz	bcpent
+	cmpb	$0x08, %al		# backspace?
+	jz	bcpbs
+	cmpb	$0x20, %al		# printable? 
+	jb	bcp2			# no -> get next key
+	ja	nospc			# yes, and it is not a space
+	cmpb	-1(%di), %al		# second space in a row?
+	je	bcp2			# yes -> ignore it
+
+nospc:	cmpw	$bcp_buf+BCP_BUFLEN-1, %di	# out of buffer space yet?
+	jz	bcp2				# yes -> next key (hope it's backspace)
+	stosb
+	call	prtchr
+	jmp	bcp2
+
+bcpent:	cmpw	$bcp_buf, %di		# <RETURN> on its own?
+	jz	bcp1			# yes -> go back to [bcp] prompt
+	leaw	bcpnl, %si		# new line
+	call	prtstr
+	movb	$0x00, (%di)		# NULL-terminate the whole thing
+	leaw	bcp_buf, %si		# %si points to bcp_buf now
+	cmpw	$0x6f67, (%si)		# "go" ?
+	je	bcpx2			# yes -> out of here
+	cmpw	$0x6d63, (%si)		# "cm" ?
+	je	bcpcm			# yes -> handle it
+	cmpw	$0x736c, (%si)		# "ls" ?
+	je	bcpls			# yes -> handle it
+	leaw	bcpunk, %si
+	call	prtstr
+	jmp	bcp1
+
+bcpls:	pushw	%ds	
+	movw	$INITSEG, %ax
+	movw	%ax, %ds
+	cmpw	$(CL_MAGIC), CL_MAGIC_ADDR
+	je	bcpls1
+	popw	%ds
+	leaw	bcperr1, %si
+	call	prtstr
+	jmp	bcp1
+bcpls1:	movl	CL_OFFSET, %esi
+	call	prtstr
+	popw	%ds
+	jmp	bcp1
+
+bcpcm:	cmpw	$bcp_buf+3, %di
+	jg	bcpcm1
+	leaw	bcperr2, %si
+	call	prtstr
+	jmp	bcp1
+bcpcm1:	pushw	%ds
+	movw	$INITSEG, %ax
+	movw	%ax, %ds
+	movw	%ax, %es
+	movw	$(CL_MAGIC), CL_MAGIC_ADDR
+	movw	$0x8000, %di
+	movw	%di, CL_OFFSET
+	popw	%ds
+	leaw	bcp_buf+3, %si
+	movw	$1024, %cx			# 2K command line
+	rep
+	movsw
+	pushw	%cs
+	popw	%es
+	leaw	bcpok, %esi
+	call	prtstr
+	jmp	bcp1
+
+bcph:	leaw	bcphlp, %si
+	call	prtstr
+	jmp	bcp1
+
+bcpbs:	cmpw	$bcp_buf, %di
+	jz	bcp2
+
+	decw	%di
+	movb	$0x08, %al
+	call	prtchr
+	call	prtspc
+	movb	$0x08, %al
+	call	prtchr
+	jmp	bcp2
+
+# Various data used by BCP
+bcpwlcm:	.string "\r\nBCP: Press <TAB> for help\r\n"
+
+bcprmpt:	.string	"\r\n[bcp] "
+
+bcphlp:		.byte	0x0d, 0x0a
+		.ascii	"Available BCP commands: "
+		.byte	0x0d, 0x0a
+		.ascii	"cm <cmdline> - set boot command line to <cmdline>"
+		.byte	0x0d, 0x0a
+		.ascii	"ls - list currently set boot command line"
+		.byte	0x0d, 0x0a
+		.string	"go - boot the kernel"
+
+bcpnl:		.string	"\r\n"
+
+bcperr1:	.string "No CL_MAGIC signature found"
+
+bcperr2:	.string "'cm' command requires an argument"
+
+bcpok:		.string	"OK"
+
+bcpunk:		.ascii	"\r\nBCP: unknown command: " # no '\0' here to fall through to bcp_buf
+
+bcp_buf:	.space	BCP_BUFLEN
+
diff -urN -X dontdiff linux/arch/i386/boot/setup.S linux-bcp/arch/i386/boot/setup.S
--- linux/arch/i386/boot/setup.S	Thu Jan 13 21:20:59 2000
+++ linux-bcp/arch/i386/boot/setup.S	Sat Feb 19 18:16:41 2000
@@ -346,6 +346,11 @@
 	xorw	%bx, %bx
 	int	$0x16
 
+#ifdef CONFIG_BCP
+# Allow the user to interact with BCP
+	call	bcp
+#endif
+
 # Check for video adapter and its parameters and allow the
 # user to browse video modes.
 	call	video				# NOTE: we need %ds pointing
@@ -819,6 +824,44 @@
 	popw	%cx
 	ret
 
+# Read a key with a timeout of %bl seconds.
+# The hardware clock is used to get the time.
+getkt:	call	gettime
+	addb	%bl, %al			# Wait 30 seconds
+	cmpb	$60, %al
+	jl	lminute
+
+	subb	$60, %al
+lminute:
+	movb	%al, %cl
+again:	movb	$0x01, %ah
+	int	$0x16
+	jnz	getkey				# key pressed, so get it
+
+	call	gettime
+	cmpb	%cl, %al
+	jne	again
+
+	movb	$0x20, %al			# timeout, return `space'
+	ret
+
+# Flush the keyboard buffer
+flush:	movb	$0x01, %ah
+	int	$0x16
+	jz	empty
+	
+	xorb	%ah, %ah
+	int	$0x16
+	jmp	flush
+
+empty:	ret
+
+
+# Read a key and return the ASCII code in al, scan code in ah
+getkey:	xorb	%ah, %ah
+	int	$0x16
+	ret
+
 # Delay is needed after doing I/O
 delay:
 	jmp	.+2				# jmp $+2
@@ -852,6 +895,11 @@
 # Include video setup & detection code
 
 #include "video.S"
+
+#ifdef CONFIG_BCP
+# Include boot commandline passer (BCP) code
+#include "bcp.S"
+#endif
 
 # Setup signature -- must be last
 setup_sig1:	.word	SIG1
diff -urN -X dontdiff linux/arch/i386/boot/video.S linux-bcp/arch/i386/boot/video.S
--- linux/arch/i386/boot/video.S	Sun Nov 21 08:09:51 1999
+++ linux-bcp/arch/i386/boot/video.S	Sat Feb 19 18:16:41 2000
@@ -246,6 +246,7 @@
 	leaw	keymsg, %si			# "Return/Space/Timeout" message
 	call	prtstr
 	call	flush
+	movb	$30, %bl			# 30 seconds timeout
 nokey:	call	getkt
 
 	cmpb	$0x0d, %al			# ENTER ?
@@ -1808,43 +1809,6 @@
 	.ascii	"Local"
 	.byte	0
 #endif	/* CONFIG_VIDEO_LOCAL */
-
-# Read a key and return the ASCII code in al, scan code in ah
-getkey:	xorb	%ah, %ah
-	int	$0x16
-	ret
-
-# Read a key with a timeout of 30 seconds.
-# The hardware clock is used to get the time.
-getkt:	call	gettime
-	addb	$30, %al			# Wait 30 seconds
-	cmpb	$60, %al
-	jl	lminute
-
-	subb	$60, %al
-lminute:
-	movb	%al, %cl
-again:	movb	$0x01, %ah
-	int	$0x16
-	jnz	getkey				# key pressed, so get it
-
-	call	gettime
-	cmpb	%cl, %al
-	jne	again
-
-	movb	$0x20, %al			# timeout, return `space'
-	ret
-
-# Flush the keyboard buffer
-flush:	movb	$0x01, %ah
-	int	$0x16
-	jz	empty
-	
-	xorb	%ah, %ah
-	int	$0x16
-	jmp	flush
-
-empty:	ret
 
 # Print hexadecimal number.
 prthw:	pushw	%ax
diff -urN -X dontdiff linux/arch/i386/config.in linux-bcp/arch/i386/config.in
--- linux/arch/i386/config.in	Sat Feb 19 08:24:17 2000
+++ linux-bcp/arch/i386/config.in	Sat Feb 19 18:16:41 2000
@@ -130,6 +130,7 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+bool 'BCP support' CONFIG_BCP
 if [ "$CONFIG_PROC_FS" = "y" ]; then
    choice 'Kernel core (/proc/kcore) format' \
 	"ELF		CONFIG_KCORE_ELF	\
diff -urN -X dontdiff linux/arch/i386/defconfig linux-bcp/arch/i386/defconfig
--- linux/arch/i386/defconfig	Thu Feb 17 20:07:54 2000
+++ linux-bcp/arch/i386/defconfig	Sat Feb 19 18:16:41 2000
@@ -57,6 +57,7 @@
 CONFIG_PCI_DIRECT=y
 CONFIG_PCI_NAMES=y
 # CONFIG_MCA is not set
+CONFIG_BCP=y
 CONFIG_HOTPLUG=y
 
 #
diff -urN -X dontdiff linux/fs/Config.in linux-bcp/fs/Config.in
--- linux/fs/Config.in	Sat Feb 19 08:24:18 2000
+++ linux-bcp/fs/Config.in	Sat Feb 19 12:20:54 2000
@@ -106,7 +106,7 @@
 	 define_tristate CONFIG_LOCKD n
       fi
    fi
-   if [ "$CONFIG_NFSD_V3" == "y" ]; then
+   if [ "$CONFIG_NFSD_V3" = "y" ]; then
      define_bool CONFIG_LOCKD_V4 y
    fi
    tristate 'SMB file system support (to mount WfW shares etc.)' CONFIG_SMB_FS
