Simulador de potencia microarquitectura (MAPS) para Cortex-M3
Descripción general
Simulador rápido Cortex-M3 que crea trazas de alimentación. Se puede encontrar más información en https://eprint.iacr.org/2017/1253.pdf
- Escrito en C ++ para la velocidad
- lee y simula un archivo .bin creado a partir de una fuente de ensamblaje/c con GNU Arm Toolchin
Solo se admiten instrucciones que generalmente se encuentran en la codificación de primitivas criptográficas. Se pueden agregar instrucciones no compatibles en CPU.cpp.
Compilación
- Simulador de compilación: el simulador (incluyendo) la función principal, se almacena en una biblioteca estática.
- CD Libsim/Build
- hacer
- hacer instalar
- Compilar un firmware de implementación. Usamos SEC_ADD_V05 como ejemplo:
- CD Sec_add_V05/FW/Build
- hacer
- Compile un simulador de implementación (todavía usando SEC_ADD_V05 como ejemplo):
- CD SEC_ADD_V05/SIM/Build
- hacer
Usando el simulador
El simulador decía un archivo .bin que debe ubicarse en el directorio actual. El nombre del archivo .bin depende de lo que se especificó en las fuentes del simulador.
Se supone que el simulador se usa al desarrollar el firmware, por lo que la forma habitual de ejecutar una simulación es
- Cambiar directorio al directorio de firmware: CD Sec_add_V05/FW/Build
- Ejecute el simulador: ../../sim/build/sim_sec_add_v05 -n 1000
La opción '-h' muestra las opciones y parámetros válidos.
Codificación de una nueva implementación de FW
Una implementación de FW es simplemente una función C (posiblemente que contiene código de ensamblaje), siguiendo el brazo ABI (primer parámetro en R0, etc.) No existe una función principal. Se pueden usar todas las funcionalidades de C y preprocesador.
El firmware puede ser compilado por cualquier compilador ARM que admite la Cortex-M3. Solo se ha probado el GCC del brazo. La ruta al ejecutable del compilador ARM puede cambiarse en scripts/fw.mak modificando la variable "Dir".
Codificando un nuevo simulador
Es mejor iniciar y modificar un simulador ya exisitante. El simulador debe contener 3 funciones:
- void check_sec_algo (void): esta función aplica algunos vectores de prueba e imprime si la prueba pasa o no.
- void t_test_sec_algo (opciones y opciones): esta función ejecuta el t_test generando entradas y recolectando trazas
- un envoltorio para llamar a la función FW (que se simulará). Este envoltorio (cuya firma depende de la función FW) debe escribir los argumentos en la memoria del simulador y establecer los registros del procesador en consecuencia. Luego, comienza la simulación. Después de la simulación, debe copiar los resultados de la memoria simulada.
Soporte de más instrucciones ARM V7-M
Siga esos pasos para admitir una instrucción en el simulador:
- Agregue los valores de decodificación y máscara en el archivo libsim/src/opcodes.h
- Decodifique la instrucción en el paso de función () en libsim/src/cpu.cpp
- Agregue la ejecución de la función en el mismo archivo
- No olvide agregar esta nueva función a la lista de métodos en CPU.H
El Macros test_ins32 y test_ins16 simplifican la decodificación de la instrucción también, ¡no olvide validar el comportamiento de la nueva instrucción simulada, especialmente el comportamiento de la tubería registra reg_a y reg_b!
Validaciones
Cada instrucción compatible con el simulador debe validarse con la simulación RTL. El árbol RTL no se almacena en este repositorio porque pertenece a Arm Limited. La mayor parte del procedimiento que se describe a continuación solo está allí para mi propia documentación.
- Agregue la nueva instrucción en el archivo Experiment.c en el árbol del simulador
- Ejecutar Make Check> sim_trace.log 2> y 1 en la dirección de compilación de FW en el árbol del simulador
- Agregue la nueva instrucción en la fuga de archivo. C en el árbol RTL
- Compilar: hacer TestCode testName = fugas
- Simular: hacer ejecutar testName = fugas
- Convierta el archivo de seguimiento de tarmac.log en un archivo de seguimiento de registro: ../../../../../python/gen_trace.py> verilog_trace.log
- Copie el archivo de rastreo de registro en el árbol del simulador: cp ~/documents/repos/maps/rendered/sse050/lógico/testbench/ejecution_tb/verilog_trace.log.
- Compare la traza del simulador y el rastro RTL. Ya sea usando gvim -d sim_trace.log verilog_trace.log, o usando: ./../../python/compare_traces.py
Errores/limitaciones
Las limitaciones de conocimiento son:
- La tubería para las instrucciones LDRB/STRB es más compleja que la implementada en el simulador. Por ejemplo, para el siguiente código:
ldrb r2, [r0]
strb r2, [r0]
Reg_a y Reg_b no serán simulados correctamente por el simulador. Sin embargo, la funcionalidad sigue siendo correcta. Cuando se inserta otra instrucción entre las instrucciones LDRB y STRB, la simulación es correcta.