mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
This patch converts s390 to use the generic entry infrastructure from kernel/entry/*. There are a few special things on s390: - PIF_PER_TRAP is moved to TIF_PER_TRAP as the generic code doesn't know about our PIF flags in exit_to_user_mode_loop(). - The old code had several ways to restart syscalls: a) PIF_SYSCALL_RESTART, which was only set during execve to force a restart after upgrading a process (usually qemu-kvm) to pgste page table extensions. b) PIF_SYSCALL, which is set by do_signal() to indicate that the current syscall should be restarted. This is changed so that do_signal() now also uses PIF_SYSCALL_RESTART. Continuing to use PIF_SYSCALL doesn't work with the generic code, and changing it to PIF_SYSCALL_RESTART makes PIF_SYSCALL and PIF_SYSCALL_RESTART more unique. - On s390 calling sys_sigreturn or sys_rt_sigreturn is implemented by executing a svc instruction on the process stack which causes a fault. While handling that fault the fault code sets PIF_SYSCALL to hand over processing to the syscall code on exit to usermode. The patch introduces PIF_SYSCALL_RET_SET, which is set if ptrace sets a return value for a syscall. The s390x ptrace ABI uses r2 both for the syscall number and return value, so ptrace cannot set the syscall number + return value at the same time. The flag makes handling that a bit easier. do_syscall() will just skip executing the syscall if PIF_SYSCALL_RET_SET is set. CONFIG_DEBUG_ASCE was removd in favour of the generic CONFIG_DEBUG_ENTRY. CR1/7/13 will be checked both on kernel entry and exit to contain the correct asces. Signed-off-by: Sven Schnelle <svens@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
61 lines
1.4 KiB
C
61 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef ARCH_S390_ENTRY_COMMON_H
|
|
#define ARCH_S390_ENTRY_COMMON_H
|
|
|
|
#include <linux/sched.h>
|
|
#include <linux/audit.h>
|
|
#include <linux/tracehook.h>
|
|
#include <linux/processor.h>
|
|
#include <linux/uaccess.h>
|
|
#include <asm/fpu/api.h>
|
|
|
|
#define ARCH_EXIT_TO_USER_MODE_WORK (_TIF_GUARDED_STORAGE | _TIF_PER_TRAP)
|
|
|
|
void do_per_trap(struct pt_regs *regs);
|
|
void do_syscall(struct pt_regs *regs);
|
|
|
|
typedef void (*pgm_check_func)(struct pt_regs *regs);
|
|
|
|
extern pgm_check_func pgm_check_table[128];
|
|
|
|
#ifdef CONFIG_DEBUG_ENTRY
|
|
static __always_inline void arch_check_user_regs(struct pt_regs *regs)
|
|
{
|
|
debug_user_asce(0);
|
|
}
|
|
|
|
#define arch_check_user_regs arch_check_user_regs
|
|
#endif /* CONFIG_DEBUG_ENTRY */
|
|
|
|
static __always_inline void arch_exit_to_user_mode_work(struct pt_regs *regs,
|
|
unsigned long ti_work)
|
|
{
|
|
if (ti_work & _TIF_PER_TRAP) {
|
|
clear_thread_flag(TIF_PER_TRAP);
|
|
do_per_trap(regs);
|
|
}
|
|
|
|
if (ti_work & _TIF_GUARDED_STORAGE)
|
|
gs_load_bc_cb(regs);
|
|
}
|
|
|
|
#define arch_exit_to_user_mode_work arch_exit_to_user_mode_work
|
|
|
|
static __always_inline void arch_exit_to_user_mode(void)
|
|
{
|
|
if (test_cpu_flag(CIF_FPU))
|
|
__load_fpu_regs();
|
|
|
|
if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
|
|
debug_user_asce(1);
|
|
}
|
|
|
|
#define arch_exit_to_user_mode arch_exit_to_user_mode
|
|
|
|
static inline bool on_thread_stack(void)
|
|
{
|
|
return !(((unsigned long)(current->stack) ^ current_stack_pointer()) & ~(THREAD_SIZE - 1));
|
|
}
|
|
|
|
#endif
|