Commit 340750c1 authored by Heiko Carstens's avatar Heiko Carstens

s390/switch_to: use generic header file

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: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 30410373
...@@ -203,6 +203,10 @@ static inline int test_and_clear_pt_regs_flag(struct pt_regs *regs, int flag) ...@@ -203,6 +203,10 @@ static inline int test_and_clear_pt_regs_flag(struct pt_regs *regs, int flag)
return ret; return ret;
} }
struct task_struct;
void update_cr_regs(struct task_struct *task);
/* /*
* These are defined as per linux/ptrace.h, which see. * These are defined as per linux/ptrace.h, which see.
*/ */
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <asm/switch_to.h>
struct stack_frame_user { struct stack_frame_user {
unsigned long back_chain; unsigned long back_chain;
......
/* 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 */
...@@ -171,13 +171,13 @@ _LPP_OFFSET = __LC_LPP ...@@ -171,13 +171,13 @@ _LPP_OFFSET = __LC_LPP
nop 0 nop 0
/* /*
* Scheduler resume function, called by switch_to * Scheduler resume function, called by __switch_to
* gpr2 = (task_struct *) prev * gpr2 = (task_struct *)prev
* gpr3 = (task_struct *) next * gpr3 = (task_struct *)next
* Returns: * Returns:
* gpr2 = prev * gpr2 = prev
*/ */
SYM_FUNC_START(__switch_to) SYM_FUNC_START(__switch_to_asm)
stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task
lghi %r4,__TASK_stack lghi %r4,__TASK_stack
lghi %r1,__TASK_thread lghi %r1,__TASK_thread
...@@ -193,7 +193,7 @@ SYM_FUNC_START(__switch_to) ...@@ -193,7 +193,7 @@ SYM_FUNC_START(__switch_to)
lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task
ALTERNATIVE "nop", "lpp _LPP_OFFSET", 40 ALTERNATIVE "nop", "lpp _LPP_OFFSET", 40
BR_EX %r14 BR_EX %r14
SYM_FUNC_END(__switch_to) SYM_FUNC_END(__switch_to_asm)
#if IS_ENABLED(CONFIG_KVM) #if IS_ENABLED(CONFIG_KVM)
/* /*
......
...@@ -19,6 +19,7 @@ void mcck_int_handler(void); ...@@ -19,6 +19,7 @@ void mcck_int_handler(void);
void restart_int_handler(void); void restart_int_handler(void);
void early_pgm_check_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 __ret_from_fork(struct task_struct *prev, struct pt_regs *regs);
void __do_pgm_check(struct pt_regs *regs); void __do_pgm_check(struct pt_regs *regs);
void __do_syscall(struct pt_regs *regs, int per_trap); void __do_syscall(struct pt_regs *regs, int per_trap);
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/ftrace.h> #include <linux/ftrace.h>
#include <linux/debug_locks.h> #include <linux/debug_locks.h>
#include <asm/guarded_storage.h>
#include <asm/pfault.h> #include <asm/pfault.h>
#include <asm/cio.h> #include <asm/cio.h>
#include <asm/setup.h> #include <asm/setup.h>
...@@ -26,7 +27,6 @@ ...@@ -26,7 +27,6 @@
#include <asm/os_info.h> #include <asm/os_info.h>
#include <asm/set_memory.h> #include <asm/set_memory.h>
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
#include <asm/switch_to.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/sclp.h> #include <asm/sclp.h>
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include <asm/cputime.h> #include <asm/cputime.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/crw.h> #include <asm/crw.h>
#include <asm/switch_to.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/pai.h> #include <asm/pai.h>
#include <asm/vx-insn.h> #include <asm/vx-insn.h>
......
...@@ -31,15 +31,18 @@ ...@@ -31,15 +31,18 @@
#include <linux/init_task.h> #include <linux/init_task.h>
#include <linux/entry-common.h> #include <linux/entry-common.h>
#include <linux/io.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/cpu_mf.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/ptrace.h>
#include <asm/vtimer.h> #include <asm/vtimer.h>
#include <asm/exec.h> #include <asm/exec.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/stacktrace.h> #include <asm/stacktrace.h>
#include <asm/switch_to.h>
#include <asm/runtime_instr.h> #include <asm/runtime_instr.h>
#include <asm/unwind.h> #include <asm/unwind.h>
#include "entry.h" #include "entry.h"
...@@ -190,6 +193,24 @@ void execve_tail(void) ...@@ -190,6 +193,24 @@ void execve_tail(void)
asm volatile("sfpc %0" : : "d" (0)); 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) unsigned long __get_wchan(struct task_struct *p)
{ {
struct unwind_state state; struct unwind_state state;
......
...@@ -24,11 +24,11 @@ ...@@ -24,11 +24,11 @@
#include <linux/seccomp.h> #include <linux/seccomp.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <trace/syscall.h> #include <trace/syscall.h>
#include <asm/guarded_storage.h>
#include <asm/access-regs.h> #include <asm/access-regs.h>
#include <asm/page.h> #include <asm/page.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/switch_to.h>
#include <asm/runtime_instr.h> #include <asm/runtime_instr.h>
#include <asm/facility.h> #include <asm/facility.h>
#include <asm/fpu/api.h> #include <asm/fpu/api.h>
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/sched/task_stack.h> #include <linux/sched/task_stack.h>
#include <asm/switch_to.h>
#include <asm/facility.h> #include <asm/facility.h>
#include <asm/kprobes.h> #include <asm/kprobes.h>
#include <asm/dis.h> #include <asm/dis.h>
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <asm/irqflags.h> #include <asm/irqflags.h>
#include <asm/checksum.h> #include <asm/checksum.h>
#include <asm/os_info.h> #include <asm/os_info.h>
#include <asm/switch_to.h>
#include <asm/maccess.h> #include <asm/maccess.h>
#include "sclp.h" #include "sclp.h"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment