lkml.org 
[lkml]   [2016]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 06/30] powerpc/ptrace: Adapt gpr32_get, gpr32_set functions for transaction
    Date
    From: Anshuman Khandual <khandual@linux.vnet.ibm.com>

    This patch splits gpr32_get, gpr32_set functions to accommodate
    in transaction ptrace requests implemented in patches later in
    the series.

    Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
    Signed-off-by: Simon Guo <wei.guo.simon@gmail.com>
    ---
    arch/powerpc/kernel/ptrace.c | 64 +++++++++++++++++++++++++++++++++++---------
    1 file changed, 51 insertions(+), 13 deletions(-)

    diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
    index ebf3b0e..2cdb4e7 100644
    --- a/arch/powerpc/kernel/ptrace.c
    +++ b/arch/powerpc/kernel/ptrace.c
    @@ -907,24 +907,35 @@ static const struct user_regset_view user_ppc_native_view = {
    #ifdef CONFIG_PPC64
    #include <linux/compat.h>

    -static int gpr32_get(struct task_struct *target,
    +static int gpr32_get_common(struct task_struct *target,
    const struct user_regset *regset,
    unsigned int pos, unsigned int count,
    - void *kbuf, void __user *ubuf)
    + void *kbuf, void __user *ubuf, bool tm_active)
    {
    const unsigned long *regs = &target->thread.regs->gpr[0];
    + const unsigned long *ckpt_regs;
    compat_ulong_t *k = kbuf;
    compat_ulong_t __user *u = ubuf;
    compat_ulong_t reg;
    int i;

    - if (target->thread.regs == NULL)
    - return -EIO;
    +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
    + ckpt_regs = &target->thread.ckpt_regs.gpr[0];
    +#endif
    + if (tm_active) {
    + regs = ckpt_regs;
    + } else {
    + if (target->thread.regs == NULL)
    + return -EIO;

    - if (!FULL_REGS(target->thread.regs)) {
    - /* We have a partial register set. Fill 14-31 with bogus values */
    - for (i = 14; i < 32; i++)
    - target->thread.regs->gpr[i] = NV_REG_POISON;
    + if (!FULL_REGS(target->thread.regs)) {
    + /*
    + * We have a partial register set.
    + * Fill 14-31 with bogus values.
    + */
    + for (i = 14; i < 32; i++)
    + target->thread.regs->gpr[i] = NV_REG_POISON;
    + }
    }

    pos /= sizeof(reg);
    @@ -964,20 +975,31 @@ static int gpr32_get(struct task_struct *target,
    PT_REGS_COUNT * sizeof(reg), -1);
    }

    -static int gpr32_set(struct task_struct *target,
    +static int gpr32_set_common(struct task_struct *target,
    const struct user_regset *regset,
    unsigned int pos, unsigned int count,
    - const void *kbuf, const void __user *ubuf)
    + const void *kbuf, const void __user *ubuf, bool tm_active)
    {
    unsigned long *regs = &target->thread.regs->gpr[0];
    + unsigned long *ckpt_regs;
    const compat_ulong_t *k = kbuf;
    const compat_ulong_t __user *u = ubuf;
    compat_ulong_t reg;

    - if (target->thread.regs == NULL)
    - return -EIO;
    +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
    + ckpt_regs = &target->thread.ckpt_regs.gpr[0];
    +#endif

    - CHECK_FULL_REGS(target->thread.regs);
    + if (tm_active) {
    + regs = ckpt_regs;
    + } else {
    + regs = &target->thread.regs->gpr[0];
    +
    + if (target->thread.regs == NULL)
    + return -EIO;
    +
    + CHECK_FULL_REGS(target->thread.regs);
    + }

    pos /= sizeof(reg);
    count /= sizeof(reg);
    @@ -1037,6 +1059,22 @@ static int gpr32_set(struct task_struct *target,
    (PT_TRAP + 1) * sizeof(reg), -1);
    }

    +static int gpr32_get(struct task_struct *target,
    + const struct user_regset *regset,
    + unsigned int pos, unsigned int count,
    + void *kbuf, void __user *ubuf)
    +{
    + return gpr32_get_common(target, regset, pos, count, kbuf, ubuf, 0);
    +}
    +
    +static int gpr32_set(struct task_struct *target,
    + const struct user_regset *regset,
    + unsigned int pos, unsigned int count,
    + const void *kbuf, const void __user *ubuf)
    +{
    + return gpr32_set_common(target, regset, pos, count, kbuf, ubuf, 0);
    +}
    +
    /*
    * These are the regset flavors matching the CONFIG_PPC32 native set.
    */
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2016-07-28 05:41    [W:2.277 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site