Simulador de Energia Micro-Arquitectural (MAPS) para Cortex-M3
Visão geral
Simulador rápido do Cortex-M3 que cria traços de energia. Mais informações podem ser encontradas em https://eprint.iacr.org/2017/1253.pdf
- Escrito em C ++ para velocidade
- lê e simula um arquivo .bin criado a partir de uma fonte de montagem/c com a cadeia de ferramentas do GNU Arm
Somente as instruções normalmente encontradas na codificação das primitivas criptográficas são suportadas. As instruções não suportadas podem ser adicionadas no CPU.CPP.
Compilação
- Simulador de compilação: o simulador (incluindo) a função principal, é armazenado em uma biblioteca estática.
- CD Libsim/Build
- fazer
- faça instalar
- Compilar um firmware de implementação. Usamos Sec_add_v05 como exemplo:
- CD SEC_ADD_V05/FW/BUILD
- fazer
- Compilar um simulador de implementação (ainda usando o Sec_add_v05 como exemplo):
- CD SEC_ADD_V05/SIM/BUILD
- fazer
Usando o simulador
O simulador leu um arquivo .bin que deve estar localizado no diretório atual. O nome do arquivo .bin depende do que foi especificado nas fontes do simulador.
O simulador deve ser usado ao desenvolver o firmware, então a maneira usual de executar uma simulação é para
- Alterar diretório para o diretório de firmware: cd sec_add_v05/fw/build
- Execute o simulador: ../../sim/build/sim_sec_add_v05 -n 1000
A opção '-h' mostra as opções e parâmetros válidos.
Codificando uma nova implementação da FW
Uma implementação da FW é simplesmente uma função C (possivelmente contendo código de montagem), seguindo o ABI do ARM (1º parâmetro no R0, etc ...), não há função principal. Todas as funcionalidades C e pré-processador podem ser usadas.
O firmware pode ser compilado por qualquer compilador de braço que suporta o Cortex-M3. Apenas o ARM GCC foi testado. O caminho para o executável do compilador de braço pode ser alterado em scripts/fw.mak modificando a variável "dir".
Codificando um novo simulador
É melhor iniciar e modificar um simulador já existente. O simulador deve conter 3 funções:
- void check_sec_algo (void): Esta função aplica alguns vetores de teste e imprime se o teste passa ou não.
- void t_test_sec_algo (opções e opções): esta função é executada no T_Test gerando entradas e coletando rastreios
- um invólucro para chamar a função FW (que será simulada). Esse invólucro (cuja assinatura depende da função FW) deve escrever os argumentos na memória do simulador e definir o processador se registrar de acordo. Em seguida, inicia a simulação. Após a simulação, ele deve copiar os resultados da memória simulada.
Apoiando mais instruções do ARM V7-M
Siga essas etapas para apoiar uma instrução no simulador:
- Adicione os valores de decodificação e máscara no arquivo libsim/src/opcodes.h
- Decode a instrução na etapa da função () em libsim/src/cpu.cpp
- Adicione a execução da função no mesmo arquivo
- Não se esqueça de adicionar esta nova função à lista de métodos na CPU.H
Os macros test_ins32 e test_ins16 simplificam a decodificação da instrução também, não se esqueça de validar o comportamento da nova instrução simulada, especialmente o comportamento do pipeline registra reg_a e reg_b!
Valitações
Cada instrução suportada pelo simulador deve ser validada em relação à simulação RTL. A árvore RTL não é armazenada neste repositório porque pertence à ARM Limited. A maior parte do procedimento descrito abaixo está lá apenas para minha própria documentação.
- Adicione a nova instrução no experimento de arquivo.c na árvore do simulador
- Execute Faça verificação> Sim_trace.log 2> & 1 na direção da construção do FW na árvore do simulador
- Adicione a nova instrução no vazamento de arquivo.c na árvore RTL
- Compilar: Faça testCode testName = vazamento
- Simular: faça executar testname = vazamento
- Converta o arquivo de rastreamento de tarmac.log em um arquivo de rastreamento de registro: ../../../../../python/gen_trace.py> verilog_trace.log
- Copie o arquivo de rastreamento de registro na árvore do simulador: cp ~/documents/repos/maps/rendered/sse050/logical/testbench/execution_tb/verilog_trace.log.
- Compare o rastreamento do simulador e o rastreamento RTL. Ou usando visualmente GVIM -D Sim_trace.log Verilog_Trace.log, ou usando: ./../../python/compare_traces.py
Bugs/limitações
As limitações de conhecimento são:
- O pipeline para instruções LDRB/STRB é mais complexo do que o implementado no simulador. Por exemplo, para o seguinte código:
ldrb r2, [r0]
strb r2, [r0]
reg_a e reg_b não serão simulados corretamente pelo simulador. A funcionalidade ainda está correta. Quando uma outra instrução é inserida entre o LDRB e as instruções STRB, a simulação está correta.