cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

signal.h (6843B)


      1/*
      2 *    Copyright (c) 2007 Benjamin Herrenschmidt, IBM Corporation
      3 *    Extracted from signal_32.c and signal_64.c
      4 *
      5 * This file is subject to the terms and conditions of the GNU General
      6 * Public License.  See the file README.legal in the main directory of
      7 * this archive for more details.
      8 */
      9
     10#ifndef _POWERPC_ARCH_SIGNAL_H
     11#define _POWERPC_ARCH_SIGNAL_H
     12
     13void __user *get_sigframe(struct ksignal *ksig, struct task_struct *tsk,
     14			  size_t frame_size, int is_32);
     15
     16extern int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
     17			   struct task_struct *tsk);
     18
     19extern int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
     20			      struct task_struct *tsk);
     21
     22static inline int __get_user_sigset(sigset_t *dst, const sigset_t __user *src)
     23{
     24	BUILD_BUG_ON(sizeof(sigset_t) != sizeof(u64));
     25
     26	return __get_user(dst->sig[0], (u64 __user *)&src->sig[0]);
     27}
     28#define unsafe_get_user_sigset(dst, src, label) do {			\
     29	sigset_t *__dst = dst;						\
     30	const sigset_t __user *__src = src;				\
     31	int i;								\
     32									\
     33	for (i = 0; i < _NSIG_WORDS; i++)				\
     34		unsafe_get_user(__dst->sig[i], &__src->sig[i], label);	\
     35} while (0)
     36
     37#ifdef CONFIG_VSX
     38extern unsigned long copy_vsx_to_user(void __user *to,
     39				      struct task_struct *task);
     40extern unsigned long copy_ckvsx_to_user(void __user *to,
     41					       struct task_struct *task);
     42extern unsigned long copy_vsx_from_user(struct task_struct *task,
     43					void __user *from);
     44extern unsigned long copy_ckvsx_from_user(struct task_struct *task,
     45						 void __user *from);
     46unsigned long copy_fpr_to_user(void __user *to, struct task_struct *task);
     47unsigned long copy_ckfpr_to_user(void __user *to, struct task_struct *task);
     48unsigned long copy_fpr_from_user(struct task_struct *task, void __user *from);
     49unsigned long copy_ckfpr_from_user(struct task_struct *task, void __user *from);
     50
     51#define unsafe_copy_fpr_to_user(to, task, label)	do {		\
     52	struct task_struct *__t = task;					\
     53	u64 __user *buf = (u64 __user *)to;				\
     54	int i;								\
     55									\
     56	for (i = 0; i < ELF_NFPREG - 1 ; i++)				\
     57		unsafe_put_user(__t->thread.TS_FPR(i), &buf[i], label); \
     58	unsafe_put_user(__t->thread.fp_state.fpscr, &buf[i], label);	\
     59} while (0)
     60
     61#define unsafe_copy_vsx_to_user(to, task, label)	do {		\
     62	struct task_struct *__t = task;					\
     63	u64 __user *buf = (u64 __user *)to;				\
     64	int i;								\
     65									\
     66	for (i = 0; i < ELF_NVSRHALFREG ; i++)				\
     67		unsafe_put_user(__t->thread.fp_state.fpr[i][TS_VSRLOWOFFSET], \
     68				&buf[i], label);\
     69} while (0)
     70
     71#define unsafe_copy_fpr_from_user(task, from, label)	do {		\
     72	struct task_struct *__t = task;					\
     73	u64 __user *buf = (u64 __user *)from;				\
     74	int i;								\
     75									\
     76	for (i = 0; i < ELF_NFPREG - 1; i++)				\
     77		unsafe_get_user(__t->thread.TS_FPR(i), &buf[i], label); \
     78	unsafe_get_user(__t->thread.fp_state.fpscr, &buf[i], label);	\
     79} while (0)
     80
     81#define unsafe_copy_vsx_from_user(task, from, label)	do {		\
     82	struct task_struct *__t = task;					\
     83	u64 __user *buf = (u64 __user *)from;				\
     84	int i;								\
     85									\
     86	for (i = 0; i < ELF_NVSRHALFREG ; i++)				\
     87		unsafe_get_user(__t->thread.fp_state.fpr[i][TS_VSRLOWOFFSET], \
     88				&buf[i], label);			\
     89} while (0)
     90
     91#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
     92#define unsafe_copy_ckfpr_to_user(to, task, label)	do {		\
     93	struct task_struct *__t = task;					\
     94	u64 __user *buf = (u64 __user *)to;				\
     95	int i;								\
     96									\
     97	for (i = 0; i < ELF_NFPREG - 1 ; i++)				\
     98		unsafe_put_user(__t->thread.TS_CKFPR(i), &buf[i], label);\
     99	unsafe_put_user(__t->thread.ckfp_state.fpscr, &buf[i], label);	\
    100} while (0)
    101
    102#define unsafe_copy_ckvsx_to_user(to, task, label)	do {		\
    103	struct task_struct *__t = task;					\
    104	u64 __user *buf = (u64 __user *)to;				\
    105	int i;								\
    106									\
    107	for (i = 0; i < ELF_NVSRHALFREG ; i++)				\
    108		unsafe_put_user(__t->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET], \
    109				&buf[i], label);\
    110} while (0)
    111
    112#define unsafe_copy_ckfpr_from_user(task, from, label)	do {		\
    113	struct task_struct *__t = task;					\
    114	u64 __user *buf = (u64 __user *)from;				\
    115	int i;								\
    116									\
    117	for (i = 0; i < ELF_NFPREG - 1 ; i++)				\
    118		unsafe_get_user(__t->thread.TS_CKFPR(i), &buf[i], label);\
    119	unsafe_get_user(__t->thread.ckfp_state.fpscr, &buf[i], failed);	\
    120} while (0)
    121
    122#define unsafe_copy_ckvsx_from_user(task, from, label)	do {		\
    123	struct task_struct *__t = task;					\
    124	u64 __user *buf = (u64 __user *)from;				\
    125	int i;								\
    126									\
    127	for (i = 0; i < ELF_NVSRHALFREG ; i++)				\
    128		unsafe_get_user(__t->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET], \
    129				&buf[i], label);			\
    130} while (0)
    131#endif
    132#elif defined(CONFIG_PPC_FPU_REGS)
    133
    134#define unsafe_copy_fpr_to_user(to, task, label)		\
    135	unsafe_copy_to_user(to, (task)->thread.fp_state.fpr,	\
    136			    ELF_NFPREG * sizeof(double), label)
    137
    138#define unsafe_copy_fpr_from_user(task, from, label)			\
    139	unsafe_copy_from_user((task)->thread.fp_state.fpr, from,	\
    140			    ELF_NFPREG * sizeof(double), label)
    141
    142static inline unsigned long
    143copy_fpr_to_user(void __user *to, struct task_struct *task)
    144{
    145	return __copy_to_user(to, task->thread.fp_state.fpr,
    146			      ELF_NFPREG * sizeof(double));
    147}
    148
    149static inline unsigned long
    150copy_fpr_from_user(struct task_struct *task, void __user *from)
    151{
    152	return __copy_from_user(task->thread.fp_state.fpr, from,
    153			      ELF_NFPREG * sizeof(double));
    154}
    155
    156#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
    157#define unsafe_copy_ckfpr_to_user(to, task, label)		\
    158	unsafe_copy_to_user(to, (task)->thread.ckfp_state.fpr,	\
    159			    ELF_NFPREG * sizeof(double), label)
    160
    161inline unsigned long copy_ckfpr_to_user(void __user *to, struct task_struct *task)
    162{
    163	return __copy_to_user(to, task->thread.ckfp_state.fpr,
    164			      ELF_NFPREG * sizeof(double));
    165}
    166
    167static inline unsigned long
    168copy_ckfpr_from_user(struct task_struct *task, void __user *from)
    169{
    170	return __copy_from_user(task->thread.ckfp_state.fpr, from,
    171				ELF_NFPREG * sizeof(double));
    172}
    173#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
    174#else
    175#define unsafe_copy_fpr_to_user(to, task, label) do { if (0) goto label;} while (0)
    176
    177#define unsafe_copy_fpr_from_user(task, from, label) do { if (0) goto label;} while (0)
    178
    179static inline unsigned long
    180copy_fpr_to_user(void __user *to, struct task_struct *task)
    181{
    182	return 0;
    183}
    184
    185static inline unsigned long
    186copy_fpr_from_user(struct task_struct *task, void __user *from)
    187{
    188	return 0;
    189}
    190#endif
    191
    192#ifdef CONFIG_PPC64
    193
    194extern int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
    195			      struct task_struct *tsk);
    196
    197#else /* CONFIG_PPC64 */
    198
    199extern long sys_rt_sigreturn(void);
    200extern long sys_sigreturn(void);
    201
    202static inline int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
    203				     struct task_struct *tsk)
    204{
    205	return -EFAULT;
    206}
    207
    208#endif /* !defined(CONFIG_PPC64) */
    209
    210void signal_fault(struct task_struct *tsk, struct pt_regs *regs,
    211		  const char *where, void __user *ptr);
    212
    213#endif  /* _POWERPC_ARCH_SIGNAL_H */