Режим мониторинга 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);