Lines Matching +full:ri +full:- +full:override
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 1999-2005 Hewlett-Packard Co
6 * David Mosberger-Tang <davidm@hpl.hp.com>
8 * 2006-08-12 - IA64 Native Utrace implementation support added by
42 * ri (restart instruction; two bits)
48 #define MASK(nbits) ((1UL << (nbits)) - 1) /* mask with NBITS bits set */
60 /* Return TRUE if PT was created due to kernel-entry via a system-call. */
65 return (long) pt->cr_ifs >= 0; in in_syscall()
69 * Collect the NaT bits for r1-r31 from scratch_unat and return a NaT
77 unsigned long bit = ia64_unat_pos(&pt->r##first); \ in ia64_get_scratch_nat_bits()
78 unsigned long nbits = (last - first + 1); \ in ia64_get_scratch_nat_bits()
82 dist = 64 + bit - first; \ in ia64_get_scratch_nat_bits()
84 dist = bit - first; \ in ia64_get_scratch_nat_bits()
116 unsigned long bit = ia64_unat_pos(&pt->r##first); \ in ia64_put_scratch_nat_bits()
117 unsigned long nbits = (last - first + 1); \ in ia64_put_scratch_nat_bits()
121 dist = 64 + bit - first; \ in ia64_put_scratch_nat_bits()
123 dist = bit - first; \ in ia64_put_scratch_nat_bits()
152 unsigned long w0, ri = ia64_psr(regs)->ri + 1; in ia64_increment_ip() local
154 if (ri > 2) { in ia64_increment_ip()
155 ri = 0; in ia64_increment_ip()
156 regs->cr_iip += 16; in ia64_increment_ip()
157 } else if (ri == 2) { in ia64_increment_ip()
158 get_user(w0, (char __user *) regs->cr_iip + 0); in ia64_increment_ip()
165 ri = 0; in ia64_increment_ip()
166 regs->cr_iip += 16; in ia64_increment_ip()
169 ia64_psr(regs)->ri = ri; in ia64_increment_ip()
175 unsigned long w0, ri = ia64_psr(regs)->ri - 1; in ia64_decrement_ip() local
177 if (ia64_psr(regs)->ri == 0) { in ia64_decrement_ip()
178 regs->cr_iip -= 16; in ia64_decrement_ip()
179 ri = 2; in ia64_decrement_ip()
180 get_user(w0, (char __user *) regs->cr_iip + 0); in ia64_decrement_ip()
187 ri = 1; in ia64_decrement_ip()
190 ia64_psr(regs)->ri = ri; in ia64_decrement_ip()
203 * +--------+ <-- lowest address
205 * +--------+
207 * +--------+
209 * +--------+ |
210 * | slot01 | > child_regs->ar_rnat
211 * +--------+ |
213 * +--------+ +--------+
214 * <- child_regs->ar_bspstore | slot61 | <-- krbs
215 * +- - - - + +--------+
217 * +- - - - + +--------+
219 * +- - - - + +--------+
221 * +- - - - + +--------+
223 * +--------+
225 * +--------+ |
226 * | slot01 | > child_stack->ar_rnat
227 * +--------+ |
229 * +--------+
230 * <--- child_stack->ar_bspstore
242 * merged in from pt->ar_rnat.
245 * backing store, rnat0/rnat1 gets its value from sw->ar_rnat.
259 kbsp = (unsigned long *) sw->ar_bspstore; in get_rnat()
260 ubspstore = (unsigned long *) pt->ar_bspstore; in get_rnat()
263 nbits = ia64_rse_num_regs(urnat_addr - 63, urbs_end); in get_rnat()
268 * First, figure out which bit number slot 0 in user-land maps in get_rnat()
277 rnat0_kaddr = rnat1_kaddr - 64; in get_rnat()
280 /* some bits need to be merged in from pt->ar_rnat */ in get_rnat()
282 urnat = (pt->ar_rnat & umask); in get_rnat()
290 rnat0 = sw->ar_rnat; in get_rnat()
295 m = mask >> (63 - shift); in get_rnat()
297 rnat1 = sw->ar_rnat; in get_rnat()
300 urnat |= (rnat1 & m) << (63 - shift); in get_rnat()
319 kbsp = (unsigned long *) sw->ar_bspstore; in put_rnat()
320 ubspstore = (unsigned long *) pt->ar_bspstore; in put_rnat()
328 cfm = pt->cr_ifs; in put_rnat()
329 urbs_kargs = ia64_rse_skip_regs(urbs_end, -(cfm & 0x7f)); in put_rnat()
335 if ((urnat_addr - 63) >= urbs_kargs) in put_rnat()
337 nbits = ia64_rse_num_regs(urnat_addr - 63, urbs_kargs); in put_rnat()
342 * First, figure out which bit number slot 0 in user-land maps in put_rnat()
351 rnat0_kaddr = rnat1_kaddr - 64; in put_rnat()
354 /* some bits need to be place in pt->ar_rnat: */ in put_rnat()
356 pt->ar_rnat = (pt->ar_rnat & ~umask) | (urnat & umask); in put_rnat()
368 sw->ar_rnat = (sw->ar_rnat & ~m) | (rnat0 & m); in put_rnat()
372 rnat1 = (urnat >> (63 - shift)); in put_rnat()
373 m = mask >> (63 - shift); in put_rnat()
375 sw->ar_rnat = (sw->ar_rnat & ~m) | (rnat1 & m); in put_rnat()
390 * Read a word from the user-level backing store of task CHILD. ADDR
391 * is the user-level address to read the word from, VAL a pointer to
392 * the return value, and USER_BSP gives the end of the user-level
412 bspstore = (unsigned long *) child_regs->ar_bspstore; in ia64_peek()
438 * IA-64 implementations, we return zero in in ia64_peek()
457 return -EIO; in ia64_peek()
472 bspstore = (unsigned long *) child_regs->ar_bspstore; in ia64_poke()
494 return -EIO; in ia64_poke()
499 * Calculate the address of the end of the user-level register backing
510 unsigned long *krbs, *bspstore, cfm = pt->cr_ifs; in ia64_get_user_rbs_end()
514 bspstore = (unsigned long *) pt->ar_bspstore; in ia64_get_user_rbs_end()
515 ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19)); in ia64_get_user_rbs_end()
531 * USER_RBS_END is the user-level address at which the backing store
549 return -EIO; in ia64_sync_user_rbs()
566 return -EIO; in ia64_sync_kernel_rbs()
586 pt = task_pt_regs(info->task); in do_sync_rbs()
587 urbs_end = ia64_get_user_rbs_end(info->task, pt, NULL); in do_sync_rbs()
589 fn(info->task, info->sw, pt->ar_bspstore, urbs_end); in do_sync_rbs()
595 * to override user stack (user space's RSE is newer than kernel's in the
642 if (child->sighand) { in ptrace_attach_sync_user_rbs()
643 spin_lock_irq(&child->sighand->siglock); in ptrace_attach_sync_user_rbs()
644 if (child->state == TASK_STOPPED && in ptrace_attach_sync_user_rbs()
648 child->state = TASK_TRACED; in ptrace_attach_sync_user_rbs()
651 spin_unlock_irq(&child->sighand->siglock); in ptrace_attach_sync_user_rbs()
666 if (child->sighand) { in ptrace_attach_sync_user_rbs()
667 spin_lock_irq(&child->sighand->siglock); in ptrace_attach_sync_user_rbs()
668 if (child->state == TASK_TRACED && in ptrace_attach_sync_user_rbs()
669 (child->signal->flags & SIGNAL_STOP_STOPPED)) { in ptrace_attach_sync_user_rbs()
670 child->state = TASK_STOPPED; in ptrace_attach_sync_user_rbs()
672 spin_unlock_irq(&child->sighand->siglock); in ptrace_attach_sync_user_rbs()
678 * Write f32-f127 back to task->thread.fph if it has been modified.
690 if (ia64_is_local_fpu_owner(task) && psr->mfh) { in ia64_flush_fph()
691 psr->mfh = 0; in ia64_flush_fph()
692 task->thread.flags |= IA64_THREAD_FPH_VALID; in ia64_flush_fph()
693 ia64_save_fpu(&task->thread.fph[0]); in ia64_flush_fph()
700 * through thread.fph. If necessary, f32-f127 are written back to
702 * is cleared to zeroes. Also, access to f32-f127 is disabled to
712 if (!(task->thread.flags & IA64_THREAD_FPH_VALID)) { in ia64_sync_fph()
713 task->thread.flags |= IA64_THREAD_FPH_VALID; in ia64_sync_fph()
714 memset(&task->thread.fph, 0, sizeof(task->thread.fph)); in ia64_sync_fph()
717 psr->dfh = 1; in ia64_sync_fph()
721 * Change the machine-state of CHILD such that it will return via the normal
722 * kernel exit-path, rather than the syscall-exit path.
738 if ((long)((unsigned long)child + IA64_STK_OFFSET - sp) in convert_to_non_syscall()
767 pt->cr_ifs = (1UL << 63) | cfm; in convert_to_non_syscall()
769 * Clear the memory that is NOT written on syscall-entry to in convert_to_non_syscall()
770 * ensure we do not leak kernel-state to user when execution in convert_to_non_syscall()
773 pt->r2 = 0; in convert_to_non_syscall()
774 pt->r3 = 0; in convert_to_non_syscall()
775 pt->r14 = 0; in convert_to_non_syscall()
776 memset(&pt->r16, 0, 16*8); /* clear r16-r31 */ in convert_to_non_syscall()
777 memset(&pt->f6, 0, 6*16); /* clear f6-f11 */ in convert_to_non_syscall()
778 pt->b7 = 0; in convert_to_non_syscall()
779 pt->ar_ccv = 0; in convert_to_non_syscall()
780 pt->ar_csd = 0; in convert_to_non_syscall()
781 pt->ar_ssd = 0; in convert_to_non_syscall()
797 return -1; in access_nat_bits()
807 return -1; in access_nat_bits()
836 return -EIO; in ptrace_getregs()
839 sw = (struct switch_stack *) (child->thread.ksp + 16); in ptrace_getregs()
842 return -EIO; in ptrace_getregs()
847 return -EIO; in ptrace_getregs()
857 return -EIO; in ptrace_getregs()
861 retval |= __put_user(pt->cr_iip, &ppr->cr_iip); in ptrace_getregs()
862 retval |= __put_user(psr, &ppr->cr_ipsr); in ptrace_getregs()
866 retval |= __put_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); in ptrace_getregs()
867 retval |= __put_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]); in ptrace_getregs()
868 retval |= __put_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); in ptrace_getregs()
869 retval |= __put_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); in ptrace_getregs()
870 retval |= __put_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); in ptrace_getregs()
871 retval |= __put_user(pt->ar_fpsr, &ppr->ar[PT_AUR_FPSR]); in ptrace_getregs()
873 retval |= __put_user(ec, &ppr->ar[PT_AUR_EC]); in ptrace_getregs()
874 retval |= __put_user(lc, &ppr->ar[PT_AUR_LC]); in ptrace_getregs()
875 retval |= __put_user(rnat, &ppr->ar[PT_AUR_RNAT]); in ptrace_getregs()
876 retval |= __put_user(bsp, &ppr->ar[PT_AUR_BSP]); in ptrace_getregs()
877 retval |= __put_user(cfm, &ppr->cfm); in ptrace_getregs()
879 /* gr1-gr3 */ in ptrace_getregs()
881 retval |= __copy_to_user(&ppr->gr[1], &pt->r1, sizeof(long)); in ptrace_getregs()
882 retval |= __copy_to_user(&ppr->gr[2], &pt->r2, sizeof(long) *2); in ptrace_getregs()
884 /* gr4-gr7 */ in ptrace_getregs()
888 return -EIO; in ptrace_getregs()
889 retval |= __put_user(val, &ppr->gr[i]); in ptrace_getregs()
892 /* gr8-gr11 */ in ptrace_getregs()
894 retval |= __copy_to_user(&ppr->gr[8], &pt->r8, sizeof(long) * 4); in ptrace_getregs()
896 /* gr12-gr15 */ in ptrace_getregs()
898 retval |= __copy_to_user(&ppr->gr[12], &pt->r12, sizeof(long) * 2); in ptrace_getregs()
899 retval |= __copy_to_user(&ppr->gr[14], &pt->r14, sizeof(long)); in ptrace_getregs()
900 retval |= __copy_to_user(&ppr->gr[15], &pt->r15, sizeof(long)); in ptrace_getregs()
902 /* gr16-gr31 */ in ptrace_getregs()
904 retval |= __copy_to_user(&ppr->gr[16], &pt->r16, sizeof(long) * 16); in ptrace_getregs()
908 retval |= __put_user(pt->b0, &ppr->br[0]); in ptrace_getregs()
910 /* b1-b5 */ in ptrace_getregs()
914 return -EIO; in ptrace_getregs()
915 __put_user(val, &ppr->br[i]); in ptrace_getregs()
918 /* b6-b7 */ in ptrace_getregs()
920 retval |= __put_user(pt->b6, &ppr->br[6]); in ptrace_getregs()
921 retval |= __put_user(pt->b7, &ppr->br[7]); in ptrace_getregs()
923 /* fr2-fr5 */ in ptrace_getregs()
927 return -EIO; in ptrace_getregs()
928 retval |= __copy_to_user(&ppr->fr[i], &fpval, sizeof (fpval)); in ptrace_getregs()
931 /* fr6-fr11 */ in ptrace_getregs()
933 retval |= __copy_to_user(&ppr->fr[6], &pt->f6, in ptrace_getregs()
936 /* fp scratch regs(12-15) */ in ptrace_getregs()
938 retval |= __copy_to_user(&ppr->fr[12], &sw->f12, in ptrace_getregs()
941 /* fr16-fr31 */ in ptrace_getregs()
945 return -EIO; in ptrace_getregs()
946 retval |= __copy_to_user(&ppr->fr[i], &fpval, sizeof (fpval)); in ptrace_getregs()
952 retval |= __copy_to_user(&ppr->fr[32], &child->thread.fph, in ptrace_getregs()
953 sizeof(ppr->fr[32]) * 96); in ptrace_getregs()
957 retval |= __put_user(pt->pr, &ppr->pr); in ptrace_getregs()
961 retval |= __put_user(nat_bits, &ppr->nat); in ptrace_getregs()
963 ret = retval ? -EIO : 0; in ptrace_getregs()
981 return -EIO; in ptrace_setregs()
984 sw = (struct switch_stack *) (child->thread.ksp + 16); in ptrace_setregs()
987 return -EIO; in ptrace_setregs()
992 return -EIO; in ptrace_setregs()
997 retval |= __get_user(pt->cr_iip, &ppr->cr_iip); in ptrace_setregs()
998 retval |= __get_user(psr, &ppr->cr_ipsr); in ptrace_setregs()
1002 retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); in ptrace_setregs()
1003 retval |= __get_user(rsc, &ppr->ar[PT_AUR_RSC]); in ptrace_setregs()
1004 retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); in ptrace_setregs()
1005 retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); in ptrace_setregs()
1006 retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); in ptrace_setregs()
1007 retval |= __get_user(pt->ar_fpsr, &ppr->ar[PT_AUR_FPSR]); in ptrace_setregs()
1009 retval |= __get_user(ec, &ppr->ar[PT_AUR_EC]); in ptrace_setregs()
1010 retval |= __get_user(lc, &ppr->ar[PT_AUR_LC]); in ptrace_setregs()
1011 retval |= __get_user(rnat, &ppr->ar[PT_AUR_RNAT]); in ptrace_setregs()
1012 retval |= __get_user(bsp, &ppr->ar[PT_AUR_BSP]); in ptrace_setregs()
1013 retval |= __get_user(cfm, &ppr->cfm); in ptrace_setregs()
1015 /* gr1-gr3 */ in ptrace_setregs()
1017 retval |= __copy_from_user(&pt->r1, &ppr->gr[1], sizeof(long)); in ptrace_setregs()
1018 retval |= __copy_from_user(&pt->r2, &ppr->gr[2], sizeof(long) * 2); in ptrace_setregs()
1020 /* gr4-gr7 */ in ptrace_setregs()
1023 retval |= __get_user(val, &ppr->gr[i]); in ptrace_setregs()
1026 return -EIO; in ptrace_setregs()
1029 /* gr8-gr11 */ in ptrace_setregs()
1031 retval |= __copy_from_user(&pt->r8, &ppr->gr[8], sizeof(long) * 4); in ptrace_setregs()
1033 /* gr12-gr15 */ in ptrace_setregs()
1035 retval |= __copy_from_user(&pt->r12, &ppr->gr[12], sizeof(long) * 2); in ptrace_setregs()
1036 retval |= __copy_from_user(&pt->r14, &ppr->gr[14], sizeof(long)); in ptrace_setregs()
1037 retval |= __copy_from_user(&pt->r15, &ppr->gr[15], sizeof(long)); in ptrace_setregs()
1039 /* gr16-gr31 */ in ptrace_setregs()
1041 retval |= __copy_from_user(&pt->r16, &ppr->gr[16], sizeof(long) * 16); in ptrace_setregs()
1045 retval |= __get_user(pt->b0, &ppr->br[0]); in ptrace_setregs()
1047 /* b1-b5 */ in ptrace_setregs()
1050 retval |= __get_user(val, &ppr->br[i]); in ptrace_setregs()
1054 /* b6-b7 */ in ptrace_setregs()
1056 retval |= __get_user(pt->b6, &ppr->br[6]); in ptrace_setregs()
1057 retval |= __get_user(pt->b7, &ppr->br[7]); in ptrace_setregs()
1059 /* fr2-fr5 */ in ptrace_setregs()
1062 retval |= __copy_from_user(&fpval, &ppr->fr[i], sizeof(fpval)); in ptrace_setregs()
1064 return -EIO; in ptrace_setregs()
1067 /* fr6-fr11 */ in ptrace_setregs()
1069 retval |= __copy_from_user(&pt->f6, &ppr->fr[6], in ptrace_setregs()
1070 sizeof(ppr->fr[6]) * 6); in ptrace_setregs()
1072 /* fp scratch regs(12-15) */ in ptrace_setregs()
1074 retval |= __copy_from_user(&sw->f12, &ppr->fr[12], in ptrace_setregs()
1075 sizeof(ppr->fr[12]) * 4); in ptrace_setregs()
1077 /* fr16-fr31 */ in ptrace_setregs()
1080 retval |= __copy_from_user(&fpval, &ppr->fr[i], in ptrace_setregs()
1083 return -EIO; in ptrace_setregs()
1089 retval |= __copy_from_user(&child->thread.fph, &ppr->fr[32], in ptrace_setregs()
1090 sizeof(ppr->fr[32]) * 96); in ptrace_setregs()
1094 retval |= __get_user(pt->pr, &ppr->pr); in ptrace_setregs()
1098 retval |= __get_user(nat_bits, &ppr->nat); in ptrace_setregs()
1109 ret = retval ? -EIO : 0; in ptrace_setregs()
1119 child_psr->ss = 1; in user_enable_single_step()
1128 child_psr->tb = 1; in user_enable_block_step()
1136 /* make sure the single step/taken-branch trap bits are not set: */ in user_disable_single_step()
1138 child_psr->ss = 0; in user_disable_single_step()
1139 child_psr->tb = 0; in user_disable_single_step()
1164 return -EIO; in arch_ptrace()
1176 return -EIO; in arch_ptrace()
1184 return -EIO; in arch_ptrace()
1188 /* for backwards-compatibility */ in arch_ptrace()
1192 /* for backwards-compatibility */ in arch_ptrace()
1218 return -ENOSYS; in syscall_trace_enter()
1276 [0] = -1, R(1), R(2), R(3),
1277 [4] = -1, [5] = -1, [6] = -1, [7] = -1,
1322 ptr = &pt->b0; in access_elf_breg()
1325 return unw_access_br(info, (addr - ELF_BR_OFFSET(0))/8, in access_elf_breg()
1328 ptr = &pt->b6; in access_elf_breg()
1331 ptr = &pt->b7; in access_elf_breg()
1354 pt->ar_rsc = *data | (3 << 2); in access_elf_areg()
1356 *data = pt->ar_rsc; in access_elf_areg()
1361 * the end of the user-level backing store. in access_elf_areg()
1362 * Use ia64_rse_skip_regs(PT_AR_BSP, -CFM.sof) in access_elf_areg()
1369 * so that the non-system-call exit in access_elf_areg()
1379 * call or that we defer it's re-execution in access_elf_areg()
1391 * Simulate user-level write in access_elf_areg()
1394 pt->loadrs = 0; in access_elf_areg()
1395 pt->ar_bspstore = *data; in access_elf_areg()
1401 ptr = &pt->ar_bspstore; in access_elf_areg()
1404 ptr = &pt->ar_rnat; in access_elf_areg()
1407 ptr = &pt->ar_ccv; in access_elf_areg()
1410 ptr = &pt->ar_unat; in access_elf_areg()
1413 ptr = &pt->ar_fpsr; in access_elf_areg()
1416 ptr = &pt->ar_pfs; in access_elf_areg()
1425 ptr = &pt->ar_csd; in access_elf_areg()
1428 ptr = &pt->ar_ssd; in access_elf_areg()
1433 ptr = &pt->cr_iip; in access_elf_areg()
1443 pt->cr_ifs = ((pt->cr_ifs & ~PFM_MASK) in access_elf_areg()
1452 /* psr.ri==3 is a reserved value: SDM 2:25 */ in access_elf_areg()
1455 pt->cr_ipsr = ((tmp & IPSR_MASK) in access_elf_areg()
1456 | (pt->cr_ipsr & ~IPSR_MASK)); in access_elf_areg()
1458 *data = (pt->cr_ipsr & IPSR_MASK); in access_elf_areg()
1465 ptr = &pt->pr; in access_elf_areg()
1467 return -1; in access_elf_areg()
1497 struct membuf to = dst->to; in do_gpregs_get()
1506 * r0-r31 in do_gpregs_get()
1507 * NaT bits (for r0-r31; bit N == 1 iff rN is a NaT) in do_gpregs_get()
1508 * predicate registers (p0-p63) in do_gpregs_get()
1509 * b0-b7 in do_gpregs_get()
1510 * ip cfm user-mask in do_gpregs_get()
1519 if (access_elf_reg(info->task, info, n, ®, 0) < 0) { in do_gpregs_get()
1520 dst->ret = -EIO; in do_gpregs_get()
1534 if (!dst->count) in do_gpregs_set()
1537 if (dst->pos < ELF_GR_OFFSET(1)) { in do_gpregs_set()
1538 dst->ret = user_regset_copyin_ignore(&dst->pos, &dst->count, in do_gpregs_set()
1539 &dst->u.set.kbuf, in do_gpregs_set()
1540 &dst->u.set.ubuf, in do_gpregs_set()
1542 if (dst->ret) in do_gpregs_set()
1546 while (dst->count && dst->pos < ELF_AR_END_OFFSET) { in do_gpregs_set()
1550 from = dst->pos; in do_gpregs_set()
1555 dst->ret = user_regset_copyin(&dst->pos, &dst->count, in do_gpregs_set()
1556 &dst->u.set.kbuf, &dst->u.set.ubuf, tmp, in do_gpregs_set()
1558 if (dst->ret) in do_gpregs_set()
1561 for (n = 0; from < dst->pos; from += sizeof(elf_greg_t), n++) in do_gpregs_set()
1562 if (access_elf_reg(dst->target, info, from, in do_gpregs_set()
1564 dst->ret = -EIO; in do_gpregs_set()
1574 struct task_struct *task = info->task; in do_fpregs_get()
1576 struct membuf to = dst->to; in do_fpregs_get()
1586 /* fr2-fr31 */ in do_fpregs_get()
1589 dst->ret = -EIO; in do_fpregs_get()
1600 if (task->thread.flags & IA64_THREAD_FPH_VALID) in do_fpregs_get()
1601 membuf_write(&to, &task->thread.fph, 96 * sizeof(reg)); in do_fpregs_get()
1616 if (dst->count > 0 && dst->pos < ELF_FP_OFFSET(2)) { in do_fpregs_set()
1617 dst->ret = user_regset_copyin_ignore(&dst->pos, &dst->count, in do_fpregs_set()
1618 &dst->u.set.kbuf, in do_fpregs_set()
1619 &dst->u.set.ubuf, in do_fpregs_set()
1621 if (dst->count == 0 || dst->ret) in do_fpregs_set()
1625 /* fr2-fr31 */ in do_fpregs_set()
1626 if (dst->count > 0 && dst->pos < ELF_FP_OFFSET(32)) { in do_fpregs_set()
1627 start = dst->pos; in do_fpregs_set()
1629 dst->pos + dst->count); in do_fpregs_set()
1630 dst->ret = user_regset_copyin(&dst->pos, &dst->count, in do_fpregs_set()
1631 &dst->u.set.kbuf, &dst->u.set.ubuf, tmp, in do_fpregs_set()
1633 if (dst->ret) in do_fpregs_set()
1639 dst->ret = -EIO; in do_fpregs_set()
1642 tmp[start / sizeof(elf_fpreg_t) - 2].u.bits[0] in do_fpregs_set()
1649 dst->ret = -EIO; in do_fpregs_set()
1652 tmp[end / sizeof(elf_fpreg_t) - 2].u.bits[1] in do_fpregs_set()
1659 if (unw_set_fr(info, index, tmp[index - 2])) { in do_fpregs_set()
1660 dst->ret = -EIO; in do_fpregs_set()
1664 if (dst->ret || dst->count == 0) in do_fpregs_set()
1669 if (dst->count > 0 && dst->pos < ELF_FP_OFFSET(128)) { in do_fpregs_set()
1670 ia64_sync_fph(dst->target); in do_fpregs_set()
1671 dst->ret = user_regset_copyin(&dst->pos, &dst->count, in do_fpregs_set()
1672 &dst->u.set.kbuf, in do_fpregs_set()
1673 &dst->u.set.ubuf, in do_fpregs_set()
1674 &dst->target->thread.fph, in do_fpregs_set()
1675 ELF_FP_OFFSET(32), -1); in do_fpregs_set()
1752 return (target->thread.flags & IA64_THREAD_FPH_VALID) ? 128 : 32; in fpregs_active()
1777 unsigned int pos = -1; /* an invalid value */ in access_uarea()
1782 return -1; in access_uarea()
1790 return -1; in access_uarea()
1795 pos = addr - PT_F32 + ELF_FP_OFFSET(32); in access_uarea()
1798 pos = addr - PT_F2 + ELF_FP_OFFSET(2); in access_uarea()
1801 pos = addr - PT_F10 + ELF_FP_OFFSET(10); in access_uarea()
1804 pos = addr - PT_F6 + ELF_FP_OFFSET(6); in access_uarea()
1808 if (pos != -1) { in access_uarea()
1812 if (reg < 32) { /* fr2-fr31 */ in access_uarea()
1822 return -1; in access_uarea()
1826 return -1; in access_uarea()
1831 elf_fpreg_t *p = &child->thread.fph[reg - 32]; in access_uarea()
1832 unsigned long *bits = &p->u.bits[which_half]; in access_uarea()
1837 else if (child->thread.flags & IA64_THREAD_FPH_VALID) in access_uarea()
1850 pos = addr - PT_R4 + ELF_GR_OFFSET(4); in access_uarea()
1853 pos = addr - PT_B1 + ELF_BR_OFFSET(1); in access_uarea()
1895 pos = addr - PT_R1 + ELF_GR_OFFSET(1); in access_uarea()
1898 pos = addr - PT_R12 + ELF_GR_OFFSET(12); in access_uarea()
1901 pos = addr - PT_R8 + ELF_GR_OFFSET(8); in access_uarea()
1904 pos = addr - PT_R16 + ELF_GR_OFFSET(16); in access_uarea()
1926 if (pos != -1) { in access_uarea()
1939 regnum = (addr - PT_IBR) >> 3; in access_uarea()
1940 ptr = &child->thread.ibr[0]; in access_uarea()
1942 regnum = (addr - PT_DBR) >> 3; in access_uarea()
1943 ptr = &child->thread.dbr[0]; in access_uarea()
1949 return -1; in access_uarea()
1952 if (!(child->thread.flags & IA64_THREAD_DBG_VALID)) { in access_uarea()
1953 child->thread.flags |= IA64_THREAD_DBG_VALID; in access_uarea()
1954 memset(child->thread.dbr, 0, in access_uarea()
1955 sizeof(child->thread.dbr)); in access_uarea()
1956 memset(child->thread.ibr, 0, in access_uarea()
1957 sizeof(child->thread.ibr)); in access_uarea()
1963 /* don't let the user set kernel-level breakpoints: */ in access_uarea()
2012 struct pt_regs *pt = args->regs; in syscall_get_set_args_cb()
2019 cfm = pt->cr_ifs; in syscall_get_set_args_cb()
2020 krbs = (unsigned long *)info->task + IA64_RBS_OFFSET/8; in syscall_get_set_args_cb()
2021 ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19)); in syscall_get_set_args_cb()
2025 count = min_t(int, args->n, cfm & 0x7f); in syscall_get_set_args_cb()
2028 if (args->rw) in syscall_get_set_args_cb()
2029 *ia64_rse_skip_regs(krbs, ndirty + i + args->i) = in syscall_get_set_args_cb()
2030 args->args[i]; in syscall_get_set_args_cb()
2032 args->args[i] = *ia64_rse_skip_regs(krbs, in syscall_get_set_args_cb()
2033 ndirty + i + args->i); in syscall_get_set_args_cb()
2036 if (!args->rw) { in syscall_get_set_args_cb()
2037 while (i < args->n) { in syscall_get_set_args_cb()
2038 args->args[i] = 0; in syscall_get_set_args_cb()