riscv: hwprobe: export highest virtual userspace address
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 [1] 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>
This commit is contained in:
parent
16badacd8a
commit
c9b8cd139c
@ -257,3 +257,6 @@ The following keys are defined:
|
|||||||
|
|
||||||
* :c:macro:`RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE`: An unsigned int which
|
* :c:macro:`RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE`: An unsigned int which
|
||||||
represents the size of the Zicboz block in bytes.
|
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.
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include <uapi/asm/hwprobe.h>
|
#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)
|
static inline bool riscv_hwprobe_key_is_valid(__s64 key)
|
||||||
{
|
{
|
||||||
|
@ -57,6 +57,12 @@
|
|||||||
|
|
||||||
#define STACK_TOP DEFAULT_MAP_WINDOW
|
#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
|
* This decides where the kernel will search for a free chunk of vm
|
||||||
* space during mmap's.
|
* space during mmap's.
|
||||||
|
@ -79,6 +79,7 @@ struct riscv_hwprobe {
|
|||||||
#define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
|
#define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
|
||||||
#define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
|
#define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
|
||||||
#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
|
#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
|
||||||
|
#define RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS 7
|
||||||
/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
|
/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
|
||||||
|
|
||||||
/* Flags */
|
/* Flags */
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/cpufeature.h>
|
#include <asm/cpufeature.h>
|
||||||
#include <asm/hwprobe.h>
|
#include <asm/hwprobe.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
#include <asm/sbi.h>
|
#include <asm/sbi.h>
|
||||||
#include <asm/switch_to.h>
|
#include <asm/switch_to.h>
|
||||||
#include <asm/uaccess.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))
|
if (hwprobe_ext0_has(cpus, RISCV_HWPROBE_EXT_ZICBOZ))
|
||||||
pair->value = riscv_cboz_block_size;
|
pair->value = riscv_cboz_block_size;
|
||||||
break;
|
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
|
* For forward compatibility, unknown keys don't fail the whole
|
||||||
|
Loading…
Reference in New Issue
Block a user