From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759725AbcDFHAU (ORCPT ); Wed, 6 Apr 2016 03:00:20 -0400 Received: from mail-pa0-f68.google.com ([209.85.220.68]:34125 "EHLO mail-pa0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751336AbcDFHAS (ORCPT ); Wed, 6 Apr 2016 03:00:18 -0400 Date: Wed, 6 Apr 2016 15:00:12 +0800 From: Simon Guo To: Michael Ellerman Cc: Benjamin Herrenschmidt , Paul Mackerras , Kees Cook , Rashmica Gupta , Simon Guo , linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Laurent Dufour , Simon Guo Subject: [RESEND][PATCH v2] powerpc: Export thread_struct.used_vr/used_vsr to user space Message-ID: <20160406070012.GA11647@simonLocalRHEL7.x64> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org These 2 fields track whether user process has used Altivec/VSX registers or not. They are used by kernel to setup signal frame on user stack correctly regarding vector part. CRIU(Checkpoint and Restore In User space) builds signal frame for restored process. It will need this export information to setup signal frame correctly. And CRIU will need to restore these 2 fields for the restored process. Signed-off-by: Simon Guo Reviewed-by: Laurent Dufour --- arch/powerpc/include/uapi/asm/ptrace.h | 11 ++++++++++ arch/powerpc/kernel/ptrace.c | 39 ++++++++++++++++++++++++++++++++++ arch/powerpc/kernel/ptrace32.c | 2 ++ 3 files changed, 52 insertions(+) diff --git a/arch/powerpc/include/uapi/asm/ptrace.h b/arch/powerpc/include/uapi/asm/ptrace.h index 8036b38..d5afe95 100644 --- a/arch/powerpc/include/uapi/asm/ptrace.h +++ b/arch/powerpc/include/uapi/asm/ptrace.h @@ -176,6 +176,17 @@ struct pt_regs { #define PTRACE_GETREGS64 0x16 #define PTRACE_SETREGS64 0x17 +/* + * Get or set some register used bit. + * The flags will be saved in a 32 bit data. + * Currently it is only used for VR/VSR usage. + */ +#define PTRACE_GET_REGS_USAGE 0x1e +#define PTRACE_SET_REGS_USAGE 0x1f + +#define PTRACE_REGS_USAGE_VR_BIT 0x00000001 +#define PTRACE_REGS_USAGE_VSR_BIT 0x00000002 + /* Calls to trace a 64bit program from a 32bit program */ #define PPC_PTRACE_PEEKTEXT_3264 0x95 #define PPC_PTRACE_PEEKDATA_3264 0x94 diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 30a03c0..39b8ff2 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c @@ -1755,6 +1755,45 @@ long arch_ptrace(struct task_struct *child, long request, REGSET_SPE, 0, 35 * sizeof(u32), datavp); #endif + case PTRACE_GET_REGS_USAGE: + { + u32 *u32_datap = (u32 *)datavp; + u32 reg_usage = 0; + + if (addr != sizeof(u32)) + return -EINVAL; + +#ifdef CONFIG_ALTIVEC + if (child->thread.used_vr) + reg_usage |= PTRACE_REGS_USAGE_VR_BIT; +#endif +#ifdef CONFIG_VSX + if (child->thread.used_vsr) + reg_usage |= PTRACE_REGS_USAGE_VSR_BIT; +#endif + return put_user(reg_usage, u32_datap); + } + case PTRACE_SET_REGS_USAGE: + { + u32 *u32_datap = (u32 *)datavp; + u32 reg_usage = 0; + + if (addr != sizeof(u32)) + return -EINVAL; + + ret = get_user(reg_usage, u32_datap); + if (ret) + return ret; +#ifdef CONFIG_ALTIVEC + child->thread.used_vr = + !!(reg_usage & PTRACE_REGS_USAGE_VR_BIT); +#endif +#ifdef CONFIG_VSX + child->thread.used_vsr = + !!(reg_usage & PTRACE_REGS_USAGE_VSR_BIT); +#endif + break; + } default: ret = ptrace_request(child, request, addr, data); diff --git a/arch/powerpc/kernel/ptrace32.c b/arch/powerpc/kernel/ptrace32.c index f52b7db..ff359a1 100644 --- a/arch/powerpc/kernel/ptrace32.c +++ b/arch/powerpc/kernel/ptrace32.c @@ -305,6 +305,8 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, case PPC_PTRACE_GETHWDBGINFO: case PPC_PTRACE_SETHWDEBUG: case PPC_PTRACE_DELHWDEBUG: + case PTRACE_GET_REGS_USAGE: + case PTRACE_SET_REGS_USAGE: ret = arch_ptrace(child, request, addr, data); break; -- 2.7.0