From patchwork Tue Nov 3 19:46:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 7546711 Return-Path: X-Original-To: patchwork-linux-fsdevel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 49181BEEA4 for ; Tue, 3 Nov 2015 19:51:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2A67C20431 for ; Tue, 3 Nov 2015 19:51:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CA8F8206F3 for ; Tue, 3 Nov 2015 19:51:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756006AbbKCTvG (ORCPT ); Tue, 3 Nov 2015 14:51:06 -0500 Received: from mail-pa0-f42.google.com ([209.85.220.42]:36558 "EHLO mail-pa0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932470AbbKCTqw (ORCPT ); Tue, 3 Nov 2015 14:46:52 -0500 Received: by pacdm15 with SMTP id dm15so2820266pac.3 for ; Tue, 03 Nov 2015 11:46:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dabbelt_com.20150623.gappssmtp.com; s=20150623; h=from:to:to:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc :cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:subject :date:message-id:in-reply-to:references; bh=qM2fSWEqjbwtB388B1QTQr/XPUd1T50Jc+hNT0FV/yw=; b=uLQeYPnBPstGvkh7sGCeO/m+Ni6bS1MS9aebEpjmQ4jDk3a0PnOAzi32qlFqfFjljp HPLkIlCGVAWeqAgGuh1I9EZZwJ1rc2lanj6IbvOZpjqnN9GDb0ldTuchUojmGeDxHgUq jcBbxZYiBww8czWU2WCN/dofQU3UhyVHwQ0WdX3g4MC0O/YvWQM001BYUnxCKJ5Q87O8 XZhtgiQvtFUygfkIXr9ijgeZSFAfQJOF/pB6HmEE14EvC1xQ1+pJFCkPOrswAhoDPrM5 6xWLReiOk6MUjfbKcMRn5pehD/3u0qqpMLDRpKij5Hk4zEYKuNS1YW4zt2eMnkmUHkoH gzZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:to:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc :cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc:cc :cc:cc:cc:cc:subject:date:message-id:in-reply-to:references; bh=qM2fSWEqjbwtB388B1QTQr/XPUd1T50Jc+hNT0FV/yw=; b=F0Ts0Y2LQdBb0Nc5QIsrBIIxXEhCpf570swGOBxugTaQEw3NAGwibyHktsI5Ydxa3P XyrOKdFYoPV9vrHyY1t8Qpez6mNqLH5xpNZV4F/sOErlt+U6hKjVYDbHBlayo56rirQu DBkaIVI2OsEQvHi+kbq/UlOf5MgFGRJeyO3hsZuH/WwfZP0LBd+RAb3+KN1Bq/PsG0ZE sl4gN956ZAHXa6X97n8cbaIbbWFX3olW2aCmI92uf7/PWCZlVRvwBO3mT30hMwOpImza cAs/Y6nE4e+ltn9qyVejYzUFFjcd4c06dRcekl3q/Uee3S54oAH/f3px4i1CTYmd5ZeC dX3w== X-Gm-Message-State: ALoCoQlUznat9Q2IRNNwi+Dj1ixfiSv+WWMHFHhPSq/EOu35HU26ihQBJrbZTCr5KRrefwt+jgK6 X-Received: by 10.68.135.132 with SMTP id ps4mr35823188pbb.74.1446580012363; Tue, 03 Nov 2015 11:46:52 -0800 (PST) Received: from localhost (dhcp-39-103.EECS.Berkeley.EDU. [128.32.39.103]) by smtp.gmail.com with ESMTPSA id ey17sm31058412pac.26.2015.11.03.11.46.51 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Nov 2015 11:46:51 -0800 (PST) From: Palmer Dabbelt To: arnd@arndb.de To: dhowells@redhat.com Cc: viro@zeniv.linux.org.uk Cc: ast@plumgrid.com Cc: aishchuk@linux.vnet.ibm.com Cc: aarcange@redhat.com Cc: akpm@linux-foundation.org Cc: luto@kernel.org Cc: acme@kernel.org Cc: bhe@redhat.com Cc: 3chas3@gmail.com Cc: chris@zankel.net Cc: dave@sr71.net Cc: dyoung@redhat.com Cc: drysdale@google.com Cc: davem@davemloft.net Cc: ebiederm@xmission.com Cc: geoff@infradead.org Cc: gregkh@linuxfoundation.org Cc: hpa@zytor.com Cc: mingo@kernel.org Cc: iulia.manda21@gmail.com Cc: plagnioj@jcrosoft.com Cc: jikos@kernel.org Cc: josh@joshtriplett.org Cc: kexec@lists.infradead.org Cc: linux-api@vger.kernel.org Cc: linux-arch@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-xtensa@linux-xtensa.org Cc: mathieu.desnoyers@efficios.com Cc: jcmvbkbc@gmail.com Cc: paulmck@linux.vnet.ibm.com Cc: a.p.zijlstra@chello.nl Cc: tglx@linutronix.de Cc: tomi.valkeinen@ti.com Cc: vgoyal@redhat.com Cc: x86@kernel.org Cc: Palmer Dabbelt Subject: [PATCH 05/13] Split FDPIC "struct elf_prstatus" to "struct elf_fdpic_prstatus" Date: Tue, 3 Nov 2015 11:46:26 -0800 Message-Id: <1446579994-9937-6-git-send-email-palmer@dabbelt.com> X-Mailer: git-send-email 2.4.10 In-Reply-To: <1446579994-9937-1-git-send-email-palmer@dabbelt.com> References: <1442271047-4908-1-git-send-email-palmer@dabbelt.com> <1446579994-9937-1-git-send-email-palmer@dabbelt.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This is a pretty big change that I haven't tested any, which worries me a lot. The general idea here is that "struct elf_prstatus" can be visible to userspace (from ) " Generic ptrace interface that exports the architecture specific regsets using the corresponding NT_* types (which are also used in the core dump). Please note that the NT_PRSTATUS note type in a core dump contains a full 'struct elf_prstatus'. But the user_regset for NT_PRSTATUS contains just the elf_gregset_t that is the pr_reg field of 'struct elf_prstatus'. For all the other user_regset flavors, the user_regset layout and the ELF core dump note payload are exactly the same layout. " so it shouldn't have an "#ifdef CONFIG_" in there. This splits the structure into two different structures, one still named "struct elf_prstatus", and one for ELF FDPIC that is named "struct elf_fdpic_prstatus" -- the idea here is that most users are standard ELF, so that's the name that didn't change. I tried to fix all the users of "struct elf_prstatus" that should now be using "struct elf_fdpic_prstatus". The only testing I did here was to build a Blackfin defconfig with "struct elf_prstatus" not defined, and to build an x86 defconfig with "struct elf_fdpic_prstatus" not defined. Note that this fails checkpatch.pl with a complaint about wanting open braces on the same line as struct definitions. The existing struct definitions in this file have the brace a line afterwards, so I'm going to leave this alone. Signed-off-by: Palmer Dabbelt Reviewed-by: Andrew Waterman Reviewed-by: Albert Ou --- fs/binfmt_elf_fdpic.c | 6 +++--- fs/proc/kcore.c | 16 ++++++++++++++++ include/linux/kexec.h | 4 ++++ include/uapi/linux/elfcore.h | 37 +++++++++++++++++++++++++++++++++++-- kernel/kexec_core.c | 4 ++++ 5 files changed, 62 insertions(+), 5 deletions(-) diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index d3634bf..587bf04 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c @@ -1323,7 +1323,7 @@ static inline void fill_note(struct memelfnote *note, const char *name, int type * fill up all the fields in prstatus from the given task struct, except * registers which need to be filled up separately. */ -static void fill_prstatus(struct elf_prstatus *prstatus, +static void fill_prstatus(struct elf_fdpic_prstatus *prstatus, struct task_struct *p, long signr) { prstatus->pr_info.si_signo = prstatus->pr_cursig = signr; @@ -1406,7 +1406,7 @@ static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p, struct elf_thread_status { struct list_head list; - struct elf_prstatus prstatus; /* NT_PRSTATUS */ + struct elf_fdpic_prstatus prstatus; /* NT_PRSTATUS */ elf_fpregset_t fpu; /* NT_PRFPREG */ struct task_struct *thread; #ifdef ELF_CORE_COPY_XFPREGS @@ -1539,7 +1539,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm) loff_t offset = 0, dataoff; int numnote; struct memelfnote *notes = NULL; - struct elf_prstatus *prstatus = NULL; /* NT_PRSTATUS */ + struct elf_fdpic_prstatus *prstatus = NULL; /* NT_PRSTATUS */ struct elf_prpsinfo *psinfo = NULL; /* NT_PRPSINFO */ LIST_HEAD(thread_list); struct list_head *t; diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 92e6726..b1edd77e 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c @@ -90,7 +90,11 @@ static size_t get_kcore_size(int *nphdr, size_t *elf_buflen) (*nphdr + 2)*sizeof(struct elf_phdr) + 3 * ((sizeof(struct elf_note)) + roundup(sizeof(CORE_STR), 4)) + +#ifdef CONFIG_BINFMT_ELF_FDPIC + roundup(sizeof(struct elf_fdpic_prstatus), 4) + +#else roundup(sizeof(struct elf_prstatus), 4) + +#endif roundup(sizeof(struct elf_prpsinfo), 4) + roundup(arch_task_struct_size, 4); *elf_buflen = PAGE_ALIGN(*elf_buflen); @@ -318,7 +322,11 @@ static char *storenote(struct memelfnote *men, char *bufp) */ static void elf_kcore_store_hdr(char *bufp, int nphdr, int dataoff) { +#ifdef CONFIG_BINFMT_ELF_FDPIC + struct elf_fdpic_prstatus prstatus; /* NT_PRSTATUS */ +#else struct elf_prstatus prstatus; /* NT_PRSTATUS */ +#endif struct elf_prpsinfo prpsinfo; /* NT_PRPSINFO */ struct elf_phdr *nhdr, *phdr; struct elfhdr *elf; @@ -387,10 +395,18 @@ static void elf_kcore_store_hdr(char *bufp, int nphdr, int dataoff) /* set up the process status */ notes[0].name = CORE_STR; notes[0].type = NT_PRSTATUS; +#ifdef CONFIG_BINFMT_ELF_FDPIC + notes[0].datasz = sizeof(struct elf_fdpic_prstatus); +#else notes[0].datasz = sizeof(struct elf_prstatus); +#endif notes[0].data = &prstatus; +#ifdef CONFIG_BINFMT_ELF_FDPIC + memset(&prstatus, 0, sizeof(struct elf_fdpic_prstatus)); +#else memset(&prstatus, 0, sizeof(struct elf_prstatus)); +#endif nhdr->p_filesz = notesize(¬es[0]); bufp = storenote(¬es[0], bufp); diff --git a/include/linux/kexec.h b/include/linux/kexec.h index d140b1e..d9196cc 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -63,7 +63,11 @@ #define KEXEC_NOTE_HEAD_BYTES ALIGN(sizeof(struct elf_note), 4) #define KEXEC_CORE_NOTE_NAME "CORE" #define KEXEC_CORE_NOTE_NAME_BYTES ALIGN(sizeof(KEXEC_CORE_NOTE_NAME), 4) +#ifdef CONFIG_BINFMT_ELF_FDPIC +#define KEXEC_CORE_NOTE_DESC_BYTES ALIGN(sizeof(struct elf_fdpic_prstatus), 4) +#else #define KEXEC_CORE_NOTE_DESC_BYTES ALIGN(sizeof(struct elf_prstatus), 4) +#endif /* * The per-cpu notes area is a list of notes terminated by a "NULL" * note header. For kdump, the code in vmcore.c runs in the context diff --git a/include/uapi/linux/elfcore.h b/include/uapi/linux/elfcore.h index 569737c..697c52d 100644 --- a/include/uapi/linux/elfcore.h +++ b/include/uapi/linux/elfcore.h @@ -60,7 +60,40 @@ struct elf_prstatus long pr_instr; /* Current instruction */ #endif elf_gregset_t pr_reg; /* GP registers */ -#ifdef CONFIG_BINFMT_ELF_FDPIC + int pr_fpvalid; /* True if math co-processor being used. */ +}; + +/* Architectures that set CONFIG_BINFMT_ELF_FDPIC use this instead of + * "struct elf_prstatus". + */ +struct elf_fdpic_prstatus +{ +#if 0 + long pr_flags; /* XXX Process flags */ + short pr_why; /* XXX Reason for process halt */ + short pr_what; /* XXX More detailed reason */ +#endif + struct elf_siginfo pr_info; /* Info associated with signal */ + short pr_cursig; /* Current signal */ + unsigned long pr_sigpend; /* Set of pending signals */ + unsigned long pr_sighold; /* Set of held signals */ +#if 0 + struct sigaltstack pr_altstack; /* Alternate stack info */ + struct sigaction pr_action; /* Signal action for current sig */ +#endif + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + struct timeval pr_utime; /* User time */ + struct timeval pr_stime; /* System time */ + struct timeval pr_cutime; /* Cumulative user time */ + struct timeval pr_cstime; /* Cumulative system time */ +#if 0 + long pr_instr; /* Current instruction */ +#endif + elf_gregset_t pr_reg; /* GP registers */ + /* When using FDPIC, the loadmap addresses need to be communicated * to GDB in order for GDB to do the necessary relocations. The * fields (below) used to communicate this information are placed @@ -69,7 +102,7 @@ struct elf_prstatus */ unsigned long pr_exec_fdpic_loadmap; unsigned long pr_interp_fdpic_loadmap; -#endif + int pr_fpvalid; /* True if math co-processor being used. */ }; diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c index 201b453..8d2fc70 100644 --- a/kernel/kexec_core.c +++ b/kernel/kexec_core.c @@ -977,7 +977,11 @@ static void final_note(u32 *buf) void crash_save_cpu(struct pt_regs *regs, int cpu) { +#ifdef CONFIG_BINFMT_ELF_FDPIC + struct elf_fdpic_prstatus prstatus; +#else struct elf_prstatus prstatus; +#endif u32 *buf; if ((cpu < 0) || (cpu >= nr_cpu_ids))