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

Commit e37f50e1 authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

[S390] Add processor type march=z10 and a processor type safety check.



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: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent b3b59d33
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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
+49 −0
Original line number Diff line number Diff line
@@ -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
+3 −24
Original line number Diff line number Diff line
@@ -10,34 +10,13 @@
 *
 */

#
# 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
+0 −23
Original line number Diff line number Diff line
@@ -10,29 +10,6 @@
 *
 */

#
# 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: