From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3B0DCC6FD1D for ; Tue, 21 Mar 2023 22:49:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 302F86B007B; Tue, 21 Mar 2023 18:49:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2B299900003; Tue, 21 Mar 2023 18:49:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1A180900002; Tue, 21 Mar 2023 18:49:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 07D066B007B for ; Tue, 21 Mar 2023 18:49:44 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id D653B1201A6 for ; Tue, 21 Mar 2023 22:49:43 +0000 (UTC) X-FDA: 80594399046.02.B7FE5C6 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) by imf12.hostedemail.com (Postfix) with ESMTP id F27504000E for ; Tue, 21 Mar 2023 22:49:41 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=dabbelt-com.20210112.gappssmtp.com header.s=20210112 header.b=5Z9OtPiH; dmarc=none; spf=pass (imf12.hostedemail.com: domain of palmer@dabbelt.com designates 209.85.216.51 as permitted sender) smtp.mailfrom=palmer@dabbelt.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1679438982; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:dkim-signature; bh=4bphvEfMSl5avwhfXJT15aKIJis5gqq3QZ/zSLwV7oM=; b=Ib58BoGTBsra+tVx3ChyUUjfywPJZcPAnECgXhcAGxV9AhNhsK/SdH6WDqKzEzZxewihig /wrjXBnxyLNkEYFFhfldY2+hpH/RE/sVcqCluvm8N9jvk+l28hZT67GqqQ0Eq7ReUa/4pw T4ME5CHU5q3Hcd6Aorum6ABLgJSpJvE= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=dabbelt-com.20210112.gappssmtp.com header.s=20210112 header.b=5Z9OtPiH; dmarc=none; spf=pass (imf12.hostedemail.com: domain of palmer@dabbelt.com designates 209.85.216.51 as permitted sender) smtp.mailfrom=palmer@dabbelt.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1679438982; a=rsa-sha256; cv=none; b=hQa683uQevC9JqViwXsvmF+m8RARIWzuT8U7zLzczEBTkvDBczRzfog2zIeC+pw09zqorR IFSG/CTGNScCxYwc4sNAJqPGijL6nSPS/crellSyjzNUVguGHm9y9IBtL21fmUl2x2EpDo iQuPzC+J6Axxk9j9zWBnxVq8YgjsD6Q= Received: by mail-pj1-f51.google.com with SMTP id x15so6584046pjk.2 for ; Tue, 21 Mar 2023 15:49:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dabbelt-com.20210112.gappssmtp.com; s=20210112; t=1679438981; h=content-transfer-encoding:mime-version:message-id:to:from:cc :in-reply-to:subject:date:from:to:cc:subject:date:message-id :reply-to; bh=4bphvEfMSl5avwhfXJT15aKIJis5gqq3QZ/zSLwV7oM=; b=5Z9OtPiHsgOCytxq8aipGasjfx3iRy0mfHaVBZPnOUvMCszycDsXvonQ8kQyodP4/L ECqdYMKy5wC08CVXBVlpR//wm9q3Td6hRetBkJ2y96o+niLp5e9mUr1ENenKWlytMRe4 RIKruTLDFb9A0OVtwZiTBvb+l02hkCOTMWPycvGcIvj8wqSNxWsIonpvST3ggbmYHkMH yOFVaDPtlT6D2NYYLh1v+vG4Hcyy8ET4ro1UuEoGEDbSUvJmXy6wBJy/5M11v1HfW9Ei biQR0mxjRoNeMH67NWCFV0K+e/aOLsWTUwN6jqWnaK5z5AeUbdihZd8F6NWa9uy95WH/ HHpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679438981; h=content-transfer-encoding:mime-version:message-id:to:from:cc :in-reply-to:subject:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=4bphvEfMSl5avwhfXJT15aKIJis5gqq3QZ/zSLwV7oM=; b=agHhJublYDsYdWkV0K4veaPX2aBDhgf0aFde564nxHKaVt84jp8iMrPFFMh8JqnjNp vbq+rw0FTV2PLRr7CptpXbw2KYUR3f/9LRTqnvpyC549zBgEQA0YjqO1AURIV+UuL4qt DrSP+JWUgRoF7gITndh/Wxg33gwKjTa7sA6NtgEv4tEIY/UGb4sNdQez8O2ILc39q4ST PKOY9rppp+ZhcxrbizXq9/eSEuoG4WjnoW5Lz1UICofhO+hXkBodPh0w2cTQPawn2gaS zVeS213BvuG0iMWN7noORZAwdy3Pd5eBXXrrzdkRnM5o3XTELJz6JbsoAIi6e+jP7Cp3 nRqA== X-Gm-Message-State: AO0yUKWT4JwNcbLyRTfdewafmkRu8WGU1FE3Qe1szsPpEKHUdgMvogtQ 3tKVdPmLxY00vvTo6A9L0jE3oA== X-Google-Smtp-Source: AK7set+mUTGkFgE2itKnrOD55dCbBCqULX8O3ptlcVutoVPy7M0q3dEkR5UkxDe6P+toJl+Ro2Jeeg== X-Received: by 2002:a17:902:e5c3:b0:1a0:6d9e:3c78 with SMTP id u3-20020a170902e5c300b001a06d9e3c78mr740192plf.53.1679438980575; Tue, 21 Mar 2023 15:49:40 -0700 (PDT) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id b14-20020a170902b60e00b001a1c6048fc8sm5736379pls.63.2023.03.21.15.49.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 15:49:40 -0700 (PDT) Date: Tue, 21 Mar 2023 15:49:40 -0700 (PDT) X-Google-Original-Date: Tue, 21 Mar 2023 15:48:41 PDT (-0700) Subject: Re: [PATCH 1/2] binfmt_elf_fdpic: support 64-bit systems In-Reply-To: <20230228135126.1686427-2-gerg@kernel.org> CC: linux-riscv@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, gerg@kernel.org From: Palmer Dabbelt To: gerg@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, ebiederm@xmission.com, keescook@chromium.org Message-ID: Mime-Version: 1.0 (MHng) Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: F27504000E X-Stat-Signature: tbkgspxadbwqsnk6hothad84x73udmwt X-HE-Tag: 1679438981-253562 X-HE-Meta: U2FsdGVkX1+LH2wosQGVUcUKhmZFwefOSErX2PkfA6V976BkCFcfWXqKcWMHEvCEk1g1vEN+CQjhvBrI1xPYq6sr03FHfE/BxukbgkdLcsenj6wlxI/MrXp4TKEmni30accadvFC6YYSSlAHNphy/4nCtK1+nPpGfjoT3ndfqU+Wbb42VaRHFC+sjBYMPjo0giUcp3KQAGc8Y1UYYd/hMDzuVcN9v6i1nM7r0B+XH293a2nFOfGBg7KCO1n6VBuRoveZUinghGQt+c2zN+rLuSEMoqUiqWy6K2eEHmr9GxLilQF34Wu/hLyAViElMX3opDkWwLY4Vf66hEJWI8xDUQffbqIIB352usDs8zCWlnrj3RtJGoVIDrwAU6mvvg2eRB8DXisVMF/ZAwAH17u9lF3+4UoR63vmPq9chcS+bSGzI5J6jDXTM2xbyKHhpQ9rHvcAb++XySHqxCGEj09RgmzmimhNlLMtPLEiKz6NJiofeHCyUPLMDBmWQnLygIf62gwBx6NrKUITuJajSkTGSzh8SYDdCrMhSDU3PvnXTzZMq+YtgrSeKiY9oKy7l2YB7SmTHpaaO9ise3POBVgnSx2qQK3VqnvNsEUC2jDxW3jcZx0pckfasc7pHsXEC6ga8cWwm7fwc3UsY72W0UuwzJuIeVL4hmeF2a4MRIQc7XEchyO02XDYX0OmVJWthSQnLsCMVcPHKsamdD+EeMok1hLze9Lb8PLxHHhRjW9ggPdlzV+CZZeit+hio5MUAd6BrmLWt7E0salniUsheUmNEf5vSbORUfab/tEEY7LXSszJ8YY3S9uRIaK8w0v5yR1VVgtfTeUmU8l33ITYF6StomSjuyTPeo431uGfU58NoRAUI+eTUVQbtSbYmnXtHiK1N1w1vxCI44zuaIAUkA+Yedf2eoOcapPlWMorBPzc/R3Inq85yh3ZkuFB+QSycSTDmFDD695IoQrrgna4n4J oG2lb6lY is/J7jzu84lWKMiIQQ9BXF069KYIo05NFilgG2zZJpkyghkpvy9tgBEDOYliJHbnG3mJ0ShhWxnFqSD1Wg14xIXNVGhBANhjB4gEkI0MUKbyrD58ClJrWOIjYa6meBO1uPv0l+FUDt61ayCrD+bnZyxpgjC6NGsprs1asVZ5hobIRnENApT9ikQeTGCRgXtbAw16Qz4dh1xFHiXjK7IokAmBn++NjtFSnTbYtqBBzN21SqWany7UTFu1rEz21Hfe7VtDwYstTRzXosI/fLyLJAVWFrv4y5A9wXF5Njenz1Te7edy4hbx5NR997VXS58LA1Du6q5RQ6wTNhSzimfiP1eb+D/Kiwq9QjHHH60mSANDlQbpcdBEhZslmXlXtTO4J/aczozCSzkR9WeF2Q9xiz/Kq4B1L+A0ffxFicdNHhnkOQzgzXx/Zsw6jqNWVA8kTJhoFbFQ7O7xdEnVOzNTSB99+9IOC410T/NfB2noUuLRb643w9swC4XkifBq9+MaGGKF7uWCPNGES/rsS8SWDct5zRoAu019alXRULROMt6PVx5khH3afr852kOIjpMBSTernTxxFXBEuimJYqtE/EXAHw9L4zxb0hHvH X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Tue, 28 Feb 2023 05:51:25 PST (-0800), gerg@kernel.org wrote: > The binfmt_flat_fdpic code has a number of 32-bit specific data > structures associated with it. Extend it to be able to support and > be used on 64-bit systems as well. > > The new code defines a number of key 64-bit variants of the core > elf-fdpic data structures - along side the existing 32-bit sized ones. > A common set of generic named structures are defined to be either > the 32-bit or 64-bit ones as required at compile time. This is a > similar technique to that used in the ELF binfmt loader. > > For example: > > elf_fdpic_loadseg is either elf32_fdpic_loadseg or elf64_fdpic_loadseg > elf_fdpic_loadmap is either elf32_fdpic_loadmap or elf64_fdpic_loadmap > > the choice based on ELFCLASS32 or ELFCLASS64. > > Signed-off-by: Greg Ungerer > --- > fs/binfmt_elf_fdpic.c | 38 +++++++++++++++++----------------- > include/linux/elf-fdpic.h | 14 ++++++++++++- > include/uapi/linux/elf-fdpic.h | 15 ++++++++++++++ > 3 files changed, 47 insertions(+), 20 deletions(-) Adding some of the binfmt/fs folks, who weren't directly on the mail. It's looking like we're generally OK with this in RISC-V land, though there's still no userspace posted. I don't think there's any rush here and it might be prudent to wait for userspace to start going through a bit of a review, but figured I'd at least poke everyone to see if there's any thoughts. I'm fine either way, so Acked-by: Palmer Dabbelt if that helps any. Also happy to take this through the RISC-V tree along with the other if that's easier, but again no rush. > > diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c > index a05eafcacfb27..2eea6dd429fd6 100644 > --- a/fs/binfmt_elf_fdpic.c > +++ b/fs/binfmt_elf_fdpic.c > @@ -138,7 +138,7 @@ static int is_constdisp(struct elfhdr *hdr) > static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params, > struct file *file) > { > - struct elf32_phdr *phdr; > + struct elf_phdr *phdr; > unsigned long size; > int retval, loop; > loff_t pos = params->hdr.e_phoff; > @@ -560,8 +560,8 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm, > sp &= ~7UL; > > /* stack the load map(s) */ > - len = sizeof(struct elf32_fdpic_loadmap); > - len += sizeof(struct elf32_fdpic_loadseg) * exec_params->loadmap->nsegs; > + len = sizeof(struct elf_fdpic_loadmap); > + len += sizeof(struct elf_fdpic_loadseg) * exec_params->loadmap->nsegs; > sp = (sp - len) & ~7UL; > exec_params->map_addr = sp; > > @@ -571,8 +571,8 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm, > current->mm->context.exec_fdpic_loadmap = (unsigned long) sp; > > if (interp_params->loadmap) { > - len = sizeof(struct elf32_fdpic_loadmap); > - len += sizeof(struct elf32_fdpic_loadseg) * > + len = sizeof(struct elf_fdpic_loadmap); > + len += sizeof(struct elf_fdpic_loadseg) * > interp_params->loadmap->nsegs; > sp = (sp - len) & ~7UL; > interp_params->map_addr = sp; > @@ -740,12 +740,12 @@ static int elf_fdpic_map_file(struct elf_fdpic_params *params, > struct mm_struct *mm, > const char *what) > { > - struct elf32_fdpic_loadmap *loadmap; > + struct elf_fdpic_loadmap *loadmap; > #ifdef CONFIG_MMU > - struct elf32_fdpic_loadseg *mseg; > + struct elf_fdpic_loadseg *mseg; > #endif > - struct elf32_fdpic_loadseg *seg; > - struct elf32_phdr *phdr; > + struct elf_fdpic_loadseg *seg; > + struct elf_phdr *phdr; > unsigned long load_addr, stop; > unsigned nloads, tmp; > size_t size; > @@ -767,7 +767,7 @@ static int elf_fdpic_map_file(struct elf_fdpic_params *params, > > params->loadmap = loadmap; > > - loadmap->version = ELF32_FDPIC_LOADMAP_VERSION; > + loadmap->version = ELF_FDPIC_LOADMAP_VERSION; > loadmap->nsegs = nloads; > > load_addr = params->load_addr; > @@ -843,8 +843,8 @@ static int elf_fdpic_map_file(struct elf_fdpic_params *params, > if (phdr->p_vaddr >= seg->p_vaddr && > phdr->p_vaddr + phdr->p_memsz <= > seg->p_vaddr + seg->p_memsz) { > - Elf32_Dyn __user *dyn; > - Elf32_Sword d_tag; > + Elf_Dyn __user *dyn; > + Elf_Sword d_tag; > > params->dynamic_addr = > (phdr->p_vaddr - seg->p_vaddr) + > @@ -854,11 +854,11 @@ static int elf_fdpic_map_file(struct elf_fdpic_params *params, > * one item, and that the last item is a NULL > * entry */ > if (phdr->p_memsz == 0 || > - phdr->p_memsz % sizeof(Elf32_Dyn) != 0) > + phdr->p_memsz % sizeof(Elf_Dyn) != 0) > goto dynamic_error; > > - tmp = phdr->p_memsz / sizeof(Elf32_Dyn); > - dyn = (Elf32_Dyn __user *)params->dynamic_addr; > + tmp = phdr->p_memsz / sizeof(Elf_Dyn); > + dyn = (Elf_Dyn __user *)params->dynamic_addr; > if (get_user(d_tag, &dyn[tmp - 1].d_tag) || > d_tag != 0) > goto dynamic_error; > @@ -927,8 +927,8 @@ static int elf_fdpic_map_file_constdisp_on_uclinux( > struct file *file, > struct mm_struct *mm) > { > - struct elf32_fdpic_loadseg *seg; > - struct elf32_phdr *phdr; > + struct elf_fdpic_loadseg *seg; > + struct elf_phdr *phdr; > unsigned long load_addr, base = ULONG_MAX, top = 0, maddr = 0; > int loop, ret; > > @@ -1011,8 +1011,8 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, > struct file *file, > struct mm_struct *mm) > { > - struct elf32_fdpic_loadseg *seg; > - struct elf32_phdr *phdr; > + struct elf_fdpic_loadseg *seg; > + struct elf_phdr *phdr; > unsigned long load_addr, delta_vaddr; > int loop, dvset; > > diff --git a/include/linux/elf-fdpic.h b/include/linux/elf-fdpic.h > index 3bea95a1af537..e533f45131945 100644 > --- a/include/linux/elf-fdpic.h > +++ b/include/linux/elf-fdpic.h > @@ -10,13 +10,25 @@ > > #include > > +#if ELF_CLASS == ELFCLASS32 > +#define Elf_Sword Elf32_Sword > +#define elf_fdpic_loadseg elf32_fdpic_loadseg > +#define elf_fdpic_loadmap elf32_fdpic_loadmap > +#define ELF_FDPIC_LOADMAP_VERSION ELF32_FDPIC_LOADMAP_VERSION > +#else > +#define Elf_Sword Elf64_Sxword > +#define elf_fdpic_loadmap elf64_fdpic_loadmap > +#define elf_fdpic_loadseg elf64_fdpic_loadseg > +#define ELF_FDPIC_LOADMAP_VERSION ELF64_FDPIC_LOADMAP_VERSION > +#endif > + > /* > * binfmt binary parameters structure > */ > struct elf_fdpic_params { > struct elfhdr hdr; /* ref copy of ELF header */ > struct elf_phdr *phdrs; /* ref copy of PT_PHDR table */ > - struct elf32_fdpic_loadmap *loadmap; /* loadmap to be passed to userspace */ > + struct elf_fdpic_loadmap *loadmap; /* loadmap to be passed to userspace */ > unsigned long elfhdr_addr; /* mapped ELF header user address */ > unsigned long ph_addr; /* mapped PT_PHDR user address */ > unsigned long map_addr; /* mapped loadmap user address */ > diff --git a/include/uapi/linux/elf-fdpic.h b/include/uapi/linux/elf-fdpic.h > index 4fcc6cfebe185..ec23f08711292 100644 > --- a/include/uapi/linux/elf-fdpic.h > +++ b/include/uapi/linux/elf-fdpic.h > @@ -32,4 +32,19 @@ struct elf32_fdpic_loadmap { > > #define ELF32_FDPIC_LOADMAP_VERSION 0x0000 > > +/* segment mappings for ELF FDPIC libraries/executables/interpreters */ > +struct elf64_fdpic_loadseg { > + Elf64_Addr addr; /* core address to which mapped */ > + Elf64_Addr p_vaddr; /* VMA recorded in file */ > + Elf64_Word p_memsz; /* allocation size recorded in file */ > +}; > + > +struct elf64_fdpic_loadmap { > + Elf64_Half version; /* version of these structures, just in case... */ > + Elf64_Half nsegs; /* number of segments */ > + struct elf64_fdpic_loadseg segs[]; > +}; > + > +#define ELF64_FDPIC_LOADMAP_VERSION 0x0000 > + > #endif /* _UAPI_LINUX_ELF_FDPIC_H */