2010-05-06 9 views
7

De acuerdo con el manual ARM, debería ser posible acceder a los registros bancarizados para un modo de CPU específico como, por ejemplo, "r13_svc". Cuando trato de hacer esto gcc me grita con el siguiente error:Acceso explícito a registros bancarizados en ARM

expresión inmediata requiere un prefijo # - `r2 mov, sp_svc'

¿Qué pasa?

Actualización. El siguiente texto del Manual de Referencia para la arquitectura ARM y ARMv5 ARMv6 me llevó a creer que es posible, la sección A2.4.2:

Registers R13 and R14 have six banked physical registers each. One is used in User and System modes, and each of the remaining five is used in one of the five exception modes. Where it is necessary to be specific about which version is being referred to, you use names of the form: R13_mode R14_mode where mode is the appropriate one of usr, svc (for Supervisor mode), abt, und, irq and fiq.

Respuesta

3

no creo que eso sea posible con la instrucción mov; al menos de acuerdo con el Manual de referencia de ARM Architecture que estoy leyendo. ¿Qué documento tienes? Hay una variante de ldm que puede cargar registros de modo de usuario desde un modo privilegiado (usando ^). Su única otra opción es cambiar al modo SVC, haga mov r2, sp, y luego vuelva a cambiar a cualquier otro modo que estuviera usando.

El error que está recibiendo es porque no entiende sp_svc, por lo que supone que usted está tratando de hacer una inmediata mov, lo que se vería así:

mov r2, #0x14 

Así que por eso se dice " requiere un # prefijo ".

+0

Entiendo eso. Consulte la actualización anterior sobre el texto del Manual de referencia de Arquitectura de ARM – Demiurg

+2

@Demiurg, ese párrafo no se refiere a escribir código, solo a las convenciones del documento. Dado que los registros bancarizados son diferentes, deben tener nombres únicos para que no todos estén confundidos. No está tratando de dar a entender que pueda usar esos nombres en su código de ensamblado. La sección de referencia de instrucciones y modos de direccionamiento más adelante en el libro es más clara sobre lo que puede y no puede hacer. –

+0

Probablemente esté en lo correcto – Demiurg

2

Utiliza mrs y msr para cambiar los modos cambiando los bits en el cpsr y luego usa r13 normalmente.

Desde el brazo brazo

 
MRS R0,CPSR 
BIC R0,R0,#0x1F 
ORR R0,R0,#0x13 
MSR CPSR_c,R0 

continuación

 
mov sp,#0x10000000 

o si necesita más bits en la inmediata

 
ldr sp,=0x12345600 

o si no quieres que el ensamblador de colocar sus datos, puedes colocarlo tú mismo.

 
ldr sp,svc_stack 
b 1f 
svc_stack: .word 0x12345600 
1: 

Verá código de inicio brazo típica, donde la aplicación se va a apoyar interrupciones, aborta y otras excepciones, para hacer que todos sus punteros de pila que se va a necesitar, modo de cambio, establecer sp, el cambio mode, set sp, change mode ...

+0

Si observa la codificación de instrucciones para un mov, hay cuatro bits para el registro de destino, lo suficiente para el 0xD (r13 o sp). Hay 6 registros sp distintos que necesita 3 bits más en la instrucción si puede especificar el modo, no veo esos bits allí, así que no hay forma de que pueda especificar el modo en la instrucción que tiene que cambiar el cpsr usando la modificación cpsr instrucción (msr). Tenga en cuenta que los diferentes ensambladores (brazo, gcc, etc.) usan una sintaxis diferente para msr/mrs y las instrucciones mrc/mcr. Entonces, la sintaxis del brazo es probable para el brazo, no para el gcc. –

+0

Gracias. El código que publicaste probablemente sea el truco. Lo que me llevó a creer que es posible acceder a estos registros directamente es el siguiente texto: Los registros R13 y R14 tienen seis registros físicos almacenados cada uno ... Donde es necesario ser específico sobre qué versión se está haciendo referencia , utiliza los nombres del formulario: R13_ R14_ donde es el apropiado de usr, svc (para el modo Supervisor), abt, und, irq y fiq. del Manual de referencia de ARM Architecture. – Demiurg

+0

Hmm, es una sección muy confusa en el brazo, no entiendo lo que están implicando. Tal vez su ensamblador le agregue instrucciones, a excepción quizás de las evaluaciones Keil. Ya no tengo acceso a las herramientas de brazo. esa sección implica algo especial sobre armv6 relacionado con la banca de registro y continúa mostrando lo que mostré arriba, comenzando con "En las versiones de archtecture anteriores a armv6". Si r13_svc, r13_sys, etc. estaban disponibles en cualquier instrucción, ya que esto implica, cada instrucción necesitaría espacio en su codificación y una nota en la codificación sobre si armv6 entonces ... –

5

La sintaxis correcta para esto es mrs r2,sp_svc o mrs r3, sp_usr. Esta es una nueva extensión armv7. El código se puede ver en el archivo fuente de ARM Linux KVM interrupt_head.S. El parche binutils gas para este instruction support por Matthew Gretton-Dann. Requiere las extensiones de virtualización por lo que yo entiendo.

De acuerdo con lo que entiendo, el LPAE (extensión de dirección física grande) implica las extensiones de virtualización. Entonces Cortex-A7, Cortex-A12, Cortex-A15 y Cortex-A17 pueden usar esta extensión. Sin embargo, Cortex-A5, Cortex-A8 y Cortex-A9 no pueden.

Documentación sobre la instrucción se puede encontrar en el ARMv7a TRM REVC, en la sección B9.3.9 MRS (registro manuales).

Para otras CPU Cortex-A (y ARMv6) puede utilizar la instrucción cps para cambiar de modo y transferir el registro bancarizado a un registro no bancarizado (R0-R7) y luego volver a cambiar. La dificultad obvia es con el modo de usuario . La forma correcta de manejar esto es con ldm rN, {sp,lr}^; el modo de usuario no tiene una forma simple de volver a los modos privilegiados.

Para todas las CPU antiguas, la información proporcionada por Dwelch funcionará. Principalmente, use mrs/msr para cambiar los modos.

Esta es una instrucción importante para el cambio de contexto (que las VM hacen mucho).

+0

Los binutils más recientes dan el error * Error: Los registros bancarizados no están disponibles con esta arquitectura. * Cuando intenta la instrucción con indicadores de CPU del compilador/ensamblador que no admiten el LPAE. –

Cuestiones relacionadas