Lines Matching +full:data +full:- +full:active

1 // SPDX-License-Identifier: GPL-2.0-or-later
8 #include "ptrace-decl.h"
73 * regs_query_register_offset() - query register offset from its name
77 * pt_regs from its name. If the name is invalid, this returns -EINVAL;
82 for (roff = regoffset_table; roff->name != NULL; roff++) in regs_query_register_offset()
83 if (!strcmp(roff->name, name)) in regs_query_register_offset()
84 return roff->offset; in regs_query_register_offset()
85 return -EINVAL; in regs_query_register_offset()
89 * regs_query_register_name() - query register name from its offset
98 for (roff = regoffset_table; roff->name != NULL; roff++) in regs_query_register_name()
99 if (roff->offset == offset) in regs_query_register_name()
100 return roff->name; in regs_query_register_name()
111 return task->thread.regs->msr | task->thread.fpexc_mode; in get_user_msr()
116 unsigned long newmsr = (task->thread.regs->msr & ~MSR_DEBUGCHANGE) | in set_user_msr()
118 regs_set_return_msr(task->thread.regs, newmsr); in set_user_msr()
123 static int get_user_dscr(struct task_struct *task, unsigned long *data) in get_user_dscr() argument
125 *data = task->thread.dscr; in get_user_dscr()
131 task->thread.dscr = dscr; in set_user_dscr()
132 task->thread.dscr_inherit = 1; in set_user_dscr()
136 static int get_user_dscr(struct task_struct *task, unsigned long *data) in get_user_dscr() argument
138 return -EIO; in get_user_dscr()
143 return -EIO; in set_user_dscr()
153 set_trap(task->thread.regs, trap); in set_user_trap()
160 int ptrace_get_reg(struct task_struct *task, int regno, unsigned long *data) in ptrace_get_reg() argument
164 if (task->thread.regs == NULL || !data) in ptrace_get_reg()
165 return -EIO; in ptrace_get_reg()
168 *data = get_user_msr(task); in ptrace_get_reg()
173 return get_user_dscr(task, data); in ptrace_get_reg()
176 * softe copies paca->irq_soft_mask variable state. Since irq_soft_mask is in ptrace_get_reg()
181 *data = 1; in ptrace_get_reg()
188 *data = ((unsigned long *)task->thread.regs)[regno]; in ptrace_get_reg()
192 return -EIO; in ptrace_get_reg()
198 int ptrace_put_reg(struct task_struct *task, int regno, unsigned long data) in ptrace_put_reg() argument
200 if (task->thread.regs == NULL) in ptrace_put_reg()
201 return -EIO; in ptrace_put_reg()
204 return set_user_msr(task, data); in ptrace_put_reg()
206 return set_user_trap(task, data); in ptrace_put_reg()
208 return set_user_dscr(task, data); in ptrace_put_reg()
212 ((unsigned long *)task->thread.regs)[regno] = data; in ptrace_put_reg()
215 return -EIO; in ptrace_put_reg()
225 if (target->thread.regs == NULL) in gpr_get()
226 return -EIO; in gpr_get()
228 membuf_write(&to, target->thread.regs, sizeof(struct user_pt_regs)); in gpr_get()
234 return membuf_zero(&to, ELF_NGREG * sizeof(unsigned long) - in gpr_get()
245 if (target->thread.regs == NULL) in gpr_set()
246 return -EIO; in gpr_set()
249 target->thread.regs, in gpr_set()
265 &target->thread.regs->orig_gpr3, in gpr_set()
284 (PT_TRAP + 1) * sizeof(reg), -1); in gpr_set()
293 if (!target->thread.regs) in ppr_get()
294 return -EINVAL; in ppr_get()
296 return membuf_write(&to, &target->thread.regs->ppr, sizeof(u64)); in ppr_get()
303 if (!target->thread.regs) in ppr_set()
304 return -EINVAL; in ppr_set()
307 &target->thread.regs->ppr, 0, sizeof(u64)); in ppr_set()
313 return membuf_write(&to, &target->thread.dscr, sizeof(u64)); in dscr_get()
320 &target->thread.dscr, 0, sizeof(u64)); in dscr_set()
327 return membuf_write(&to, &target->thread.tar, sizeof(u64)); in tar_get()
334 &target->thread.tar, 0, sizeof(u64)); in tar_set()
340 return -ENODEV; in ebb_active()
342 if (target->thread.used_ebb) in ebb_active()
343 return regset->n; in ebb_active()
356 return -ENODEV; in ebb_get()
358 if (!target->thread.used_ebb) in ebb_get()
359 return -ENODATA; in ebb_get()
361 return membuf_write(&to, &target->thread.ebbrr, 3 * sizeof(unsigned long)); in ebb_get()
375 return -ENODEV; in ebb_set()
377 if (target->thread.used_ebb) in ebb_set()
378 return -ENODATA; in ebb_set()
380 ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &target->thread.ebbrr, in ebb_set()
385 &target->thread.ebbhr, sizeof(unsigned long), in ebb_set()
390 &target->thread.bescr, 2 * sizeof(unsigned long), in ebb_set()
398 return -ENODEV; in pmu_active()
400 return regset->n; in pmu_active()
413 return -ENODEV; in pmu_get()
415 return membuf_write(&to, &target->thread.siar, 5 * sizeof(unsigned long)); in pmu_get()
431 return -ENODEV; in pmu_set()
433 ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &target->thread.siar, in pmu_set()
438 &target->thread.sdar, sizeof(unsigned long), in pmu_set()
443 &target->thread.sier, 2 * sizeof(unsigned long), in pmu_set()
448 &target->thread.mmcr2, 3 * sizeof(unsigned long), in pmu_set()
453 &target->thread.mmcr0, 4 * sizeof(unsigned long), in pmu_set()
461 return -ENODEV; in dexcr_active()
463 return regset->n; in dexcr_active()
470 return -ENODEV; in dexcr_get()
472 membuf_store(&to, (u64)lower_32_bits(target->thread.dexcr)); in dexcr_get()
475 * Technically the HDEXCR is per-cpu, but a hypervisor can't reasonably in dexcr_get()
485 return -ENODEV; in hashkeyr_active()
487 return regset->n; in hashkeyr_active()
494 return -ENODEV; in hashkeyr_get()
496 return membuf_store(&to, target->thread.hashkeyr); in hashkeyr_get()
504 return -ENODEV; in hashkeyr_set()
506 return user_regset_copyin(&pos, &count, &kbuf, &ubuf, &target->thread.hashkeyr, in hashkeyr_set()
516 return -ENODEV; in pkey_active()
518 return regset->n; in pkey_active()
526 return -ENODEV; in pkey_get()
528 membuf_store(&to, target->thread.regs->amr); in pkey_get()
529 membuf_store(&to, target->thread.regs->iamr); in pkey_get()
541 return -ENODEV; in pkey_set()
545 return -EINVAL; in pkey_set()
562 target->thread.regs->amr = (new_amr & default_uamor) | in pkey_set()
563 (target->thread.regs->amr & ~default_uamor); in pkey_set()
584 .active = vr_active, .regset_get = vr_get, .set = vr_set
591 .active = vsr_active, .regset_get = vsr_get, .set = vsr_set
598 .active = evr_active, .regset_get = evr_get, .set = evr_set
605 .active = tm_cgpr_active, .regset_get = tm_cgpr_get, .set = tm_cgpr_set
610 .active = tm_cfpr_active, .regset_get = tm_cfpr_get, .set = tm_cfpr_set
615 .active = tm_cvmx_active, .regset_get = tm_cvmx_get, .set = tm_cvmx_set
620 .active = tm_cvsx_active, .regset_get = tm_cvsx_get, .set = tm_cvsx_set
625 .active = tm_spr_active, .regset_get = tm_spr_get, .set = tm_spr_set
630 .active = tm_tar_active, .regset_get = tm_tar_get, .set = tm_tar_set
635 .active = tm_ppr_active, .regset_get = tm_ppr_get, .set = tm_ppr_set
640 .active = tm_dscr_active, .regset_get = tm_dscr_get, .set = tm_dscr_set
664 .active = ebb_active, .regset_get = ebb_get, .set = ebb_set
669 .active = pmu_active, .regset_get = pmu_get, .set = pmu_set
674 .active = dexcr_active, .regset_get = dexcr_get
680 .active = hashkeyr_active, .regset_get = hashkeyr_get, .set = hashkeyr_set
688 .active = pkey_active, .regset_get = pkey_get, .set = pkey_set
711 return membuf_zero(&to, (ELF_NGREG - PT_REGS_COUNT) * sizeof(u32)); in gpr32_get_common()
724 for (; count > 0 && pos < PT_MSR; --count) in gpr32_set_common_kernel()
730 --count; in gpr32_set_common_kernel()
733 for (; count > 0 && pos <= PT_MAX_PUT_REG; --count) in gpr32_set_common_kernel()
735 for (; count > 0 && pos < PT_TRAP; --count, ++pos) in gpr32_set_common_kernel()
741 --count; in gpr32_set_common_kernel()
748 (PT_TRAP + 1) * sizeof(compat_ulong_t), -1); in gpr32_set_common_kernel()
762 return -EFAULT; in gpr32_set_common_user()
767 for (; count > 0 && pos < PT_MSR; --count) { in gpr32_set_common_user()
776 --count; in gpr32_set_common_user()
779 for (; count > 0 && pos <= PT_MAX_PUT_REG; --count) { in gpr32_set_common_user()
783 for (; count > 0 && pos < PT_TRAP; --count, ++pos) in gpr32_set_common_user()
790 --count; in gpr32_set_common_user()
798 (PT_TRAP + 1) * sizeof(reg), -1); in gpr32_set_common_user()
803 return -EFAULT; in gpr32_set_common_user()
822 if (target->thread.regs == NULL) in gpr32_get()
823 return -EIO; in gpr32_get()
826 &target->thread.regs->gpr[0]); in gpr32_get()
834 if (target->thread.regs == NULL) in gpr32_set()
835 return -EIO; in gpr32_set()
838 &target->thread.regs->gpr[0]); in gpr32_set()
859 .active = vr_active, .regset_get = vr_get, .set = vr_set
866 .active = evr_active, .regset_get = evr_get, .set = evr_set
873 .active = tm_cgpr_active,
879 .active = tm_cfpr_active, .regset_get = tm_cfpr_get, .set = tm_cfpr_set
884 .active = tm_cvmx_active, .regset_get = tm_cvmx_get, .set = tm_cvmx_set
889 .active = tm_cvsx_active, .regset_get = tm_cvsx_get, .set = tm_cvsx_set
894 .active = tm_spr_active, .regset_get = tm_spr_get, .set = tm_spr_set
899 .active = tm_tar_active, .regset_get = tm_tar_get, .set = tm_tar_set
904 .active = tm_ppr_active, .regset_get = tm_ppr_get, .set = tm_ppr_set
909 .active = tm_dscr_active, .regset_get = tm_dscr_get, .set = tm_dscr_set
933 .active = ebb_active, .regset_get = ebb_get, .set = ebb_set