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 --- |