s390/early: move control registers setup in C code
authorVasily Gorbik <gor@linux.ibm.com>
Tue, 12 Nov 2019 16:35:28 +0000 (17:35 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 20 Nov 2019 11:58:12 +0000 (12:58 +0100)
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/ctl_reg.h
arch/s390/kernel/early.c
arch/s390/kernel/head64.S

index 60f9075..ed5efbb 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/bits.h>
 
 #define CR0_CLOCK_COMPARATOR_SIGN      BIT(63 - 10)
+#define CR0_LOW_ADDRESS_PROTECTION     BIT(63 - 35)
 #define CR0_EMERGENCY_SIGNAL_SUBMASK   BIT(63 - 49)
 #define CR0_EXTERNAL_CALL_SUBMASK      BIT(63 - 50)
 #define CR0_CLOCK_COMPARATOR_SUBMASK   BIT(63 - 52)
index 2e99e01..0ed6ae6 100644 (file)
@@ -260,6 +260,17 @@ static inline void save_vector_registers(void)
 #endif
 }
 
+static inline void setup_control_registers(void)
+{
+       unsigned long reg;
+
+       __ctl_store(reg, 0, 0);
+       reg |= CR0_LOW_ADDRESS_PROTECTION;
+       reg |= CR0_EMERGENCY_SIGNAL_SUBMASK;
+       reg |= CR0_EXTERNAL_CALL_SUBMASK;
+       __ctl_load(reg, 0, 0);
+}
+
 static int __init disable_vector_extension(char *str)
 {
        S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX;
@@ -317,5 +328,6 @@ void __init startup_init(void)
        save_vector_registers();
        setup_topology();
        sclp_early_detect();
+       setup_control_registers();
        lockdep_on();
 }
index 0d9ee19..5b21702 100644 (file)
@@ -42,12 +42,6 @@ ENTRY(startup_continue)
 #
        brasl   %r14,startup_init
 
-# check control registers
-       stctg   %c0,%c15,0(%r15)
-       oi      6(%r15),0x60            # enable sigp emergency & external call
-       oi      4(%r15),0x10            # switch on low address proctection
-       lctlg   %c0,%c15,0(%r15)
-
        lam     0,15,.Laregs-.LPG1(%r13)        # load acrs needed by uaccess
        brasl   %r14,start_kernel               # go to C code
 #