[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 5/7] xen/riscv: implement data and instruction cache operations
On 17.12.2024 17:32, Oleksii Kurochko wrote: > Implement following cache operations: > - clean_and_invalidate_dcache_va_range() > - clean_dcache_va_range() > - invalidate_icache() > > The first two functions may require support for the CMO (Cache Management > Operations) extension and/or hardware-specific instructions. > Currently, only QEMU is supported, which does not model cache behavior. > Therefore, clean_and_invalidate_dcache_va_range() and clean_dcache_va_range() > are implemented to simply return 0. For other cases, generate compilation > error > so a user won't miss to update this function if necessery. > If hardware supports CMO or hardware-specific instructions, these functions > should be updated accordingly. To support current implementation of these > function CONFIG_QEMU_PLATFORM is introduced. > > invalidate_icache() is implemented using fence.i instruction as > mentioned in the unpriv spec: > The FENCE.I instruction was designed to support a wide variety of > implementations. A simple implementation can flush the local instruction > cache and the instruction pipeline when the FENCE.I is executed. > A more complex implementation might snoop the instruction (data) cache > on every data (instruction) cache miss, or use an inclusive unified > private L2 cache to invalidate lines from the primary instruction cache > when they are being written by a local store instruction. > If instruction and data caches are kept coherent in this way, or if the > memory system consists of only uncached RAMs, then just the fetch pipeline > needs to be flushed at a FENCE.I. > The FENCE.I instruction requires the presence of the Zifencei extension, > which might not always be available. However, Xen uses the RV64G ISA, which > guarantees the presence of the Zifencei extension. According to the > unprivileged ISA specification (version 20240411): > 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. > > Set CONFIG_QEMU_PLATFORM=y in tiny64_defconfig to have proper implemtation of > clean_and_invalidate_dcache_va_range() and clean_dcache_va_range() for CI. > > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> I'm not entirely happy with this (and where it appears to be moving us), but for the time being it's perhaps good enough, so Acked-by: Jan Beulich <jbeulich@xxxxxxxx> Albeit with ... > @@ -148,9 +149,28 @@ static inline bool pte_is_mapping(pte_t p) > return (p.pte & PTE_VALID) && (p.pte & PTE_ACCESS_MASK); > } > > +static inline int clean_and_invalidate_dcache_va_range(const void *p, > + unsigned long size) > +{ > +#ifndef CONFIG_QEMU_PLATFORM > + #error "should clean_and_invalidate_dcache_va_range() be updated?" > +#endif > + > + return 0; > +} > + > +static inline int clean_dcache_va_range(const void *p, unsigned long size) > +{ > +#ifndef CONFIG_QEMU_PLATFORM > + #error "should clean_dcache_va_range() be updated?" > +#endif > + > + return 0; > +} ... the #-es moved back to the 1st column, which I'll take the liberty of doing while committing. Personally I wonder anyway why these aren't simply BUILD_BUG_ON("unimplemented"). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |