aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2014-03-05 07:31:20 -0500
committerRichard Weinberger <richard@sigma-star.at>2014-08-06 07:03:45 -0400
commit38a7be3c280bb9f9c4c892cf5ff51c847e959cf1 (patch)
treea50c1b3486c3adac679682a602cba944f7b6c388
parent5290dd79c0219fd2b90784d66a54d00880a21520 (diff)
arm64: Use sigsp()
Use sigsp() instead of the open coded variant. Signed-off-by: Richard Weinberger <richard@nod.at>
-rw-r--r--arch/arm64/kernel/signal.c12
-rw-r--r--arch/arm64/kernel/signal32.c14
2 files changed, 7 insertions, 19 deletions
diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
index b29f5dab77ae..6fa792137eda 100644
--- a/arch/arm64/kernel/signal.c
+++ b/arch/arm64/kernel/signal.c
@@ -209,19 +209,13 @@ static int setup_sigframe(struct rt_sigframe __user *sf,
209 return err; 209 return err;
210} 210}
211 211
212static struct rt_sigframe __user *get_sigframe(struct k_sigaction *ka, 212static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig,
213 struct pt_regs *regs) 213 struct pt_regs *regs)
214{ 214{
215 unsigned long sp, sp_top; 215 unsigned long sp, sp_top;
216 struct rt_sigframe __user *frame; 216 struct rt_sigframe __user *frame;
217 217
218 sp = sp_top = regs->sp; 218 sp = sp_top = sigsp(regs->sp, ksig);
219
220 /*
221 * This is the X/Open sanctioned signal stack switching.
222 */
223 if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
224 sp = sp_top = current->sas_ss_sp + current->sas_ss_size;
225 219
226 sp = (sp - sizeof(struct rt_sigframe)) & ~15; 220 sp = (sp - sizeof(struct rt_sigframe)) & ~15;
227 frame = (struct rt_sigframe __user *)sp; 221 frame = (struct rt_sigframe __user *)sp;
@@ -259,7 +253,7 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
259 struct rt_sigframe __user *frame; 253 struct rt_sigframe __user *frame;
260 int err = 0; 254 int err = 0;
261 255
262 frame = get_sigframe(&ksig->ka, regs); 256 frame = get_sigframe(ksig, regs);
263 if (!frame) 257 if (!frame)
264 return 1; 258 return 1;
265 259
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
index b69ee6921c48..1a5c5bfa8ea4 100644
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -407,20 +407,14 @@ badframe:
407 return 0; 407 return 0;
408} 408}
409 409
410static void __user *compat_get_sigframe(struct k_sigaction *ka, 410static void __user *compat_get_sigframe(struct ksignal *ksig,
411 struct pt_regs *regs, 411 struct pt_regs *regs,
412 int framesize) 412 int framesize)
413{ 413{
414 compat_ulong_t sp = regs->compat_sp; 414 compat_ulong_t sp = sigsp(regs->compat_sp, ksig);
415 void __user *frame; 415 void __user *frame;
416 416
417 /* 417 /*
418 * This is the X/Open sanctioned signal stack switching.
419 */
420 if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
421 sp = current->sas_ss_sp + current->sas_ss_size;
422
423 /*
424 * ATPCS B01 mandates 8-byte alignment 418 * ATPCS B01 mandates 8-byte alignment
425 */ 419 */
426 frame = compat_ptr((compat_uptr_t)((sp - framesize) & ~7)); 420 frame = compat_ptr((compat_uptr_t)((sp - framesize) & ~7));
@@ -526,7 +520,7 @@ int compat_setup_rt_frame(int usig, struct ksignal *ksig,
526 struct compat_rt_sigframe __user *frame; 520 struct compat_rt_sigframe __user *frame;
527 int err = 0; 521 int err = 0;
528 522
529 frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame)); 523 frame = compat_get_sigframe(ksig, regs, sizeof(*frame));
530 524
531 if (!frame) 525 if (!frame)
532 return 1; 526 return 1;
@@ -555,7 +549,7 @@ int compat_setup_frame(int usig, struct ksignal *ksig, sigset_t *set,
555 struct compat_sigframe __user *frame; 549 struct compat_sigframe __user *frame;
556 int err = 0; 550 int err = 0;
557 551
558 frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame)); 552 frame = compat_get_sigframe(ksig, regs, sizeof(*frame));
559 553
560 if (!frame) 554 if (!frame)
561 return 1; 555 return 1;