2008-11-27 8 views
6

¿Cómo accedo al usuario R13 y R14 que se guardan cuando se ingresa al modo supervisor? Estoy usando un ARM7TDMI.ARM. Acceso al usuario R13 y R14 desde el modo Supervisor

I.E. 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

Respuesta

9

voy a describir la respuesta para su pregunta específica, pero el mismo enfoque se aplica a otros modos también.

Deberá cambiar el modo de 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 & 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 pudo volver al modo 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 & 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í. :-D

(Una cosa que debería agregar para el "caso general" (la suya es muy específica) - puede examinar el SPSR para ver "de dónde vino" y usar eso para determinar qué modo necesita cambiar a)

Por cierto, acabo de hacer esto recientemente para uno de mis clientes ... pequeño mundo, supongo.

+0

Wow gracias. ¡Nunca me di cuenta de que el modo de usuario y el modo de sistema compartían los mismos registros! Voy a obtener grietas en el código. Me temo que no puedo publicarlo aquí porque es para un trabajo de campo, pero creo que usted ha descrito los principios muy bien, que es más importante. – Tarski

+0

De nada. Buena suerte con los cursos. – Dan

+0

Hola Dan, si ARM está en modo hip y tiene que leer el R13/r14 de PL1 NS = 1 modo (SVC) ¿cómo se haría? – mSO

3

he descubierto una mejor manera: -

cuando se hace un STM, si r15 no es uno de los operandos y^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 así como

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode 
nop 
sub r13, r13, #8  ;update stack pointer 
+0

^solo está disponible en ARMv6 y más nuevo, IIRC. –

+0

¡Este es un gran hallazgo! De acuerdo con http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihcadda.html, este uso es "obsoleto", sin embargo. No estoy seguro de si importarme eso. – Brendan

Cuestiones relacionadas