首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerPC注射

PowerPC注射
EN

Stack Overflow用户
提问于 2015-01-20 16:23:38
回答 1查看 698关注 0票数 1

我对PowerPC体系结构很陌生,试图实现mce-inject命令(如x86),.The要求在运行PowerPC linux内核时注入机器检查(指令缓存奇偶校验错误)。

按照下面的链接,我可以看到如果设置了MSRME和L1CSR1ICPE,它将生成机器检查中断。

注/AN3532.pdf 3532.pdf

我想知道产生机器检查中断并调用机器检查处理程序(如果是PowerPC,我相信machine_check_e500mc就是处理程序)是否就足够了?

EN

回答 1

Stack Overflow用户

发布于 2015-03-16 17:44:27

我知道这个问题已经6周了,很可能你已经自己解决了。但是,由于该解决方案可能对其他人有用,而且对于e200内核,我不得不解决同样的问题,下面是我是如何做到的。

它不是e500核心,但e200应该足够近。

您将找到关于指令缓存这里的大部分细节。

以下是e200指令缓存的相关寄存器。

代码语言:javascript
复制
L1CSR1[ICECE] (e500: L1CSR1[ICEP])
L1CSR1[ICEA]  (e500: -)
L1CSR1[ICEI]  (e500: L1CSR1[ICPI])
  1. 重要的是,处理程序是不被处理的,因为核心不能处理机器检查中断方面的双重故障。问题中链接的应用程序说明在处理程序中还需要处理什么。带有处理程序的页面应该始终在MMU上有一个映射,否则您必须首先处理页面错误。在Linux中,您很可能不必担心这个问题。只是为了你的理解。由于处理程序似乎已经以machine_check_e500mc的形式存在,很可能已经有人处理了这一切。
  2. 是否为页面启用指令缓存取决于您在创建映射时通过MAS2寄存器设置或清除的MMU上的MAS2位。对于您的特殊情况,页面不被缓存是很重要的,这就是为什么我建议您确保它不是缓存的,我不能说您是如何在Linux内核中解决这个问题的。也许他们的页面属性中有它。如果他们不这么做,你就得一直走下去。如果您在处理程序中没有遇到任何奇偶校验错误,则它们的页面已经被隐藏。那你就不用担心了。以下是没有操作系统的情况下的示例。我加入了VLE_NOT_SET标志,因为我认为gcc无论如何都不能产生VLE指令。这对手头的任务来说并不重要。 # MAS2 626 #定义VLE_NOT_SET 0x00u #定义CACHE_INHIBITED_SET 0x01u e_ori r2,r2,((VLE_NOT_SET << 5) AC.26 (CACHE_INHIBITED << 3)) mtspr MAS2,r2
  3. 核心期望IVOR1寄存器中机器检查中断的处理程序。实际上,IVOR1只保存处理程序地址的较低的单词(16位)。地址的上一字(16位)位于IVPR寄存器中,该寄存器保存所有中断处理程序的基地址。machine_check_e500mc这个名字意味着它就是它。如果您想要跟踪它,您可以查找如下代码片段。无论在IVOR1中安装什么,都是处理程序。 __asm(“e_add16i r5,r3,%lo( machine_check_e500mc )");__asm(”mtspr IVOR1,r5")
  4. 当在L1CSR1寄存器中设置ICEI位时,指令缓存将开始将奇偶校验错误插入到从现在开始获取的指令的每个字节中。在我的例子中,我不得不前进几步,直到第一次指令出现奇偶校验错误。您必须考虑核心做指令预取。这意味着当您设置ICEI位时,路上的一些指令已经在指令缓存中了。当然,这些指令没有奇偶校验错误。
  5. 使用下面的示例代码和调试器(Lauterbach over ),这是我需要做的错误注入。 se_mflr r0 e_stwu r1,-0x10(r1) se_stw r310x0C(R1) se_stw r0,0x14(r1)
代码语言:javascript
复制
- Stop your system at a position where the IVOR registers and the cache have been initialized. In my case, this is the first instruction of a function prologue, se\_mflr r0.
- Set a breakpoint at the first instruction in machine\_check\_e500mc.
- Set L1CSR1[ICEI] := 1
- Step a few times. In my case, se\_stw r0,0x14(r1) is the first instruction with a parity error.
- Now you should have hit the breakpoint in machine\_check\_e500mc.
- MCSRR0 contains the address of the instruction that was executed when the machine check occurred.
- I had to set MSR[ME] := 0, otherwise my debugger refused to step any further.
- Now the first thing you do is to invalidate the cache line with the parity error, as they say in the application note.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28050301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档