[PATCH 23/25] powerpc: Deliver SEGV signal on pkey violation
Ram Pai
linuxram at us.ibm.com
Sat Sep 9 08:45:11 AEST 2017
The value of the pkey, whose protection got violated,
is made available in si_pkey field of the siginfo structure.
Also keep the thread's pkey-register fields up2date.
Signed-off-by: Ram Pai <linuxram at us.ibm.com>
---
arch/powerpc/kernel/traps.c | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index ec74e20..f2a310d 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -20,6 +20,7 @@
#include <linux/sched/debug.h>
#include <linux/kernel.h>
#include <linux/mm.h>
+#include <linux/pkeys.h>
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/ptrace.h>
@@ -265,6 +266,15 @@ void user_single_step_siginfo(struct task_struct *tsk,
info->si_addr = (void __user *)regs->nip;
}
+#ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS
+static void fill_sig_info_pkey(int si_code, siginfo_t *info, unsigned long addr)
+{
+ if (info->si_signo != SIGSEGV || si_code != SEGV_PKUERR)
+ return;
+ info->si_pkey = get_paca()->paca_pkey;
+}
+#endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */
+
void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
{
siginfo_t info;
@@ -292,6 +302,18 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
info.si_signo = signr;
info.si_code = code;
info.si_addr = (void __user *) addr;
+
+#ifdef CONFIG_PPC64_MEMORY_PROTECTION_KEYS
+ /*
+ * update the thread's pkey related fields.
+ * core-dump handlers and other sub-systems
+ * depend on those values.
+ */
+ thread_pkey_regs_save(¤t->thread);
+ /* update the violated-key value */
+ fill_sig_info_pkey(code, &info, addr);
+#endif /* CONFIG_PPC64_MEMORY_PROTECTION_KEYS */
+
force_sig_info(signr, &info, current);
}
--
1.7.1
More information about the Linuxppc-dev
mailing list