Files
fail/simulators/ovp/test1/platform/beforeInstruction.cpp

92 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "beforeInstruction.hpp"
Uns8 bpCount;
Addr breakpoints[255];
//Ignore warning: deprecated conversion from string constant to char*
#pragma GCC diagnostic ignored "-Wwrite-strings"
void printArmCortexM3Registers(icmProcessorObject processor) {
Uns32 registers[17];
icmPrintf("---------------\t\t---------------\n");
readRegister(processor, "R0", registers[0]);
readRegister(processor, "R1", registers[1]);
readRegister(processor, "R2", registers[2]);
readRegister(processor, "R3", registers[3]);
readRegister(processor, "R4", registers[4]);
readRegister(processor, "R5", registers[5]);
readRegister(processor, "R6", registers[6]);
readRegister(processor, "R7", registers[7]);
readRegister(processor, "R8", registers[8]);
readRegister(processor, "R9", registers[9]);
readRegister(processor, "R10", registers[10]);
readRegister(processor, "R11", registers[11]);
readRegister(processor, "R12", registers[12]);
readRegister(processor, "SP", registers[13]);
readRegister(processor, "LR", registers[14]);
readRegister(processor, "PC", registers[15]);
readRegister(processor, "CPSR", registers[16]);
icmPrintf("R0: 0x%08x\t\t", registers[0]);
icmPrintf("R1: 0x%08x\n", registers[1]);
icmPrintf("R2: 0x%08x\t\t", registers[2]);
icmPrintf("R3: 0x%08x\n", registers[3]);
icmPrintf("R4: 0x%08x\t\t", registers[4]);
icmPrintf("R5: 0x%08x\n", registers[5]);
icmPrintf("R6: 0x%08x\t\t", registers[6]);
icmPrintf("R7: 0x%08x\n", registers[7]);
icmPrintf("R8: 0x%08x\t\t", registers[8]);
icmPrintf("R9: 0x%08x\n", registers[9]);
icmPrintf("R10: 0x%08x\t\t", registers[10]);
icmPrintf("R11: 0x%08x\n", registers[11]);
icmPrintf("R12: 0x%08x\n\n", registers[12]);
icmPrintf("SP: 0x%08x\t\t", registers[13]);
icmPrintf("LR: 0x%08x\n", registers[14]);
icmPrintf("PC: 0x%08x\n", registers[15]);
icmPrintf("PSR: 0x%08x\n\n", registers[16]);
}
Bool readRegister(icmProcessorObject processor, char *regName, Uns32 &value) {
if (regName[0] == 'P' && regName[1] == 'C') {
value = (Uns32)processor.getPC();
return True;
} else {
return processor.readReg(regName, &value);
}
}
Bool writeRegister(icmProcessorObject processor, char *regName, Uns32 &newValue) {
if (regName[0] == 'P' && regName[1] == 'C') {
processor.setPC((Addr)newValue);
return True;
} else {
return processor.writeReg(regName, &newValue);
}
}
void addBreakpoint(Addr breakAddr) {
if (breakAddr != 0x00 && bpCount != 255) {
breakpoints[bpCount] = breakAddr;
bpCount++;
}
}
Addr simulateUntilBP(icmProcessorObject processor) {
if (bpCount == 0) {
icmPlatform::Instance()->simulate();
return 0x00;
}
Addr currentPC = 0x00;
while (processor.simulate(1) == ICM_SR_SCHED) {
currentPC = processor.getPC();
for (Uns8 u = 0; u < bpCount; u++) {
if (currentPC == breakpoints[u]) {
return currentPC;
}
}
}
return 0x00;
}