Question

Comment puis-je accéder aux utilisateurs R13 et R14 qui sont enregistrés lorsque le mode superviseur est activé? J'utilise un ARM7TDMI.

I.E. Je ne veux pas accéder au superviseur R14 qui contient maintenant l'adresse de retour en mode utilisateur, mais souhaite plutôt la valeur du registre de liaison du mode utilisateur. Cela fait partie d'un débogueur que j'écris.

Existe-t-il des alias spéciaux pour ces registres?

Merci

Était-ce utile?

La solution

Je vais décrire la réponse à votre question spécifique, mais la même approche s'applique également aux autres modes.

Vous devrez changer le mode du processeur en modifiant les bits de mode du CPSR en mode système. Cela vous donnera accès au SP / LR du mode utilisateur (R13 et R14). N'oubliez pas que le mode système est privilégié, mais que ses paramètres R13 et R14 sont identiques à ceux des modes R13 et R14 du mode utilisateur.

Une fois que vous êtes en mode système, lisez R13 et R14 et placez-les où vous voulez. Ensuite, remettez simplement les bits de mode dans votre mode précédent (je crois que c’était le mode superviseur dans votre exemple) et vous pouvez continuer.

Notez que nous ne sommes pas passés du mode superviseur au mode utilisateur. Si vous êtes passé de superviseur à utilisateur, vous ne pouviez pas revenir en mode superviseur . (Sinon, il n'y aurait aucune protection contre les privilèges liés à l'escalade de code utilisateur). C'est pourquoi nous avons utilisé le mode système - le mode système est privilégié, mais les registres sont identiques au mode utilisateur.

Vous pouvez basculer entre tous les modes privilégiés à volonté en manipulant les bits de mode dans le CPSR. Je pense qu'ils sont les 5 bits inférieurs? Je suis sur la route & amp; Je n'ai pas l'information à portée de main. Sinon, je vous aurais fourni le code d'assemblage pour ce que j'ai décrit ci-dessus. En fait, si vous voulez mettre des cheveux sur votre poitrine, prenez ce que je vous ai donné ci-dessus, mettez-le en œuvre, testez-le et publiez-le ici. :-D

(Une chose que je devrais ajouter pour le "cas général" (le vôtre est très spécifique) - vous pouvez examiner le SPSR pour voir "d'où vous venez" et l'utiliser pour déterminer le mode dont vous avez besoin passer à.)

En passant, je viens de le faire récemment pour l'un de mes clients .... dans un petit monde, je suppose.

Autres conseils

J'ai découvert un meilleur moyen: -

Lors de l'exécution d'un STM, si r15 n'est pas l'un des opérandes, ^ donne accès aux registres en mode utilisateur. Cependant, l'auto-incrémentation ne semble pas fonctionner dans l'instruction, et un nop est requis par la suite si vous souhaitez accéder à la banque de registres.

Quelque chose comme

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top