Skip to content

Commit

Permalink
[S390] Add processor type march=z10 and a processor type safety check.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Martin Schwidefsky committed Dec 25, 2008
1 parent b3b59d3 commit e37f50e
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 47 deletions.
8 changes: 8 additions & 0 deletions arch/s390/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions arch/s390/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
49 changes: 49 additions & 0 deletions arch/s390/kernel/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
27 changes: 3 additions & 24 deletions arch/s390/kernel/head31.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
23 changes: 0 additions & 23 deletions arch/s390/kernel/head64.S
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit e37f50e

Please sign in to comment.