[PATCH 13/17] powerpc: Add new transactional memory state to the signal context

2013-02-13 Thread Michael Neuling
This adds the new transactional memory archtected state to the signal context
in both 32 and 64 bit.

Signed-off-by: Matt Evans 
Signed-off-by: Michael Neuling 
---
 arch/powerpc/include/asm/reg.h  |1 +
 arch/powerpc/kernel/signal.h|8 +
 arch/powerpc/kernel/signal_32.c |  500 ++-
 arch/powerpc/kernel/signal_64.c |  337 +-
 4 files changed, 830 insertions(+), 16 deletions(-)

diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index eee2a60..7035e60 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -120,6 +120,7 @@
 #define TM_CAUSE_FAC_UNAV  0xfa
 #define TM_CAUSE_SYSCALL   0xf9 /* Persistent */
 #define TM_CAUSE_MISC  0xf6
+#define TM_CAUSE_SIGNAL0xf4
 
 #if defined(CONFIG_PPC_BOOK3S_64)
 #define MSR_64BIT  MSR_SF
diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h
index e00acb4..ec84c90 100644
--- a/arch/powerpc/kernel/signal.h
+++ b/arch/powerpc/kernel/signal.h
@@ -25,13 +25,21 @@ extern int handle_rt_signal32(unsigned long sig, struct 
k_sigaction *ka,
 
 extern unsigned long copy_fpr_to_user(void __user *to,
  struct task_struct *task);
+extern unsigned long copy_transact_fpr_to_user(void __user *to,
+  struct task_struct *task);
 extern unsigned long copy_fpr_from_user(struct task_struct *task,
void __user *from);
+extern unsigned long copy_transact_fpr_from_user(struct task_struct *task,
+void __user *from);
 #ifdef CONFIG_VSX
 extern unsigned long copy_vsx_to_user(void __user *to,
  struct task_struct *task);
+extern unsigned long copy_transact_vsx_to_user(void __user *to,
+  struct task_struct *task);
 extern unsigned long copy_vsx_from_user(struct task_struct *task,
void __user *from);
+extern unsigned long copy_transact_vsx_from_user(struct task_struct *task,
+void __user *from);
 #endif
 
 #ifdef CONFIG_PPC64
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 804e323..e4a88d3 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -43,6 +43,7 @@
 #include 
 #include 
 #include 
+#include 
 #ifdef CONFIG_PPC64
 #include "ppc32.h"
 #include 
@@ -293,6 +294,10 @@ long sys_sigaction(int sig, struct old_sigaction __user 
*act,
 struct sigframe {
struct sigcontext sctx; /* the sigcontext */
struct mcontext mctx;   /* all the register values */
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+   struct sigcontext sctx_transact;
+   struct mcontext mctx_transact;
+#endif
/*
 * Programs using the rs6000/xcoff abi can save up to 19 gp
 * regs and 18 fp regs below sp before decrementing it.
@@ -321,6 +326,9 @@ struct rt_sigframe {
struct siginfo info;
 #endif
struct ucontext uc;
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+   struct ucontext uc_transact;
+#endif
/*
 * Programs using the rs6000/xcoff abi can save up to 19 gp
 * regs and 18 fp regs below sp before decrementing it.
@@ -381,6 +389,61 @@ unsigned long copy_vsx_from_user(struct task_struct *task,
task->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i];
return 0;
 }
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+unsigned long copy_transact_fpr_to_user(void __user *to,
+ struct task_struct *task)
+{
+   double buf[ELF_NFPREG];
+   int i;
+
+   /* save FPR copy to local buffer then write to the thread_struct */
+   for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+   buf[i] = task->thread.TS_TRANS_FPR(i);
+   memcpy(&buf[i], &task->thread.transact_fpscr, sizeof(double));
+   return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
+}
+
+unsigned long copy_transact_fpr_from_user(struct task_struct *task,
+ void __user *from)
+{
+   double buf[ELF_NFPREG];
+   int i;
+
+   if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
+   return 1;
+   for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+   task->thread.TS_TRANS_FPR(i) = buf[i];
+   memcpy(&task->thread.transact_fpscr, &buf[i], sizeof(double));
+
+   return 0;
+}
+
+unsigned long copy_transact_vsx_to_user(void __user *to,
+ struct task_struct *task)
+{
+   double buf[ELF_NVSRHALFREG];
+   int i;
+
+   /* save FPR copy to local buffer then write to the thread_struct */
+   for (i = 0; i < ELF_NVSRHALFREG; i++)
+   buf[i] = task->thread.transact_fpr[i][TS_VSRLOWOFFSET];
+   return __copy_to_user(to, buf, ELF_NVSRHA

[PATCH 13/17] powerpc: Add new transactional memory state to the signal context

2013-02-12 Thread Michael Neuling
This adds the new transactional memory archtected state to the signal context
in both 32 and 64 bit.

Signed-off-by: Matt Evans 
Signed-off-by: Michael Neuling 
---
 arch/powerpc/include/asm/reg.h  |1 +
 arch/powerpc/kernel/signal.h|8 +
 arch/powerpc/kernel/signal_32.c |  500 ++-
 arch/powerpc/kernel/signal_64.c |  337 +-
 4 files changed, 830 insertions(+), 16 deletions(-)

diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index eee2a60..7035e60 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -120,6 +120,7 @@
 #define TM_CAUSE_FAC_UNAV  0xfa
 #define TM_CAUSE_SYSCALL   0xf9 /* Persistent */
 #define TM_CAUSE_MISC  0xf6
+#define TM_CAUSE_SIGNAL0xf4
 
 #if defined(CONFIG_PPC_BOOK3S_64)
 #define MSR_64BIT  MSR_SF
diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h
index e00acb4..ec84c90 100644
--- a/arch/powerpc/kernel/signal.h
+++ b/arch/powerpc/kernel/signal.h
@@ -25,13 +25,21 @@ extern int handle_rt_signal32(unsigned long sig, struct 
k_sigaction *ka,
 
 extern unsigned long copy_fpr_to_user(void __user *to,
  struct task_struct *task);
+extern unsigned long copy_transact_fpr_to_user(void __user *to,
+  struct task_struct *task);
 extern unsigned long copy_fpr_from_user(struct task_struct *task,
void __user *from);
+extern unsigned long copy_transact_fpr_from_user(struct task_struct *task,
+void __user *from);
 #ifdef CONFIG_VSX
 extern unsigned long copy_vsx_to_user(void __user *to,
  struct task_struct *task);
+extern unsigned long copy_transact_vsx_to_user(void __user *to,
+  struct task_struct *task);
 extern unsigned long copy_vsx_from_user(struct task_struct *task,
void __user *from);
+extern unsigned long copy_transact_vsx_from_user(struct task_struct *task,
+void __user *from);
 #endif
 
 #ifdef CONFIG_PPC64
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 804e323..e4a88d3 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -43,6 +43,7 @@
 #include 
 #include 
 #include 
+#include 
 #ifdef CONFIG_PPC64
 #include "ppc32.h"
 #include 
@@ -293,6 +294,10 @@ long sys_sigaction(int sig, struct old_sigaction __user 
*act,
 struct sigframe {
struct sigcontext sctx; /* the sigcontext */
struct mcontext mctx;   /* all the register values */
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+   struct sigcontext sctx_transact;
+   struct mcontext mctx_transact;
+#endif
/*
 * Programs using the rs6000/xcoff abi can save up to 19 gp
 * regs and 18 fp regs below sp before decrementing it.
@@ -321,6 +326,9 @@ struct rt_sigframe {
struct siginfo info;
 #endif
struct ucontext uc;
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+   struct ucontext uc_transact;
+#endif
/*
 * Programs using the rs6000/xcoff abi can save up to 19 gp
 * regs and 18 fp regs below sp before decrementing it.
@@ -381,6 +389,61 @@ unsigned long copy_vsx_from_user(struct task_struct *task,
task->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i];
return 0;
 }
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+unsigned long copy_transact_fpr_to_user(void __user *to,
+ struct task_struct *task)
+{
+   double buf[ELF_NFPREG];
+   int i;
+
+   /* save FPR copy to local buffer then write to the thread_struct */
+   for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+   buf[i] = task->thread.TS_TRANS_FPR(i);
+   memcpy(&buf[i], &task->thread.transact_fpscr, sizeof(double));
+   return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
+}
+
+unsigned long copy_transact_fpr_from_user(struct task_struct *task,
+ void __user *from)
+{
+   double buf[ELF_NFPREG];
+   int i;
+
+   if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
+   return 1;
+   for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+   task->thread.TS_TRANS_FPR(i) = buf[i];
+   memcpy(&task->thread.transact_fpscr, &buf[i], sizeof(double));
+
+   return 0;
+}
+
+unsigned long copy_transact_vsx_to_user(void __user *to,
+ struct task_struct *task)
+{
+   double buf[ELF_NVSRHALFREG];
+   int i;
+
+   /* save FPR copy to local buffer then write to the thread_struct */
+   for (i = 0; i < ELF_NVSRHALFREG; i++)
+   buf[i] = task->thread.transact_fpr[i][TS_VSRLOWOFFSET];
+   return __copy_to_user(to, buf, ELF_NVSRHA

[PATCH 13/17] powerpc: Add new transactional memory state to the signal context

2013-01-17 Thread Michael Neuling
This adds the new transactional memory archtected state to the signal context
in both 32 and 64 bit.

Signed-off-by: Matt Evans 
Signed-off-by: Michael Neuling 
---
 arch/powerpc/include/asm/reg.h  |1 +
 arch/powerpc/kernel/signal.h|8 +
 arch/powerpc/kernel/signal_32.c |  500 ++-
 arch/powerpc/kernel/signal_64.c |  337 +-
 4 files changed, 830 insertions(+), 16 deletions(-)

diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index d19581ae4..41894dc 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -120,6 +120,7 @@
 #define TM_CAUSE_FAC_UNAV  0xfa
 #define TM_CAUSE_SYSCALL   0xf9 /* Persistent */
 #define TM_CAUSE_MISC  0xf6
+#define TM_CAUSE_SIGNAL0xf4
 
 #if defined(CONFIG_PPC_BOOK3S_64)
 #define MSR_64BIT  MSR_SF
diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h
index e00acb4..ec84c90 100644
--- a/arch/powerpc/kernel/signal.h
+++ b/arch/powerpc/kernel/signal.h
@@ -25,13 +25,21 @@ extern int handle_rt_signal32(unsigned long sig, struct 
k_sigaction *ka,
 
 extern unsigned long copy_fpr_to_user(void __user *to,
  struct task_struct *task);
+extern unsigned long copy_transact_fpr_to_user(void __user *to,
+  struct task_struct *task);
 extern unsigned long copy_fpr_from_user(struct task_struct *task,
void __user *from);
+extern unsigned long copy_transact_fpr_from_user(struct task_struct *task,
+void __user *from);
 #ifdef CONFIG_VSX
 extern unsigned long copy_vsx_to_user(void __user *to,
  struct task_struct *task);
+extern unsigned long copy_transact_vsx_to_user(void __user *to,
+  struct task_struct *task);
 extern unsigned long copy_vsx_from_user(struct task_struct *task,
void __user *from);
+extern unsigned long copy_transact_vsx_from_user(struct task_struct *task,
+void __user *from);
 #endif
 
 #ifdef CONFIG_PPC64
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 804e323..9dc2472 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -43,6 +43,7 @@
 #include 
 #include 
 #include 
+#include 
 #ifdef CONFIG_PPC64
 #include "ppc32.h"
 #include 
@@ -293,6 +294,10 @@ long sys_sigaction(int sig, struct old_sigaction __user 
*act,
 struct sigframe {
struct sigcontext sctx; /* the sigcontext */
struct mcontext mctx;   /* all the register values */
+#ifdef CONFIG_TRANSACTIONAL_MEM
+   struct sigcontext sctx_transact;
+   struct mcontext mctx_transact;
+#endif
/*
 * Programs using the rs6000/xcoff abi can save up to 19 gp
 * regs and 18 fp regs below sp before decrementing it.
@@ -321,6 +326,9 @@ struct rt_sigframe {
struct siginfo info;
 #endif
struct ucontext uc;
+#ifdef CONFIG_TRANSACTIONAL_MEM
+   struct ucontext uc_transact;
+#endif
/*
 * Programs using the rs6000/xcoff abi can save up to 19 gp
 * regs and 18 fp regs below sp before decrementing it.
@@ -381,6 +389,61 @@ unsigned long copy_vsx_from_user(struct task_struct *task,
task->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i];
return 0;
 }
+
+#ifdef CONFIG_TRANSACTIONAL_MEM
+unsigned long copy_transact_fpr_to_user(void __user *to,
+ struct task_struct *task)
+{
+   double buf[ELF_NFPREG];
+   int i;
+
+   /* save FPR copy to local buffer then write to the thread_struct */
+   for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+   buf[i] = task->thread.TS_TRANS_FPR(i);
+   memcpy(&buf[i], &task->thread.transact_fpscr, sizeof(double));
+   return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
+}
+
+unsigned long copy_transact_fpr_from_user(struct task_struct *task,
+ void __user *from)
+{
+   double buf[ELF_NFPREG];
+   int i;
+
+   if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
+   return 1;
+   for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+   task->thread.TS_TRANS_FPR(i) = buf[i];
+   memcpy(&task->thread.transact_fpscr, &buf[i], sizeof(double));
+
+   return 0;
+}
+
+unsigned long copy_transact_vsx_to_user(void __user *to,
+ struct task_struct *task)
+{
+   double buf[ELF_NVSRHALFREG];
+   int i;
+
+   /* save FPR copy to local buffer then write to the thread_struct */
+   for (i = 0; i < ELF_NVSRHALFREG; i++)
+   buf[i] = task->thread.transact_fpr[i][TS_VSRLOWOFFSET];
+   return __copy_to_user(to, buf, ELF_NVSRHALFREG * si