Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 991c1505 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

s390: add zEC12 code generation support



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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
parent d1e57508
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -169,6 +169,10 @@ config HAVE_MARCH_Z196_FEATURES
	def_bool n
	def_bool n
	select HAVE_MARCH_Z10_FEATURES
	select HAVE_MARCH_Z10_FEATURES


config HAVE_MARCH_ZEC12_FEATURES
	def_bool n
	select HAVE_MARCH_Z196_FEATURES

choice
choice
	prompt "Processor type"
	prompt "Processor type"
	default MARCH_G5
	default MARCH_G5
@@ -220,6 +224,13 @@ config MARCH_Z196
	  (2818 and 2817 series). The kernel will be slightly faster but will
	  (2818 and 2817 series). The kernel will be slightly faster but will
	  not work on older machines.
	  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
endchoice


config 64BIT
config 64BIT
+1 −0
Original line number Original line Diff line number Diff line
@@ -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_Z9_109) += $(call cc-option,-march=z9-109)
cflags-$(CONFIG_MARCH_Z10) += $(call cc-option,-march=z10)
cflags-$(CONFIG_MARCH_Z10) += $(call cc-option,-march=z10)
cflags-$(CONFIG_MARCH_Z196) += $(call cc-option,-march=z196)
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 is necessary for make rpm
KBUILD_IMAGE	:=arch/s390/boot/image
KBUILD_IMAGE	:=arch/s390/boot/image
+44 −30
Original line number Original line Diff line number Diff line
@@ -393,30 +393,35 @@ ENTRY(startup_kdump)
	xc	0x300(256),0x300
	xc	0x300(256),0x300
	xc	0xe00(256),0xe00
	xc	0xe00(256),0xe00
	stck	__LC_LAST_UPDATE_CLOCK
	stck	__LC_LAST_UPDATE_CLOCK
	spt	5f-.LPG0(%r13)
	spt	6f-.LPG0(%r13)
	mvc	__LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13)
	mvc	__LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
	xc	__LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
	xc	__LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
#ifndef CONFIG_MARCH_G5
#ifndef CONFIG_MARCH_G5
	# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
	# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
	.insn	s,0xb2b10000,__LC_STFL_FAC_LIST	# store facility list
	.insn	s,0xb2b10000,__LC_STFL_FAC_LIST	# store facility list
	tm	__LC_STFL_FAC_LIST,0x01	# stfle available ?
	tm	__LC_STFL_FAC_LIST,0x01	# stfle available ?
	jz	0f
	jz	0f
	la	%r0,0
	la	%r0,1
	.insn	s,0xb2b00000,__LC_STFL_FAC_LIST	# store facility list extended
	.insn	s,0xb2b00000,__LC_STFL_FAC_LIST	# store facility list extended
0:	l	%r0,__LC_STFL_FAC_LIST
	# verify if all required facilities are supported by the machine
	n	%r0,2f+8-.LPG0(%r13)
0:	la	%r1,__LC_STFL_FAC_LIST
	cl	%r0,2f+8-.LPG0(%r13)
	la	%r2,3f+8-.LPG0(%r13)
	jne	1f
	l	%r3,0(%r2)
	l	%r0,__LC_STFL_FAC_LIST+4
1:	l	%r0,0(%r1)
	n	%r0,2f+12-.LPG0(%r13)
	n	%r0,4(%r2)
	cl	%r0,2f+12-.LPG0(%r13)
	cl	%r0,4(%r2)
	je	3f
	jne	2f
1:	l	%r15,.Lstack-.LPG0(%r13)
	la	%r1,4(%r1)
	la	%r2,4(%r2)
	ahi	%r3,-1
	jnz	1b
	j	4f
2:	l	%r15,.Lstack-.LPG0(%r13)
	ahi	%r15,-96
	ahi	%r15,-96
	la	%r2,.Lals_string-.LPG0(%r13)
	la	%r2,.Lals_string-.LPG0(%r13)
	l	%r3,.Lsclp_print-.LPG0(%r13)
	l	%r3,.Lsclp_print-.LPG0(%r13)
	basr	%r14,%r3
	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:
.Lals_string:
	.asciz	"The Linux kernel requires more recent processor hardware"
	.asciz	"The Linux kernel requires more recent processor hardware"
.Lsclp_print:
.Lsclp_print:
@@ -424,33 +429,42 @@ ENTRY(startup_kdump)
.Lstack:
.Lstack:
	.long	0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
	.long	0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
	.align 16
	.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_64BIT)
#if defined(CONFIG_MARCH_Z196)
#if defined(CONFIG_MARCH_ZEC12)
	.long 0xc100efe3, 0xf46c0000
	.long 3, 0xc100efe3, 0xf46ce000, 0x00400000
#elif defined(CONFIG_MARCH_Z196)
	.long 2, 0xc100efe3, 0xf46c0000
#elif defined(CONFIG_MARCH_Z10)
#elif defined(CONFIG_MARCH_Z10)
	.long 0xc100efe3, 0xf0680000
	.long 2, 0xc100efe3, 0xf0680000
#elif defined(CONFIG_MARCH_Z9_109)
#elif defined(CONFIG_MARCH_Z9_109)
	.long 0xc100efc3, 0x00000000
	.long 1, 0xc100efc3
#elif defined(CONFIG_MARCH_Z990)
#elif defined(CONFIG_MARCH_Z990)
	.long 0xc0002000, 0x00000000
	.long 1, 0xc0002000
#elif defined(CONFIG_MARCH_Z900)
#elif defined(CONFIG_MARCH_Z900)
	.long 0xc0000000, 0x00000000
	.long 1, 0xc0000000
#endif
#endif
#else
#else
#if defined(CONFIG_MARCH_Z196)
#if defined(CONFIG_MARCH_ZEC12)
	.long 0x8100c880, 0x00000000
	.long 1, 0x8100c880
#elif defined(CONFIG_MARCH_Z196)
	.long 1, 0x8100c880
#elif defined(CONFIG_MARCH_Z10)
#elif defined(CONFIG_MARCH_Z10)
	.long 0x8100c880, 0x00000000
	.long 1, 0x8100c880
#elif defined(CONFIG_MARCH_Z9_109)
#elif defined(CONFIG_MARCH_Z9_109)
	.long 0x8100c880, 0x00000000
	.long 1, 0x8100c880
#elif defined(CONFIG_MARCH_Z990)
#elif defined(CONFIG_MARCH_Z990)
	.long 0x80002000, 0x00000000
	.long 1, 0x80002000
#elif defined(CONFIG_MARCH_Z900)
#elif defined(CONFIG_MARCH_Z900)
	.long 0x80000000, 0x00000000
	.long 1, 0x80000000
#endif
#endif
#endif
#endif
3:
4:
#endif
#endif


#ifdef CONFIG_64BIT
#ifdef CONFIG_64BIT
@@ -459,14 +473,14 @@ ENTRY(startup_kdump)
	jg	startup_continue
	jg	startup_continue
#else
#else
	/* Continue with 31bit startup code in head31.S */
	/* Continue with 31bit startup code in head31.S */
	l	%r13,4f-.LPG0(%r13)
	l	%r13,5f-.LPG0(%r13)
	b	0(%r13)
	b	0(%r13)
	.align	8
	.align	8
4:	.long	startup_continue
5:	.long	startup_continue
#endif
#endif


	.align	8
	.align	8
5:	.long	0x7fffffff,0xffffffff
6:	.long	0x7fffffff,0xffffffff


#include "head_kdump.S"
#include "head_kdump.S"


+3 −0
Original line number Original line Diff line number Diff line
@@ -1006,6 +1006,9 @@ static void __init setup_hwcaps(void)
	case 0x2818:
	case 0x2818:
		strcpy(elf_platform, "z196");
		strcpy(elf_platform, "z196");
		break;
		break;
	case 0x2827:
		strcpy(elf_platform, "zEC12");
		break;
	}
	}
}
}