s390/switch_to: use generic header file
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 5 Feb 2024 20:32:13 +0000 (21:32 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 12 Feb 2024 14:03:33 +0000 (15:03 +0100)
Move the switch_to() implementation to process.c and use the generic
switch_to.h header file instead, like some other architectures.

This addresses also the oddity that the old switch_to() implementation
assigns the return value of __switch_to() to 'prev' instead of 'last',
like it should.

Remove also all includes of switch_to.h from C files, except process.c.

Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/include/asm/ptrace.h
arch/s390/include/asm/stacktrace.h
arch/s390/include/asm/switch_to.h [deleted file]
arch/s390/kernel/entry.S
arch/s390/kernel/entry.h
arch/s390/kernel/machine_kexec.c
arch/s390/kernel/nmi.c
arch/s390/kernel/process.c
arch/s390/kernel/ptrace.c
arch/s390/kernel/uprobes.c
drivers/s390/char/zcore.c

index d28bf8fb279959409397b60e82086e0fa56e34d2..788bc4467445c9da9471cf5037bcf2887f1303e8 100644 (file)
@@ -203,6 +203,10 @@ static inline int test_and_clear_pt_regs_flag(struct pt_regs *regs, int flag)
        return ret;
 }
 
+struct task_struct;
+
+void update_cr_regs(struct task_struct *task);
+
 /*
  * These are defined as per linux/ptrace.h, which see.
  */
index 31ec4f545e036a26bfc0d8cc7fb8163fdd2c93a5..433fde85b14ea902308cdf5bf83583c7305473b1 100644 (file)
@@ -4,7 +4,6 @@
 
 #include <linux/uaccess.h>
 #include <linux/ptrace.h>
-#include <asm/switch_to.h>
 
 struct stack_frame_user {
        unsigned long back_chain;
diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h
deleted file mode 100644 (file)
index 8b0ca7d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright IBM Corp. 1999, 2009
- *
- * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
- */
-
-#ifndef __ASM_SWITCH_TO_H
-#define __ASM_SWITCH_TO_H
-
-#include <linux/thread_info.h>
-#include <asm/fpu/api.h>
-#include <asm/access-regs.h>
-#include <asm/ptrace.h>
-#include <asm/guarded_storage.h>
-
-extern struct task_struct *__switch_to(void *, void *);
-extern void update_cr_regs(struct task_struct *task);
-
-#define switch_to(prev, next, last) do {                               \
-       /* save_fpu_regs() sets the CIF_FPU flag, which enforces        \
-        * a restore of the floating point / vector registers as        \
-        * soon as the next task returns to user space                  \
-        */                                                             \
-       save_fpu_regs();                                                \
-       save_access_regs(&prev->thread.acrs[0]);                        \
-       save_ri_cb(prev->thread.ri_cb);                                 \
-       save_gs_cb(prev->thread.gs_cb);                                 \
-       update_cr_regs(next);                                           \
-       restore_access_regs(&next->thread.acrs[0]);                     \
-       restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb);          \
-       restore_gs_cb(next->thread.gs_cb);                              \
-       prev = __switch_to(prev, next);                                 \
-} while (0)
-
-#endif /* __ASM_SWITCH_TO_H */
index 49a11f6dd7ae9a695bfda2e18523a625de81f6ed..f22cb6831f937a3740a77a9f56e2fe7f36dad8dd 100644 (file)
@@ -171,13 +171,13 @@ _LPP_OFFSET       = __LC_LPP
        nop     0
 
 /*
- * Scheduler resume function, called by switch_to
- *  gpr2 = (task_struct *) prev
- *  gpr3 = (task_struct *) next
+ * Scheduler resume function, called by __switch_to
+ *  gpr2 = (task_struct *)prev
+ *  gpr3 = (task_struct *)next
  * Returns:
  *  gpr2 = prev
  */
-SYM_FUNC_START(__switch_to)
+SYM_FUNC_START(__switch_to_asm)
        stmg    %r6,%r15,__SF_GPRS(%r15)        # store gprs of prev task
        lghi    %r4,__TASK_stack
        lghi    %r1,__TASK_thread
@@ -193,7 +193,7 @@ SYM_FUNC_START(__switch_to)
        lmg     %r6,%r15,__SF_GPRS(%r15)        # load gprs of next task
        ALTERNATIVE "nop", "lpp _LPP_OFFSET", 40
        BR_EX   %r14
-SYM_FUNC_END(__switch_to)
+SYM_FUNC_END(__switch_to_asm)
 
 #if IS_ENABLED(CONFIG_KVM)
 /*
index 9f41853f36b934bc8dd0675cd2bbe57e17377b2b..21969520f947d42a3d631bc59d8c4786853eb6ee 100644 (file)
@@ -19,6 +19,7 @@ void mcck_int_handler(void);
 void restart_int_handler(void);
 void early_pgm_check_handler(void);
 
+struct task_struct *__switch_to_asm(struct task_struct *prev, struct task_struct *next);
 void __ret_from_fork(struct task_struct *prev, struct pt_regs *regs);
 void __do_pgm_check(struct pt_regs *regs);
 void __do_syscall(struct pt_regs *regs, int per_trap);
index aa22ffc16bcd3d5e2467e7093204f682a036e42b..032a1124f04bca9019e86f0cf9b7e1a46ba46370 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/reboot.h>
 #include <linux/ftrace.h>
 #include <linux/debug_locks.h>
+#include <asm/guarded_storage.h>
 #include <asm/pfault.h>
 #include <asm/cio.h>
 #include <asm/setup.h>
@@ -26,7 +27,6 @@
 #include <asm/os_info.h>
 #include <asm/set_memory.h>
 #include <asm/stacktrace.h>
-#include <asm/switch_to.h>
 #include <asm/nmi.h>
 #include <asm/sclp.h>
 
index 9ad44c26d1a2884adc75bb7969c0988f3b896caf..bbef8d954d01da60a63a947feb55f7604b535ac0 100644 (file)
@@ -28,7 +28,6 @@
 #include <asm/cputime.h>
 #include <asm/nmi.h>
 #include <asm/crw.h>
-#include <asm/switch_to.h>
 #include <asm/asm-offsets.h>
 #include <asm/pai.h>
 #include <asm/vx-insn.h>
index 4e3b366589fb6a7484b866faf786dc976dbbffa3..7227a73226f18b289ff0ebefb21b73fccb902c03 100644 (file)
 #include <linux/init_task.h>
 #include <linux/entry-common.h>
 #include <linux/io.h>
+#include <asm/guarded_storage.h>
+#include <asm/access-regs.h>
+#include <asm/switch_to.h>
 #include <asm/cpu_mf.h>
 #include <asm/processor.h>
+#include <asm/ptrace.h>
 #include <asm/vtimer.h>
 #include <asm/exec.h>
 #include <asm/irq.h>
 #include <asm/nmi.h>
 #include <asm/smp.h>
 #include <asm/stacktrace.h>
-#include <asm/switch_to.h>
 #include <asm/runtime_instr.h>
 #include <asm/unwind.h>
 #include "entry.h"
@@ -190,6 +193,24 @@ void execve_tail(void)
        asm volatile("sfpc %0" : : "d" (0));
 }
 
+struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *next)
+{
+       /*
+        * save_fpu_regs() sets the CIF_FPU flag, which enforces
+        * a restore of the floating point / vector registers as
+        * soon as the next task returns to user space.
+        */
+       save_fpu_regs();
+       save_access_regs(&prev->thread.acrs[0]);
+       save_ri_cb(prev->thread.ri_cb);
+       save_gs_cb(prev->thread.gs_cb);
+       update_cr_regs(next);
+       restore_access_regs(&next->thread.acrs[0]);
+       restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb);
+       restore_gs_cb(next->thread.gs_cb);
+       return __switch_to_asm(prev, next);
+}
+
 unsigned long __get_wchan(struct task_struct *p)
 {
        struct unwind_state state;
index d662ea9e54f5a70c1e69c76f051771c1dd41fca1..7c5e99be2155af58187c3b0dfd77fe90a7f36cce 100644 (file)
 #include <linux/seccomp.h>
 #include <linux/compat.h>
 #include <trace/syscall.h>
+#include <asm/guarded_storage.h>
 #include <asm/access-regs.h>
 #include <asm/page.h>
 #include <linux/uaccess.h>
 #include <asm/unistd.h>
-#include <asm/switch_to.h>
 #include <asm/runtime_instr.h>
 #include <asm/facility.h>
 #include <asm/fpu/api.h>
index b88345ef8bd9ed627a14065e2efbd534ccf20173..5b0633ea8d93d1f088c0d54897afded431157a19 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/kdebug.h>
 #include <linux/sched/task_stack.h>
 
-#include <asm/switch_to.h>
 #include <asm/facility.h>
 #include <asm/kprobes.h>
 #include <asm/dis.h>
index bc3be0330f1db97e04048c02cdec9ceb717a3f52..0969fa01df58b0bddff85696afe27d8e33b2dd12 100644 (file)
@@ -29,7 +29,6 @@
 #include <asm/irqflags.h>
 #include <asm/checksum.h>
 #include <asm/os_info.h>
-#include <asm/switch_to.h>
 #include <asm/maccess.h>
 #include "sclp.h"