On 12/8/25 5:22 PM, Jan Beulich wrote:
On 24.11.2025 13:33, Oleksii Kurochko wrote:
+static void __init gstage_mode_detect(void)
+{
+    static const struct gstage_mode_desc modes[] __initconst = {
+        /*
+         * Based on the RISC-V spec:
+         *   Bare mode is always supported, regardless of SXLEN.
+         *   When SXLEN=32, the only other valid setting for MODE is Sv32.
+         *   When SXLEN=64, three paged virtual-memory schemes are defined:
+         *   Sv39, Sv48, and Sv57.
+         */
+#ifdef CONFIG_RISCV_32
+        { HGATP_MODE_SV32X4, 2, "Sv32x4" }
+#else
+        { HGATP_MODE_SV39X4, 3, "Sv39x4" },
+        { HGATP_MODE_SV48X4, 4, "Sv48x4" },
+        { HGATP_MODE_SV57X4, 5, "Sv57x4" },
+#endif
+    };
+
+    unsigned int mode_idx;
Can't this move ...

+    for ( mode_idx = ARRAY_SIZE(modes); mode_idx-- > 0; )
... into here? You don't use the variable outside of the loop.

Agree, mode_idx isn't used outside of the loop anymore, so I will move
declaration of it into for header.


+    {
+        unsigned long mode = modes[mode_idx].mode;
+
+        csr_write(CSR_HGATP, MASK_INSR(mode, HGATP_MODE_MASK));
+
+        if ( MASK_EXTR(csr_read(CSR_HGATP), HGATP_MODE_MASK) == mode )
+        {
+            max_gstage_mode.mode = modes[mode_idx].mode;
+            max_gstage_mode.paging_levels = modes[mode_idx].paging_levels;
+            safe_strcpy(max_gstage_mode.name, modes[mode_idx].name);
This looks as if you were overwriting .rodata here (the string literal
"Bare"). You aren't, but why can't the whole copying be a single struct
assignment?

Agree, it could be just:
 max_gstage_mode = modes[mode_idx];


Preferably with the adjustments:
Acked-by: Jan Beulich <[email protected]>

Thanks.

~ Oleksii


Reply via email to