Режим мониторинга TrustZone и IFAR, IFSR, DFAR, DFSR

Режим мониторинга ARM TrustZone может перехватывать прерывания в режиме мониторинга. Режим мониторинга всегда выполняется в безопасном мире или контексте. Как мы можем узнать, какой адрес и причина вызвали сбой в обычном мире, когда он переходит в режим прерывания инструкций режима монитора и векторы ошибок данных?

IFSR, IFAR, DFSR а также DFAR банковские регистры CP15.

1 ответ

Решение

Стоит отметить, что в режиме мониторинга можно настроить только внешние прерывания, поэтому ошибки доступа MMU не будут отслеживаться.

Что касается основного вопроса: состояние всех защищенных / незащищенных банковских регистров в режиме мониторинга контролируется состоянием бита NS регистра конфигурации безопасности cp15: когда он установлен, вы получаете доступ к незащищенным версиям и когда ясно, что вы получаете доступ к защищенным версиям.

Ниже приведено несколько встроенных 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);
Другие вопросы по тегам