Received: by 10.223.176.46 with SMTP id f43csp308829wra; Thu, 18 Jan 2018 17:56:58 -0800 (PST) X-Google-Smtp-Source: ACJfBosQ0avxBoVVdcOSRrA8GNkm4LIOkT+3U87Z9BziQgLAUeGxN4e6mJMKX9//rewSRn8gzuWf X-Received: by 10.98.228.5 with SMTP id r5mr21013177pfh.193.1516327018781; Thu, 18 Jan 2018 17:56:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516327018; cv=none; d=google.com; s=arc-20160816; b=cA74BryBrZl3lsjTol3GNz42Pxai6ZUFhqDNj/RB6vZZclEPtUeeJKyfF8G2HiZqRG vVHbb4zYQGjNtO2zR3NRDPMx1PuXQRzpPuJLib9eBYdHvCHfUEUSxkI0YZC42lU3955s UoBYvtGLC6+NxfhN/MeGgZ6xGB8eSRejhyxsfFz2KET4y2KmAAsPxS0d0kb6tIoHKLZZ NFXtWLG8Jfg/FTapvkjwejActeSE5w/2rwWN5TvkjORqf/3IC2rSihYYkioO3LtbDVLU 552SBlhu14EWJiyzIF6oO/Dj5cUf1WOeRL/yd20r7U7v5tjAz/3g2DxafJHpF2irgmMT /vhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=/f02sa2fpkbXSeSFTie1Ex2amzwvVku8dBpNR9IUc/4=; b=BS3Kr9Qc3jNGu+wDsqV3bWQtT5Tm2diH/XxDevbto5WQsb/W+HOIA76HPOrgYRwj9N 46pSHoANOUyAivETmKJbflH6RWcrHopU6IWVcKPhxiVzmiwRXIaYC/YC5uiAJ+cm0hwK yx9ihpR7hNWxV89qbDhnLq9OuhvhBEodM+Sa1S3qv+AILd0rRJpyB34lXWSyxlnC3c7n 5aF3PKgNqMKYx0VEUZN05v/6HvxXzfZQrHmT7rD0/meSuSsN09nHJx41dHzMisx5aaw4 JIWtf8SNfhbyDaoiCIcbxE2q4wniBTC/3iKTMKIOX8RhdYE1/csfrwcyvskzDScEDthj kPVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=SAynujyW; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u74si7157552pgc.445.2018.01.18.17.56.44; Thu, 18 Jan 2018 17:56:58 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=SAynujyW; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933035AbeASBzo (ORCPT + 99 others); Thu, 18 Jan 2018 20:55:44 -0500 Received: from mail-qt0-f193.google.com ([209.85.216.193]:37938 "EHLO mail-qt0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755778AbeASBwr (ORCPT ); Thu, 18 Jan 2018 20:52:47 -0500 Received: by mail-qt0-f193.google.com with SMTP id z10so444665qti.5; Thu, 18 Jan 2018 17:52:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=/f02sa2fpkbXSeSFTie1Ex2amzwvVku8dBpNR9IUc/4=; b=SAynujyWNLSSmx9wIIiT+5KnnROxnUxcPKH34qPPMFF+4xL2SFVkuDQWQLLVqUSbiF yv0JjU3LTLwvh8gVUS5CdHPuDuRlvijd3NPOIoYtMc06cZIFUh3kO4y+fP/rYgqLaRkY tnFljRSPIWkQH3xfv3awmdhAKebarsfPzPf8ydP9CvCNWHxCCOx64M33cP2OBaqELddC kpzWe1zklNULd2pv8pDmoKQrxRO1E+3uFVEAZldOvpNjotS6cXYWYkowzLyYNFbe6qt7 73F7uV8kAm1ceV0WCUr5VQfrIPYZQaueGjwce2Lksf1YzKMnKSgRuUYaONTMkK4HRD+Z m0+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=/f02sa2fpkbXSeSFTie1Ex2amzwvVku8dBpNR9IUc/4=; b=T9AyBEmT5ygZhcbqYsVr66GcRgWo3GkO4S4+n4X0Y9lYwj/IrQvHt1ooUXKIffLFKs 8SBdql+fY1+6vOrfTk8CTusiGs1eNV2BK5lgShi8ClfLDbFCwDIa49Od8ZaCzK4GXH5R hbQiuxVyKW1HXQHj5w69bBFnT2ACCYFtk2uUwMejgX4JrA7bwkHW0oz7EzyNkFkojPjb QeTjvYGkx8OLwwwcByNMZ4wp0bl3VpxDnRGVQ/vdNQMmyfd0ebIcLnXqJZP8r4KuI2FC UGgpXoHBjRrZEYi+ml76+ngPX13/a/aKf9craX0roaU2tIDWaKCFcaOptOXPPZd1m+Zt I0+g== X-Gm-Message-State: AKwxytd95F0zkWfQCbbigJDp2JzbnSajt0nEd+Wd+fmPb+w1snzaz2lC n+R73tp58grKiGFDFVNFwJQ= X-Received: by 10.55.12.4 with SMTP id 4mr47755445qkm.158.1516326765942; Thu, 18 Jan 2018 17:52:45 -0800 (PST) Received: from localhost.localdomain (50-39-100-161.bvtn.or.frontiernet.net. [50.39.100.161]) by smtp.gmail.com with ESMTPSA id c127sm5483161qke.78.2018.01.18.17.52.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 17:52:45 -0800 (PST) From: Ram Pai To: mpe@ellerman.id.au, mingo@redhat.com, akpm@linux-foundation.org, corbet@lwn.net, arnd@arndb.de Cc: linuxppc-dev@lists.ozlabs.org, linux-mm@kvack.org, x86@kernel.org, linux-arch@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, dave.hansen@intel.com, benh@kernel.crashing.org, paulus@samba.org, khandual@linux.vnet.ibm.com, aneesh.kumar@linux.vnet.ibm.com, bsingharora@gmail.com, hbabu@us.ibm.com, mhocko@kernel.org, bauerman@linux.vnet.ibm.com, ebiederm@xmission.com, linuxram@us.ibm.com Subject: [PATCH v10 22/27] powerpc/ptrace: Add memory protection key regset Date: Thu, 18 Jan 2018 17:50:43 -0800 Message-Id: <1516326648-22775-23-git-send-email-linuxram@us.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1516326648-22775-1-git-send-email-linuxram@us.ibm.com> References: <1516326648-22775-1-git-send-email-linuxram@us.ibm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thiago Jung Bauermann The AMR/IAMR/UAMOR are part of the program context. Allow it to be accessed via ptrace and through core files. Signed-off-by: Ram Pai Signed-off-by: Thiago Jung Bauermann --- arch/powerpc/include/asm/pkeys.h | 5 +++ arch/powerpc/include/uapi/asm/elf.h | 1 + arch/powerpc/kernel/ptrace.c | 66 +++++++++++++++++++++++++++++++++++ arch/powerpc/kernel/traps.c | 7 ++++ include/uapi/linux/elf.h | 1 + 5 files changed, 80 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/include/asm/pkeys.h b/arch/powerpc/include/asm/pkeys.h index 7c45a40..0c480b2 100644 --- a/arch/powerpc/include/asm/pkeys.h +++ b/arch/powerpc/include/asm/pkeys.h @@ -213,6 +213,11 @@ static inline int arch_set_user_pkey_access(struct task_struct *tsk, int pkey, return __arch_set_user_pkey_access(tsk, pkey, init_val); } +static inline bool arch_pkeys_enabled(void) +{ + return !static_branch_likely(&pkey_disabled); +} + extern void pkey_mm_init(struct mm_struct *mm); extern void thread_pkey_regs_save(struct thread_struct *thread); extern void thread_pkey_regs_restore(struct thread_struct *new_thread, diff --git a/arch/powerpc/include/uapi/asm/elf.h b/arch/powerpc/include/uapi/asm/elf.h index 5f201d4..860c592 100644 --- a/arch/powerpc/include/uapi/asm/elf.h +++ b/arch/powerpc/include/uapi/asm/elf.h @@ -97,6 +97,7 @@ #define ELF_NTMSPRREG 3 /* include tfhar, tfiar, texasr */ #define ELF_NEBB 3 /* includes ebbrr, ebbhr, bescr */ #define ELF_NPMU 5 /* includes siar, sdar, sier, mmcr2, mmcr0 */ +#define ELF_NPKEY 3 /* includes amr, iamr, uamor */ typedef unsigned long elf_greg_t64; typedef elf_greg_t64 elf_gregset_t64[ELF_NGREG]; diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index f52ad5b..3718a04 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -1775,6 +1776,61 @@ static int pmu_set(struct task_struct *target, return ret; } #endif + +#ifdef CONFIG_PPC_MEM_KEYS +static int pkey_active(struct task_struct *target, + const struct user_regset *regset) +{ + if (!arch_pkeys_enabled()) + return -ENODEV; + + return regset->n; +} + +static int pkey_get(struct task_struct *target, + const struct user_regset *regset, + unsigned int pos, unsigned int count, + void *kbuf, void __user *ubuf) +{ + BUILD_BUG_ON(TSO(amr) + sizeof(unsigned long) != TSO(iamr)); + BUILD_BUG_ON(TSO(iamr) + sizeof(unsigned long) != TSO(uamor)); + + if (!arch_pkeys_enabled()) + return -ENODEV; + + return user_regset_copyout(&pos, &count, &kbuf, &ubuf, + &target->thread.amr, 0, + ELF_NPKEY * sizeof(unsigned long)); +} + +static int pkey_set(struct task_struct *target, + const struct user_regset *regset, + unsigned int pos, unsigned int count, + const void *kbuf, const void __user *ubuf) +{ + u64 new_amr; + int ret; + + if (!arch_pkeys_enabled()) + return -ENODEV; + + /* Only the AMR can be set from userspace */ + if (pos != 0 || count != sizeof(new_amr)) + return -EINVAL; + + ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, + &new_amr, 0, sizeof(new_amr)); + if (ret) + return ret; + + /* UAMOR determines which bits of the AMR can be set from userspace. */ + target->thread.amr = (new_amr & target->thread.uamor) | + (target->thread.amr & ~target->thread.uamor); + + return 0; +} +#endif /* CONFIG_PPC_MEM_KEYS */ + /* * These are our native regset flavors. */ @@ -1809,6 +1865,9 @@ enum powerpc_regset { REGSET_EBB, /* EBB registers */ REGSET_PMR, /* Performance Monitor Registers */ #endif +#ifdef CONFIG_PPC_MEM_KEYS + REGSET_PKEY, /* AMR register */ +#endif }; static const struct user_regset native_regsets[] = { @@ -1914,6 +1973,13 @@ enum powerpc_regset { .active = pmu_active, .get = pmu_get, .set = pmu_set }, #endif +#ifdef CONFIG_PPC_MEM_KEYS + [REGSET_PKEY] = { + .core_note_type = NT_PPC_PKEY, .n = ELF_NPKEY, + .size = sizeof(u64), .align = sizeof(u64), + .active = pkey_active, .get = pkey_get, .set = pkey_set + }, +#endif }; static const struct user_regset_view user_ppc_native_view = { diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 3753498..c42ca5b 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -292,6 +292,13 @@ void _exception_pkey(int signr, struct pt_regs *regs, int code, local_irq_enable(); current->thread.trap_nr = code; + + /* + * Save all the pkey registers AMR/IAMR/UAMOR. Eg: Core dumps need + * to capture the content, if the task gets killed. + */ + thread_pkey_regs_save(¤t->thread); + memset(&info, 0, sizeof(info)); info.si_signo = signr; info.si_code = code; diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h index bb68369..3bf73fb 100644 --- a/include/uapi/linux/elf.h +++ b/include/uapi/linux/elf.h @@ -396,6 +396,7 @@ #define NT_PPC_TM_CTAR 0x10d /* TM checkpointed Target Address Register */ #define NT_PPC_TM_CPPR 0x10e /* TM checkpointed Program Priority Register */ #define NT_PPC_TM_CDSCR 0x10f /* TM checkpointed Data Stream Control Register */ +#define NT_PPC_PKEY 0x110 /* Memory Protection Keys registers */ #define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ #define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ #define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ -- 1.7.1