From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by sourceware.org (Postfix) with ESMTPS id 7E24F391B0B6 for ; Fri, 9 Dec 2022 04:11:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7E24F391B0B6 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivosinc.com Received: by mail-pl1-x62a.google.com with SMTP id k7so3631569pll.6 for ; Thu, 08 Dec 2022 20:11:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=KFo+5JCjPmHuQg1TX3tOnMmTiz9lF10Og5wRPPK3Omc=; b=wX0YnmHg8ERtwNy9JSijCNyVp4b7arg2x0QH6z5fPeFg3efmSDgamOxL+UBg6wwEXZ yOYYuGnIu/CHgcj46Uu8dTSbbvudTT9ObrcxeQ3nKOHhjkfUmmqFe2L3vTkadh0DlUIP 4ySSY/BnoAQ/1RB/pIo4M9AXaCF48xFprgImEyK5IAtKPUaynb2aLpczJUZw2GvSruLb Gypx7a2aK3aw/CkMjcCz1O97ajmjwXpHbivPi6XjYMV29Z2kuCK0BrxbgA2nXL/I5w71 Es1irvNDUixqt0xwABw2K0Gi1IxnSL/oELeP31rcE2QCUKm213ZKHR3jMbMCTtu1QUyc fN2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=KFo+5JCjPmHuQg1TX3tOnMmTiz9lF10Og5wRPPK3Omc=; b=Ffki1wjKfJcdaXA54uGM5XgXScIn7sSeWQUJGVdsEv2215AGdjyas1Y8UEddKUqNsR nnXTr/l+WpPKo7CZZwUL5+48j+y9XgCiZAqboL13cxoPS72nVT2lv6lqiveF3rLA2IvK itntXsxpF4z4fSgSwSWWF8RYUnMMzW7PpaEL2cwK2ZBwiEvnRPQw6MM35iN1KNqbbF7/ +zc2Ge7QT6ARlgffejEanayg5Ete43imsAcrewdg5Z1HrhIRe0qb4dZO9TsdhywisHMl kHP7UjHG2mqOSNMYZtDGfnUCKzrHONKhK+Qm2xcJrXhvgFDySjYLrSm9DgWiRihdMzc0 2iiQ== X-Gm-Message-State: ANoB5pkvpLOlAzMpv3SPWdNQPY0m+2oEzYepcyyx8p+Vg85eoEpKjkQ1 GBBzNKQtiJGkts5129pyEhO5Gw== X-Google-Smtp-Source: AA0mqf51/eWUWEd8J6qGEhrQj5FmLbbK6vtphuYGLQGJhb1mq5mxTDuM0X03JCMCzyI8ZzgGooeTnQ== X-Received: by 2002:a17:902:e20c:b0:189:a934:ee33 with SMTP id u12-20020a170902e20c00b00189a934ee33mr3934371plb.58.1670559085300; Thu, 08 Dec 2022 20:11:25 -0800 (PST) Received: from [192.168.50.116] (c-24-4-73-83.hsd1.ca.comcast.net. [24.4.73.83]) by smtp.gmail.com with ESMTPSA id i6-20020a17090332c600b00182d25a1e4bsm216280plr.259.2022.12.08.20.11.23 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 08 Dec 2022 20:11:24 -0800 (PST) Message-ID: <76459bf7-10f9-ff70-d217-ed3298b88c4a@rivosinc.com> Date: Thu, 8 Dec 2022 20:11:23 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: [PATCH v2 2/2] riscv: Resolve symbols directly for symbols with STO_RISCV_VARIANT_CC. Content-Language: en-US To: Vincent Chen , libc-alpha@sourceware.org, palmer@dabbelt.com, darius@bluespec.com, andrew@sifive.com, dj@redhat.com Cc: greentime.hu@sifive.com, kito.cheng@sifive.com, Hsiangkai Wang , Andy Chiu , =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= , davidlt@rivosinc.com, Arnd Bergmann , Andrew Waterman , Florian Weimer , Nelson Chu References: <20220118043159.27521-1-vincent.chen@sifive.com> <20220118043159.27521-3-vincent.chen@sifive.com> From: Vineet Gupta In-Reply-To: <20220118043159.27521-3-vincent.chen@sifive.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-9.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_BARRACUDACENTRAL,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 1/17/22 20:31, Vincent Chen wrote: > From: Hsiangkai Wang > > In some cases, we do not want to go through the resolver for function > calls. For example, functions with vector arguments will use vector > registers to pass arguments. In the resolver, we do not save/restore the > vector argument registers for lazy binding efficiency. To avoid ruining > the vector arguments, functions with vector arguments will not go > through the resolver. > > To achieve the goal, we will annotate the function symbols with > STO_RISCV_VARIANT_CC flag and add DT_RISCV_VARIANT_CC tag in the dynamic > section. In the first pass on PLT relocations, we do not set up to call > _dl_runtime_resolve. Instead, we resolve the functions directly. As per the ratified psABI v1.0, the V calling convention doesn't allow use of V reg for functions args, so this is not needed for now. -Vineet > > Signed-off-by: Hsiangkai Wang > Signed-off-by: Vincent Chen > --- > elf/elf.h | 7 +++++++ > manual/platform.texi | 6 ++++++ > sysdeps/riscv/dl-dtprocnum.h | 21 +++++++++++++++++++++ > sysdeps/riscv/dl-machine.h | 26 ++++++++++++++++++++++++++ > 4 files changed, 60 insertions(+) > create mode 100644 sysdeps/riscv/dl-dtprocnum.h > > diff --git a/elf/elf.h b/elf/elf.h > index 0735f6b579..9c95544050 100644 > --- a/elf/elf.h > +++ b/elf/elf.h > @@ -3911,6 +3911,13 @@ enum > > #define R_TILEGX_NUM 130 > > +/* RISC-V specific values for the Dyn d_tag field. */ > +#define DT_RISCV_VARIANT_CC (DT_LOPROC + 1) > +#define DT_RISCV_NUM 2 > + > +/* RISC-V specific values for the st_other field. */ > +#define STO_RISCV_VARIANT_CC 0x80 > + > /* RISC-V ELF Flags */ > #define EF_RISCV_RVC 0x0001 > #define EF_RISCV_FLOAT_ABI 0x0006 > diff --git a/manual/platform.texi b/manual/platform.texi > index d5fdc5bd05..a1a740f381 100644 > --- a/manual/platform.texi > +++ b/manual/platform.texi > @@ -121,6 +121,12 @@ when it is not allowed, the priority is set to medium. > @node RISC-V > @appendixsec RISC-V-specific Facilities > > +Functions that are lazily bound must be compatible with the standard calling > +convention. When a function is annotated with STO_RISCV_VARIANT_CC, it means > +this function is not compatible with the standard calling convention. The > +dynamic linker will directly resolve it instead of using the lazy binding > +mechanism. > + > Cache management facilities specific to RISC-V systems that implement the Linux > ABI are declared in @file{sys/cachectl.h}. > > diff --git a/sysdeps/riscv/dl-dtprocnum.h b/sysdeps/riscv/dl-dtprocnum.h > new file mode 100644 > index 0000000000..f189fd700a > --- /dev/null > +++ b/sysdeps/riscv/dl-dtprocnum.h > @@ -0,0 +1,21 @@ > +/* Configuration of lookup functions. RISC-V version. > + Copyright (C) 2019-2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + . */ > + > +/* Number of extra dynamic section entries for this architecture. By > + default there are none. */ > +#define DT_THISPROCNUM DT_RISCV_NUM > diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h > index 1d3e2e588c..cdbaca6533 100644 > --- a/sysdeps/riscv/dl-machine.h > +++ b/sysdeps/riscv/dl-machine.h > @@ -53,6 +53,9 @@ > || (__WORDSIZE == 64 && (type) == R_RISCV_TLS_TPREL64))) \ > | (ELF_RTYPE_CLASS_COPY * ((type) == R_RISCV_COPY))) > > +//* Translate a processor specific dynamic tag to the index in l_info array. */ > +#define DT_RISCV(x) (DT_RISCV_##x - DT_LOPROC + DT_NUM) > + > /* Return nonzero iff ELF header is compatible with the running host. */ > static inline int __attribute_used__ > elf_machine_matches_host (const ElfW(Ehdr) *ehdr) > @@ -305,6 +308,29 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], > /* Check for unexpected PLT reloc type. */ > if (__glibc_likely (r_type == R_RISCV_JUMP_SLOT)) > { > + if (__glibc_unlikely (map->l_info[DT_RISCV (VARIANT_CC)] != NULL)) > + { > + /* Check the symbol table for variant CC symbols. */ > + const Elf_Symndx symndx = ELFW(R_SYM) (reloc->r_info); > + const ElfW(Sym) *symtab = > + (const void *)D_PTR (map, l_info[DT_SYMTAB]); > + const ElfW(Sym) *sym = &symtab[symndx]; > + if (__glibc_unlikely (sym->st_other & STO_RISCV_VARIANT_CC)) > + { > + /* Avoid lazy resolution of variant CC symbols. */ > + const struct r_found_version *version = NULL; > + if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) > + { > + const ElfW(Half) *vernum = > + (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); > + version = &map->l_versions[vernum[symndx] & 0x7fff]; > + } > + elf_machine_rela (map, scope, reloc, sym, version, reloc_addr, > + skip_ifunc); > + return; > + } > + } > + > if (__glibc_unlikely (map->l_mach.plt == 0)) > { > if (l_addr)