Received: by 10.223.164.202 with SMTP id h10csp10406wrb; Mon, 6 Nov 2017 01:30:30 -0800 (PST) X-Google-Smtp-Source: ABhQp+RiZxhUGTl4fg/ZHDCnBTa8LAE2PPUWZnJV11tY5rjcEInNQT1A9s8K2zBqVrnDbzLAc5mB X-Received: by 10.98.62.142 with SMTP id y14mr16238492pfj.83.1509960630312; Mon, 06 Nov 2017 01:30:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1509960630; cv=none; d=google.com; s=arc-20160816; b=wFoq2/F/8lyLEGd2ty1sEn3Y7Mfh8fmCJIXEs62NyNPNO3elCsW3zKXUl8O4/3buAv 07OfSRfQsnkXdAk98eum7kJKUt/Ia2JA/YiIi+/qjuYdmvfj6CLPpE21xD3/VvvqtHmt m4JNWFy5PxdjCly+xvPVrv4DFKeM260X6QM6A/Ls0yLQRTGCyCulE3x3caQb+jTCxhhJ KTb2FHiggAP/Tx6w3RMDFmIjZGBG4c23gywArmSgba8OBPZy10IvLAL7yzMEbiKp+B6F yAbXTc6UGB0+VFhNOtFFRjYG3pmSBZ9MWoxFCGoA9QNfgW6gqfLJlx7Y+SzuNvCea6dg 75cg== 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=V/NXERedqMGafAluOJtEWAkW5dQnd96U43UbsP7NtE4=; b=KNIMBxw+ocNBeqZZPvfppXq1m4Eni40Hl691PHvg9ZLb+xmhDZRKg/nHCCIW5l37Iu iIV716wE/dYg+zUFIHBOKMScRWw7D5oE9DDdLR0f3d42YtIDfXV2ER7se9o5/G8Ozbnx wEy5lg4Azc32yToo0+EAoTH3bX9NkdxcLKmrJW63LHtBiaTEuPcsYhkgG0bxnn8Trl9+ 3NQTKy88SyQb92XtyQwwKQoub3Ojy+UC/0OYGnQOtvXPzatQTvl6wz0otbdZ3hqcsOZN lH+wO0HuJZpsHmIT2PSoFlXIWA5WQrBEpKJsoY25Qsl6pTmRzplfdzUNawV8Cp+yuo5Y fCZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=MNIJ1VQh; 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 e77si11978138pfm.110.2017.11.06.01.30.16; Mon, 06 Nov 2017 01:30:30 -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=MNIJ1VQh; 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 S1752398AbdKFI72 (ORCPT + 98 others); Mon, 6 Nov 2017 03:59:28 -0500 Received: from mail-qt0-f196.google.com ([209.85.216.196]:52882 "EHLO mail-qt0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752344AbdKFI7X (ORCPT ); Mon, 6 Nov 2017 03:59:23 -0500 Received: by mail-qt0-f196.google.com with SMTP id 31so9994654qtz.9; Mon, 06 Nov 2017 00:59:22 -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=V/NXERedqMGafAluOJtEWAkW5dQnd96U43UbsP7NtE4=; b=MNIJ1VQhQwCjV/b1Dp6zrY5KFZZmVHnXbCjnzjq8DDXgUBq+P+AfeFNomdpWRjT0Wy KteBbOaJYQwyTifTr2p2ARKcpKhU9OlDkwULAMtC5MRlG2IUgNGDebFO6etZ3pvFbSTV 882bQFfWVfj3qanbHH/5SwLOEGS2H8HGKYoIvjgRA1BccVe8M71xHfblFKCpPL2lIsFG 7EieLaxAPosR1OHZ1z4ZuXV/JtXCB6O8BukXfAqEPNxCml8SLqbKkzcjqijPGANg2nuh khFfdVN6G9jbnxOLHObHXZcOWrpDejM37aQddTEWIvaY1kycbAbw2a2Ku5HHGcO6RI3S Jpzg== 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=V/NXERedqMGafAluOJtEWAkW5dQnd96U43UbsP7NtE4=; b=fTfmB4XOS469LuqK+vgXzyexLnBxHDNyoP5M/SKLxWqmViu6guPIVNnSnFJKnMmw8D PhuQXim5chvr8UghWzTK8RJ1inzoQqY/0w+LaKvtj9kML6gnAmhr3HAqzmDiJugcgDLY jDV1jgn65FigKphzEGHqHOrELvZf7s8HqSaQRwig4JshusWZ4ovNBXZMOo4uPem+u3Dl 6Y4EcNrFsS0kSW1ssUln732O+SvnN4FsDQJckXCgd3ssbNSJwokckWfLfRvFI6QjBLJG gKEE2q2MJzvCQ5hMkDHfTEY/6ncjAeNkWX20bpGSCL7UUyeCtGtqzAnqEvrHSEMi4sRa R/1Q== X-Gm-Message-State: AMCzsaVw0+3hc/IMduyz/7gbT9Mxe7F/isYyFNGboqOOIH7N81xaailW 41BjYEvcyYWLgbjguVtshDI= X-Received: by 10.200.8.74 with SMTP id x10mr21597094qth.31.1509958761978; Mon, 06 Nov 2017 00:59:21 -0800 (PST) Received: from localhost.localdomain (50-39-103-96.bvtn.or.frontiernet.net. [50.39.103.96]) by smtp.gmail.com with ESMTPSA id r26sm8001094qki.42.2017.11.06.00.59.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 Nov 2017 00:59:21 -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 v9 22/51] powerpc/ptrace: Add memory protection key regset Date: Mon, 6 Nov 2017 00:57:14 -0800 Message-Id: <1509958663-18737-23-git-send-email-linuxram@us.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1509958663-18737-1-git-send-email-linuxram@us.ibm.com> References: <1509958663-18737-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 3437a50..9ee4731 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); +} + static inline void pkey_mm_init(struct mm_struct *mm) { if (static_branch_likely(&pkey_disabled)) 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 ed1c39b..f449dc5 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -291,6 +291,13 @@ void _exception_pkey(int signr, struct pt_regs *regs, int code, unsigned long ad 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 c58627c..c017818 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 From 1583365134760703369@xxx Tue Nov 07 00:31:02 +0000 2017 X-GM-THRID: 1583365134760703369 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread