arm - BRAZO. Acceda al usuario R13 y R14 desde el modo Supervisor
supervisor-mode (2)
¿Cómo accedo al usuario R13 y R14 que se guardan cuando se ingresa al modo supervisor? Estoy usando un ARM7TDMI.
IE No quiero acceder al supervisor R14, que ahora contiene la dirección de retorno al modo de usuario, sino el valor del registro de enlace del modo de usuario. Esto es parte de un depurador que estoy escribiendo.
¿Hay alias especiales para estos registros?
Gracias
Describiré la respuesta a su pregunta específica, pero el mismo enfoque también se aplica a otros modos.
Deberá cambiar el modo del procesador cambiando los bits de modo en el CPSR al modo de sistema. Esto le dará acceso al SP / LR del modo de usuario (R13 y R14). Recuerde que el modo de sistema tiene privilegios, pero sus R13 y R14 son los mismos que los R13 y R14 del modo de usuario.
Una vez que esté en modo sistema, lea R13 y R14 y colóquelos donde desee. Luego simplemente cambie los bits de modo a su modo anterior (creo que ese fue el modo de supervisor en su ejemplo) y está listo para continuar.
Tenga en cuenta que no cambiamos de supervisor a modo de usuario. Si cambió de supervisor a usuario, no podría volver al modo de supervisor . (De lo contrario, no habría protección contra el privilegio de escalada del código de usuario). Es por eso que utilizamos el modo de sistema: el modo de sistema es privilegiado, pero los registros son los mismos que el modo de usuario.
Puede cambiar cualquiera de los modos privilegiados a voluntad manipulando los bits de modo en el CPSR. Creo que son los 5 bits inferiores? Estoy en el camino y no tengo la información a mi alcance. De lo contrario, le habría proporcionado el código de ensamblaje para lo que he descrito anteriormente. En realidad, si quieres ponerte algo de pelo en el pecho, toma lo que te he dado arriba, impleméntalo, pruébalo y publícalo aquí. :-RE
(Una cosa que debería agregar para el "caso general" (el suyo es muy específico): puede examinar el SPSR para ver "de dónde vino" y usarlo para determinar a qué modo debe cambiar).
Por cierto, acabo de hacer esto recientemente para uno de mis clientes ... pequeño mundo, supongo.
He descubierto una mejor manera:
Al hacer un STM, si r15 no es uno de los operandos, ^ da acceso a los registros de modo de usuario. Sin embargo, el autoincrementing no parece funcionar dentro de la instrucción, y luego se requiere un nop si desea acceder al banco de registros.
Algo como
stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8 ;update stack pointer