Arm 信任区监视模式和IFAR、IFSR、DFAR、DFSR

Arm 信任区监视模式和IFAR、IFSR、DFAR、DFSR,arm,trust-zone,Arm,Trust Zone,ARM可以在监视器模式下捕获中止。监视模式始终在安全世界或上下文中执行。在正常情况下,当故障捕获到监视器模式指令中止和数据故障向量时,我们如何知道是什么地址和原因导致了故障 和是存储在CP15寄存器中。值得注意的是,只有外部中止可以配置为在监视器模式下执行,因此不会捕获MMU访问故障 #define MODE_MONITOR 0x16 unsigned int mode; unsigned int world; unsigned int dfar; uns

ARM可以在监视器模式下捕获中止。监视模式始终在安全世界或上下文中执行。在正常情况下,当故障捕获到监视器模式指令中止和数据故障向量时,我们如何知道是什么地址和原因导致了故障


和是存储在CP15寄存器中。

值得注意的是,只有外部中止可以配置为在监视器模式下执行,因此不会捕获MMU访问故障

    #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);
至于主要问题:在监控模式下,所有安全/非安全存储寄存器的状态由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);

很奇怪,;所有的存盘
CP15
寄存器都是这样的吗?因此,当您在监视器中时,安全MMU状态适用,但如果设置了NS位,您可以看到非安全TTBR等?正确。监视器模式是“特殊”的。您能否解释一下“因此,当您在监视器中时,安全MMU状态适用,但如果设置了NS位,您可以看到非安全TTBR等?”@mSO:监视器模式本身始终是安全的。因此,无论NS位的状态如何,在监视器模式或任何其他安全模式下执行时分配的TLB条目都是安全的(NSTID=0)。