* [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) @ 2025-05-20 5:25 Tsukasa OI 2025-05-20 7:30 ` Clément Léger 0 siblings, 1 reply; 7+ messages in thread From: Tsukasa OI @ 2025-05-20 5:25 UTC (permalink / raw) To: linux-riscv, Clément Léger, Miquel Sabaté Solà, Paul Walmsley, Palmer Dabbelt Hello Clément, Miquel and all. It's too late to make changes for the Linux kernel version 6.15 but at least we need to clarify something. I would like to hear from Clément and Miquel about your original intent of your changes and hear from all about your thoughts about the argument below. Background =========== While I am preparing for the riscv_hwprobe support in the Rust standard library (for target feature detection) looking at the master branch of Linux, I found three extensions in the RISCV_HWPROBE_KEY_IMA_EXT_0 key that would be redundant if we read the documentation pedantically. cf. Original riscv_hwprobe support for the Rust standard library (supports all flags as of Linux 6.14 except OS-dependent "Supm"): <https://github.com/rust-lang/stdarch/pull/1770> Here's the list (all of them will be new in 6.15): Commit 4458b8f68dc7ab8309291f1667157d0250938291 (by Miquel): 1. Zicntr (Zihpm is excluded because the argument below does not apply). Commit 9d45d1ff90a6888f6138eb7e1f2619ef427831d3 (by Clément): 2. Zalrsc 3. Zaamo Base Facts =========== The RISC-V hwprobe documentation states that RISCV_HWPROBE_BASE_BEHAVIOR_IMA is either RV32IMA/RV64IMA (user ISA version 2.2 and privileged ISA version 1.10 with a few exceptions) and RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions that are compatible with the RISCV_HWPROBE_BASE_BEHAVIOR_IMA base system behavior (I'll call this the IMA base behavior from now on). cf. <https://docs.kernel.org/arch/riscv/hwprobe.html> 1. Zicntr ========== The user ISA version 2.2 has RV32I / RV64I ("I") base ISAs, version 2.0. However, "I" base ISAs at that time contain features now ratified as the "Zicntr" extension. To be specific, the "I" base ISAs in the user ISA version 2.2 have changed as follows (with some extras): User ISA version 2.2: * RV32I / RV64I ("I") version 2.0 User ISA version 20190608: * RV32I / RV64I ("I") version 2.1 * The "Zicsr" extension, version 2.0 * The "Zifencei" extension, version 2.0 * Non-extension: Counters * 3 counters originally available in "I" v2.0 (later "Zicntr") * NEW: Additional up to 29 counters (later "Zihpm") User ISA version 20240411: * RV32I / RV64I ("I") version 2.1 * The "Zicsr" extension, version 2.0 * The "Zifencei" extension, version 2.0 * The "Zicntr" extension, version 2.0 (New as an extension) * The "Zihpm" extension, version 2.0 (New as an extension) In other words, "I" version 2.0 is roughly equivalent to: * RV32I / RV64I ("I") version 2.1 * The "Zicsr" extension, version 2.0 * The "Zifencei" extension, version 2.0 * The "Zicntr" extension, version 2.0 So if we think pedantically, the flag containing "Zicntr" makes no sense. Of course, there are a few cases where this flag becomes valid: 1. IMA base behavior should have been changed (a documentation fix will be required to justify this) 2. Denotes that native hardware support of basic hardware counters In either case, we will need to clarify somewhere. 2/3. Zalrsc / Zaamo ==================== This is easier to tell but harder to justify flags' existence. 1. The IMA base behavior contains the "A" extension. 2. Both "Zalrsc" and "Zaamo" extensions are subsets of "A" (in fact, A == Zalrsc + Zaamo) 3. Is there any case where the IMA base behavior is available but lacks a part of full "A" extension? For me, it just looks RISCV_HWPROBE_EXT_ZAAMO and RISCV_HWPROBE_EXT_ZALRSC are always-on flags. If the value containing these bits (key RISCV_HWPROBE_KEY_IMA_EXT_0) just lists extensions (with no conditions), that would be meaningful if the Linux kernel is changed so that the full "A" extension is no longer needed. But because the key RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions *compatible to* the IMA base behavior, justifying this is pretty hard. If there is a case where these flags can be turned off and still valid, I'm happy to see an example and learn. Rust (userland) Behavior on version 1.88 or later ================================================== From Rust 1.88 (currently in beta and will be released on the end of June), the RISC-V feature detection logic (backend for the is_riscv_feature_detected macro) will start to use the riscv_hwprobe system call on Linux (before that, only auxiliary vector is used). cf. <https://doc.rust-lang.org/beta/std/arch/macro.is_riscv_feature_detected.html> Currently, these flags are not read by the Rust standard library (because Linux kernel version 6.15 hasn't released yet) but the behavior is determined considering existence of these flags (new in 6.15): If the IMA base behavior is detected, following Rust target features are enabled: 1. Either "rv32i" or "rv64i" The IMA base behavior contains "I" base and extensions "M" and "A". 2. "zicsr" This is inferred from the fact I explained in the "Zicntr" section above. It is also justified by the fact that Linux requires the privileged architecture, which depends on the Zicsr extension. 3. "zifencei" This is inferred from the fact I explained in the "Zicntr" section above. Linux also has the CMODX feature which makes the Zifencei extension in the userland valid but riscv_hwprobe doesn't provide a flag for the Zifencei extension. 4. "m" The IMA base behavior contains "I" base and extensions "M" and "A". It implies the Zmmul extension but this one is not supported by the Rust's feature handling system yet. 5. "a" The IMA base behavior contains "I" base and extensions "M" and "A". 6. "zalrsc" This extension is supported by Rust and implied from "a", making RISCV_HWPROBE_EXT_ZALRSC ineffective. 7. "zaamo" This extension is supported by Rust and implied from "a", making RISCV_HWPROBE_EXT_ZAAMO ineffective. But the IMA base behavior alone does NOT enable: 1. "zicntr" I implemented the RISC-V feature detection logic in Rust more conservatively than the documentation suggests. It may make RISCV_HWPROBE_EXT_ZICNTR effective on Rust depending on how future versions of the standard library is implemented (possibly Rust version 1.90 or later). Reiterating RFC ================ 1. (To Clément and Miquel) I'd like to hear the original intent of your changes. 2. (To all) How do we handle this situation? Best regards, Tsukasa p.s. Just in case, I'm talking NOTHING about Rust on Linux (kernel mode). _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) 2025-05-20 5:25 [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) Tsukasa OI @ 2025-05-20 7:30 ` Clément Léger 2025-05-20 9:32 ` Tsukasa OI 0 siblings, 1 reply; 7+ messages in thread From: Clément Léger @ 2025-05-20 7:30 UTC (permalink / raw) To: Tsukasa OI, linux-riscv, Miquel Sabaté Solà, Paul Walmsley, Palmer Dabbelt On 20/05/2025 07:25, Tsukasa OI wrote: > Hello Clément, Miquel and all. > > It's too late to make changes for the Linux kernel version 6.15 but at > least we need to clarify something. I would like to hear from Clément > and Miquel about your original intent of your changes and hear from all > about your thoughts about the argument below. > > > Background > =========== > > While I am preparing for the riscv_hwprobe support in the Rust standard > library (for target feature detection) looking at the master branch of > Linux, I found three extensions in the RISCV_HWPROBE_KEY_IMA_EXT_0 key > that would be redundant if we read the documentation pedantically. > > cf. Original riscv_hwprobe support for the Rust standard library > (supports all flags as of Linux 6.14 except OS-dependent "Supm"): > <https://github.com/rust-lang/stdarch/pull/1770> > > Here's the list (all of them will be new in 6.15): > > Commit 4458b8f68dc7ab8309291f1667157d0250938291 (by Miquel): > 1. Zicntr > (Zihpm is excluded because the argument below does not apply). > > Commit 9d45d1ff90a6888f6138eb7e1f2619ef427831d3 (by Clément): > 2. Zalrsc > 3. Zaamo > > > Base Facts > =========== > > The RISC-V hwprobe documentation states that > RISCV_HWPROBE_BASE_BEHAVIOR_IMA is either RV32IMA/RV64IMA (user ISA > version 2.2 and privileged ISA version 1.10 with a few exceptions) and > RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions that are compatible with > the RISCV_HWPROBE_BASE_BEHAVIOR_IMA base system behavior (I'll call this > the IMA base behavior from now on). > > cf. <https://docs.kernel.org/arch/riscv/hwprobe.html> > > > 1. Zicntr > ========== > > The user ISA version 2.2 has RV32I / RV64I ("I") base ISAs, version 2.0. > However, "I" base ISAs at that time contain features now ratified as the > "Zicntr" extension. To be specific, the "I" base ISAs in the user ISA > version 2.2 have changed as follows (with some extras): > > User ISA version 2.2: > * RV32I / RV64I ("I") version 2.0 > > User ISA version 20190608: > * RV32I / RV64I ("I") version 2.1 > * The "Zicsr" extension, version 2.0 > * The "Zifencei" extension, version 2.0 > * Non-extension: Counters > * 3 counters originally available in "I" v2.0 (later "Zicntr") > * NEW: Additional up to 29 counters (later "Zihpm") > > User ISA version 20240411: > * RV32I / RV64I ("I") version 2.1 > * The "Zicsr" extension, version 2.0 > * The "Zifencei" extension, version 2.0 > * The "Zicntr" extension, version 2.0 (New as an extension) > * The "Zihpm" extension, version 2.0 (New as an extension) > > In other words, "I" version 2.0 is roughly equivalent to: > * RV32I / RV64I ("I") version 2.1 > * The "Zicsr" extension, version 2.0 > * The "Zifencei" extension, version 2.0 > * The "Zicntr" extension, version 2.0 > > So if we think pedantically, the flag containing "Zicntr" makes no > sense. Of course, there are a few cases where this flag becomes valid: > > 1. IMA base behavior should have been changed > (a documentation fix will be required to justify this) > 2. Denotes that native hardware support of basic hardware counters > > In either case, we will need to clarify somewhere. > > > 2/3. Zalrsc / Zaamo > ==================== > > This is easier to tell but harder to justify flags' existence. > > 1. The IMA base behavior contains the "A" extension. > 2. Both "Zalrsc" and "Zaamo" extensions are subsets of "A" > (in fact, A == Zalrsc + Zaamo) > 3. Is there any case where the IMA base behavior is available but > lacks a part of full "A" extension? > > For me, it just looks RISCV_HWPROBE_EXT_ZAAMO and > RISCV_HWPROBE_EXT_ZALRSC are always-on flags. If the value containing > these bits (key RISCV_HWPROBE_KEY_IMA_EXT_0) just lists extensions (with > no conditions), that would be meaningful if the Linux kernel is changed > so that the full "A" extension is no longer needed. But because the key > RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions *compatible to* the IMA > base behavior, justifying this is pretty hard. > > If there is a case where these flags can be turned off and still valid, > I'm happy to see an example and learn. While not technically required right now, there has been a series to use ZALRSC to implement AMO (from MIPS) [1] and thus remove the kernel dependency on the full "A" extensions. The goal of adding ZAAMO/ZALRSC was to have a comprehensive support of RISC-V extensions that might be useful for the userspace. Rationale was also that it was better to express all the dependencies rather than letting the userspace make some assumptions that would be hard to remove later. BTW, there are a few mechanisms that are unlikely to be used as well in hwprobe (per-cpu extensions for instance, I do not think we yet have seen such hardware yet ?). Ditto for per-cpu misaligned access support. While potentially not popular, we try to cover the majority of the use cases, RISC-V hardware being, by nature, flexible. Thanks, Clément Link: https://patchwork.kernel.org/project/linux-riscv/patch/20241225082412.36727-1-arikalo@gmail.com/#26192228 [1] > > > Rust (userland) Behavior on version 1.88 or later > ================================================== > > From Rust 1.88 (currently in beta and will be released on the end of > June), the RISC-V feature detection logic (backend for the > is_riscv_feature_detected macro) will start to use the riscv_hwprobe > system call on Linux (before that, only auxiliary vector is used). > > cf. > <https://doc.rust-lang.org/beta/std/arch/macro.is_riscv_feature_detected.html> > > Currently, these flags are not read by the Rust standard library > (because Linux kernel version 6.15 hasn't released yet) but the behavior > is determined considering existence of these flags (new in 6.15): > > If the IMA base behavior is detected, following Rust target features are > enabled: > > 1. Either "rv32i" or "rv64i" > The IMA base behavior contains "I" base and extensions "M" and "A". > 2. "zicsr" > This is inferred from the fact I explained in the "Zicntr" section > above. It is also justified by the fact that Linux requires > the privileged architecture, which depends on the Zicsr extension. > 3. "zifencei" > This is inferred from the fact I explained in the "Zicntr" section > above. Linux also has the CMODX feature which makes the Zifencei > extension in the userland valid but riscv_hwprobe doesn't provide > a flag for the Zifencei extension. > 4. "m" > The IMA base behavior contains "I" base and extensions "M" and "A". > It implies the Zmmul extension but this one is not supported by > the Rust's feature handling system yet. > 5. "a" > The IMA base behavior contains "I" base and extensions "M" and "A". > 6. "zalrsc" > This extension is supported by Rust and implied from "a", > making RISCV_HWPROBE_EXT_ZALRSC ineffective. > 7. "zaamo" > This extension is supported by Rust and implied from "a", > making RISCV_HWPROBE_EXT_ZAAMO ineffective. > > But the IMA base behavior alone does NOT enable: > > 1. "zicntr" > I implemented the RISC-V feature detection logic in Rust more > conservatively than the documentation suggests. > It may make RISCV_HWPROBE_EXT_ZICNTR effective on Rust depending > on how future versions of the standard library is implemented > (possibly Rust version 1.90 or later). > > > Reiterating RFC > ================ > > 1. (To Clément and Miquel) > I'd like to hear the original intent of your changes. > 2. (To all) > How do we handle this situation? > > > Best regards, > Tsukasa > > p.s. > Just in case, I'm talking NOTHING about Rust on Linux (kernel mode). _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) 2025-05-20 7:30 ` Clément Léger @ 2025-05-20 9:32 ` Tsukasa OI 2025-05-20 13:49 ` Miquel Sabaté Solà 0 siblings, 1 reply; 7+ messages in thread From: Tsukasa OI @ 2025-05-20 9:32 UTC (permalink / raw) To: Clément Léger, linux-riscv, Miquel Sabaté Solà, Paul Walmsley, Palmer Dabbelt Hi Clément, On 2025/05/20 16:30, Clément Léger wrote: > > > On 20/05/2025 07:25, Tsukasa OI wrote: >> Hello Clément, Miquel and all. >> >> It's too late to make changes for the Linux kernel version 6.15 but at >> least we need to clarify something. I would like to hear from Clément >> and Miquel about your original intent of your changes and hear from all >> about your thoughts about the argument below. >> >> >> Background >> =========== >> >> While I am preparing for the riscv_hwprobe support in the Rust standard >> library (for target feature detection) looking at the master branch of >> Linux, I found three extensions in the RISCV_HWPROBE_KEY_IMA_EXT_0 key >> that would be redundant if we read the documentation pedantically. >> >> cf. Original riscv_hwprobe support for the Rust standard library >> (supports all flags as of Linux 6.14 except OS-dependent "Supm"): >> <https://github.com/rust-lang/stdarch/pull/1770> >> >> Here's the list (all of them will be new in 6.15): >> >> Commit 4458b8f68dc7ab8309291f1667157d0250938291 (by Miquel): >> 1. Zicntr >> (Zihpm is excluded because the argument below does not apply). >> >> Commit 9d45d1ff90a6888f6138eb7e1f2619ef427831d3 (by Clément): >> 2. Zalrsc >> 3. Zaamo >> >> >> Base Facts >> =========== >> >> The RISC-V hwprobe documentation states that >> RISCV_HWPROBE_BASE_BEHAVIOR_IMA is either RV32IMA/RV64IMA (user ISA >> version 2.2 and privileged ISA version 1.10 with a few exceptions) and >> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions that are compatible with >> the RISCV_HWPROBE_BASE_BEHAVIOR_IMA base system behavior (I'll call this >> the IMA base behavior from now on). >> >> cf. <https://docs.kernel.org/arch/riscv/hwprobe.html> >> >> >> 1. Zicntr >> ========== >> >> The user ISA version 2.2 has RV32I / RV64I ("I") base ISAs, version 2.0. >> However, "I" base ISAs at that time contain features now ratified as the >> "Zicntr" extension. To be specific, the "I" base ISAs in the user ISA >> version 2.2 have changed as follows (with some extras): >> >> User ISA version 2.2: >> * RV32I / RV64I ("I") version 2.0 >> >> User ISA version 20190608: >> * RV32I / RV64I ("I") version 2.1 >> * The "Zicsr" extension, version 2.0 >> * The "Zifencei" extension, version 2.0 >> * Non-extension: Counters >> * 3 counters originally available in "I" v2.0 (later "Zicntr") >> * NEW: Additional up to 29 counters (later "Zihpm") >> >> User ISA version 20240411: >> * RV32I / RV64I ("I") version 2.1 >> * The "Zicsr" extension, version 2.0 >> * The "Zifencei" extension, version 2.0 >> * The "Zicntr" extension, version 2.0 (New as an extension) >> * The "Zihpm" extension, version 2.0 (New as an extension) >> >> In other words, "I" version 2.0 is roughly equivalent to: >> * RV32I / RV64I ("I") version 2.1 >> * The "Zicsr" extension, version 2.0 >> * The "Zifencei" extension, version 2.0 >> * The "Zicntr" extension, version 2.0 >> >> So if we think pedantically, the flag containing "Zicntr" makes no >> sense. Of course, there are a few cases where this flag becomes valid: >> >> 1. IMA base behavior should have been changed >> (a documentation fix will be required to justify this) >> 2. Denotes that native hardware support of basic hardware counters >> >> In either case, we will need to clarify somewhere. >> >> >> 2/3. Zalrsc / Zaamo >> ==================== >> >> This is easier to tell but harder to justify flags' existence. >> >> 1. The IMA base behavior contains the "A" extension. >> 2. Both "Zalrsc" and "Zaamo" extensions are subsets of "A" >> (in fact, A == Zalrsc + Zaamo) >> 3. Is there any case where the IMA base behavior is available but >> lacks a part of full "A" extension? >> >> For me, it just looks RISCV_HWPROBE_EXT_ZAAMO and >> RISCV_HWPROBE_EXT_ZALRSC are always-on flags. If the value containing >> these bits (key RISCV_HWPROBE_KEY_IMA_EXT_0) just lists extensions (with >> no conditions), that would be meaningful if the Linux kernel is changed >> so that the full "A" extension is no longer needed. But because the key >> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions *compatible to* the IMA >> base behavior, justifying this is pretty hard. >> >> If there is a case where these flags can be turned off and still valid, >> I'm happy to see an example and learn. > > While not technically required right now, there has been a series to use > ZALRSC to implement AMO (from MIPS) [1] and thus remove the kernel > dependency on the full "A" extensions. The goal of adding ZAAMO/ZALRSC > was to have a comprehensive support of RISC-V extensions that might be > useful for the userspace. Rationale was also that it was better to > express all the dependencies rather than letting the userspace make some > assumptions that would be hard to remove later. Thanks for the background! In this case, meanings of the key RISCV_HWPROBE_KEY_IMA_EXT_0 should be changed in the future (when the requirements are lowered and a different RISCV_HWPROBE_KEY_BASE_BEHAVIOR value is defined) but otherwise looks fine (and documentation update is only needed once that happens). And I understand that this is not worrying state for the userland. I appreciate that! Thanks, Tsukasa > > BTW, there are a few mechanisms that are unlikely to be used as well in > hwprobe (per-cpu extensions for instance, I do not think we yet have > seen such hardware yet ?). Ditto for per-cpu misaligned access support. > While potentially not popular, we try to cover the majority of the use > cases, RISC-V hardware being, by nature, flexible. > > Thanks, > > Clément > > Link: > https://patchwork.kernel.org/project/linux-riscv/patch/20241225082412.36727-1-arikalo@gmail.com/#26192228 > [1] > >> >> >> Rust (userland) Behavior on version 1.88 or later >> ================================================== >> >> From Rust 1.88 (currently in beta and will be released on the end of >> June), the RISC-V feature detection logic (backend for the >> is_riscv_feature_detected macro) will start to use the riscv_hwprobe >> system call on Linux (before that, only auxiliary vector is used). >> >> cf. >> <https://doc.rust-lang.org/beta/std/arch/macro.is_riscv_feature_detected.html> >> >> Currently, these flags are not read by the Rust standard library >> (because Linux kernel version 6.15 hasn't released yet) but the behavior >> is determined considering existence of these flags (new in 6.15): >> >> If the IMA base behavior is detected, following Rust target features are >> enabled: >> >> 1. Either "rv32i" or "rv64i" >> The IMA base behavior contains "I" base and extensions "M" and "A". >> 2. "zicsr" >> This is inferred from the fact I explained in the "Zicntr" section >> above. It is also justified by the fact that Linux requires >> the privileged architecture, which depends on the Zicsr extension. >> 3. "zifencei" >> This is inferred from the fact I explained in the "Zicntr" section >> above. Linux also has the CMODX feature which makes the Zifencei >> extension in the userland valid but riscv_hwprobe doesn't provide >> a flag for the Zifencei extension. >> 4. "m" >> The IMA base behavior contains "I" base and extensions "M" and "A". >> It implies the Zmmul extension but this one is not supported by >> the Rust's feature handling system yet. >> 5. "a" >> The IMA base behavior contains "I" base and extensions "M" and "A". >> 6. "zalrsc" >> This extension is supported by Rust and implied from "a", >> making RISCV_HWPROBE_EXT_ZALRSC ineffective. >> 7. "zaamo" >> This extension is supported by Rust and implied from "a", >> making RISCV_HWPROBE_EXT_ZAAMO ineffective. >> >> But the IMA base behavior alone does NOT enable: >> >> 1. "zicntr" >> I implemented the RISC-V feature detection logic in Rust more >> conservatively than the documentation suggests. >> It may make RISCV_HWPROBE_EXT_ZICNTR effective on Rust depending >> on how future versions of the standard library is implemented >> (possibly Rust version 1.90 or later). >> >> >> Reiterating RFC >> ================ >> >> 1. (To Clément and Miquel) >> I'd like to hear the original intent of your changes. >> 2. (To all) >> How do we handle this situation? >> >> >> Best regards, >> Tsukasa >> >> p.s. >> Just in case, I'm talking NOTHING about Rust on Linux (kernel mode). > _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) 2025-05-20 9:32 ` Tsukasa OI @ 2025-05-20 13:49 ` Miquel Sabaté Solà 2025-05-20 13:59 ` Clément Léger 2025-05-22 4:16 ` Tsukasa OI 0 siblings, 2 replies; 7+ messages in thread From: Miquel Sabaté Solà @ 2025-05-20 13:49 UTC (permalink / raw) To: Tsukasa OI Cc: Clément Léger, linux-riscv, Paul Walmsley, Palmer Dabbelt [-- Attachment #1.1: Type: text/plain, Size: 9619 bytes --] Hello, On dt., de maig 20 2025, Tsukasa OI wrote: > Hi Clément, > > On 2025/05/20 16:30, Clément Léger wrote: >> >> >> On 20/05/2025 07:25, Tsukasa OI wrote: >>> Hello Clément, Miquel and all. >>> >>> It's too late to make changes for the Linux kernel version 6.15 but at >>> least we need to clarify something. I would like to hear from Clément >>> and Miquel about your original intent of your changes and hear from all >>> about your thoughts about the argument below. >>> >>> >>> Background >>> =========== >>> >>> While I am preparing for the riscv_hwprobe support in the Rust standard >>> library (for target feature detection) looking at the master branch of >>> Linux, I found three extensions in the RISCV_HWPROBE_KEY_IMA_EXT_0 key >>> that would be redundant if we read the documentation pedantically. >>> >>> cf. Original riscv_hwprobe support for the Rust standard library >>> (supports all flags as of Linux 6.14 except OS-dependent "Supm"): >>> <https://github.com/rust-lang/stdarch/pull/1770> >>> >>> Here's the list (all of them will be new in 6.15): >>> >>> Commit 4458b8f68dc7ab8309291f1667157d0250938291 (by Miquel): >>> 1. Zicntr >>> (Zihpm is excluded because the argument below does not apply). >>> >>> Commit 9d45d1ff90a6888f6138eb7e1f2619ef427831d3 (by Clément): >>> 2. Zalrsc >>> 3. Zaamo >>> >>> >>> Base Facts >>> =========== >>> >>> The RISC-V hwprobe documentation states that >>> RISCV_HWPROBE_BASE_BEHAVIOR_IMA is either RV32IMA/RV64IMA (user ISA >>> version 2.2 and privileged ISA version 1.10 with a few exceptions) and >>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions that are compatible with >>> the RISCV_HWPROBE_BASE_BEHAVIOR_IMA base system behavior (I'll call this >>> the IMA base behavior from now on). >>> >>> cf. <https://docs.kernel.org/arch/riscv/hwprobe.html> >>> >>> >>> 1. Zicntr >>> ========== >>> >>> The user ISA version 2.2 has RV32I / RV64I ("I") base ISAs, version 2.0. >>> However, "I" base ISAs at that time contain features now ratified as the >>> "Zicntr" extension. To be specific, the "I" base ISAs in the user ISA >>> version 2.2 have changed as follows (with some extras): >>> >>> User ISA version 2.2: >>> * RV32I / RV64I ("I") version 2.0 >>> >>> User ISA version 20190608: >>> * RV32I / RV64I ("I") version 2.1 >>> * The "Zicsr" extension, version 2.0 >>> * The "Zifencei" extension, version 2.0 >>> * Non-extension: Counters >>> * 3 counters originally available in "I" v2.0 (later "Zicntr") >>> * NEW: Additional up to 29 counters (later "Zihpm") >>> >>> User ISA version 20240411: >>> * RV32I / RV64I ("I") version 2.1 >>> * The "Zicsr" extension, version 2.0 >>> * The "Zifencei" extension, version 2.0 >>> * The "Zicntr" extension, version 2.0 (New as an extension) >>> * The "Zihpm" extension, version 2.0 (New as an extension) >>> >>> In other words, "I" version 2.0 is roughly equivalent to: >>> * RV32I / RV64I ("I") version 2.1 >>> * The "Zicsr" extension, version 2.0 >>> * The "Zifencei" extension, version 2.0 >>> * The "Zicntr" extension, version 2.0 >>> >>> So if we think pedantically, the flag containing "Zicntr" makes no >>> sense. Of course, there are a few cases where this flag becomes valid: >>> >>> 1. IMA base behavior should have been changed >>> (a documentation fix will be required to justify this) >>> 2. Denotes that native hardware support of basic hardware counters >>> >>> In either case, we will need to clarify somewhere. >>> >>> >>> 2/3. Zalrsc / Zaamo >>> ==================== >>> >>> This is easier to tell but harder to justify flags' existence. >>> >>> 1. The IMA base behavior contains the "A" extension. >>> 2. Both "Zalrsc" and "Zaamo" extensions are subsets of "A" >>> (in fact, A == Zalrsc + Zaamo) >>> 3. Is there any case where the IMA base behavior is available but >>> lacks a part of full "A" extension? >>> >>> For me, it just looks RISCV_HWPROBE_EXT_ZAAMO and >>> RISCV_HWPROBE_EXT_ZALRSC are always-on flags. If the value containing >>> these bits (key RISCV_HWPROBE_KEY_IMA_EXT_0) just lists extensions (with >>> no conditions), that would be meaningful if the Linux kernel is changed >>> so that the full "A" extension is no longer needed. But because the key >>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions *compatible to* the IMA >>> base behavior, justifying this is pretty hard. >>> >>> If there is a case where these flags can be turned off and still valid, >>> I'm happy to see an example and learn. >> >> While not technically required right now, there has been a series to use >> ZALRSC to implement AMO (from MIPS) [1] and thus remove the kernel >> dependency on the full "A" extensions. The goal of adding ZAAMO/ZALRSC >> was to have a comprehensive support of RISC-V extensions that might be >> useful for the userspace. Rationale was also that it was better to >> express all the dependencies rather than letting the userspace make some >> assumptions that would be hard to remove later. > > > Thanks for the background! > > In this case, meanings of the key RISCV_HWPROBE_KEY_IMA_EXT_0 should be > changed in the future (when the requirements are lowered and a different > RISCV_HWPROBE_KEY_BASE_BEHAVIOR value is defined) but otherwise looks > fine (and documentation update is only needed once that happens). > > And I understand that this is not worrying state for the userland. > > I appreciate that! > > Thanks, > Tsukasa > From my end and the Zicntr inclusion, I have to admit that given the documentation and the arguments you are bringing to the table, it is indeed redundant if we look at things pedantically. That being said, and as both of you are mentioning, maybe the requirements could be lowered to enable the flexibility which is inherent on the RISC-V architecture. Thus, I'm fine if you want me to provide a patch removing Zicntr in hwprobe if that is inconvenient to user-space. That is, I'd still keep it just in case, but if you feel that it's inconvenient or that it breaks user-space in any way, I'm more than happy to provide a patch for that. > >> >> BTW, there are a few mechanisms that are unlikely to be used as well in >> hwprobe (per-cpu extensions for instance, I do not think we yet have >> seen such hardware yet ?). Ditto for per-cpu misaligned access support. >> While potentially not popular, we try to cover the majority of the use >> cases, RISC-V hardware being, by nature, flexible. >> >> Thanks, >> >> Clément >> >> Link: >> https://patchwork.kernel.org/project/linux-riscv/patch/20241225082412.36727-1-arikalo@gmail.com/#26192228 >> [1] >> >>> >>> >>> Rust (userland) Behavior on version 1.88 or later >>> ================================================== >>> >>> From Rust 1.88 (currently in beta and will be released on the end of >>> June), the RISC-V feature detection logic (backend for the >>> is_riscv_feature_detected macro) will start to use the riscv_hwprobe >>> system call on Linux (before that, only auxiliary vector is used). >>> >>> cf. >>> <https://doc.rust-lang.org/beta/std/arch/macro.is_riscv_feature_detected.html> >>> >>> Currently, these flags are not read by the Rust standard library >>> (because Linux kernel version 6.15 hasn't released yet) but the behavior >>> is determined considering existence of these flags (new in 6.15): >>> >>> If the IMA base behavior is detected, following Rust target features are >>> enabled: >>> >>> 1. Either "rv32i" or "rv64i" >>> The IMA base behavior contains "I" base and extensions "M" and "A". >>> 2. "zicsr" >>> This is inferred from the fact I explained in the "Zicntr" section >>> above. It is also justified by the fact that Linux requires >>> the privileged architecture, which depends on the Zicsr extension. >>> 3. "zifencei" >>> This is inferred from the fact I explained in the "Zicntr" section >>> above. Linux also has the CMODX feature which makes the Zifencei >>> extension in the userland valid but riscv_hwprobe doesn't provide >>> a flag for the Zifencei extension. >>> 4. "m" >>> The IMA base behavior contains "I" base and extensions "M" and "A". >>> It implies the Zmmul extension but this one is not supported by >>> the Rust's feature handling system yet. >>> 5. "a" >>> The IMA base behavior contains "I" base and extensions "M" and "A". >>> 6. "zalrsc" >>> This extension is supported by Rust and implied from "a", >>> making RISCV_HWPROBE_EXT_ZALRSC ineffective. >>> 7. "zaamo" >>> This extension is supported by Rust and implied from "a", >>> making RISCV_HWPROBE_EXT_ZAAMO ineffective. >>> >>> But the IMA base behavior alone does NOT enable: >>> >>> 1. "zicntr" >>> I implemented the RISC-V feature detection logic in Rust more >>> conservatively than the documentation suggests. >>> It may make RISCV_HWPROBE_EXT_ZICNTR effective on Rust depending >>> on how future versions of the standard library is implemented >>> (possibly Rust version 1.90 or later). >>> >>> >>> Reiterating RFC >>> ================ >>> >>> 1. (To Clément and Miquel) >>> I'd like to hear the original intent of your changes. >>> 2. (To all) >>> How do we handle this situation? >>> >>> >>> Best regards, >>> Tsukasa >>> >>> p.s. >>> Just in case, I'm talking NOTHING about Rust on Linux (kernel mode). >> Thanks for looking into this! Miquel [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 861 bytes --] [-- Attachment #2: Type: text/plain, Size: 161 bytes --] _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) 2025-05-20 13:49 ` Miquel Sabaté Solà @ 2025-05-20 13:59 ` Clément Léger 2025-05-22 4:16 ` Tsukasa OI 1 sibling, 0 replies; 7+ messages in thread From: Clément Léger @ 2025-05-20 13:59 UTC (permalink / raw) To: Miquel Sabaté Solà, Tsukasa OI Cc: linux-riscv, Paul Walmsley, Palmer Dabbelt On 20/05/2025 15:49, Miquel Sabaté Solà wrote: > Hello, > > On dt., de maig 20 2025, Tsukasa OI wrote: > >> Hi Clément, >> >> On 2025/05/20 16:30, Clément Léger wrote: >>> >>> >>> On 20/05/2025 07:25, Tsukasa OI wrote: >>>> Hello Clément, Miquel and all. >>>> >>>> It's too late to make changes for the Linux kernel version 6.15 but at >>>> least we need to clarify something. I would like to hear from Clément >>>> and Miquel about your original intent of your changes and hear from all >>>> about your thoughts about the argument below. >>>> >>>> >>>> Background >>>> =========== >>>> >>>> While I am preparing for the riscv_hwprobe support in the Rust standard >>>> library (for target feature detection) looking at the master branch of >>>> Linux, I found three extensions in the RISCV_HWPROBE_KEY_IMA_EXT_0 key >>>> that would be redundant if we read the documentation pedantically. >>>> >>>> cf. Original riscv_hwprobe support for the Rust standard library >>>> (supports all flags as of Linux 6.14 except OS-dependent "Supm"): >>>> <https://github.com/rust-lang/stdarch/pull/1770> >>>> >>>> Here's the list (all of them will be new in 6.15): >>>> >>>> Commit 4458b8f68dc7ab8309291f1667157d0250938291 (by Miquel): >>>> 1. Zicntr >>>> (Zihpm is excluded because the argument below does not apply). >>>> >>>> Commit 9d45d1ff90a6888f6138eb7e1f2619ef427831d3 (by Clément): >>>> 2. Zalrsc >>>> 3. Zaamo >>>> >>>> >>>> Base Facts >>>> =========== >>>> >>>> The RISC-V hwprobe documentation states that >>>> RISCV_HWPROBE_BASE_BEHAVIOR_IMA is either RV32IMA/RV64IMA (user ISA >>>> version 2.2 and privileged ISA version 1.10 with a few exceptions) and >>>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions that are compatible with >>>> the RISCV_HWPROBE_BASE_BEHAVIOR_IMA base system behavior (I'll call this >>>> the IMA base behavior from now on). >>>> >>>> cf. <https://docs.kernel.org/arch/riscv/hwprobe.html> >>>> >>>> >>>> 1. Zicntr >>>> ========== >>>> >>>> The user ISA version 2.2 has RV32I / RV64I ("I") base ISAs, version 2.0. >>>> However, "I" base ISAs at that time contain features now ratified as the >>>> "Zicntr" extension. To be specific, the "I" base ISAs in the user ISA >>>> version 2.2 have changed as follows (with some extras): >>>> >>>> User ISA version 2.2: >>>> * RV32I / RV64I ("I") version 2.0 >>>> >>>> User ISA version 20190608: >>>> * RV32I / RV64I ("I") version 2.1 >>>> * The "Zicsr" extension, version 2.0 >>>> * The "Zifencei" extension, version 2.0 >>>> * Non-extension: Counters >>>> * 3 counters originally available in "I" v2.0 (later "Zicntr") >>>> * NEW: Additional up to 29 counters (later "Zihpm") >>>> >>>> User ISA version 20240411: >>>> * RV32I / RV64I ("I") version 2.1 >>>> * The "Zicsr" extension, version 2.0 >>>> * The "Zifencei" extension, version 2.0 >>>> * The "Zicntr" extension, version 2.0 (New as an extension) >>>> * The "Zihpm" extension, version 2.0 (New as an extension) >>>> >>>> In other words, "I" version 2.0 is roughly equivalent to: >>>> * RV32I / RV64I ("I") version 2.1 >>>> * The "Zicsr" extension, version 2.0 >>>> * The "Zifencei" extension, version 2.0 >>>> * The "Zicntr" extension, version 2.0 >>>> >>>> So if we think pedantically, the flag containing "Zicntr" makes no >>>> sense. Of course, there are a few cases where this flag becomes valid: >>>> >>>> 1. IMA base behavior should have been changed >>>> (a documentation fix will be required to justify this) >>>> 2. Denotes that native hardware support of basic hardware counters >>>> >>>> In either case, we will need to clarify somewhere. >>>> >>>> >>>> 2/3. Zalrsc / Zaamo >>>> ==================== >>>> >>>> This is easier to tell but harder to justify flags' existence. >>>> >>>> 1. The IMA base behavior contains the "A" extension. >>>> 2. Both "Zalrsc" and "Zaamo" extensions are subsets of "A" >>>> (in fact, A == Zalrsc + Zaamo) >>>> 3. Is there any case where the IMA base behavior is available but >>>> lacks a part of full "A" extension? >>>> >>>> For me, it just looks RISCV_HWPROBE_EXT_ZAAMO and >>>> RISCV_HWPROBE_EXT_ZALRSC are always-on flags. If the value containing >>>> these bits (key RISCV_HWPROBE_KEY_IMA_EXT_0) just lists extensions (with >>>> no conditions), that would be meaningful if the Linux kernel is changed >>>> so that the full "A" extension is no longer needed. But because the key >>>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions *compatible to* the IMA >>>> base behavior, justifying this is pretty hard. >>>> >>>> If there is a case where these flags can be turned off and still valid, >>>> I'm happy to see an example and learn. >>> >>> While not technically required right now, there has been a series to use >>> ZALRSC to implement AMO (from MIPS) [1] and thus remove the kernel >>> dependency on the full "A" extensions. The goal of adding ZAAMO/ZALRSC >>> was to have a comprehensive support of RISC-V extensions that might be >>> useful for the userspace. Rationale was also that it was better to >>> express all the dependencies rather than letting the userspace make some >>> assumptions that would be hard to remove later. >> >> >> Thanks for the background! >> >> In this case, meanings of the key RISCV_HWPROBE_KEY_IMA_EXT_0 should be >> changed in the future (when the requirements are lowered and a different >> RISCV_HWPROBE_KEY_BASE_BEHAVIOR value is defined) but otherwise looks >> fine (and documentation update is only needed once that happens). >> >> And I understand that this is not worrying state for the userland. >> >> I appreciate that! >> >> Thanks, >> Tsukasa >> > > From my end and the Zicntr inclusion, I have to admit that given the > documentation and the arguments you are bringing to the table, it is > indeed redundant if we look at things pedantically. That being said, and > as both of you are mentioning, maybe the requirements could be lowered > to enable the flexibility which is inherent on the RISC-V architecture. > > Thus, I'm fine if you want me to provide a patch removing Zicntr in > hwprobe if that is inconvenient to user-space. That is, I'd still keep > it just in case, but if you feel that it's inconvenient or that it > breaks user-space in any way, I'm more than happy to provide a patch for > that. Kernel rule n°1 being "Do not break the userspace", if it was in a released kernel and thus exposed to userspace, we should most probably keep it. Additionally, if it's useless, then it's not really harming anything, so there is no need to actually remove it. Thanks, Clément > >> >>> >>> BTW, there are a few mechanisms that are unlikely to be used as well in >>> hwprobe (per-cpu extensions for instance, I do not think we yet have >>> seen such hardware yet ?). Ditto for per-cpu misaligned access support. >>> While potentially not popular, we try to cover the majority of the use >>> cases, RISC-V hardware being, by nature, flexible. >>> >>> Thanks, >>> >>> Clément >>> >>> Link: >>> https://patchwork.kernel.org/project/linux-riscv/patch/20241225082412.36727-1-arikalo@gmail.com/#26192228 >>> [1] >>> >>>> >>>> >>>> Rust (userland) Behavior on version 1.88 or later >>>> ================================================== >>>> >>>> From Rust 1.88 (currently in beta and will be released on the end of >>>> June), the RISC-V feature detection logic (backend for the >>>> is_riscv_feature_detected macro) will start to use the riscv_hwprobe >>>> system call on Linux (before that, only auxiliary vector is used). >>>> >>>> cf. >>>> <https://doc.rust-lang.org/beta/std/arch/macro.is_riscv_feature_detected.html> >>>> >>>> Currently, these flags are not read by the Rust standard library >>>> (because Linux kernel version 6.15 hasn't released yet) but the behavior >>>> is determined considering existence of these flags (new in 6.15): >>>> >>>> If the IMA base behavior is detected, following Rust target features are >>>> enabled: >>>> >>>> 1. Either "rv32i" or "rv64i" >>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>> 2. "zicsr" >>>> This is inferred from the fact I explained in the "Zicntr" section >>>> above. It is also justified by the fact that Linux requires >>>> the privileged architecture, which depends on the Zicsr extension. >>>> 3. "zifencei" >>>> This is inferred from the fact I explained in the "Zicntr" section >>>> above. Linux also has the CMODX feature which makes the Zifencei >>>> extension in the userland valid but riscv_hwprobe doesn't provide >>>> a flag for the Zifencei extension. >>>> 4. "m" >>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>> It implies the Zmmul extension but this one is not supported by >>>> the Rust's feature handling system yet. >>>> 5. "a" >>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>> 6. "zalrsc" >>>> This extension is supported by Rust and implied from "a", >>>> making RISCV_HWPROBE_EXT_ZALRSC ineffective. >>>> 7. "zaamo" >>>> This extension is supported by Rust and implied from "a", >>>> making RISCV_HWPROBE_EXT_ZAAMO ineffective. >>>> >>>> But the IMA base behavior alone does NOT enable: >>>> >>>> 1. "zicntr" >>>> I implemented the RISC-V feature detection logic in Rust more >>>> conservatively than the documentation suggests. >>>> It may make RISCV_HWPROBE_EXT_ZICNTR effective on Rust depending >>>> on how future versions of the standard library is implemented >>>> (possibly Rust version 1.90 or later). >>>> >>>> >>>> Reiterating RFC >>>> ================ >>>> >>>> 1. (To Clément and Miquel) >>>> I'd like to hear the original intent of your changes. >>>> 2. (To all) >>>> How do we handle this situation? >>>> >>>> >>>> Best regards, >>>> Tsukasa >>>> >>>> p.s. >>>> Just in case, I'm talking NOTHING about Rust on Linux (kernel mode). >>> > > Thanks for looking into this! > Miquel _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) 2025-05-20 13:49 ` Miquel Sabaté Solà 2025-05-20 13:59 ` Clément Léger @ 2025-05-22 4:16 ` Tsukasa OI 2025-05-22 11:30 ` Miquel Sabaté Solà 1 sibling, 1 reply; 7+ messages in thread From: Tsukasa OI @ 2025-05-22 4:16 UTC (permalink / raw) To: Miquel Sabaté Solà, Clément Léger Cc: linux-riscv, Paul Walmsley, Palmer Dabbelt On 2025/05/20 22:49, Miquel Sabaté Solà wrote: > Hello, > > On dt., de maig 20 2025, Tsukasa OI wrote: > >> Hi Clément, >> >> On 2025/05/20 16:30, Clément Léger wrote: >>> >>> >>> On 20/05/2025 07:25, Tsukasa OI wrote: >>>> Hello Clément, Miquel and all. >>>> >>>> It's too late to make changes for the Linux kernel version 6.15 but at >>>> least we need to clarify something. I would like to hear from Clément >>>> and Miquel about your original intent of your changes and hear from all >>>> about your thoughts about the argument below. >>>> >>>> >>>> Background >>>> =========== >>>> >>>> While I am preparing for the riscv_hwprobe support in the Rust standard >>>> library (for target feature detection) looking at the master branch of >>>> Linux, I found three extensions in the RISCV_HWPROBE_KEY_IMA_EXT_0 key >>>> that would be redundant if we read the documentation pedantically. >>>> >>>> cf. Original riscv_hwprobe support for the Rust standard library >>>> (supports all flags as of Linux 6.14 except OS-dependent "Supm"): >>>> <https://github.com/rust-lang/stdarch/pull/1770> >>>> >>>> Here's the list (all of them will be new in 6.15): >>>> >>>> Commit 4458b8f68dc7ab8309291f1667157d0250938291 (by Miquel): >>>> 1. Zicntr >>>> (Zihpm is excluded because the argument below does not apply). >>>> >>>> Commit 9d45d1ff90a6888f6138eb7e1f2619ef427831d3 (by Clément): >>>> 2. Zalrsc >>>> 3. Zaamo >>>> >>>> >>>> Base Facts >>>> =========== >>>> >>>> The RISC-V hwprobe documentation states that >>>> RISCV_HWPROBE_BASE_BEHAVIOR_IMA is either RV32IMA/RV64IMA (user ISA >>>> version 2.2 and privileged ISA version 1.10 with a few exceptions) and >>>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions that are compatible with >>>> the RISCV_HWPROBE_BASE_BEHAVIOR_IMA base system behavior (I'll call this >>>> the IMA base behavior from now on). >>>> >>>> cf. <https://docs.kernel.org/arch/riscv/hwprobe.html> >>>> >>>> >>>> 1. Zicntr >>>> ========== >>>> >>>> The user ISA version 2.2 has RV32I / RV64I ("I") base ISAs, version 2.0. >>>> However, "I" base ISAs at that time contain features now ratified as the >>>> "Zicntr" extension. To be specific, the "I" base ISAs in the user ISA >>>> version 2.2 have changed as follows (with some extras): >>>> >>>> User ISA version 2.2: >>>> * RV32I / RV64I ("I") version 2.0 >>>> >>>> User ISA version 20190608: >>>> * RV32I / RV64I ("I") version 2.1 >>>> * The "Zicsr" extension, version 2.0 >>>> * The "Zifencei" extension, version 2.0 >>>> * Non-extension: Counters >>>> * 3 counters originally available in "I" v2.0 (later "Zicntr") >>>> * NEW: Additional up to 29 counters (later "Zihpm") >>>> >>>> User ISA version 20240411: >>>> * RV32I / RV64I ("I") version 2.1 >>>> * The "Zicsr" extension, version 2.0 >>>> * The "Zifencei" extension, version 2.0 >>>> * The "Zicntr" extension, version 2.0 (New as an extension) >>>> * The "Zihpm" extension, version 2.0 (New as an extension) >>>> >>>> In other words, "I" version 2.0 is roughly equivalent to: >>>> * RV32I / RV64I ("I") version 2.1 >>>> * The "Zicsr" extension, version 2.0 >>>> * The "Zifencei" extension, version 2.0 >>>> * The "Zicntr" extension, version 2.0 >>>> >>>> So if we think pedantically, the flag containing "Zicntr" makes no >>>> sense. Of course, there are a few cases where this flag becomes valid: >>>> >>>> 1. IMA base behavior should have been changed >>>> (a documentation fix will be required to justify this) >>>> 2. Denotes that native hardware support of basic hardware counters >>>> >>>> In either case, we will need to clarify somewhere. >>>> >>>> >>>> 2/3. Zalrsc / Zaamo >>>> ==================== >>>> >>>> This is easier to tell but harder to justify flags' existence. >>>> >>>> 1. The IMA base behavior contains the "A" extension. >>>> 2. Both "Zalrsc" and "Zaamo" extensions are subsets of "A" >>>> (in fact, A == Zalrsc + Zaamo) >>>> 3. Is there any case where the IMA base behavior is available but >>>> lacks a part of full "A" extension? >>>> >>>> For me, it just looks RISCV_HWPROBE_EXT_ZAAMO and >>>> RISCV_HWPROBE_EXT_ZALRSC are always-on flags. If the value containing >>>> these bits (key RISCV_HWPROBE_KEY_IMA_EXT_0) just lists extensions (with >>>> no conditions), that would be meaningful if the Linux kernel is changed >>>> so that the full "A" extension is no longer needed. But because the key >>>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions *compatible to* the IMA >>>> base behavior, justifying this is pretty hard. >>>> >>>> If there is a case where these flags can be turned off and still valid, >>>> I'm happy to see an example and learn. >>> >>> While not technically required right now, there has been a series to use >>> ZALRSC to implement AMO (from MIPS) [1] and thus remove the kernel >>> dependency on the full "A" extensions. The goal of adding ZAAMO/ZALRSC >>> was to have a comprehensive support of RISC-V extensions that might be >>> useful for the userspace. Rationale was also that it was better to >>> express all the dependencies rather than letting the userspace make some >>> assumptions that would be hard to remove later. >> >> >> Thanks for the background! >> >> In this case, meanings of the key RISCV_HWPROBE_KEY_IMA_EXT_0 should be >> changed in the future (when the requirements are lowered and a different >> RISCV_HWPROBE_KEY_BASE_BEHAVIOR value is defined) but otherwise looks >> fine (and documentation update is only needed once that happens). >> >> And I understand that this is not worrying state for the userland. >> >> I appreciate that! >> >> Thanks, >> Tsukasa >> > > From my end and the Zicntr inclusion, I have to admit that given the > documentation and the arguments you are bringing to the table, it is > indeed redundant if we look at things pedantically. That being said, and > as both of you are mentioning, maybe the requirements could be lowered > to enable the flexibility which is inherent on the RISC-V architecture. Thanks for the background! I wasn't keeping my eyes on the Linux kernel and I'm sorry for that. I would have replied with concerns if I was there at the time but I understand that this is quite hard to notice. So don't mind too much. > > Thus, I'm fine if you want me to provide a patch removing Zicntr in > hwprobe if that is inconvenient to user-space. That is, I'd still keep > it just in case, but if you feel that it's inconvenient or that it > breaks user-space in any way, I'm more than happy to provide a patch for > that. I support to keep it (even if this is *currently* redundant). As Clément quoted, we'd like to follow the rule: "Do not break the userspace". As the current requirements can be lowered in the future and the Zicntr extension constant will perfectly make sense if that happens. If that happens, I would propose adding the constant for the Zifencei extension (which has a history similar to the Zicntr extension but not in the extension list for riscv_hwprobe). I appreciate that both of you (Miquel and Clément) gave me the backgrounds and happy to confirm that no userland problems will occur on the kernel version 6.15. I (or someone) might change the behavior on handling the Zicntr extension on the Rust standard library in the future but it will be still compatible to the documented kernel behavior. Best regards, Tsukasa > >> >>> >>> BTW, there are a few mechanisms that are unlikely to be used as well in >>> hwprobe (per-cpu extensions for instance, I do not think we yet have >>> seen such hardware yet ?). Ditto for per-cpu misaligned access support. >>> While potentially not popular, we try to cover the majority of the use >>> cases, RISC-V hardware being, by nature, flexible. >>> >>> Thanks, >>> >>> Clément >>> >>> Link: >>> https://patchwork.kernel.org/project/linux-riscv/patch/20241225082412.36727-1-arikalo@gmail.com/#26192228 >>> [1] >>> >>>> >>>> >>>> Rust (userland) Behavior on version 1.88 or later >>>> ================================================== >>>> >>>> From Rust 1.88 (currently in beta and will be released on the end of >>>> June), the RISC-V feature detection logic (backend for the >>>> is_riscv_feature_detected macro) will start to use the riscv_hwprobe >>>> system call on Linux (before that, only auxiliary vector is used). >>>> >>>> cf. >>>> <https://doc.rust-lang.org/beta/std/arch/macro.is_riscv_feature_detected.html> >>>> >>>> Currently, these flags are not read by the Rust standard library >>>> (because Linux kernel version 6.15 hasn't released yet) but the behavior >>>> is determined considering existence of these flags (new in 6.15): >>>> >>>> If the IMA base behavior is detected, following Rust target features are >>>> enabled: >>>> >>>> 1. Either "rv32i" or "rv64i" >>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>> 2. "zicsr" >>>> This is inferred from the fact I explained in the "Zicntr" section >>>> above. It is also justified by the fact that Linux requires >>>> the privileged architecture, which depends on the Zicsr extension. >>>> 3. "zifencei" >>>> This is inferred from the fact I explained in the "Zicntr" section >>>> above. Linux also has the CMODX feature which makes the Zifencei >>>> extension in the userland valid but riscv_hwprobe doesn't provide >>>> a flag for the Zifencei extension. >>>> 4. "m" >>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>> It implies the Zmmul extension but this one is not supported by >>>> the Rust's feature handling system yet. >>>> 5. "a" >>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>> 6. "zalrsc" >>>> This extension is supported by Rust and implied from "a", >>>> making RISCV_HWPROBE_EXT_ZALRSC ineffective. >>>> 7. "zaamo" >>>> This extension is supported by Rust and implied from "a", >>>> making RISCV_HWPROBE_EXT_ZAAMO ineffective. >>>> >>>> But the IMA base behavior alone does NOT enable: >>>> >>>> 1. "zicntr" >>>> I implemented the RISC-V feature detection logic in Rust more >>>> conservatively than the documentation suggests. >>>> It may make RISCV_HWPROBE_EXT_ZICNTR effective on Rust depending >>>> on how future versions of the standard library is implemented >>>> (possibly Rust version 1.90 or later). >>>> >>>> >>>> Reiterating RFC >>>> ================ >>>> >>>> 1. (To Clément and Miquel) >>>> I'd like to hear the original intent of your changes. >>>> 2. (To all) >>>> How do we handle this situation? >>>> >>>> >>>> Best regards, >>>> Tsukasa >>>> >>>> p.s. >>>> Just in case, I'm talking NOTHING about Rust on Linux (kernel mode). >>> > > Thanks for looking into this! > Miquel _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) 2025-05-22 4:16 ` Tsukasa OI @ 2025-05-22 11:30 ` Miquel Sabaté Solà 0 siblings, 0 replies; 7+ messages in thread From: Miquel Sabaté Solà @ 2025-05-22 11:30 UTC (permalink / raw) To: Tsukasa OI Cc: Clément Léger, linux-riscv, Paul Walmsley, Palmer Dabbelt [-- Attachment #1.1: Type: text/plain, Size: 11666 bytes --] On dj., de maig 22 2025, Tsukasa OI wrote: > On 2025/05/20 22:49, Miquel Sabaté Solà wrote: >> Hello, >> >> On dt., de maig 20 2025, Tsukasa OI wrote: >> >>> Hi Clément, >>> >>> On 2025/05/20 16:30, Clément Léger wrote: >>>> >>>> >>>> On 20/05/2025 07:25, Tsukasa OI wrote: >>>>> Hello Clément, Miquel and all. >>>>> >>>>> It's too late to make changes for the Linux kernel version 6.15 but at >>>>> least we need to clarify something. I would like to hear from Clément >>>>> and Miquel about your original intent of your changes and hear from all >>>>> about your thoughts about the argument below. >>>>> >>>>> >>>>> Background >>>>> =========== >>>>> >>>>> While I am preparing for the riscv_hwprobe support in the Rust standard >>>>> library (for target feature detection) looking at the master branch of >>>>> Linux, I found three extensions in the RISCV_HWPROBE_KEY_IMA_EXT_0 key >>>>> that would be redundant if we read the documentation pedantically. >>>>> >>>>> cf. Original riscv_hwprobe support for the Rust standard library >>>>> (supports all flags as of Linux 6.14 except OS-dependent "Supm"): >>>>> <https://github.com/rust-lang/stdarch/pull/1770> >>>>> >>>>> Here's the list (all of them will be new in 6.15): >>>>> >>>>> Commit 4458b8f68dc7ab8309291f1667157d0250938291 (by Miquel): >>>>> 1. Zicntr >>>>> (Zihpm is excluded because the argument below does not apply). >>>>> >>>>> Commit 9d45d1ff90a6888f6138eb7e1f2619ef427831d3 (by Clément): >>>>> 2. Zalrsc >>>>> 3. Zaamo >>>>> >>>>> >>>>> Base Facts >>>>> =========== >>>>> >>>>> The RISC-V hwprobe documentation states that >>>>> RISCV_HWPROBE_BASE_BEHAVIOR_IMA is either RV32IMA/RV64IMA (user ISA >>>>> version 2.2 and privileged ISA version 1.10 with a few exceptions) and >>>>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions that are compatible with >>>>> the RISCV_HWPROBE_BASE_BEHAVIOR_IMA base system behavior (I'll call this >>>>> the IMA base behavior from now on). >>>>> >>>>> cf. <https://docs.kernel.org/arch/riscv/hwprobe.html> >>>>> >>>>> >>>>> 1. Zicntr >>>>> ========== >>>>> >>>>> The user ISA version 2.2 has RV32I / RV64I ("I") base ISAs, version 2.0. >>>>> However, "I" base ISAs at that time contain features now ratified as the >>>>> "Zicntr" extension. To be specific, the "I" base ISAs in the user ISA >>>>> version 2.2 have changed as follows (with some extras): >>>>> >>>>> User ISA version 2.2: >>>>> * RV32I / RV64I ("I") version 2.0 >>>>> >>>>> User ISA version 20190608: >>>>> * RV32I / RV64I ("I") version 2.1 >>>>> * The "Zicsr" extension, version 2.0 >>>>> * The "Zifencei" extension, version 2.0 >>>>> * Non-extension: Counters >>>>> * 3 counters originally available in "I" v2.0 (later "Zicntr") >>>>> * NEW: Additional up to 29 counters (later "Zihpm") >>>>> >>>>> User ISA version 20240411: >>>>> * RV32I / RV64I ("I") version 2.1 >>>>> * The "Zicsr" extension, version 2.0 >>>>> * The "Zifencei" extension, version 2.0 >>>>> * The "Zicntr" extension, version 2.0 (New as an extension) >>>>> * The "Zihpm" extension, version 2.0 (New as an extension) >>>>> >>>>> In other words, "I" version 2.0 is roughly equivalent to: >>>>> * RV32I / RV64I ("I") version 2.1 >>>>> * The "Zicsr" extension, version 2.0 >>>>> * The "Zifencei" extension, version 2.0 >>>>> * The "Zicntr" extension, version 2.0 >>>>> >>>>> So if we think pedantically, the flag containing "Zicntr" makes no >>>>> sense. Of course, there are a few cases where this flag becomes valid: >>>>> >>>>> 1. IMA base behavior should have been changed >>>>> (a documentation fix will be required to justify this) >>>>> 2. Denotes that native hardware support of basic hardware counters >>>>> >>>>> In either case, we will need to clarify somewhere. >>>>> >>>>> >>>>> 2/3. Zalrsc / Zaamo >>>>> ==================== >>>>> >>>>> This is easier to tell but harder to justify flags' existence. >>>>> >>>>> 1. The IMA base behavior contains the "A" extension. >>>>> 2. Both "Zalrsc" and "Zaamo" extensions are subsets of "A" >>>>> (in fact, A == Zalrsc + Zaamo) >>>>> 3. Is there any case where the IMA base behavior is available but >>>>> lacks a part of full "A" extension? >>>>> >>>>> For me, it just looks RISCV_HWPROBE_EXT_ZAAMO and >>>>> RISCV_HWPROBE_EXT_ZALRSC are always-on flags. If the value containing >>>>> these bits (key RISCV_HWPROBE_KEY_IMA_EXT_0) just lists extensions (with >>>>> no conditions), that would be meaningful if the Linux kernel is changed >>>>> so that the full "A" extension is no longer needed. But because the key >>>>> RISCV_HWPROBE_KEY_IMA_EXT_0 lists extensions *compatible to* the IMA >>>>> base behavior, justifying this is pretty hard. >>>>> >>>>> If there is a case where these flags can be turned off and still valid, >>>>> I'm happy to see an example and learn. >>>> >>>> While not technically required right now, there has been a series to use >>>> ZALRSC to implement AMO (from MIPS) [1] and thus remove the kernel >>>> dependency on the full "A" extensions. The goal of adding ZAAMO/ZALRSC >>>> was to have a comprehensive support of RISC-V extensions that might be >>>> useful for the userspace. Rationale was also that it was better to >>>> express all the dependencies rather than letting the userspace make some >>>> assumptions that would be hard to remove later. >>> >>> >>> Thanks for the background! >>> >>> In this case, meanings of the key RISCV_HWPROBE_KEY_IMA_EXT_0 should be >>> changed in the future (when the requirements are lowered and a different >>> RISCV_HWPROBE_KEY_BASE_BEHAVIOR value is defined) but otherwise looks >>> fine (and documentation update is only needed once that happens). >>> >>> And I understand that this is not worrying state for the userland. >>> >>> I appreciate that! >>> >>> Thanks, >>> Tsukasa >>> >> >> From my end and the Zicntr inclusion, I have to admit that given the >> documentation and the arguments you are bringing to the table, it is >> indeed redundant if we look at things pedantically. That being said, and >> as both of you are mentioning, maybe the requirements could be lowered >> to enable the flexibility which is inherent on the RISC-V architecture. > > Thanks for the background! > > I wasn't keeping my eyes on the Linux kernel and I'm sorry for that. > I would have replied with concerns if I was there at the time but I > understand that this is quite hard to notice. So don't mind too much. > >> >> Thus, I'm fine if you want me to provide a patch removing Zicntr in >> hwprobe if that is inconvenient to user-space. That is, I'd still keep >> it just in case, but if you feel that it's inconvenient or that it >> breaks user-space in any way, I'm more than happy to provide a patch for >> that. > > I support to keep it (even if this is *currently* redundant). > > As Clément quoted, we'd like to follow the rule: "Do not break the > userspace". As the current requirements can be lowered in the future > and the Zicntr extension constant will perfectly make sense if that happens. > > If that happens, I would propose adding the constant for the Zifencei > extension (which has a history similar to the Zicntr extension but not > in the extension list for riscv_hwprobe). > This is already the current behavior, as the extension for Zifencei is already defined (see arch/riscv/include/asm/hwcap.h) and the extension is properly detected, but it's simply not exported to the riscv_hwprobe interface. Hence, no patches required for now. Thanks for the feedback, Miquel > > I appreciate that both of you (Miquel and Clément) gave me the > backgrounds and happy to confirm that no userland problems will occur on > the kernel version 6.15. I (or someone) might change the behavior on > handling the Zicntr extension on the Rust standard library in the future > but it will be still compatible to the documented kernel behavior. > > Best regards, > Tsukasa > >> >>> >>>> >>>> BTW, there are a few mechanisms that are unlikely to be used as well in >>>> hwprobe (per-cpu extensions for instance, I do not think we yet have >>>> seen such hardware yet ?). Ditto for per-cpu misaligned access support. >>>> While potentially not popular, we try to cover the majority of the use >>>> cases, RISC-V hardware being, by nature, flexible. >>>> >>>> Thanks, >>>> >>>> Clément >>>> >>>> Link: >>>> https://patchwork.kernel.org/project/linux-riscv/patch/20241225082412.36727-1-arikalo@gmail.com/#26192228 >>>> [1] >>>> >>>>> >>>>> >>>>> Rust (userland) Behavior on version 1.88 or later >>>>> ================================================== >>>>> >>>>> From Rust 1.88 (currently in beta and will be released on the end of >>>>> June), the RISC-V feature detection logic (backend for the >>>>> is_riscv_feature_detected macro) will start to use the riscv_hwprobe >>>>> system call on Linux (before that, only auxiliary vector is used). >>>>> >>>>> cf. >>>>> <https://doc.rust-lang.org/beta/std/arch/macro.is_riscv_feature_detected.html> >>>>> >>>>> Currently, these flags are not read by the Rust standard library >>>>> (because Linux kernel version 6.15 hasn't released yet) but the behavior >>>>> is determined considering existence of these flags (new in 6.15): >>>>> >>>>> If the IMA base behavior is detected, following Rust target features are >>>>> enabled: >>>>> >>>>> 1. Either "rv32i" or "rv64i" >>>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>>> 2. "zicsr" >>>>> This is inferred from the fact I explained in the "Zicntr" section >>>>> above. It is also justified by the fact that Linux requires >>>>> the privileged architecture, which depends on the Zicsr extension. >>>>> 3. "zifencei" >>>>> This is inferred from the fact I explained in the "Zicntr" section >>>>> above. Linux also has the CMODX feature which makes the Zifencei >>>>> extension in the userland valid but riscv_hwprobe doesn't provide >>>>> a flag for the Zifencei extension. >>>>> 4. "m" >>>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>>> It implies the Zmmul extension but this one is not supported by >>>>> the Rust's feature handling system yet. >>>>> 5. "a" >>>>> The IMA base behavior contains "I" base and extensions "M" and "A". >>>>> 6. "zalrsc" >>>>> This extension is supported by Rust and implied from "a", >>>>> making RISCV_HWPROBE_EXT_ZALRSC ineffective. >>>>> 7. "zaamo" >>>>> This extension is supported by Rust and implied from "a", >>>>> making RISCV_HWPROBE_EXT_ZAAMO ineffective. >>>>> >>>>> But the IMA base behavior alone does NOT enable: >>>>> >>>>> 1. "zicntr" >>>>> I implemented the RISC-V feature detection logic in Rust more >>>>> conservatively than the documentation suggests. >>>>> It may make RISCV_HWPROBE_EXT_ZICNTR effective on Rust depending >>>>> on how future versions of the standard library is implemented >>>>> (possibly Rust version 1.90 or later). >>>>> >>>>> >>>>> Reiterating RFC >>>>> ================ >>>>> >>>>> 1. (To Clément and Miquel) >>>>> I'd like to hear the original intent of your changes. >>>>> 2. (To all) >>>>> How do we handle this situation? >>>>> >>>>> >>>>> Best regards, >>>>> Tsukasa >>>>> >>>>> p.s. >>>>> Just in case, I'm talking NOTHING about Rust on Linux (kernel mode). >>>> >> >> Thanks for looking into this! >> Miquel [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 861 bytes --] [-- Attachment #2: Type: text/plain, Size: 161 bytes --] _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-05-22 11:32 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-05-20 5:25 [RFC] Making sense of RISCV_HWPROBE_EXT_* (new flags in version 6.15) Tsukasa OI 2025-05-20 7:30 ` Clément Léger 2025-05-20 9:32 ` Tsukasa OI 2025-05-20 13:49 ` Miquel Sabaté Solà 2025-05-20 13:59 ` Clément Léger 2025-05-22 4:16 ` Tsukasa OI 2025-05-22 11:30 ` Miquel Sabaté Solà
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).