2 * Copyright (c) 2007 Benjamin Herrenschmidt, IBM Corporation
3 * Extracted from signal_32.c and signal_64.c
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.
10 #ifndef _POWERPC_ARCH_SIGNAL_H
11 #define _POWERPC_ARCH_SIGNAL_H
13 void __user *get_sigframe(struct ksignal *ksig, struct task_struct *tsk,
14 size_t frame_size, int is_32);
16 extern int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
17 struct task_struct *tsk);
19 extern int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
20 struct task_struct *tsk);
22 static inline int __get_user_sigset(sigset_t *dst, const sigset_t __user *src)
24 BUILD_BUG_ON(sizeof(sigset_t) != sizeof(u64));
26 return __get_user(dst->sig[0], (u64 __user *)&src->sig[0]);
28 #define unsafe_get_user_sigset(dst, src, label) \
29 unsafe_get_user((dst)->sig[0], (u64 __user *)&(src)->sig[0], label)
32 extern unsigned long copy_vsx_to_user(void __user *to,
33 struct task_struct *task);
34 extern unsigned long copy_ckvsx_to_user(void __user *to,
35 struct task_struct *task);
36 extern unsigned long copy_vsx_from_user(struct task_struct *task,
38 extern unsigned long copy_ckvsx_from_user(struct task_struct *task,
40 unsigned long copy_fpr_to_user(void __user *to, struct task_struct *task);
41 unsigned long copy_ckfpr_to_user(void __user *to, struct task_struct *task);
42 unsigned long copy_fpr_from_user(struct task_struct *task, void __user *from);
43 unsigned long copy_ckfpr_from_user(struct task_struct *task, void __user *from);
45 #define unsafe_copy_fpr_to_user(to, task, label) do { \
46 struct task_struct *__t = task; \
47 u64 __user *buf = (u64 __user *)to; \
50 for (i = 0; i < ELF_NFPREG - 1 ; i++) \
51 unsafe_put_user(__t->thread.TS_FPR(i), &buf[i], label); \
52 unsafe_put_user(__t->thread.fp_state.fpscr, &buf[i], label); \
55 #define unsafe_copy_vsx_to_user(to, task, label) do { \
56 struct task_struct *__t = task; \
57 u64 __user *buf = (u64 __user *)to; \
60 for (i = 0; i < ELF_NVSRHALFREG ; i++) \
61 unsafe_put_user(__t->thread.fp_state.fpr[i][TS_VSRLOWOFFSET], \
65 #define unsafe_copy_fpr_from_user(task, from, label) do { \
66 struct task_struct *__t = task; \
67 u64 __user *buf = (u64 __user *)from; \
70 for (i = 0; i < ELF_NFPREG - 1; i++) \
71 unsafe_get_user(__t->thread.TS_FPR(i), &buf[i], label); \
72 unsafe_get_user(__t->thread.fp_state.fpscr, &buf[i], label); \
75 #define unsafe_copy_vsx_from_user(task, from, label) do { \
76 struct task_struct *__t = task; \
77 u64 __user *buf = (u64 __user *)from; \
80 for (i = 0; i < ELF_NVSRHALFREG ; i++) \
81 unsafe_get_user(__t->thread.fp_state.fpr[i][TS_VSRLOWOFFSET], \
85 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
86 #define unsafe_copy_ckfpr_to_user(to, task, label) do { \
87 struct task_struct *__t = task; \
88 u64 __user *buf = (u64 __user *)to; \
91 for (i = 0; i < ELF_NFPREG - 1 ; i++) \
92 unsafe_put_user(__t->thread.TS_CKFPR(i), &buf[i], label);\
93 unsafe_put_user(__t->thread.ckfp_state.fpscr, &buf[i], label); \
96 #define unsafe_copy_ckvsx_to_user(to, task, label) do { \
97 struct task_struct *__t = task; \
98 u64 __user *buf = (u64 __user *)to; \
101 for (i = 0; i < ELF_NVSRHALFREG ; i++) \
102 unsafe_put_user(__t->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET], \
106 #define unsafe_copy_ckfpr_from_user(task, from, label) do { \
107 struct task_struct *__t = task; \
108 u64 __user *buf = (u64 __user *)from; \
111 for (i = 0; i < ELF_NFPREG - 1 ; i++) \
112 unsafe_get_user(__t->thread.TS_CKFPR(i), &buf[i], label);\
113 unsafe_get_user(__t->thread.ckfp_state.fpscr, &buf[i], failed); \
116 #define unsafe_copy_ckvsx_from_user(task, from, label) do { \
117 struct task_struct *__t = task; \
118 u64 __user *buf = (u64 __user *)from; \
121 for (i = 0; i < ELF_NVSRHALFREG ; i++) \
122 unsafe_get_user(__t->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET], \
126 #elif defined(CONFIG_PPC_FPU_REGS)
128 #define unsafe_copy_fpr_to_user(to, task, label) \
129 unsafe_copy_to_user(to, (task)->thread.fp_state.fpr, \
130 ELF_NFPREG * sizeof(double), label)
132 #define unsafe_copy_fpr_from_user(task, from, label) \
133 unsafe_copy_from_user((task)->thread.fp_state.fpr, from, \
134 ELF_NFPREG * sizeof(double), label)
136 static inline unsigned long
137 copy_fpr_to_user(void __user *to, struct task_struct *task)
139 return __copy_to_user(to, task->thread.fp_state.fpr,
140 ELF_NFPREG * sizeof(double));
143 static inline unsigned long
144 copy_fpr_from_user(struct task_struct *task, void __user *from)
146 return __copy_from_user(task->thread.fp_state.fpr, from,
147 ELF_NFPREG * sizeof(double));
150 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
151 #define unsafe_copy_ckfpr_to_user(to, task, label) \
152 unsafe_copy_to_user(to, (task)->thread.ckfp_state.fpr, \
153 ELF_NFPREG * sizeof(double), label)
155 inline unsigned long copy_ckfpr_to_user(void __user *to, struct task_struct *task)
157 return __copy_to_user(to, task->thread.ckfp_state.fpr,
158 ELF_NFPREG * sizeof(double));
161 static inline unsigned long
162 copy_ckfpr_from_user(struct task_struct *task, void __user *from)
164 return __copy_from_user(task->thread.ckfp_state.fpr, from,
165 ELF_NFPREG * sizeof(double));
167 #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
169 #define unsafe_copy_fpr_to_user(to, task, label) do { if (0) goto label;} while (0)
171 #define unsafe_copy_fpr_from_user(task, from, label) do { if (0) goto label;} while (0)
173 static inline unsigned long
174 copy_fpr_to_user(void __user *to, struct task_struct *task)
179 static inline unsigned long
180 copy_fpr_from_user(struct task_struct *task, void __user *from)
188 extern int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
189 struct task_struct *tsk);
191 #else /* CONFIG_PPC64 */
193 extern long sys_rt_sigreturn(void);
194 extern long sys_sigreturn(void);
196 static inline int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
197 struct task_struct *tsk)
202 #endif /* !defined(CONFIG_PPC64) */
204 void signal_fault(struct task_struct *tsk, struct pt_regs *regs,
205 const char *where, void __user *ptr);
207 #endif /* _POWERPC_ARCH_SIGNAL_H */