Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tile: Use get_signal() signal_setup_done()

Use the more generic functions get_signal() signal_setup_done()
for signal delivery.

Signed-off-by: Richard Weinberger <richard@nod.at>
Acked-by: Chris Metcalf <cmetcalf@tilera.com>

authored by

Richard Weinberger and committed by
Richard Weinberger
b3707c7e b46e8487

+40 -46
+1 -2
arch/tile/include/asm/compat.h
··· 267 267 return current_thread_info()->status & TS_COMPAT; 268 268 } 269 269 270 - extern int compat_setup_rt_frame(int sig, struct k_sigaction *ka, 271 - siginfo_t *info, sigset_t *set, 270 + extern int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set, 272 271 struct pt_regs *regs); 273 272 274 273 /* Compat syscalls. */
+15 -14
arch/tile/kernel/compat_signal.c
··· 190 190 return (void __user *) sp; 191 191 } 192 192 193 - int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, 194 - sigset_t *set, struct pt_regs *regs) 193 + int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set, 194 + struct pt_regs *regs) 195 195 { 196 196 unsigned long restorer; 197 197 struct compat_rt_sigframe __user *frame; 198 - int err = 0; 198 + int err = 0, sig = ksig->sig; 199 199 int usig; 200 200 201 - frame = compat_get_sigframe(ka, regs, sizeof(*frame)); 201 + frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame)); 202 202 203 203 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 204 - goto give_sigsegv; 204 + goto err; 205 205 206 206 usig = current_thread_info()->exec_domain 207 207 && current_thread_info()->exec_domain->signal_invmap ··· 210 210 : sig; 211 211 212 212 /* Always write at least the signal number for the stack backtracer. */ 213 - if (ka->sa.sa_flags & SA_SIGINFO) { 213 + if (ksig->ka.sa.sa_flags & SA_SIGINFO) { 214 214 /* At sigreturn time, restore the callee-save registers too. */ 215 - err |= copy_siginfo_to_user32(&frame->info, info); 215 + err |= copy_siginfo_to_user32(&frame->info, &ksig->info); 216 216 regs->flags |= PT_FLAGS_RESTORE_REGS; 217 217 } else { 218 - err |= __put_user(info->si_signo, &frame->info.si_signo); 218 + err |= __put_user(ksig->info.si_signo, &frame->info.si_signo); 219 219 } 220 220 221 221 /* Create the ucontext. */ ··· 226 226 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); 227 227 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); 228 228 if (err) 229 - goto give_sigsegv; 229 + goto err; 230 230 231 231 restorer = VDSO_SYM(&__vdso_rt_sigreturn); 232 - if (ka->sa.sa_flags & SA_RESTORER) 233 - restorer = ptr_to_compat_reg(ka->sa.sa_restorer); 232 + if (ksig->ka.sa.sa_flags & SA_RESTORER) 233 + restorer = ptr_to_compat_reg(ksig->ka.sa.sa_restorer); 234 234 235 235 /* 236 236 * Set up registers for signal handler. ··· 239 239 * We always pass siginfo and mcontext, regardless of SA_SIGINFO, 240 240 * since some things rely on this (e.g. glibc's debug/segfault.c). 241 241 */ 242 - regs->pc = ptr_to_compat_reg(ka->sa.sa_handler); 242 + regs->pc = ptr_to_compat_reg(ksig->ka.sa.sa_handler); 243 243 regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */ 244 244 regs->sp = ptr_to_compat_reg(frame); 245 245 regs->lr = restorer; ··· 249 249 regs->flags |= PT_FLAGS_CALLER_SAVES; 250 250 return 0; 251 251 252 - give_sigsegv: 253 - signal_fault("bad setup frame", regs, frame, sig); 252 + err: 253 + trace_unhandled_signal("bad sigreturn frame", regs, 254 + (unsigned long)frame, SIGSEGV); 254 255 return -EFAULT; 255 256 }
+24 -30
arch/tile/kernel/signal.c
··· 153 153 return (void __user *) sp; 154 154 } 155 155 156 - static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, 157 - sigset_t *set, struct pt_regs *regs) 156 + static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, 157 + struct pt_regs *regs) 158 158 { 159 159 unsigned long restorer; 160 160 struct rt_sigframe __user *frame; 161 - int err = 0; 161 + int err = 0, sig = ksig->sig; 162 162 int usig; 163 163 164 - frame = get_sigframe(ka, regs, sizeof(*frame)); 164 + frame = get_sigframe(&ksig->ka, regs, sizeof(*frame)); 165 165 166 166 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 167 - goto give_sigsegv; 167 + goto err; 168 168 169 169 usig = current_thread_info()->exec_domain 170 170 && current_thread_info()->exec_domain->signal_invmap ··· 173 173 : sig; 174 174 175 175 /* Always write at least the signal number for the stack backtracer. */ 176 - if (ka->sa.sa_flags & SA_SIGINFO) { 176 + if (ksig->ka.sa.sa_flags & SA_SIGINFO) { 177 177 /* At sigreturn time, restore the callee-save registers too. */ 178 - err |= copy_siginfo_to_user(&frame->info, info); 178 + err |= copy_siginfo_to_user(&frame->info, &ksig->info); 179 179 regs->flags |= PT_FLAGS_RESTORE_REGS; 180 180 } else { 181 - err |= __put_user(info->si_signo, &frame->info.si_signo); 181 + err |= __put_user(ksig->info.si_signo, &frame->info.si_signo); 182 182 } 183 183 184 184 /* Create the ucontext. */ ··· 189 189 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); 190 190 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); 191 191 if (err) 192 - goto give_sigsegv; 192 + goto err; 193 193 194 194 restorer = VDSO_SYM(&__vdso_rt_sigreturn); 195 - if (ka->sa.sa_flags & SA_RESTORER) 196 - restorer = (unsigned long) ka->sa.sa_restorer; 195 + if (ksig->ka.sa.sa_flags & SA_RESTORER) 196 + restorer = (unsigned long) ksig->ka.sa.sa_restorer; 197 197 198 198 /* 199 199 * Set up registers for signal handler. ··· 202 202 * We always pass siginfo and mcontext, regardless of SA_SIGINFO, 203 203 * since some things rely on this (e.g. glibc's debug/segfault.c). 204 204 */ 205 - regs->pc = (unsigned long) ka->sa.sa_handler; 205 + regs->pc = (unsigned long) ksig->ka.sa.sa_handler; 206 206 regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */ 207 207 regs->sp = (unsigned long) frame; 208 208 regs->lr = restorer; ··· 212 212 regs->flags |= PT_FLAGS_CALLER_SAVES; 213 213 return 0; 214 214 215 - give_sigsegv: 216 - signal_fault("bad setup frame", regs, frame, sig); 215 + err: 216 + trace_unhandled_signal("bad sigreturn frame", regs, 217 + (unsigned long)frame, SIGSEGV); 217 218 return -EFAULT; 218 219 } 219 220 ··· 222 221 * OK, we're invoking a handler 223 222 */ 224 223 225 - static void handle_signal(unsigned long sig, siginfo_t *info, 226 - struct k_sigaction *ka, 227 - struct pt_regs *regs) 224 + static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) 228 225 { 229 226 sigset_t *oldset = sigmask_to_save(); 230 227 int ret; ··· 237 238 break; 238 239 239 240 case -ERESTARTSYS: 240 - if (!(ka->sa.sa_flags & SA_RESTART)) { 241 + if (!(ksig->ka.sa.sa_flags & SA_RESTART)) { 241 242 regs->regs[0] = -EINTR; 242 243 break; 243 244 } ··· 253 254 /* Set up the stack frame */ 254 255 #ifdef CONFIG_COMPAT 255 256 if (is_compat_task()) 256 - ret = compat_setup_rt_frame(sig, ka, info, oldset, regs); 257 + ret = compat_setup_rt_frame(ksig, oldset, regs); 257 258 else 258 259 #endif 259 - ret = setup_rt_frame(sig, ka, info, oldset, regs); 260 - if (ret) 261 - return; 262 - signal_delivered(sig, info, ka, regs, 263 - test_thread_flag(TIF_SINGLESTEP)); 260 + ret = setup_rt_frame(ksig, oldset, regs); 261 + 262 + signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP)); 264 263 } 265 264 266 265 /* ··· 268 271 */ 269 272 void do_signal(struct pt_regs *regs) 270 273 { 271 - siginfo_t info; 272 - int signr; 273 - struct k_sigaction ka; 274 + struct ksignal ksig; 274 275 275 276 /* 276 277 * i386 will check if we're coming from kernel mode and bail out ··· 277 282 * helpful, we can reinstate the check on "!user_mode(regs)". 278 283 */ 279 284 280 - signr = get_signal_to_deliver(&info, &ka, regs, NULL); 281 - if (signr > 0) { 285 + if (get_signal(&ksig)) { 282 286 /* Whee! Actually deliver the signal. */ 283 - handle_signal(signr, &info, &ka, regs); 287 + handle_signal(&ksig, regs); 284 288 goto done; 285 289 } 286 290