mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 14:19:16 +00:00
RISC-V: hwprobe: Add support for RISCV_HWPROBE_BASE_BEHAVIOR_IMA
We have an implicit set of base behaviors that userspace depends on, which are mostly defined in various ISA specifications. Co-developed-by: Palmer Dabbelt <palmer@rivosinc.com> Signed-off-by: Evan Green <evan@rivosinc.com> Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Reviewed-by: Heiko Stuebner <heiko.stuebner@vrull.eu> Tested-by: Heiko Stuebner <heiko.stuebner@vrull.eu> Reviewed-by: Paul Walmsley <paul.walmsley@sifive.com> Link: https://lore.kernel.org/r/20230407231103.2622178-4-evan@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
ea3de9ce8a
commit
00e76e2c6a
4 changed files with 50 additions and 1 deletions
|
@ -39,3 +39,27 @@ The following keys are defined:
|
||||||
|
|
||||||
* :c:macro:`RISCV_HWPROBE_KEY_MIMPLID`: Contains the value of ``mimplid``, as
|
* :c:macro:`RISCV_HWPROBE_KEY_MIMPLID`: Contains the value of ``mimplid``, as
|
||||||
defined by the RISC-V privileged architecture specification.
|
defined by the RISC-V privileged architecture specification.
|
||||||
|
|
||||||
|
* :c:macro:`RISCV_HWPROBE_KEY_BASE_BEHAVIOR`: A bitmask containing the base
|
||||||
|
user-visible behavior that this kernel supports. The following base user ABIs
|
||||||
|
are defined:
|
||||||
|
|
||||||
|
* :c:macro:`RISCV_HWPROBE_BASE_BEHAVIOR_IMA`: Support for rv32ima or
|
||||||
|
rv64ima, as defined by version 2.2 of the user ISA and version 1.10 of the
|
||||||
|
privileged ISA, with the following known exceptions (more exceptions may be
|
||||||
|
added, but only if it can be demonstrated that the user ABI is not broken):
|
||||||
|
|
||||||
|
* The :fence.i: instruction cannot be directly executed by userspace
|
||||||
|
programs (it may still be executed in userspace via a
|
||||||
|
kernel-controlled mechanism such as the vDSO).
|
||||||
|
|
||||||
|
* :c:macro:`RISCV_HWPROBE_KEY_IMA_EXT_0`: A bitmask containing the extensions
|
||||||
|
that are compatible with the :c:macro:`RISCV_HWPROBE_BASE_BEHAVIOR_IMA`:
|
||||||
|
base system behavior.
|
||||||
|
|
||||||
|
* :c:macro:`RISCV_HWPROBE_IMA_FD`: The F and D extensions are supported, as
|
||||||
|
defined by commit cd20cee ("FMIN/FMAX now implement
|
||||||
|
minimumNumber/maximumNumber, not minNum/maxNum") of the RISC-V ISA manual.
|
||||||
|
|
||||||
|
* :c:macro:`RISCV_HWPROBE_IMA_C`: The C extension is supported, as defined
|
||||||
|
by version 2.2 of the RISC-V ISA manual.
|
||||||
|
|
|
@ -8,6 +8,6 @@
|
||||||
|
|
||||||
#include <uapi/asm/hwprobe.h>
|
#include <uapi/asm/hwprobe.h>
|
||||||
|
|
||||||
#define RISCV_HWPROBE_MAX_KEY 2
|
#define RISCV_HWPROBE_MAX_KEY 4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,6 +20,11 @@ struct riscv_hwprobe {
|
||||||
#define RISCV_HWPROBE_KEY_MVENDORID 0
|
#define RISCV_HWPROBE_KEY_MVENDORID 0
|
||||||
#define RISCV_HWPROBE_KEY_MARCHID 1
|
#define RISCV_HWPROBE_KEY_MARCHID 1
|
||||||
#define RISCV_HWPROBE_KEY_MIMPID 2
|
#define RISCV_HWPROBE_KEY_MIMPID 2
|
||||||
|
#define RISCV_HWPROBE_KEY_BASE_BEHAVIOR 3
|
||||||
|
#define RISCV_HWPROBE_BASE_BEHAVIOR_IMA (1 << 0)
|
||||||
|
#define RISCV_HWPROBE_KEY_IMA_EXT_0 4
|
||||||
|
#define RISCV_HWPROBE_IMA_FD (1 << 0)
|
||||||
|
#define RISCV_HWPROBE_IMA_C (1 << 1)
|
||||||
/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
|
/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/hwprobe.h>
|
#include <asm/hwprobe.h>
|
||||||
#include <asm/sbi.h>
|
#include <asm/sbi.h>
|
||||||
|
#include <asm/switch_to.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm-generic/mman-common.h>
|
#include <asm-generic/mman-common.h>
|
||||||
|
@ -125,6 +126,25 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair,
|
||||||
case RISCV_HWPROBE_KEY_MIMPID:
|
case RISCV_HWPROBE_KEY_MIMPID:
|
||||||
hwprobe_arch_id(pair, cpus);
|
hwprobe_arch_id(pair, cpus);
|
||||||
break;
|
break;
|
||||||
|
/*
|
||||||
|
* The kernel already assumes that the base single-letter ISA
|
||||||
|
* extensions are supported on all harts, and only supports the
|
||||||
|
* IMA base, so just cheat a bit here and tell that to
|
||||||
|
* userspace.
|
||||||
|
*/
|
||||||
|
case RISCV_HWPROBE_KEY_BASE_BEHAVIOR:
|
||||||
|
pair->value = RISCV_HWPROBE_BASE_BEHAVIOR_IMA;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RISCV_HWPROBE_KEY_IMA_EXT_0:
|
||||||
|
pair->value = 0;
|
||||||
|
if (has_fpu())
|
||||||
|
pair->value |= RISCV_HWPROBE_IMA_FD;
|
||||||
|
|
||||||
|
if (riscv_isa_extension_available(NULL, c))
|
||||||
|
pair->value |= RISCV_HWPROBE_IMA_C;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For forward compatibility, unknown keys don't fail the whole
|
* For forward compatibility, unknown keys don't fail the whole
|
||||||
|
|
Loading…
Reference in a new issue