]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
riscv: hwprobe: export highest virtual userspace address
authorClément Léger <cleger@rivosinc.com>
Wed, 10 Apr 2024 14:45:57 +0000 (16:45 +0200)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 11 Jul 2024 15:57:33 +0000 (08:57 -0700)
Some userspace applications (OpenJDK for instance) uses the free MSBs
in pointers to insert additional information for their own logic and
need to get this information from somewhere. Currently they rely on
parsing /proc/cpuinfo "mmu=svxx" string to obtain the current value of
virtual address usable bits [1]. Since this reflect the raw supported
MMU mode, it might differ from the logical one used internally which is
why arch_get_mmap_end() is used. Exporting the highest mmapable address
through hwprobe will allow a more stable interface to be used. For that
purpose, add a new hwprobe key named
RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS which will export the highest
userspace virtual address.

Link: https://github.com/openjdk/jdk/blob/master/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp#L171
Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Link: https://lore.kernel.org/r/20240410144558.1104006-1-cleger@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
Documentation/arch/riscv/hwprobe.rst
arch/riscv/include/asm/hwprobe.h
arch/riscv/include/asm/processor.h
arch/riscv/include/uapi/asm/hwprobe.h
arch/riscv/kernel/sys_hwprobe.c

index 25d783be2878776a6d3969ffc637bc8d0f45bd9d..652e6ef05baa0a7a1facd5bc0ec6e22817f8d989 100644 (file)
@@ -257,3 +257,6 @@ The following keys are defined:
 
 * :c:macro:`RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE`: An unsigned int which
   represents the size of the Zicboz block in bytes.
+
+* :c:macro:`RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS`: An unsigned long which
+  represent the highest userspace virtual address usable.
index 630507dff5ead30a368fcae56489c5ccb988e3e7..150a9877b0af1f0bf79be13c697961ab7ce03d60 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <uapi/asm/hwprobe.h>
 
-#define RISCV_HWPROBE_MAX_KEY 6
+#define RISCV_HWPROBE_MAX_KEY 7
 
 static inline bool riscv_hwprobe_key_is_valid(__s64 key)
 {
index 68c3432dc6ea4ef44b590438373815db4fd18a9f..8702b8721a270d3c7122cca1e7219852c5b744b0 100644 (file)
 
 #define STACK_TOP              DEFAULT_MAP_WINDOW
 
+#ifdef CONFIG_MMU
+#define user_max_virt_addr() arch_get_mmap_end(ULONG_MAX, 0, 0)
+#else
+#define user_max_virt_addr() 0
+#endif /* CONFIG_MMU */
+
 /*
  * This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
index 920fc6a586c9e994505badeae8ffe5e022024e7d..9e48320cb970f24f0b3c347b8c6359124d663eab 100644 (file)
@@ -79,6 +79,7 @@ struct riscv_hwprobe {
 #define                RISCV_HWPROBE_MISALIGNED_UNSUPPORTED    (4 << 0)
 #define                RISCV_HWPROBE_MISALIGNED_MASK           (7 << 0)
 #define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE    6
+#define RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS 7
 /* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
 
 /* Flags */
index 3d1aa13a0bb2fe29a6ea42859e3642002d8a13c6..c6b77fee6e1aa5abc9342a8280ac932079e57b0e 100644 (file)
@@ -8,6 +8,7 @@
 #include <asm/cacheflush.h>
 #include <asm/cpufeature.h>
 #include <asm/hwprobe.h>
+#include <asm/processor.h>
 #include <asm/sbi.h>
 #include <asm/switch_to.h>
 #include <asm/uaccess.h>
@@ -231,6 +232,9 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair,
                if (hwprobe_ext0_has(cpus, RISCV_HWPROBE_EXT_ZICBOZ))
                        pair->value = riscv_cboz_block_size;
                break;
+       case RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS:
+               pair->value = user_max_virt_addr();
+               break;
 
        /*
         * For forward compatibility, unknown keys don't fail the whole