diff -ruN linux-2.6.5.orig/arch/s390/kernel/head.S linux-2.6.5/arch/s390/kernel/head.S
--- linux-2.6.5.orig/arch/s390/kernel/head.S	2004-04-04 03:36:52.000000000 +0000
+++ linux-2.6.5/arch/s390/kernel/head.S	2004-05-27 05:05:02.000000000 +0000
@@ -58,6 +58,10 @@
 
         .org   0x100
 #
+# reserve room for IPL registers...remain compatible with ZIPL.
+#
+        .org   0x1c0
+#
 # subroutine for loading from tape
 # Paramters:	
 #  R1 = device number
@@ -180,6 +184,10 @@
 
         .org   0xf0
 #
+# reserve room for IPL registers...remain compatible with ZIPL.
+#
+        .org   0x1c0
+#
 # subroutine for loading cards from the reader
 #
 .Lloader:	
@@ -257,6 +265,7 @@
 #endif  /* CONFIG_IPL_VM */
 
 iplstart:
+        stm   %r0,%r15,IPL_REGS                # store all registers
         lh    %r1,0xb8                         # test if subchannel number
         bct   %r1,.Lnoload                     #  is valid
 	l     %r1,0xb8                         # load ipl subchannel number
@@ -460,7 +469,16 @@
 # or linload or SALIPL
 #
         .org  0x10000
-startup:basr  %r13,0                     # get base
+startup:
+#ifdef CONFIG_SHARED_KERNEL
+#
+# Allows use of the IPL PARM parameter with NSSes and remains compatable
+# with none NSS usage.
+#
+        lm    %r0,%r15,IPL_REGS          # load ipl regs
+        stm   %r0,%r15,IPL_REGS          # (re)save regs
+#endif
+        basr  %r13,0                     # get base
 .LPG1:  lctl  %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
 	la    %r12,_pstart-.LPG1(%r13)   # pointer to parameter area
 					 # move IPL device to lowcore
diff -ruN linux-2.6.5.orig/arch/s390/kernel/setup.c linux-2.6.5/arch/s390/kernel/setup.c
--- linux-2.6.5.orig/arch/s390/kernel/setup.c	2004-05-13 21:28:41.000000000 +0000
+++ linux-2.6.5/arch/s390/kernel/setup.c	2004-05-27 05:33:44.009824391 +0000
@@ -36,7 +36,7 @@
 #include <linux/console.h>
 #include <linux/seq_file.h>
 #include <linux/kernel_stat.h>
-
+#include <linux/ctype.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/smp.h>
@@ -44,6 +44,7 @@
 #include <asm/cpcmd.h>
 #include <asm/lowcore.h>
 #include <asm/irq.h>
+#include <asm/ebcdic.h>
 
 /*
  * Machine setup..
@@ -73,6 +74,13 @@
 
 #include <asm/setup.h>
 
+/*
+ * Change this to whatever you want the VM PARM eyecatcher to be or set to
+ * the null ("") string to disable.  (It must be in uppercase EBCDIC.)
+ */
+#define PARMEYEC "\xd3\xc9\xd5\xc5\x40"
+#define PARMEYEL ((int)sizeof(PARMEYEC)-1)
+
 static char command_line[COMMAND_LINE_SIZE] = { 0, };
        char saved_command_line[COMMAND_LINE_SIZE];
 
@@ -373,6 +381,28 @@
 	data_resource.start = (unsigned long) &_etext;
 	data_resource.end = (unsigned long) &_edata - 1;
 
+        /* Append VM PARMs */
+        if (MACHINE_IS_VM && (memcmp(IPL_REGS, PARMEYEC, PARMEYEL) == 0)) {
+                int last = 0;
+
+		/* Find last nonblank character */
+                for (i = 0; i < COMMAND_LINE_SIZE; i++) {
+                        if (from[i] == '\0')
+                                break;
+                        if (!isspace(from[i]))
+                                last = i + 1;
+                }
+
+                if (last < COMMAND_LINE_SIZE) {
+                        from[last++] = ' ';
+                        i = min(COMMAND_LINE_SIZE-last, 64-PARMEYEL);
+                        memcpy(&from[last], &((char *)IPL_REGS)[PARMEYEL], i);
+                        EBC_TOLOWER(&from[last], i);
+                        EBCASC(&from[last], i);
+                        from[last+i] = '\0';
+		}
+        }
+
         /* Save unparsed command line copy for /proc/cmdline */
         memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
         saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
diff -ruN linux-2.6.5.orig/include/asm-s390/setup.h linux-2.6.5/include/asm-s390/setup.h
--- linux-2.6.5.orig/include/asm-s390/setup.h	2004-04-04 03:38:14.000000000 +0000
+++ linux-2.6.5/include/asm-s390/setup.h	2004-05-27 05:05:18.000000000 +0000
@@ -25,6 +25,7 @@
 #define INITRD_SIZE       (*(unsigned long *)  (0x10410))
 #endif /* __s390x__ */
 #define COMMAND_LINE      ((char *)            (0x10480))
+#define IPL_REGS          ((unsigned int *)    (0x180))
 
 /*
  * Machine features detected in head.S
@@ -76,6 +77,7 @@
 #define INITRD_SIZE       0x10410
 #endif /* __s390x__ */
 #define COMMAND_LINE      0x10480
+#define IPL_REGS          0x180
 
 #endif
 
