diff --git a/docs/misc/riscv/booting.txt b/docs/misc/riscv/booting.txt index c99ccafa74..14212ed62f 100644 --- a/docs/misc/riscv/booting.txt +++ b/docs/misc/riscv/booting.txt @@ -19,9 +19,6 @@ them is missing from the riscv,isa property of the CPU nodes: a very simple sequence. The similar issue occurs with other __builtin_, so it is needed to provide a generic version of bitops in RISC-V bitops.h -- Zihintpause: - On a system that doesn't have this extension, cpu_relax() should be - implemented properly. - Svpbmt: Mandatory to enable changing the memory attributes of a page. For platforms that do not support Svpbmt, it is necessary to introduce a diff --git a/xen/arch/riscv/cpufeature.c b/xen/arch/riscv/cpufeature.c index 2d12dffae7..3d5bbd2228 100644 --- a/xen/arch/riscv/cpufeature.c +++ b/xen/arch/riscv/cpufeature.c @@ -214,7 +214,6 @@ static const struct riscv_isa_ext_data __initconst required_extensions[] = { RISCV_ISA_EXT_DATA(h), RISCV_ISA_EXT_DATA(zicsr), RISCV_ISA_EXT_DATA(zifencei), - RISCV_ISA_EXT_DATA(zihintpause), RISCV_ISA_EXT_DATA(zbb), RISCV_ISA_EXT_DATA(svpbmt), }; @@ -664,6 +663,17 @@ void __init riscv_fill_hwcap(void) __set_bit(RISCV_ISA_EXT_sstc, riscv_isa); } + /* + * Zihintpause isn't mandatory: the encoding used by cpu_relax() is a + * HINT which executes as a no-op on hardware without the extension. + * Report it, as a platform may provide its own way to hint a spin-wait + * loop, which then has to be wired up in cpu_relax(). + */ + if ( !riscv_isa_extension_available(NULL, RISCV_ISA_EXT_zihintpause) ) + printk(XENLOG_WARNING + "Zihintpause unavailable: cpu_relax() gives the CPU no hint; " + "wire up this platform's pause equivalent in cpu_relax()\n"); + for ( i = 0; i < req_extns_amount; i++ ) { const struct riscv_isa_ext_data ext = required_extensions[i];