[S390] Add processor type march=z10 and a processor type safety check.
Martin Schwidefsky [Thu, 25 Dec 2008 12:39:19 +0000 (13:39 +0100)]
This patch adds the code generation option for IBM System z10 and
adds a check in head[31,64].S to prevents the execution of a kernel
compiled for a new processor type on an old machine.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

arch/s390/Kconfig
arch/s390/Makefile
arch/s390/kernel/head.S
arch/s390/kernel/head31.S
arch/s390/kernel/head64.S

index e6efc12..7a18d23 100644 (file)
@@ -230,6 +230,14 @@ config MARCH_Z9_109
          Class (z9 BC). The kernel will be slightly faster but will not
          work on older machines such as the z990, z890, z900, and z800.
 
+config MARCH_Z10
+       bool "IBM System z10"
+       help
+         Select this to enable optimizations for IBM System z10. The
+         kernel will be slightly faster but will not work on older
+         machines such as the z990, z890, z900, z800, z9-109, z9-ec
+         and z9-bc.
+
 endchoice
 
 config PACK_STACK
index 792a4e7..578c61f 100644 (file)
@@ -34,6 +34,7 @@ cflags-$(CONFIG_MARCH_G5)   += $(call cc-option,-march=g5)
 cflags-$(CONFIG_MARCH_Z900) += $(call cc-option,-march=z900)
 cflags-$(CONFIG_MARCH_Z990) += $(call cc-option,-march=z990)
 cflags-$(CONFIG_MARCH_Z9_109) += $(call cc-option,-march=z9-109)
+cflags-$(CONFIG_MARCH_Z10) += $(call cc-option,-march=z10)
 
 #KBUILD_IMAGE is necessary for make rpm
 KBUILD_IMAGE   :=arch/s390/boot/image
index 83477c7..ec7e35f 100644 (file)
@@ -461,6 +461,55 @@ start:
        .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
        .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
 
+#
+# startup-code at 0x10000, running in absolute addressing mode
+# this is called either by the ipl loader or directly by PSW restart
+# or linload or SALIPL
+#
+       .org    0x10000
+startup:basr   %r13,0                  # get base
+.LPG0:
+
+#ifndef CONFIG_MARCH_G5
+       # check processor version against MARCH_{G5,Z900,Z990,Z9_109,Z10}
+       stidp   __LC_CPUID              # store cpuid
+       lhi     %r0,(3f-2f) / 2
+       la      %r1,2f-.LPG0(%r13)
+0:     clc     __LC_CPUID+4(2),0(%r1)
+       jne     3f
+       lpsw    1f-.LPG0(13)            # machine type not good enough, crash
+       .align 16
+1:     .long   0x000a0000,0x00000000
+2:
+#if defined(CONFIG_MARCH_Z10)
+       .short 0x9672, 0x2064, 0x2066, 0x2084, 0x2086, 0x2094, 0x2096
+#elif defined(CONFIG_MARCH_Z9_109)
+       .short 0x9672, 0x2064, 0x2066, 0x2084, 0x2086
+#elif defined(CONFIG_MARCH_Z990)
+       .short 0x9672, 0x2064, 0x2066
+#elif defined(CONFIG_MARCH_Z900)
+       .short 0x9672
+#endif
+3:     la      %r1,2(%r1)
+       brct    %r0,0b
+#endif
+
+       l       %r13,0f-.LPG0(%r13)
+       b       0(%r13)
+0:     .long   startup_continue
+
+#
+# params at 10400 (setup.h)
+#
+       .org    PARMAREA
+       .long   0,0                     # IPL_DEVICE
+       .long   0,0                     # INITRD_START
+       .long   0,0                     # INITRD_SIZE
+
+       .org    COMMAND_LINE
+       .byte   "root=/dev/ram0 ro"
+       .byte   0
+
 #ifdef CONFIG_64BIT
 #include "head64.S"
 #else
index a816e2d..7add845 100644 (file)
  *
  */
 
-#
-# startup-code at 0x10000, running in absolute addressing mode
-# this is called either by the ipl loader or directly by PSW restart
-# or linload or SALIPL
-#
-       .org    0x10000
-startup:basr   %r13,0                  # get base
-.LPG0: l       %r13,0f-.LPG0(%r13)
-       b       0(%r13)
-0:     .long   startup_continue
-
-#
-# params at 10400 (setup.h)
-#
-       .org    PARMAREA
-       .long   0,0                     # IPL_DEVICE
-       .long   0,0                     # INITRD_START
-       .long   0,0                     # INITRD_SIZE
-
-       .org    COMMAND_LINE
-       .byte   "root=/dev/ram0 ro"
-       .byte   0
-
        .org    0x11000
 
 startup_continue:
        basr    %r13,0                  # get base
-.LPG1: mvi     __LC_AR_MODE_ID,0       # set ESA flag (mode 0)
+.LPG1:
+
+       mvi     __LC_AR_MODE_ID,0       # set ESA flag (mode 0)
        lctl    %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
        l       %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
                                        # move IPL device to lowcore
index 1d06961..b1a8ceb 100644 (file)
  *
  */
 
-#
-# startup-code at 0x10000, running in absolute addressing mode
-# this is called either by the ipl loader or directly by PSW restart
-# or linload or SALIPL
-#
-       .org    0x10000
-startup:basr   %r13,0                  # get base
-.LPG0: l       %r13,0f-.LPG0(%r13)
-       b       0(%r13)
-0:     .long   startup_continue
-
-#
-# params at 10400 (setup.h)
-#
-       .org    PARMAREA
-       .quad   0                       # IPL_DEVICE
-       .quad   0                       # INITRD_START
-       .quad   0                       # INITRD_SIZE
-
-       .org    COMMAND_LINE
-       .byte   "root=/dev/ram0 ro"
-       .byte   0
-
        .org    0x11000
 
 startup_continue: