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 AC165C6FD18 for ; Wed, 19 Apr 2023 03:27:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 239BC8E0003; Tue, 18 Apr 2023 23:27:16 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1E8D78E0001; Tue, 18 Apr 2023 23:27:16 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0B20F8E0003; Tue, 18 Apr 2023 23:27:16 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id EEF368E0001 for ; Tue, 18 Apr 2023 23:27:15 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id B98BE160554 for ; Wed, 19 Apr 2023 03:27:15 +0000 (UTC) X-FDA: 80696704830.14.6EB10ED Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) by imf01.hostedemail.com (Postfix) with ESMTP id CEE634001A for ; Wed, 19 Apr 2023 03:27:12 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=dabbelt-com.20221208.gappssmtp.com header.s=20221208 header.b=V4DT7iyy; spf=pass (imf01.hostedemail.com: domain of palmer@dabbelt.com designates 209.85.215.180 as permitted sender) smtp.mailfrom=palmer@dabbelt.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1681874833; 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=UNPYSUMahgAyXZXRtPSa/FHx7hsSNLc7er8SypYXEE0=; b=mfT1zhLxnE9pB6VNvZofA4uTvZ7/IvtgObQVTWBwPlbYJ8TCdCqXFerfvF9QlAN/8aKt5M 7qUish906Nr0dkoO95JD4rqdwSQBxNb15Xj1myNuuCrEyDFYo0sLBJ4I9HzQ58kOVVy/qd 6/eXA4F44qYoBT/E+/RzRZg5aRYR85g= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=dabbelt-com.20221208.gappssmtp.com header.s=20221208 header.b=V4DT7iyy; spf=pass (imf01.hostedemail.com: domain of palmer@dabbelt.com designates 209.85.215.180 as permitted sender) smtp.mailfrom=palmer@dabbelt.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1681874833; a=rsa-sha256; cv=none; b=qZNRAOoBEihnn3imNQRvIkHqhvDtMdVmYHBjbcLX6RtUhLxL9Gk5qYMoyp4JhkZdHMbgiH MIUy+FnfJhpc6JCmTNENAyIbIfdMfN1vy8Zg8j2YWBxFyesxi+nDhI6OUj+2R19xnwejDq T1Q0/0jqr1Ynfd+5WwSQRjtcRUKp/bA= Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-5144043d9d1so2611183a12.3 for ; Tue, 18 Apr 2023 20:27:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dabbelt-com.20221208.gappssmtp.com; s=20221208; t=1681874831; x=1684466831; 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=UNPYSUMahgAyXZXRtPSa/FHx7hsSNLc7er8SypYXEE0=; b=V4DT7iyyMQk9hHL1OmZVid6pnWukKrSwK6E8gzwjCU/tnzzCMf5eYYpN6aMHJsNMHx pNXolNAOD7N2oJOK5tkA2uSndkcdl6gbHb4CfeTnSTV3ehy4LBLViRQcgoxYDStlrnR8 xCv8UEBC66+JGz4EYv8PSulabzkaXPKWV5MKou2vj//nyIdoqIvtu/7GVmYmH8i6etVj A9qJmmWXHcDq8eJ0hG/o1Yobx7PRkfAjfeZ2I44RoY3RwFJ1U4mVOqiVvEOPqis7zwTb Z7WmwM01SW94AxWdaO82OtygctICR8cYj0hQaNUnhUG/VKY854W8eQYBeE8LwRlG11Kx mL7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681874831; x=1684466831; 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=UNPYSUMahgAyXZXRtPSa/FHx7hsSNLc7er8SypYXEE0=; b=X1R1w7hTEYR34FdG3wNrK9Z6+I3qZphmBlDUvygNuaf/z6LveG0qOSemsNu/Ku2Zh/ gGCqqBxbq0UHveHQrdbPfbJu5JvrUp6eL7e/nStGN2fs8MvT+sC/+jFa+w/dpWYxSkOU ZfnZcPZ+L/pI2FgD1xXiAwZpBZDFi1n4pC5CWzjyYhlWECnUi1T6+UtrXmzKsQJnTsar DoZFbnryhnUzG/GrnSJCxCn/TK/LodyavtVFlF9kFi0M66AQd7bEbfnrAxZv/0Uy06Ak dyMPDTBrlEDlWK+BIKEXM5toCmnXe5LsaDJZbkTZIPoDmBCxWq5oEau4mIX99QhxXWNT 72gA== X-Gm-Message-State: AAQBX9dclS5iRM4mLpNKCi5BM6QXZqHWb63nbZDgzapt0xlRDzzOoSXn J7rpMfo7bPAIeiz61fWbsxuy4g== X-Google-Smtp-Source: AKy350bO5eCRO2oTDoKnVbIgbWmrg60BOMhAdOU8Eo/INK0dKi0uDVZTOyfy49E1Gf0PrPF7ZTYe2g== X-Received: by 2002:a17:90b:392:b0:247:601c:20fa with SMTP id ga18-20020a17090b039200b00247601c20famr1484491pjb.5.1681874831418; Tue, 18 Apr 2023 20:27:11 -0700 (PDT) Received: from localhost ([135.180.227.0]) by smtp.gmail.com with ESMTPSA id m23-20020a170902bb9700b001a66e6bb66esm10328642pls.162.2023.04.18.20.27.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Apr 2023 20:27:10 -0700 (PDT) Date: Tue, 18 Apr 2023 20:27:10 -0700 (PDT) X-Google-Original-Date: Tue, 18 Apr 2023 20:27:06 PDT (-0700) Subject: Re: [PATCH 1/2] binfmt_elf_fdpic: support 64-bit systems In-Reply-To: CC: viro@zeniv.linux.org.uk, brauner@kernel.org, ebiederm@xmission.com, keescook@chromium.org, linux-riscv@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org From: Palmer Dabbelt To: gerg@kernel.org Message-ID: Mime-Version: 1.0 (MHng) Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: CEE634001A X-Rspam-User: X-Stat-Signature: ear8wzprhgtdbgpq4uox8wdt3zcoiyne X-HE-Tag: 1681874832-789386 X-HE-Meta: U2FsdGVkX19Y9Mz3cJZv/LMVyi3lzeqsuiiYZhk9qSaFOE9atJhgsONAJPlY4EeN+J6CvmV2OSXLbdEe+xbsCx7346fi40YlbwF4G3SNbJLmLyA4ctRmCSXqObhsDAi54dQERiNpwfE3Z/DKL+uhGoxSudYF/NBsKeCLxqDsy2j4vpYW9J+O1IkbXtUUaPFSrXSb+hwmwrTLTWMduEqk6NH+6xK5JURfRpX987ZYsrYVcRE3MX6lsTafaSjpW2k/0wn60C4YWIJkxSky4bm39pskmH0B3aLcUZqqQe2ferkx9Y09ezgYi3ucYXqoQuLCRd/T8JdqOsN9iS9q+EGJjebgmp/3ZMB692c3MWh0M40zNyRTEERDfCWsoI0AozFCu+8/D1s8uQbJosBV9lNThXm/Pu9rZiRpUXX+5fDcgGDoqTPsPf6Z3r28lNFWxIxgFp3q97DVzKN/0BUenUcfp1yroy18TFwwvKxbNsVrrBlapl1tqoHs398u2u6nHySVF1fj8Gksxs+LIOKBjsjiWBzM/M0Ld02mLHZcvJhHPBvh7TRp5s17oqo2Yp0swITdcY81UsG0LUOp3bYCtzL21rYufat+rZkShtsbk66j9auvm67JijY7hkv3MXOGudElshvbBp+KnEQ3tKqY+CHQZQE1T48Mhzwoa/37ipJHXuKgu7kyW4JVDagJSnnrKTki2of3exVovOREGc/04BcOEPkkfTboXaK+qrXHMSyCMyjOQq1uwuvnTfeyyo/qjjb3UOVUF4mB3IPDJ2bQh+OY1GANlpS/BtY4H+05F/97l+FU46o6/ZYy6LfL84L12HA0sfesaETnufFO7mmG2DlE9JlKFJu/ilkqbimfnArgT5oZkLKyO0zu+46BBjZoXRezolrVFY89F/r7UrIJ3v30iwc0hn6K/ojoWkz2L2jU2HqLVfPPDoCPR557iaoYnr5e0rbTx5GoN7Spnzh37j1 Q7jm2DJU MDO/nFeJJey1tIFjxQHIOhPtxGZkZCXInfTAOnVmKF4j3Qlu0iHg7Wby5+9SMzXq3/EspIBqtroGq5JzUShlEblBDnHqzVE8Dx1YesbVB+nJVIMWMtCXzNjzGFeB6r2ciJJ73ECSsfdWMPM4pvbXsPs5haKZOLFo9+a+lsuJA9VlBZQX3YovQYQu2t4Fe3Fc8uaxRFAeDYtFdBgQH7VAQ0dKVHhbaFzRP3PYQtgogq8JXI9fJgA1agMM3+/a8R1ayQWX+Qo+0GSm3UQ9dF9rLsmtHrQQH8QVCQgOgO9MCuxz3wSzwnkjfA8zWIs50MCrjjU8B0pJR8dPHmLjJzmr31hkjwFRE14a8bGV5oWa8TxrjthLAW2ihyWi11r50ebfHNK8W8s63QE2klLzZbBUkbCd/JKESncxjbbapVMpBQA6usmVMXUg3BIWJjssHkYA5z0iaKMDEOwKC9AZS9MIIYFAL9ZoOpTfcvJA4zS0DNKv/HPZFGXVuBJYL6j5kVg2mKe11nTh/NDG3/fwF43JhUNFD1BKx6O9HGV+UMn3iYhpNgSu/uphkacP4bdmLsEBaAmlIY53IHX8MMb21Pq30jOCZdWPgV9GEJN5a 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 Wed, 29 Mar 2023 06:48:55 PDT (-0700), gerg@kernel.org wrote: > > On 22/3/23 08:49, Palmer Dabbelt wrote: >> 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. > > Just following up. I haven't seen any feedback on this - did I miss any? If you did then I did too. I'm not really sure what to do here: it looks fine to me, but it's not really my area so I'd prefer to have someone who understands this stuff a bit better chime in. It looks like some Arm patches recently went in through that tree, though, so maybe that's how things are supposed to go here? > > Regards > Greg > > >>> 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 */ >>