From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by sourceware.org (Postfix) with ESMTPS id 0DE2D3858D20 for ; Tue, 15 Mar 2022 18:52:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0DE2D3858D20 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=dabbelt.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=dabbelt.com Received: by mail-pj1-x1030.google.com with SMTP id mj15-20020a17090b368f00b001c637aa358eso2751278pjb.0 for ; Tue, 15 Mar 2022 11:52:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dabbelt-com.20210112.gappssmtp.com; s=20210112; h=date:subject:in-reply-to:cc:from:to:message-id:mime-version :content-transfer-encoding; bh=sJy57lcSZKEXEwh+G76sdVeEUakh3L/g6nALCjH5q80=; b=F9BetStXU3cVYm/KqKkcJYb5sDjamqGrBOAKnUz4ZGpzxVwTEzl5w29IVfb3xaepuM J/cQleT/mhza0VIQn5Jnme9D5NamvGIomHnNLo9GOkh+1nofPTco2QtteCDyeJ/UC9QZ PZfnqG8AAfzq4npmyJezW6Q4uB4o0nMUgqA+EbxOmx72ECU2xHQYcUGm1BAzEclU287f Mwmlo0s8QRkwhNwRIPK7W+e5yWeKI94B2ldPUxou26BfmXNRjC6XomGVu2jevWcC/Bet uF93kssGsdv+8SolUo/uS7oN44Tp3aRIQz074zxr4/Y3f6lv1TPujI54+cL9gFKhskAn iF4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:subject:in-reply-to:cc:from:to:message-id :mime-version:content-transfer-encoding; bh=sJy57lcSZKEXEwh+G76sdVeEUakh3L/g6nALCjH5q80=; b=PBUQHJqr6QFGd0kdsnhCJ3CMqcSlyJCzVs6oFfQBXNvGOyl45uHHc34IwR+usf/xx+ Ac8mzPa5G0+54NNAIRQX2nwH7MiD3nzfuVUlYA3hGeTVETcrQ8QnyHMoxPeWsr7QV9i8 ZdblUi7k3HLiB/gpuGh8aNkAVKGDxTpbL35uPfBsL6NxbUJRrxXA9V20d+Px8P7rMh70 o7tvjxH4PD7wF1kXMRxgyDU/U1miQE//232cyvx08dajhQb2yKs51KuoL8d77lX+RsCo IYC+bH6j55owPjRXRkpcyVOsV9gWAPYeTQVOaugK+YY9+QBlvDk0BjRffd7CQoXWOKYy XuEg== X-Gm-Message-State: AOAM532h4ne9fKgWjN75WFPdnSziCdJG3co6uKowfHlxJKr9C3k35WZ3 UATWdx6Dxb0kpNYVtG88zUGwTQ== X-Google-Smtp-Source: ABdhPJy5v726eWOrp9nSVOngDi14BXMgVxF/yPpHXut3Jz9W0gg0kqQCSPpe0oRZEqGQ0jYiNgiLYg== X-Received: by 2002:a17:902:e80c:b0:151:e743:903a with SMTP id u12-20020a170902e80c00b00151e743903amr29528265plg.65.1647370332935; Tue, 15 Mar 2022 11:52:12 -0700 (PDT) Received: from localhost ([12.3.194.138]) by smtp.gmail.com with ESMTPSA id d11-20020aa7868b000000b004f768dfe93asm21460662pfo.176.2022.03.15.11.52.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Mar 2022 11:52:12 -0700 (PDT) Date: Tue, 15 Mar 2022 11:52:12 -0700 (PDT) X-Google-Original-Date: Tue, 15 Mar 2022 11:51:24 PDT (-0700) Subject: Re: [PATCH] RISC-V: Support ZTSO extension In-Reply-To: CC: cmuellner@ventanamicro.com, shihua@iscas.ac.cn, binutils@sourceware.org, kito.cheng@sifive.com, Jim Wilson , lazyparser@gmail.com, jiawei@iscas.ac.cn, Nelson Chu From: Palmer Dabbelt To: Andrew Waterman Message-ID: Mime-Version: 1.0 (MHng) Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2022 18:52:16 -0000 On Tue, 15 Mar 2022 11:41:14 PDT (-0700), Andrew Waterman wrote: > On Tue, Mar 15, 2022 at 9:24 AM Christoph Muellner > wrote: >> >> >> >> On Tue, Mar 15, 2022 at 3:44 AM wrote: >>> >>> From: LiaoShihua >>> >>> ZTSO is the extension of tatol store order model. >> >> >> typo: tatol -> total >> >>> >>> This extension adds no new instructions to the ISA, and you can use it with arch "ztso". >>> If you use it, TSO flag will be generate in the ELF header. >>> >>> bfd\ChangeLog: >>> >>> * elfnn-riscv.c (_bfd_riscv_elf_merge_private_bfd_data):Add support for ztso extension. >>> * elfxx-riscv.c (riscv_multi_subset_supports):Ditto. >>> >>> binutils\ChangeLog: >>> >>> * readelf.c (get_machine_flags):Ditto. >>> >>> gas\ChangeLog: >>> >>> * config/tc-riscv.c (struct riscv_set_options):Ditto. >>> (riscv_set_tso):Ditto. >>> (riscv_set_arch):Ditto. >>> >>> include\ChangeLog: >>> >>> * elf/riscv.h (EF_RISCV_TSO):Ditto. >>> * opcode/riscv.h (enum riscv_insn_class):Ditto. >>> >>> --- >>> bfd/elfnn-riscv.c | 3 +++ >>> bfd/elfxx-riscv.c | 3 +++ >>> binutils/readelf.c | 3 +++ >>> gas/config/tc-riscv.c | 17 +++++++++++++++++ >>> include/elf/riscv.h | 3 +++ >>> include/opcode/riscv.h | 1 + >>> 6 files changed, 30 insertions(+) >>> >>> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c >>> index 8f9f0d8a86a..25e8082b957 100644 >>> --- a/bfd/elfnn-riscv.c >>> +++ b/bfd/elfnn-riscv.c >>> @@ -3886,6 +3886,9 @@ _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) >>> /* Allow linking RVC and non-RVC, and keep the RVC flag. */ >>> elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC; >>> >>> + /* Allow linking ZTSO and non-ZTSO, and keep the TSO flag. */ >>> + elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_TSO; >> >> >> Is this flag evaluated anywhere? >> I.e. how do we protect users from executing TSO binaries on RVWMO systems? >> In the case of e.g. compressed instructions, they will run into a SIG_ILL, but here they will observe unpredictable behavior if we don't do anything. > > The intent had always been that the ELF loaders (OS kernel, dynamic > linker, etc.) would enforce this property. The work hasn't been done > for the Linux kernel or glibc, AFAIK, presumably because Ztso hasn't > been a priority. The EF_RISCV_TSO bit has long been reserved for this > purpose, though, and so nothing is holding up that work. (The Linux > kernel will need to be informed about the presence of Ztso via DT, and > the dynamic linker will need to be informed via HWCAP. Until all of > that plumbing exists, these loaders should conservatively reject Ztso > binaries.) IIUC we're half way there: glibc is already rejecting dynamic libraries with the TSO bit set, but Linux appears to ignore the flags entirely. I think that means static binaries with the TSO bit would end up loaded, but IMO that's just a Linux bug and it shouldn't be that hard to fix. My bigger worry here is allowing TSO to be flipped on before we actually know what the memory model is. I'm not sure what the right way to go is here: we've got a "it's TSO" extension ratified, but there's no formal description of the memory model. I know we're relying on poorly defined semantics for other stuff, but IMO memory model land is just too complicated for that sort of thing. If there's actual hardware implementations of this around then it's a different story, but without that I'd be somewhat reluctant to start generating TSO binaries as then we'll be stuck remaining compatible with whatever's allowed by Ztso v0.1. > >> >>> >>> + >>> return true; >>> >>> fail: >>> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c >>> index 2915b74dd0f..a041c89a623 100644 >>> --- a/bfd/elfxx-riscv.c >>> +++ b/bfd/elfxx-riscv.c >>> @@ -1215,6 +1215,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] = >>> {"zvl16384b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, >>> {"zvl32768b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, >>> {"zvl65536b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, >>> + {"ztso", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 }, Ztso v0.1 is in 20191213, so at least we don't have to call it a draft. >>> {NULL, 0, 0, 0, 0} >>> }; >>> >>> @@ -2393,6 +2394,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps, >>> || riscv_subset_supports (rps, "zve32f")); >>> case INSN_CLASS_SVINVAL: >>> return riscv_subset_supports (rps, "svinval"); >>> + case INSN_CLASS_ZTSO: >>> + return riscv_subset_supports (rps, "ztso"); >>> default: >>> rps->error_handler >>> (_("internal: unreachable INSN_CLASS_*")); >>> diff --git a/binutils/readelf.c b/binutils/readelf.c >>> index 16efe1dfd2d..ba4d6f9db4f 100644 >>> --- a/binutils/readelf.c >>> +++ b/binutils/readelf.c >>> @@ -3975,6 +3975,9 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine) >>> >>> if (e_flags & EF_RISCV_RVE) >>> strcat (buf, ", RVE"); >>> + >>> + if (e_flags & EF_RISCV_TSO) >>> + strcat (buf, ", TSO"); >>> >>> switch (e_flags & EF_RISCV_FLOAT_ABI) >>> { >>> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c >>> index 9cc0abfda88..ed33cfa919a 100644 >>> --- a/gas/config/tc-riscv.c >>> +++ b/gas/config/tc-riscv.c >>> @@ -222,6 +222,7 @@ struct riscv_set_options >>> int relax; /* Emit relocs the linker is allowed to relax. */ >>> int arch_attr; /* Emit architecture and privileged elf attributes. */ >>> int csr_check; /* Enable the CSR checking. */ >>> + int tso; /* Use TSO model. */ >>> }; >>> >>> static struct riscv_set_options riscv_opts = >>> @@ -231,6 +232,7 @@ static struct riscv_set_options riscv_opts = >>> 1, /* relax */ >>> DEFAULT_RISCV_ATTR, /* arch_attr */ >>> 0, /* csr_check */ >>> + 0, /* tso */ >>> }; >>> >>> /* Enable or disable the rvc flags for riscv_opts. Turn on the rvc flag >>> @@ -245,6 +247,18 @@ riscv_set_rvc (bool rvc_value) >>> riscv_opts.rvc = rvc_value; >>> } >>> >>> +/* Enable or disable the tso flags for riscv_opts. Turn on the tso flag >>> + for elf_flags once we have enabled ztso extension. */ >>> + >>> +static void >>> +riscv_set_tso (bool tso_value) >>> +{ >>> + if (tso_value) >>> + elf_flags |= EF_RISCV_TSO; >>> + >>> + riscv_opts.tso = tso_value; >>> +} >>> + >>> /* This linked list records all enabled extensions, which are parsed from >>> the architecture string. The architecture string can be set by the >>> -march option, the elf architecture attributes, and the --with-arch >>> @@ -295,6 +309,9 @@ riscv_set_arch (const char *s) >>> riscv_set_rvc (false); >>> if (riscv_subset_supports (&riscv_rps_as, "c")) >>> riscv_set_rvc (true); >>> + >>> + if (riscv_subset_supports (&riscv_rps_as, "ztso")) >>> + riscv_set_tso (true); >>> } >>> >>> /* Indicate -mabi option is explictly set. */ >>> diff --git a/include/elf/riscv.h b/include/elf/riscv.h >>> index d0acf6886d8..eed3ec5f82e 100644 >>> --- a/include/elf/riscv.h >>> +++ b/include/elf/riscv.h >>> @@ -114,6 +114,9 @@ END_RELOC_NUMBERS (R_RISCV_max) >>> /* File uses the 32E base integer instruction. */ >>> #define EF_RISCV_RVE 0x0008 >>> >>> +/* File uses the TSO model. */ >>> +#define EF_RISCV_TSO 0x0010 >>> + >>> /* The name of the global pointer symbol. */ >>> #define RISCV_GP_SYMBOL "__global_pointer$" >>> >>> diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h >>> index 048ab0a5d68..ed81df271c1 100644 >>> --- a/include/opcode/riscv.h >>> +++ b/include/opcode/riscv.h >>> @@ -388,6 +388,7 @@ enum riscv_insn_class >>> INSN_CLASS_V, >>> INSN_CLASS_ZVEF, >>> INSN_CLASS_SVINVAL, >>> + INSN_CLASS_ZTSO, >>> }; >>> >>> /* This structure holds information for a particular instruction. */ >>> -- >>> 2.31.1.windows.1 >>>