summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/ptrace.c
diff options
context:
space:
mode:
authorMadhavan Srinivasan2017-08-20 19:58:24 +0200
committerMichael Ellerman2018-01-19 12:36:54 +0100
commita8a4b03ab95f3e99196b0a4dd40804620ea77e74 (patch)
tree210d0a819712c7301180bdf862d56f09d41bb12c /arch/powerpc/kernel/ptrace.c
parentpowerpc/64s: Fix ps3 build error due to tlbiel_all() (diff)
downloadkernel-qcow2-linux-a8a4b03ab95f3e99196b0a4dd40804620ea77e74.tar.gz
kernel-qcow2-linux-a8a4b03ab95f3e99196b0a4dd40804620ea77e74.tar.xz
kernel-qcow2-linux-a8a4b03ab95f3e99196b0a4dd40804620ea77e74.zip
powerpc: Hard wire PT_SOFTE value to 1 in ptrace & signals
We have always had softe in pt_regs, and accessible via PT_SOFTE, even though it is not userspace state. The value userspace sees should always be 1, because we should never be in userspace with interrupts soft disabled. In a subsequent patch we will be changing the semantics of the kernel softe value, so hard wire the value to 1 to retain the existing semantics. As far as we know nothing ever looks at it, but better safe than sorry. Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> [mpe: Split out of larger patch, write change log] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/kernel/ptrace.c')
-rw-r--r--arch/powerpc/kernel/ptrace.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index f52ad5bb7109..bd2c49475473 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -283,6 +283,18 @@ int ptrace_get_reg(struct task_struct *task, int regno, unsigned long *data)
if (regno == PT_DSCR)
return get_user_dscr(task, data);
+#ifdef CONFIG_PPC64
+ /*
+ * softe copies paca->soft_enabled variable state. Since soft_enabled is
+ * no more used as a flag, lets force usr to alway see the softe value as 1
+ * which means interrupts are not soft disabled.
+ */
+ if (regno == PT_SOFTE) {
+ *data = 1;
+ return 0;
+ }
+#endif
+
if (regno < (sizeof(struct pt_regs) / sizeof(unsigned long))) {
*data = ((unsigned long *)task->thread.regs)[regno];
return 0;