From: Anshuman Khandual <khandual@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org
Cc: shuahkh@osg.samsung.com, mikey@neuling.org,
james.hogan@imgtec.com, avagin@openvz.org,
Paul.Clothier@imgtec.com, peterz@infradead.org,
palves@redhat.com, nacc@linux.vnet.ibm.com,
emachado@linux.vnet.ibm.com, oleg@redhat.com,
davem@davemloft.net, dhowells@redhat.com,
Ulrich.Weigand@de.ibm.com, kirjanov@gmail.com, davej@redhat.com,
akpm@linux-foundation.org, sukadev@linux.vnet.ibm.com,
tglx@linutronix.de, sam.bobroff@au1.ibm.com
Subject: [PATCH V8 03/28] powerpc, ptrace: Enable in transaction NT_PRFPREG ptrace requests
Date: Tue, 19 May 2015 20:37:59 +0530 [thread overview]
Message-ID: <1432048104-4695-4-git-send-email-khandual@linux.vnet.ibm.com> (raw)
In-Reply-To: <1432048104-4695-1-git-send-email-khandual@linux.vnet.ibm.com>
This patch enables in transaction NT_PRFPREG ptrace requests.
The function fpr_get which gets the running value of all FPR
registers and the function fpr_set which sets the running
value of of all FPR registers work on the running set of FPR
registers whose location will be different if transaction is
active. This patch makes these functions adapt to situations
when the transaction is active.
Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
arch/powerpc/kernel/ptrace.c | 93 ++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 89 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index f21897b..d8a1388 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -357,6 +357,29 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
return ret;
}
+/*
+ * When the transaction is active, 'transact_fp' holds the current running
+ * value of all FPR registers and 'fp_state' holds the last checkpointed
+ * value of all FPR registers for the current transaction. When transaction
+ * is not active 'fp_state' holds the current running state of all the FPR
+ * registers. So this function which returns the current running values of
+ * all the FPR registers, needs to know whether any transaction is active
+ * or not.
+ *
+ * Userspace interface buffer layout:
+ *
+ * struct data {
+ * u64 fpr[32];
+ * u64 fpscr;
+ * };
+ *
+ * There are two config options CONFIG_VSX and CONFIG_PPC_TRANSACTIONAL_MEM
+ * which determines the final code in this function. All the combinations of
+ * these two config options are possible except the one below as transactional
+ * memory config pulls in CONFIG_VSX automatically.
+ *
+ * !defined(CONFIG_VSX) && defined(CONFIG_PPC_TRANSACTIONAL_MEM)
+ */
static int fpr_get(struct task_struct *target, const struct user_regset *regset,
unsigned int pos, unsigned int count,
void *kbuf, void __user *ubuf)
@@ -367,14 +390,31 @@ static int fpr_get(struct task_struct *target, const struct user_regset *regset,
#endif
flush_fp_to_thread(target);
-#ifdef CONFIG_VSX
+#if defined(CONFIG_VSX) && defined(CONFIG_PPC_TRANSACTIONAL_MEM)
+ /* copy to local buffer then write that out */
+ if (MSR_TM_ACTIVE(target->thread.regs->msr)) {
+ flush_altivec_to_thread(target);
+ flush_tmregs_to_thread(target);
+ for (i = 0; i < 32 ; i++)
+ buf[i] = target->thread.TS_TRANS_FPR(i);
+ buf[32] = target->thread.transact_fp.fpscr;
+ } else {
+ for (i = 0; i < 32 ; i++)
+ buf[i] = target->thread.TS_FPR(i);
+ buf[32] = target->thread.fp_state.fpscr;
+ }
+ return user_regset_copyout(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
+#endif
+
+#if defined(CONFIG_VSX) && !defined(CONFIG_PPC_TRANSACTIONAL_MEM)
/* copy to local buffer then write that out */
for (i = 0; i < 32 ; i++)
buf[i] = target->thread.TS_FPR(i);
buf[32] = target->thread.fp_state.fpscr;
return user_regset_copyout(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
+#endif
-#else
+#if !defined(CONFIG_VSX) && !defined(CONFIG_PPC_TRANSACTIONAL_MEM)
BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
offsetof(struct thread_fp_state, fpr[32][0]));
@@ -383,6 +423,29 @@ static int fpr_get(struct task_struct *target, const struct user_regset *regset,
#endif
}
+/*
+ * When the transaction is active, 'transact_fp' holds the current running
+ * value of all FPR registers and 'fp_state' holds the last checkpointed
+ * value of all FPR registers for the current transaction. When transaction
+ * is not active 'fp_state' holds the current running state of all the FPR
+ * registers. So this function which setss the current running values of
+ * all the FPR registers, needs to know whether any transaction is active
+ * or not.
+ *
+ * Userspace interface buffer layout:
+ *
+ * struct data {
+ * u64 fpr[32];
+ * u64 fpscr;
+ * };
+ *
+ * There are two config options CONFIG_VSX and CONFIG_PPC_TRANSACTIONAL_MEM
+ * which determines the final code in this function. All the combinations of
+ * these two config options are possible except the one below as transactional
+ * memory config pulls in CONFIG_VSX automatically.
+ *
+ * !defined(CONFIG_VSX) && defined(CONFIG_PPC_TRANSACTIONAL_MEM)
+ */
static int fpr_set(struct task_struct *target, const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
@@ -393,7 +456,27 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,
#endif
flush_fp_to_thread(target);
-#ifdef CONFIG_VSX
+#if defined(CONFIG_VSX) && defined(CONFIG_PPC_TRANSACTIONAL_MEM)
+ /* copy to local buffer then write that out */
+ i = user_regset_copyin(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
+ if (i)
+ return i;
+
+ if (MSR_TM_ACTIVE(target->thread.regs->msr)) {
+ flush_altivec_to_thread(target);
+ flush_tmregs_to_thread(target);
+ for (i = 0; i < 32 ; i++)
+ target->thread.TS_TRANS_FPR(i) = buf[i];
+ target->thread.transact_fp.fpscr = buf[32];
+ } else {
+ for (i = 0; i < 32 ; i++)
+ target->thread.TS_FPR(i) = buf[i];
+ target->thread.fp_state.fpscr = buf[32];
+ }
+ return 0;
+#endif
+
+#if defined(CONFIG_VSX) && !defined(CONFIG_PPC_TRANSACTIONAL_MEM)
/* copy to local buffer then write that out */
i = user_regset_copyin(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
if (i)
@@ -402,7 +485,9 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,
target->thread.TS_FPR(i) = buf[i];
target->thread.fp_state.fpscr = buf[32];
return 0;
-#else
+#endif
+
+#if !defined(CONFIG_VSX) && !defined(CONFIG_PPC_TRANSACTIONAL_MEM)
BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
offsetof(struct thread_fp_state, fpr[32][0]));
--
2.1.0
next prev parent reply other threads:[~2015-05-19 15:08 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-19 15:07 [PATCH V8 00/28] Add new powerpc specific ELF core notes Anshuman Khandual
2015-05-19 15:07 ` [PATCH V8 01/28] elf: Add powerpc specific core note sections Anshuman Khandual
2015-05-19 15:07 ` [PATCH V8 02/28] powerpc, process: Add the function flush_tmregs_to_thread Anshuman Khandual
2015-05-19 15:07 ` Anshuman Khandual [this message]
2015-05-19 15:08 ` [PATCH V8 04/28] powerpc, ptrace: Enable in transaction NT_PPC_VMX ptrace requests Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 05/28] powerpc, ptrace: Enable in transaction NT_PPC_VSX " Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 06/28] powerpc, ptrace: Adapt gpr32_get, gpr32_set functions for transaction Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 07/28] powerpc, ptrace: Enable support for NT_PPC_CGPR Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 08/28] powerpc, ptrace: Enable support for NT_PPC_CFPR Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 09/28] powerpc, ptrace: Enable support for NT_PPC_CVMX Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 10/28] powerpc, ptrace: Enable support for NT_PPC_CVSX Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 11/28] powerpc, ptrace: Enable support for TM SPR state Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 12/28] powerpc, ptrace: Enable NT_PPC_TM_CTAR, NT_PPC_TM_CPPR, NT_PPC_TM_CDSCR Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 13/28] powerpc, ptrace: Enable support for NT_PPPC_TAR, NT_PPC_PPR, NT_PPC_DSCR Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 14/28] powerpc, ptrace: Enable support for EBB registers Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 15/28] selftests, powerpc: Move 'reg.h' file outside of 'ebb' sub directory Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 16/28] selftests, powerpc: Add more SPR numbers, TM & VMX instructions to 'reg.h' Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 17/28] selftests, powerpc: Add ptrace tests for EBB Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 18/28] selftests, powerpc: Add ptrace tests for GPR/FPR registers Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 19/28] selftests, powerpc: Add ptrace tests for GPR/FPR registers in TM Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 20/28] selftests, powerpc: Add ptrace tests for GPR/FPR registers in suspended TM Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 21/28] selftests, powerpc: Add ptrace tests for TAR, PPR, DSCR registers Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 22/28] selftests, powerpc: Add ptrace tests for TAR, PPR, DSCR in TM Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 23/28] selftests, powerpc: Add ptrace tests for TAR, PPR, DSCR in suspended TM Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 24/28] selftests, powerpc: Add ptrace tests for VSX, VMX registers Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 25/28] selftests, powerpc: Add ptrace tests for VSX, VMX registers in TM Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 26/28] selftests, powerpc: Add ptrace tests for VSX, VMX registers in suspended TM Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 27/28] selftests, powerpc: Add ptrace tests for TM SPR registers Anshuman Khandual
2015-05-19 15:08 ` [PATCH V8 28/28] selftests, powerpc: Add .gitignore file for ptrace executables Anshuman Khandual
2015-05-25 8:40 ` [PATCH V8 00/28] Add new powerpc specific ELF core notes Anshuman Khandual
2015-06-08 16:28 ` Ulrich Weigand
2015-10-08 13:45 ` Anshuman Khandual
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1432048104-4695-4-git-send-email-khandual@linux.vnet.ibm.com \
--to=khandual@linux.vnet.ibm.com \
--cc=Paul.Clothier@imgtec.com \
--cc=Ulrich.Weigand@de.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=avagin@openvz.org \
--cc=davej@redhat.com \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=emachado@linux.vnet.ibm.com \
--cc=james.hogan@imgtec.com \
--cc=kirjanov@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=mikey@neuling.org \
--cc=nacc@linux.vnet.ibm.com \
--cc=oleg@redhat.com \
--cc=palves@redhat.com \
--cc=peterz@infradead.org \
--cc=sam.bobroff@au1.ibm.com \
--cc=shuahkh@osg.samsung.com \
--cc=sukadev@linux.vnet.ibm.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).