assembly stack arm atomic

assembly - ARM: ¿Es "STMDB SP!{R0-R8}"(también conocido como PUSH{R0-R8}) una operación atómica?



stack atomic (4)

Me pregunto si STMDB SP !, {R0-R8} es una operación atómica en ARM (v7), porque me parece bastante complejo. Entonces, ¿es posible, por ejemplo, que la CPU se interrumpa en algún lugar "en el centro" y ya haya almacenado R5-R8 en la pila y SP ahora SP_old - 16 y después de manejar la interrupción, el procesador continúe con R0-R4? Gracias.


Es atómico, en lo que respecta al manejo de interrupciones.

Si mal no recuerdo, la interrupción de la instrucción hace que se anule y se vuelva a ejecutar después de que finalice el procesamiento de interrupción, para garantizar la latencia de interrupción.


Si está configurado, se puede interrumpir y luego reiniciar (no continuar). También se puede anular si la memoria no se puede borrar.

No es atómico con respecto a otros dispositivos.


STM es una instrucción única, por lo que es tanto atómica como otras instrucciones. Le dice a la CPU que guarde N registros comenzando desde la memoria apuntada por SP-4 y luego actualice SP a SP-N * 4 en una sola instrucción. Por lo tanto, es su responsabilidad mantener las cosas en un estado consistente entre los diferentes interruptores de modo (también conocidos como interrupciones).


Para aclarar sobre la mezcla ligeramente confusa de respuestas aquí, primero; v7-A 1 :

En la configuración estándar, la única excepción que puede interrumpir una instrucción de acceso múltiple es un aborto de datos síncronos, por lo que son efectivamente atómicos en términos de interrupciones (aunque no en términos de acceso a la memoria).

Sin embargo, esto no es cierto si la configuración de interrupción de baja latencia es compatible y se ha habilitado. Aquí IRQs, FIQs y cancelaciones asincrónicas también pueden interrumpir la instrucción. Para citar el ARM ARM v7-A en esto:

ARM anula la dependencia del software del comportamiento de que no se puede producir una interrupción o un aborto asíncrono en una secuencia de transacciones de memoria generadas por una única carga o instrucción de almacenamiento que accede a la memoria Normal.

Nota

Un caso particular que ha demostrado esta dependencia es la carga múltiple que carga el puntero de pila desde la memoria. En una implementación donde se toma una interrupción durante el LDM, esto puede dañar el puntero de la pila.

Una instrucción interrumpida de esta manera será abandonada y, si se regresa, la ejecución se reinicia desde el principio (por lo tanto, para las tiendas, las direcciones inferiores pueden ver dos escrituras).

En segundo lugar v7-M 2 , con su modelo de excepción loco:

Aquí tiene baja latencia todo el día todos los días. Las excepciones siempre se pueden tomar durante las instrucciones de acceso múltiple, pero la arquitectura permite (en ciertas condiciones) continuar la ejecución desde el punto de interrupción según la sugerencia en la pregunta. También se permite el comportamiento de abandono y reinicio como alternativa, y es la única opción para combinaciones de instrucción / excepción no continuables.

[1] secciones A3.5.3 y B1.8.12 del ARMv7-A ARM (DDI0406C.b)

[2] sección B1.5.10 del ARMv7-M ARM (DDI0403D)