From: Heiko Carstens Date: Mon, 11 Sep 2023 19:40:05 +0000 (+0200) Subject: s390/ctltreg: make initialization of control register save area explicit X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=d11d5c8c8426a4abdcb2252999f1b57e3aa79e5b;p=linux.git s390/ctltreg: make initialization of control register save area explicit Commit e1b9c2749af0 ("s390/smp: ensure global control register contents are in sync") made the control register save area contained within the lowcore at absolute address zero a resource which is used when initializing CPUs. However this is anything but obvious from the code. Add an ctlreg_init_save_area() function in order to make this explicit. Signed-off-by: Heiko Carstens Reviewed-by: Alexander Gordeev Signed-off-by: Vasily Gorbik --- diff --git a/arch/s390/include/asm/ctlreg.h b/arch/s390/include/asm/ctlreg.h index 57cc610dd9977..1f25601d75a06 100644 --- a/arch/s390/include/asm/ctlreg.h +++ b/arch/s390/include/asm/ctlreg.h @@ -110,9 +110,12 @@ static __always_inline void local_ctl_clear_bit(unsigned int cr, unsigned int bi local_ctl_load(cr, ®); } +struct lowcore; + void system_ctlreg_lock(void); void system_ctlreg_unlock(void); void system_ctl_set_clear_bit(unsigned int cr, unsigned int bit, bool set); +void system_ctlreg_init_save_area(struct lowcore *lc); static inline void system_ctl_set_bit(unsigned int cr, unsigned int bit) { diff --git a/arch/s390/kernel/ctlreg.c b/arch/s390/kernel/ctlreg.c index 14f715bc5f736..7acc408048743 100644 --- a/arch/s390/kernel/ctlreg.c +++ b/arch/s390/kernel/ctlreg.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -27,6 +28,16 @@ void system_ctlreg_unlock(void) spin_unlock(&system_ctl_lock); } +void __init system_ctlreg_init_save_area(struct lowcore *lc) +{ + struct lowcore *abs_lc; + + abs_lc = get_abs_lowcore(); + __local_ctl_store(0, 15, lc->cregs_save_area); + __local_ctl_store(0, 15, abs_lc->cregs_save_area); + put_abs_lowcore(abs_lc); +} + struct ctl_bit_parms { unsigned long orval; unsigned long andval; diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 1c049a65c769f..d399f18d0379e 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -449,7 +449,6 @@ static void __init setup_lowcore(void) lc->restart_fn = (unsigned long) do_restart; lc->restart_data = 0; lc->restart_source = -1U; - __local_ctl_store(0, 15, lc->cregs_save_area); lc->spinlock_lockval = arch_spin_lockval(0); lc->spinlock_index = 0; arch_spin_lock_setup(0); @@ -459,6 +458,7 @@ static void __init setup_lowcore(void) lc->kernel_asce = S390_lowcore.kernel_asce; lc->user_asce = S390_lowcore.user_asce; + system_ctlreg_init_save_area(lc); abs_lc = get_abs_lowcore(); abs_lc->restart_stack = lc->restart_stack; abs_lc->restart_fn = lc->restart_fn; @@ -466,7 +466,6 @@ static void __init setup_lowcore(void) abs_lc->restart_source = lc->restart_source; abs_lc->restart_psw = lc->restart_psw; abs_lc->restart_flags = RESTART_FLAG_CTLREGS; - memcpy(abs_lc->cregs_save_area, lc->cregs_save_area, sizeof(abs_lc->cregs_save_area)); abs_lc->program_new_psw = lc->program_new_psw; abs_lc->mcesad = lc->mcesad; put_abs_lowcore(abs_lc);