linux/arch/powerpc/kernel/ptrace/ptrace-spe.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2
   3#include <linux/regset.h>
   4
   5#include <asm/switch_to.h>
   6
   7#include "ptrace-decl.h"
   8
   9/*
  10 * For get_evrregs/set_evrregs functions 'data' has the following layout:
  11 *
  12 * struct {
  13 *   u32 evr[32];
  14 *   u64 acc;
  15 *   u32 spefscr;
  16 * }
  17 */
  18
  19int evr_active(struct task_struct *target, const struct user_regset *regset)
  20{
  21        flush_spe_to_thread(target);
  22        return target->thread.used_spe ? regset->n : 0;
  23}
  24
  25int evr_get(struct task_struct *target, const struct user_regset *regset,
  26            unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf)
  27{
  28        int ret;
  29
  30        flush_spe_to_thread(target);
  31
  32        ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
  33                                  &target->thread.evr,
  34                                  0, sizeof(target->thread.evr));
  35
  36        BUILD_BUG_ON(offsetof(struct thread_struct, acc) + sizeof(u64) !=
  37                     offsetof(struct thread_struct, spefscr));
  38
  39        if (!ret)
  40                ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
  41                                          &target->thread.acc,
  42                                          sizeof(target->thread.evr), -1);
  43
  44        return ret;
  45}
  46
  47int evr_set(struct task_struct *target, const struct user_regset *regset,
  48            unsigned int pos, unsigned int count,
  49            const void *kbuf, const void __user *ubuf)
  50{
  51        int ret;
  52
  53        flush_spe_to_thread(target);
  54
  55        ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
  56                                 &target->thread.evr,
  57                                 0, sizeof(target->thread.evr));
  58
  59        BUILD_BUG_ON(offsetof(struct thread_struct, acc) + sizeof(u64) !=
  60                     offsetof(struct thread_struct, spefscr));
  61
  62        if (!ret)
  63                ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
  64                                         &target->thread.acc,
  65                                         sizeof(target->thread.evr), -1);
  66
  67        return ret;
  68}
  69