On 27.11.2024 13:50, Oleksii Kurochko wrote: > --- a/xen/arch/riscv/Kconfig > +++ b/xen/arch/riscv/Kconfig > @@ -14,6 +14,9 @@ config ARCH_DEFCONFIG > string > default "arch/riscv/configs/tiny64_defconfig" > > +config HAS_CMO # Cache Management Operations > + bool
Hmm, and nothing ever sets this, and hence ... > @@ -148,9 +149,24 @@ static inline bool pte_is_mapping(pte_t p) > return (p.pte & PTE_VALID) && (p.pte & PTE_ACCESS_MASK); > } > > +#ifndef HAS_CMO > +static inline int clean_and_invalidate_dcache_va_range(const void *p, > unsigned long size) > +{ > + return -EOPNOTSUPP; > +} > + > +static inline int clean_dcache_va_range(const void *p, unsigned long size) > +{ > + return -EOPNOTSUPP; > +} > +#else > +int clean_and_invalidate_dcache_va_range(const void *p, unsigned long size); > +int clean_dcache_va_range(const void *p, unsigned long size); > +#endif ... all you really provide are stubs and declarations, but no definition anywhere? Plus of course this gets us into feature detection territory again: If RISC-V provided a way to detect presence / absence of certain extensions, this really shouldn't be a compile time setting, but be determined dynamically. > static inline void invalidate_icache(void) > { > - BUG_ON("unimplemented"); > + asm volatile ( "fence.i" ::: "memory" ); > } That's a separate extension, Zifencei, which I don't think you can just assume to be present? Jan