Mode moniteur TrustZone et IFAR, IFSR, DFAR, DFSR
-
24-12-2019 - |
Question
Le bras Mode moniteur TrustZone peut intercepter les abandons en mode moniteur.Le mode moniteur s’exécute toujours dans le monde ou le contexte sécurisé.Comment pouvons-nous savoir quelle adresse et quelle raison ont provoqué un défaut dans le monde normal lorsqu'il passe en mode moniteur instruction d'abandon et erreur de données des vecteurs ?
Le IFSR
, IFAR
, DFSR
et DFAR
sont mis en banque CP15 enregistre.
La solution
Il convient de noter que seuls les abandons externes peuvent être configurés pour être effectués en mode moniteur, de sorte que les erreurs d'accès à la MMU ne seront pas piégées.
Quant à la question principale :l'état de tous les registres bancaires sécurisés/non sécurisés en mode moniteur est contrôlé par l'état du bit NS du registre de configuration sécurisé cp15 :lorsqu'il est défini, vous accédez aux versions non sécurisées, et lorsqu'il est clair, vous accédez aux versions sécurisées.
Ce qui suit est quelques éléments en ligne gcc
code qui permet à tout monde sécurisé mode pour les inspecter CP15
enregistre.
#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);