From: Philippe Mathieu-Daudé Date: Mon, 5 Jun 2023 19:52:54 +0000 (+0200) Subject: util/cacheflush: Avoid possible redundant dcache flush on Darwin X-Git-Tag: v8.1.0-rc0~58^2~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bb6af0fa51cac875e5986aada0de339dcc94eca5;p=thirdparty%2Fqemu.git util/cacheflush: Avoid possible redundant dcache flush on Darwin describes sys_icache_invalidate() as "equivalent to sys_cache_control(kCacheFunctionPrepareForExecution)", having kCacheFunctionPrepareForExecution defined as: /* Prepare memory for execution. This should be called * after writing machine instructions to memory, before * executing them. It syncs the dcache and icache. [...] */ Since the dcache is also sync'd, we can avoid the sys_dcache_flush() call when both rx/rw pointers are equal. Suggested-by: Richard Henderson Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Richard Henderson Reviewed-by: Akihiko Odaki Message-Id: <20230605195911.96033-1-philmd@linaro.org> --- diff --git a/util/cacheflush.c b/util/cacheflush.c index de35616718c..a08906155a9 100644 --- a/util/cacheflush.c +++ b/util/cacheflush.c @@ -241,7 +241,14 @@ static void __attribute__((constructor)) init_cache_info(void) void flush_idcache_range(uintptr_t rx, uintptr_t rw, size_t len) { - sys_dcache_flush((void *)rw, len); + if (rx == rw) { + /* + * sys_icache_invalidate() syncs the dcache and icache, + * so no need to call sys_dcache_flush(). + */ + } else { + sys_dcache_flush((void *)rw, len); + } sys_icache_invalidate((void *)rx, len); } #else