[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 4/6] xen/riscv: introduce cache management operations (CMO)
On 10.12.2024 13:19, Oleksii Kurochko wrote: > > On 12/9/24 3:38 PM, Jan Beulich wrote: >> 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? > > Yes, this was done intentionally because: > - I don't have hardware with the CMO extension, so I can't test it. ( QEMU > doesn't model cache and so > there is no need for CMO extension emulation IIUC ) > - The instructions used for these functions may be hardware-specific and > exist only for particular devices. > > It seems useful to have something similar to Linux: > https://elixir.bootlin.com/linux/v6.6.64/source/arch/riscv/include/asm/errata_list.h#L135 > > <https://elixir.bootlin.com/linux/v6.6.64/source/arch/riscv/include/asm/errata_list.h#L135> > (There are also custom instructions for THEAD above this macro.) > > We could use|ALT_CMO_OP(...)| inside|clean_and_invalidate_dcache_va_range()| > and|clean_dcache_va_range()|. > However, I think it would be better to introduce or implement these functions > when|HAS_CMO| is set to|y| someday. > > As an alternative, we could implement these functions as|panic("need to be > implemented\n")| in case when HAS_CMO=y. I think this would be well in line with various other stubs you have. > Another option is to drop|HAS_CMO| entirely for now and keep the current > implementation (|return -EOPNOTSUPP|). > However, with this approach, there's a risk of encountering hard-to-debug > issues on platforms with the CMO extension. > And necessity of implementation of these could be missed because there is no > any notification... Well, callers ought to check return values? >>> 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? > > Based on the specification: > ``` > Chapter 34. RV32/64G Instruction Set Listings > One goal of the RISC-V project is that it be used as a stable software > development target. For this > purpose, we define a combination of a base ISA (RV32I or RV64I) plus selected > standard extensions > (IMAFD, Zicsr, Zifencei) as a "general-purpose" ISA, and we use the > abbreviation G for the > IMAFDZicsr_Zifencei combination of instruction-set extensions. This chapter > presents opcode maps > and instruction-set listings for RV32G and RV64G > ``` Hmm, indeed. That's well hidden in a place I didn't expect it to live at. Maybe worth a sentence in the description? > and that G is needed to boot Linux kernel ( and so Xen ) I make an assumption > that Zifencei will be always > present. I'd be a little careful here. Xen may be used in Linux-free environments. I notice arch.mk specifies rv64g, yet I'm uncertain we shouldn't relax that at some point. > And based on Linux code > (https://elixir.bootlin.com/linux/v6.12.4/source/arch/riscv/kernel/cpufeature.c#L676 > ) > when 'i' is present in riscv,isa property zifencei is present unconditionally. That looks questionable to me. I don't think Zifencei can be inferred from I. Historically it was, and imo that's what the comment there says. Plus it is dependent upon acpi_disabled. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |