AArch64,多级缓存刷新,级刷新顺序

AArch64, multi level cache flush, order of level flushing

简而言之,我们谈论的是具有 2 级缓存(L1、L2)的 SoC。我需要将缓存中的所有数据刷新到主 DDR 内存中。问题是应该按什么顺序完成


详情:
所讨论的 SoC 是具有 4 CPUs 的 AArch64 芯片。每个CPU有单独的L1缓存和共享的L2缓存,主DDR内存在L2缓存之后。
在系统 CPU0 上启动并

现在 CPU0,在允许其他人启动之前,刷新整个缓存(L1 和 L2),以便其他人可以使用全局环境变量进行正确的初始化。主要初始化由其他 CPUs 完成,缓存关闭,因此重要的是将数据放在主内存中,而不仅仅是共享 L2 中。 通过使用 dc csw ... 指令遍历所有 sets/ways 来刷新缓存。

问题是一些全局变量没有完全进入主内存。我可以看到 CPUs(CPU0 除外)使用默认值读取这些变量(就像它们从未被 CPU0 分配过一样)。

重要提示: 当缓存按 'whole L1' - 'whole L2' 的顺序刷新时会发生这种情况。 当我将刷新顺序更改为 L2 - L1 时,一切都很好并且 CPUs 从内存中读取了正确的值。

但这仍然可能只是一个 'luck',所有必要的环境变量都被缓存控制器而不是我的缓存刷新例程从缓存中逐出。

那么刷新缓存的正确顺序是什么? 谢谢

PS:

D4.4.7下的ARMv8 Reference Manual说:

The points to which a cache maintenance instruction can be defined differ depending on whether the instruction operates by VA or by set/way.

  • For instructions operating by set/way, the point is defined to be to the next level of caching. [...]

所以正确的顺序应该是L1,然后是L2。