56e62a7370
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>
91 lines
3.2 KiB
C
91 lines
3.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ENTRY_H
|
|
#define _ENTRY_H
|
|
|
|
#include <linux/percpu.h>
|
|
#include <linux/types.h>
|
|
#include <linux/signal.h>
|
|
#include <asm/ptrace.h>
|
|
#include <asm/idle.h>
|
|
|
|
extern void *restart_stack;
|
|
|
|
void system_call(void);
|
|
void pgm_check_handler(void);
|
|
void ext_int_handler(void);
|
|
void io_int_handler(void);
|
|
void mcck_int_handler(void);
|
|
void restart_int_handler(void);
|
|
|
|
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);
|
|
|
|
void do_protection_exception(struct pt_regs *regs);
|
|
void do_dat_exception(struct pt_regs *regs);
|
|
void do_secure_storage_access(struct pt_regs *regs);
|
|
void do_non_secure_storage_access(struct pt_regs *regs);
|
|
void do_secure_storage_violation(struct pt_regs *regs);
|
|
|
|
void addressing_exception(struct pt_regs *regs);
|
|
void data_exception(struct pt_regs *regs);
|
|
void default_trap_handler(struct pt_regs *regs);
|
|
void divide_exception(struct pt_regs *regs);
|
|
void execute_exception(struct pt_regs *regs);
|
|
void hfp_divide_exception(struct pt_regs *regs);
|
|
void hfp_overflow_exception(struct pt_regs *regs);
|
|
void hfp_significance_exception(struct pt_regs *regs);
|
|
void hfp_sqrt_exception(struct pt_regs *regs);
|
|
void hfp_underflow_exception(struct pt_regs *regs);
|
|
void illegal_op(struct pt_regs *regs);
|
|
void operand_exception(struct pt_regs *regs);
|
|
void overflow_exception(struct pt_regs *regs);
|
|
void privileged_op(struct pt_regs *regs);
|
|
void space_switch_exception(struct pt_regs *regs);
|
|
void special_op_exception(struct pt_regs *regs);
|
|
void specification_exception(struct pt_regs *regs);
|
|
void transaction_exception(struct pt_regs *regs);
|
|
void translation_exception(struct pt_regs *regs);
|
|
void vector_exception(struct pt_regs *regs);
|
|
void monitor_event_exception(struct pt_regs *regs);
|
|
|
|
void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str);
|
|
void kernel_stack_overflow(struct pt_regs * regs);
|
|
void do_signal(struct pt_regs *regs);
|
|
void handle_signal32(struct ksignal *ksig, sigset_t *oldset,
|
|
struct pt_regs *regs);
|
|
void do_notify_resume(struct pt_regs *regs);
|
|
|
|
void __init init_IRQ(void);
|
|
void do_io_irq(struct pt_regs *regs);
|
|
void do_ext_irq(struct pt_regs *regs);
|
|
void do_restart(void);
|
|
void __init startup_init(void);
|
|
void die(struct pt_regs *regs, const char *str);
|
|
int setup_profiling_timer(unsigned int multiplier);
|
|
void __init time_init(void);
|
|
unsigned long prepare_ftrace_return(unsigned long parent, unsigned long sp, unsigned long ip);
|
|
|
|
struct s390_mmap_arg_struct;
|
|
struct fadvise64_64_args;
|
|
struct old_sigaction;
|
|
|
|
long sys_rt_sigreturn(void);
|
|
long sys_sigreturn(void);
|
|
|
|
long sys_s390_personality(unsigned int personality);
|
|
long sys_s390_runtime_instr(int command, int signum);
|
|
long sys_s390_guarded_storage(int command, struct gs_cb __user *);
|
|
long sys_s390_pci_mmio_write(unsigned long, const void __user *, size_t);
|
|
long sys_s390_pci_mmio_read(unsigned long, void __user *, size_t);
|
|
long sys_s390_sthyi(unsigned long function_code, void __user *buffer, u64 __user *return_code, unsigned long flags);
|
|
|
|
DECLARE_PER_CPU(u64, mt_cycles[8]);
|
|
|
|
unsigned long stack_alloc(void);
|
|
void stack_free(unsigned long stack);
|
|
|
|
extern char kprobes_insn_page[];
|
|
|
|
#endif /* _ENTRY_H */
|