【问题标题】:How to invalidate L1 data cache for a specific memory range on PowerPC PQ-III e500?如何使 PowerPC PQ-III e500 上特定内存范围的 L1 数据缓存失效?
【发布时间】:2011-05-30 08:25:01
【问题描述】:

DMA 任务会定期更新一个特殊的内存块。当另一个Task频繁尝试在这个block中查找数据时,会出现关于L1数据缓存奇偶校验的MCE(Machine Check Exception)。 我可以完全或仅在 DMA 更新后使此内存块的 L1 数据缓存失效吗?

libogc 中有一个有趣的 API,例如:

void DCInvalidateRange(void *startaddress,u32 len); 

    .globl DCInvalidateRange
DCInvalidateRange:
    cmplwi r4, 0   # zero or negative size?
    blelr
    clrlwi. r5, r3, 27  # check for lower bits set in address
    beq 1f
    addi r4, r4, 0x20 
1:
    addi r4, r4, 0x1f
    srwi r4, r4, 5
    mtctr r4
2:
    dcbi r0, r3
    addi r3, r3, 0x20
    bdnz 2b
    blr

我不熟悉 ASM,也不熟悉 PowerPC 上的 ASM。人们会推荐有关此操作的链接或说明吗?

【问题讨论】:

  • freescale.com/files/32bit/doc/app_note/AN3544.pdf 提供了一种对 TLB 标志进行操作的方法,但它不是对 MPC8540 e500 的用户空间地址的直接操作。
  • 我尝试在 ko init 阶段使用以下说明禁用 L1 数据缓存,但由于 sys-trap 失败。 asm volatile ("eieio;sync"); mtspr(SPRN_L1CSR0, 0x00000000);

标签: powerpc cpu-cache


【解决方案1】:

这是最好的资源,PowerPC Programming Environments Manual

您对缓存有什么具体问题吗?

使用 DMA,您的选择是窥探或缓存刷新。要出现此错误,您可能启用了窥探。所以问题很可能是您在 L1 缓存中有未初始化的数据。

还有第二个资源,E500 Core Reference Manual,我目前无法下载,但它应该很好地描述了如何初始化缓存。我一直在使用 E-600 书。

【讨论】:

  • 大卫,我已经尝试第一步在加载私有 ko 时禁用 L1 数据缓存。但是,当执行初始化功能中的以下指令时,板会重新启动。错误日志显示发生了几次“Slab 损坏”,然后在执行 initialize_func 并将 ko 加载到内核中后,内核在重新启动前报告了内核堆栈溢出。我已经提到的日志:(1)38E12D103:14/03/1902 UTC 06:31:32,[366.427292] 板损坏:size-32 start=8b4de9e0,len=32(2)38E420545:14/03/1902 UTC 06:31:32,[366.497530] 80内核堆栈溢出进程中。
  • @iMax - 你必须小心禁用缓存。如果您不先刷新数据,您将丢失内核写入的数据。这可能会导致堆栈溢出。您是否有机会禁用 DMA 上的窥探作为测试?
  • 感谢您的提醒。在禁用 L1 数据缓存之前,我没有刷新 L1 数据。这样我会阅读您上面提到的第二个来源并找到测试两种情况的方法:1)在禁用 L1 数据缓存之前刷新 L1 数据缓存(这是一个私人测试,以确定 L1 数据缓存奇偶校验检查是否是由滥用 DMA;2) 尝试使用 DMA 启用 L1 数据缓存侦听。由于我不熟悉 ASM 指令,因此会花费一些时间。我想让你知道结果。无论如何,您已经指出了解决我的问题的方法。
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2016-02-10
  • 2017-01-27
  • 2016-09-30
  • 2011-12-18
相关资源
最近更新 更多