ptrace.c (e258d719ff28ecc7a048eb8f78380e68c4b3a3f0) ptrace.c (4725c86055f5bbdcdfe47199c0715881893a2c79)
1/*
2 * Ptrace user space interface.
3 *
4 * Copyright IBM Corp. 1999, 2010
5 * Author(s): Denis Joseph Barrow
6 * Martin Schwidefsky (schwidefsky@de.ibm.com)
7 */
8

--- 225 unchanged lines hidden (view full) ---

234
235 } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
236 /*
237 * floating point regs. are stored in the thread structure
238 */
239 offset = addr - (addr_t) &dummy->regs.fp_regs;
240 tmp = *(addr_t *)((addr_t) &child->thread.fp_regs + offset);
241 if (addr == (addr_t) &dummy->regs.fp_regs.fpc)
1/*
2 * Ptrace user space interface.
3 *
4 * Copyright IBM Corp. 1999, 2010
5 * Author(s): Denis Joseph Barrow
6 * Martin Schwidefsky (schwidefsky@de.ibm.com)
7 */
8

--- 225 unchanged lines hidden (view full) ---

234
235 } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
236 /*
237 * floating point regs. are stored in the thread structure
238 */
239 offset = addr - (addr_t) &dummy->regs.fp_regs;
240 tmp = *(addr_t *)((addr_t) &child->thread.fp_regs + offset);
241 if (addr == (addr_t) &dummy->regs.fp_regs.fpc)
242 tmp &= (unsigned long) FPC_VALID_MASK
243 << (BITS_PER_LONG - 32);
242 tmp <<= BITS_PER_LONG - 32;
244
245 } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
246 /*
247 * Handle access to the per_info structure.
248 */
249 addr -= (addr_t) &dummy->regs.per_info;
250 tmp = __peek_user_per(child, addr);
251

--- 106 unchanged lines hidden (view full) ---

358 * orig_gpr2 and fp_regs on s390.
359 */
360 return 0;
361
362 } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
363 /*
364 * floating point regs. are stored in the thread structure
365 */
243
244 } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
245 /*
246 * Handle access to the per_info structure.
247 */
248 addr -= (addr_t) &dummy->regs.per_info;
249 tmp = __peek_user_per(child, addr);
250

--- 106 unchanged lines hidden (view full) ---

357 * orig_gpr2 and fp_regs on s390.
358 */
359 return 0;
360
361 } else if (addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
362 /*
363 * floating point regs. are stored in the thread structure
364 */
366 if (addr == (addr_t) &dummy->regs.fp_regs.fpc &&
367 (data & ~((unsigned long) FPC_VALID_MASK
368 << (BITS_PER_LONG - 32))) != 0)
369 return -EINVAL;
365 if (addr == (addr_t) &dummy->regs.fp_regs.fpc)
366 if ((unsigned int) data != 0 ||
367 test_fp_ctl(data >> (BITS_PER_LONG - 32)))
368 return -EINVAL;
370 offset = addr - (addr_t) &dummy->regs.fp_regs;
371 *(addr_t *)((addr_t) &child->thread.fp_regs + offset) = data;
372
373 } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
374 /*
375 * Handle access to the per_info structure.
376 */
377 addr -= (addr_t) &dummy->regs.per_info;

--- 313 unchanged lines hidden (view full) ---

691 */
692 return 0;
693
694 } else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
695 /*
696 * floating point regs. are stored in the thread structure
697 */
698 if (addr == (addr_t) &dummy32->regs.fp_regs.fpc &&
369 offset = addr - (addr_t) &dummy->regs.fp_regs;
370 *(addr_t *)((addr_t) &child->thread.fp_regs + offset) = data;
371
372 } else if (addr < (addr_t) (&dummy->regs.per_info + 1)) {
373 /*
374 * Handle access to the per_info structure.
375 */
376 addr -= (addr_t) &dummy->regs.per_info;

--- 313 unchanged lines hidden (view full) ---

690 */
691 return 0;
692
693 } else if (addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
694 /*
695 * floating point regs. are stored in the thread structure
696 */
697 if (addr == (addr_t) &dummy32->regs.fp_regs.fpc &&
699 (tmp & ~FPC_VALID_MASK) != 0)
700 /* Invalid floating point control. */
698 test_fp_ctl(tmp))
701 return -EINVAL;
702 offset = addr - (addr_t) &dummy32->regs.fp_regs;
703 *(__u32 *)((addr_t) &child->thread.fp_regs + offset) = tmp;
704
705 } else if (addr < (addr_t) (&dummy32->regs.per_info + 1)) {
706 /*
707 * Handle access to the per_info structure.
708 */

--- 181 unchanged lines hidden (view full) ---

890
891 return rc;
892}
893
894static int s390_fpregs_get(struct task_struct *target,
895 const struct user_regset *regset, unsigned int pos,
896 unsigned int count, void *kbuf, void __user *ubuf)
897{
699 return -EINVAL;
700 offset = addr - (addr_t) &dummy32->regs.fp_regs;
701 *(__u32 *)((addr_t) &child->thread.fp_regs + offset) = tmp;
702
703 } else if (addr < (addr_t) (&dummy32->regs.per_info + 1)) {
704 /*
705 * Handle access to the per_info structure.
706 */

--- 181 unchanged lines hidden (view full) ---

888
889 return rc;
890}
891
892static int s390_fpregs_get(struct task_struct *target,
893 const struct user_regset *regset, unsigned int pos,
894 unsigned int count, void *kbuf, void __user *ubuf)
895{
898 if (target == current)
899 save_fp_regs(&target->thread.fp_regs);
896 if (target == current) {
897 save_fp_ctl(&target->thread.fp_regs.fpc);
898 save_fp_regs(target->thread.fp_regs.fprs);
899 }
900
901 return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
902 &target->thread.fp_regs, 0, -1);
903}
904
905static int s390_fpregs_set(struct task_struct *target,
906 const struct user_regset *regset, unsigned int pos,
907 unsigned int count, const void *kbuf,
908 const void __user *ubuf)
909{
910 int rc = 0;
911
900
901 return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
902 &target->thread.fp_regs, 0, -1);
903}
904
905static int s390_fpregs_set(struct task_struct *target,
906 const struct user_regset *regset, unsigned int pos,
907 unsigned int count, const void *kbuf,
908 const void __user *ubuf)
909{
910 int rc = 0;
911
912 if (target == current)
913 save_fp_regs(&target->thread.fp_regs);
912 if (target == current) {
913 save_fp_ctl(&target->thread.fp_regs.fpc);
914 save_fp_regs(target->thread.fp_regs.fprs);
915 }
914
915 /* If setting FPC, must validate it first. */
916 if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) {
916
917 /* If setting FPC, must validate it first. */
918 if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) {
917 u32 fpc[2] = { target->thread.fp_regs.fpc, 0 };
918 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &fpc,
919 u32 ufpc[2] = { target->thread.fp_regs.fpc, 0 };
920 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ufpc,
919 0, offsetof(s390_fp_regs, fprs));
920 if (rc)
921 return rc;
921 0, offsetof(s390_fp_regs, fprs));
922 if (rc)
923 return rc;
922 if ((fpc[0] & ~FPC_VALID_MASK) != 0 || fpc[1] != 0)
924 if (ufpc[1] != 0 || test_fp_ctl(ufpc[0]))
923 return -EINVAL;
925 return -EINVAL;
924 target->thread.fp_regs.fpc = fpc[0];
926 target->thread.fp_regs.fpc = ufpc[0];
925 }
926
927 if (rc == 0 && count > 0)
928 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
929 target->thread.fp_regs.fprs,
930 offsetof(s390_fp_regs, fprs), -1);
931
927 }
928
929 if (rc == 0 && count > 0)
930 rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
931 target->thread.fp_regs.fprs,
932 offsetof(s390_fp_regs, fprs), -1);
933
932 if (rc == 0 && target == current)
933 restore_fp_regs(&target->thread.fp_regs);
934 if (rc == 0 && target == current) {
935 restore_fp_ctl(&target->thread.fp_regs.fpc);
936 restore_fp_regs(target->thread.fp_regs.fprs);
937 }
934
935 return rc;
936}
937
938#ifdef CONFIG_64BIT
939
940static int s390_last_break_get(struct task_struct *target,
941 const struct user_regset *regset,

--- 399 unchanged lines hidden ---
938
939 return rc;
940}
941
942#ifdef CONFIG_64BIT
943
944static int s390_last_break_get(struct task_struct *target,
945 const struct user_regset *regset,

--- 399 unchanged lines hidden ---