From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x231.google.com (mail-oi1-x231.google.com [IPv6:2607:f8b0:4864:20::231]) by sourceware.org (Postfix) with ESMTPS id 5F1833858C78 for ; Tue, 15 Mar 2022 18:41:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5F1833858C78 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=sifive.com Received: by mail-oi1-x231.google.com with SMTP id o83so303669oif.0 for ; Tue, 15 Mar 2022 11:41:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=9IlI15XP0bJRycKNJHcHZWFeuEnEtiZiCtBogttQRYY=; b=kuH24GHtNXTsMjaljhTVlopLUCCWQkmbMxrGBW0MmBgF9SxEnSKchIgRQO0XhmyQ8s HL3R+ogc2xCxUbRPwguFHCR4gJrSmPsgytCdQqj5UHmuwJwbwZh2oCdtrvXeg9TkRw+P ClDw1CTVqI8BYGPeYPJyEmwYRkGxKQ9mpmQy8l8rHIFsj66RxkUfXB1fdvc41+1CiDjy uiQv80aYYayj+gseCpkVCeHMepNSapOPqEHT3/A/Btthsu5se++xdPLZTFu7LTUQifDS GBy1EvaWTq79PmaFvsAMtWUidE1Dk1dyEb0C9WWBabwa2Jyo3+a2Q7tARznckK3EPZ7T hAsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=9IlI15XP0bJRycKNJHcHZWFeuEnEtiZiCtBogttQRYY=; b=vaXG7VPjOMGTzKCc/MttJaRQ0a8jCufjgPJfQKWplMkbu/gp/6pdft5xbmcG3Ns+kp QzRVUTiKr5ZboPZMUfyCfTPERd/C1UmPR66i3Pv2CHN3ouD4CKvSZjCtDrFmqbTg2i1Q ALiyKIRDCPNvJJUa3k+BPjoCf08MCQI2i1i2f1kJx0g0FdlWAUhQVAkvjZll71ag2BSa E+oUwDicYF+q3ZBPB8n0EEhP3KmjkjBRBkzNs/YWohsFqhYwcW4ayIIm7KvBTAxvd+hl KJ0wCvqckYeTYUSuh0/f0A0ehqp9g+Ih7WEItL2ShELqlkY4T7rp5xFrYiR6NE31z9PA Yt9w== X-Gm-Message-State: AOAM530fjstEqDvdHFuueXqBVtlcJRMz/tPfXiGreYqJU3oA6/eWMYLy FqKoxqC4QOY5Fpiq8wQAYEIT3aNUdmFvMxBc X-Google-Smtp-Source: ABdhPJw2Q+asPuiCvZXBfNyeBVNDroQSzIgY0nhdAsqkblgVebxcirWWdn1xG9zXCzL+uAC4Yi0Hrw== X-Received: by 2002:aca:bb44:0:b0:2d9:c2a7:9d8e with SMTP id l65-20020acabb44000000b002d9c2a79d8emr2341578oif.278.1647369686486; Tue, 15 Mar 2022 11:41:26 -0700 (PDT) Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com. [209.85.167.176]) by smtp.gmail.com with ESMTPSA id w1-20020a056871060100b000d9a1c283e8sm8360047oan.37.2022.03.15.11.41.25 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 15 Mar 2022 11:41:26 -0700 (PDT) Received: by mail-oi1-f176.google.com with SMTP id w2so266820oie.2 for ; Tue, 15 Mar 2022 11:41:25 -0700 (PDT) X-Received: by 2002:a05:6808:2204:b0:2da:30c1:dd4c with SMTP id bd4-20020a056808220400b002da30c1dd4cmr2393991oib.195.1647369685666; Tue, 15 Mar 2022 11:41:25 -0700 (PDT) MIME-Version: 1.0 References: <20220315024318.297-1-shihua@iscas.ac.cn> In-Reply-To: From: Andrew Waterman Date: Tue, 15 Mar 2022 11:41:14 -0700 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] RISC-V: Support ZTSO extension To: Christoph Muellner Cc: Shihua Liao , Binutils , Kito Cheng , Jim Wilson , Palmer Dabbelt , =?UTF-8?B?V2VpIFd1ICjlkLTkvJ8p?= , jiawei , Nelson Chu Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, 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:41:29 -0000 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.) > >> >> + >> 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 }, >> {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 >>