s390: add zEC12 code generation support
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 13 Nov 2012 08:26:37 +0000 (10:26 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 23 Nov 2012 10:14:31 +0000 (11:14 +0100)
Allow to generate code that only runs on zEC12 machines.

Also add a check which prevents the kernel to run on machines which
do not have any of the following new facilities installed:

- (48) decimal-floating-point zoned-conversion
- (49) execution-hint
- (49) load-and-trap
- (49) miscellaneous-instruction-extensions
- (49) processor-assist
- (50) constrained transactional-execution
- (73) transactional-execution

48, 49, 50 and 73 are the bit numbers of the facility indications for
each of the required facilities.

Note that we assume that user-space gets compiled with the same
compiler options, therefore we also test for a dfp facility even
if the kernel doesn't make use of it.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
arch/s390/Kconfig
arch/s390/Makefile
arch/s390/kernel/head.S
arch/s390/kernel/setup.c

index d385f396dfee90172e5a984702cd9ded8a76387d..1bf4b294c6e9213beb00264e117c3d77a18cb66d 100644 (file)
@@ -169,6 +169,10 @@ config HAVE_MARCH_Z196_FEATURES
        def_bool n
        select HAVE_MARCH_Z10_FEATURES
 
+config HAVE_MARCH_ZEC12_FEATURES
+       def_bool n
+       select HAVE_MARCH_Z196_FEATURES
+
 choice
        prompt "Processor type"
        default MARCH_G5
@@ -220,6 +224,13 @@ config MARCH_Z196
          (2818 and 2817 series). The kernel will be slightly faster but will
          not work on older machines.
 
+config MARCH_ZEC12
+       bool "IBM zEC12"
+       select HAVE_MARCH_ZEC12_FEATURES if 64BIT
+       help
+         Select this to enable optimizations for IBM zEC12 (2827 series). The
+         kernel will be slightly faster but will not work on older machines.
+
 endchoice
 
 config 64BIT
index 49e76e8b477d43444c98e20c6ef9f4cf868e3a2f..4b8e08b56f49679b40bd4ee098bae0bb01945292 100644 (file)
@@ -41,6 +41,7 @@ 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)
 cflags-$(CONFIG_MARCH_Z196) += $(call cc-option,-march=z196)
+cflags-$(CONFIG_MARCH_ZEC12) += $(call cc-option,-march=zEC12)
 
 #KBUILD_IMAGE is necessary for make rpm
 KBUILD_IMAGE   :=arch/s390/boot/image
index 984726cbce1607855672dbb6210d7b38b56ea122..fd8db63dfc942a211d9dfe95b8c2bff88b90ed8d 100644 (file)
@@ -393,30 +393,35 @@ ENTRY(startup_kdump)
        xc      0x300(256),0x300
        xc      0xe00(256),0xe00
        stck    __LC_LAST_UPDATE_CLOCK
-       spt     5f-.LPG0(%r13)
-       mvc     __LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13)
+       spt     6f-.LPG0(%r13)
+       mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
        xc      __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
 #ifndef CONFIG_MARCH_G5
        # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
        .insn   s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list
        tm      __LC_STFL_FAC_LIST,0x01 # stfle available ?
        jz      0f
-       la      %r0,0
+       la      %r0,1
        .insn   s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended
-0:     l       %r0,__LC_STFL_FAC_LIST
-       n       %r0,2f+8-.LPG0(%r13)
-       cl      %r0,2f+8-.LPG0(%r13)
-       jne     1f
-       l       %r0,__LC_STFL_FAC_LIST+4
-       n       %r0,2f+12-.LPG0(%r13)
-       cl      %r0,2f+12-.LPG0(%r13)
-       je      3f
-1:     l       %r15,.Lstack-.LPG0(%r13)
+       # verify if all required facilities are supported by the machine
+0:     la      %r1,__LC_STFL_FAC_LIST
+       la      %r2,3f+8-.LPG0(%r13)
+       l       %r3,0(%r2)
+1:     l       %r0,0(%r1)
+       n       %r0,4(%r2)
+       cl      %r0,4(%r2)
+       jne     2f
+       la      %r1,4(%r1)
+       la      %r2,4(%r2)
+       ahi     %r3,-1
+       jnz     1b
+       j       4f
+2:     l       %r15,.Lstack-.LPG0(%r13)
        ahi     %r15,-96
        la      %r2,.Lals_string-.LPG0(%r13)
        l       %r3,.Lsclp_print-.LPG0(%r13)
        basr    %r14,%r3
-       lpsw    2f-.LPG0(%r13)          # machine type not good enough, crash
+       lpsw    3f-.LPG0(%r13)          # machine type not good enough, crash
 .Lals_string:
        .asciz  "The Linux kernel requires more recent processor hardware"
 .Lsclp_print:
@@ -424,33 +429,42 @@ ENTRY(startup_kdump)
 .Lstack:
        .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
        .align 16
-2:     .long   0x000a0000,0x8badcccc
+3:     .long   0x000a0000,0x8badcccc
+
+# List of facilities that are required. If not all facilities are present
+# the kernel will crash. Format is number of facility words with bits set,
+# followed by the facility words.
+
 #if defined(CONFIG_64BIT)
-#if defined(CONFIG_MARCH_Z196)
-       .long 0xc100efe3, 0xf46c0000
+#if defined(CONFIG_MARCH_ZEC12)
+       .long 3, 0xc100efe3, 0xf46ce000, 0x00400000
+#elif defined(CONFIG_MARCH_Z196)
+       .long 2, 0xc100efe3, 0xf46c0000
 #elif defined(CONFIG_MARCH_Z10)
-       .long 0xc100efe3, 0xf0680000
+       .long 2, 0xc100efe3, 0xf0680000
 #elif defined(CONFIG_MARCH_Z9_109)
-       .long 0xc100efc3, 0x00000000
+       .long 1, 0xc100efc3
 #elif defined(CONFIG_MARCH_Z990)
-       .long 0xc0002000, 0x00000000
+       .long 1, 0xc0002000
 #elif defined(CONFIG_MARCH_Z900)
-       .long 0xc0000000, 0x00000000
+       .long 1, 0xc0000000
 #endif
 #else
-#if defined(CONFIG_MARCH_Z196)
-       .long 0x8100c880, 0x00000000
+#if defined(CONFIG_MARCH_ZEC12)
+       .long 1, 0x8100c880
+#elif defined(CONFIG_MARCH_Z196)
+       .long 1, 0x8100c880
 #elif defined(CONFIG_MARCH_Z10)
-       .long 0x8100c880, 0x00000000
+       .long 1, 0x8100c880
 #elif defined(CONFIG_MARCH_Z9_109)
-       .long 0x8100c880, 0x00000000
+       .long 1, 0x8100c880
 #elif defined(CONFIG_MARCH_Z990)
-       .long 0x80002000, 0x00000000
+       .long 1, 0x80002000
 #elif defined(CONFIG_MARCH_Z900)
-       .long 0x80000000, 0x00000000
+       .long 1, 0x80000000
 #endif
 #endif
-3:
+4:
 #endif
 
 #ifdef CONFIG_64BIT
@@ -459,14 +473,14 @@ ENTRY(startup_kdump)
        jg      startup_continue
 #else
        /* Continue with 31bit startup code in head31.S */
-       l       %r13,4f-.LPG0(%r13)
+       l       %r13,5f-.LPG0(%r13)
        b       0(%r13)
        .align  8
-4:     .long   startup_continue
+5:     .long   startup_continue
 #endif
 
        .align  8
-5:     .long   0x7fffffff,0xffffffff
+6:     .long   0x7fffffff,0xffffffff
 
 #include "head_kdump.S"
 
index cfdad57957febb6f0d931ace4c103fb4bb352b3c..2568590973ad2e429f394ce4f6147211e7169b11 100644 (file)
@@ -1006,6 +1006,9 @@ static void __init setup_hwcaps(void)
        case 0x2818:
                strcpy(elf_platform, "z196");
                break;
+       case 0x2827:
+               strcpy(elf_platform, "zEC12");
+               break;
        }
 }