TrustZone监控模式和IFAR,IFSR,DFAR,DFSR

时间:2014-02-27 21:32:46

标签: arm trust-zone

ARM TrustZone monitor mode可以在监控模式下陷入中止。监控模式始终在安全环境或上下文中执行。当它陷入监控模式指令中止数据错误向量时,我们怎么知道正常世界中哪个地址和原因导致了错误?

IFSRIFARDFSRDFAR已存储 CP15 寄存器。

1 个答案:

答案 0 :(得分:3)

值得注意的是,只能在监控模式下配置外部中止,因此不会捕获MMU访问故障。

关于主要问题:所有安全/非安全库存寄存器在监控模式下的状态由cp15安全配置寄存器NS位的状态控制:当它被设置时,您访问非安全版本,当您清楚地访问安全版本时。

以下是一些内联gcc代码,允许任何安全世界模式检查这些CP15寄存器。

    #define MODE_MONITOR 0x16
    unsigned int mode;
    unsigned int world;
    unsigned int dfar;
    unsigned int dfsr;
    unsigned int ifar;
    unsigned int ifsr;

    asm (" mrs %0, cpsr\n"                 /* Save mode. */
         " mrc p15, 0, %1, c1, c1, 0\n"
         " orr  %1, %1, #1\n"              /* Set NS bit in SCR. */
         " cpsid aif, %6\n"                /* To monitor mode... */
         " mcr p15, 0, %1, c1, c1, 0\n"
         " mrc p15, 0, %2, c6, c0, 0\n"
         " mrc p15, 0, %3, c5, c0, 0\n"
         " mrc p15, 0, %4, c6, c0, 2\n"
         " mrc p15, 0, %5, c5, c0, 1\n"
         " bic  %1, %1, #1\n"              /* Clear NS bit in SCR. */
         " mcr  p15, 0, %1, c1, c1, 0\n"
         " isb\n"
         " msr cpsr, %0\n"
         : "=&r" (mode), "=&r" (world),
           "=r"(dfar), "=r"(dfsr),
           "=r"(ifar), "=r"(ifsr)
         : "I" (MODE_MONITOR));
    printf("DFAR: %.8x dfsr: %.8x IFAR: %.8x ifsr: %.8x\n",
           dfar, dfsr, ifar, ifsr);