The T32 can simulate bare instruction sets without periphery. For the Cortex-M3 we have complete NVIC model including Systick Timer. Currently a simple CiAO can run on the simulator. TODO: - Let memlogger log all memory accesses. - Interact with FailT32 for a complete simulation/FI
119 lines
3.1 KiB
C
119 lines
3.1 KiB
C
#include "nvic.h"
|
|
|
|
/*************** SysTick Control and Status Register ***************/
|
|
|
|
int STCSR_Read(simulProcessor processor, simulCallbackStruct * cbs, simulPtr _private)
|
|
{
|
|
IntController *IntCtrl = (IntController*) _private;
|
|
simulWord32 reg;
|
|
cbs->x.bus.clocks = 1;
|
|
|
|
reg = IntCtrl->regs.stcsr & (REG_STCSR_COUNTFLAG | REG_STCSR_TICKINT | REG_STCSR_ENABLE | REG_STCSR_CLKSOURCE);
|
|
|
|
if (cbs->x.bus.cycletype!=SIMUL_MEMORY_HIDDEN)
|
|
{
|
|
IntCtrl->regs.stcsr &= ~REG_STCSR_COUNTFLAG;
|
|
}
|
|
|
|
return BusWrite(&cbs->x.bus, ®);
|
|
}
|
|
|
|
int STCSR_Write(simulProcessor processor, simulCallbackStruct * cbs, simulPtr _private)
|
|
{
|
|
IntController *IntCtrl = (IntController*) _private;
|
|
simulWord32 reg;
|
|
cbs->x.bus.clocks = 1;
|
|
|
|
reg = IntCtrl->regs.stcsr;
|
|
BusRead(&cbs->x.bus,®);
|
|
|
|
if (reg ^ IntCtrl->regs.stcsr)
|
|
{
|
|
if ((IntCtrl->regs.stcsr & REG_STCSR_ENABLE) ^ (reg & REG_STCSR_ENABLE))
|
|
{
|
|
if (reg & REG_STCSR_ENABLE)
|
|
{
|
|
/* enable timer */
|
|
simulTime time = 1;
|
|
SIMUL_StartTimer(processor, IntCtrl->timer, SIMUL_TIMER_REPEAT | SIMUL_TIMER_CLOCKS, &time);
|
|
IntCtrl->timerrun = 1;
|
|
|
|
IntCtrl->regs.stcvr = IntCtrl->regs.strvr;
|
|
}
|
|
else
|
|
{
|
|
/* disable timer */
|
|
SIMUL_StopTimer(processor, IntCtrl->timer);
|
|
IntCtrl->timerrun = 0;
|
|
}
|
|
}
|
|
|
|
IntCtrl->regs.stcsr = (IntCtrl->regs.stcsr & ~(REG_STCSR_TICKINT | REG_STCSR_ENABLE | REG_STCSR_COUNTFLAG)) | (reg & (REG_STCSR_TICKINT | REG_STCSR_ENABLE | REG_STCSR_COUNTFLAG)) | REG_STCSR_CLKSOURCE;
|
|
}
|
|
|
|
return SIMUL_MEMORY_OK;
|
|
}
|
|
|
|
/*************** SysTick Reload Value Register ***************/
|
|
|
|
int STRVR_Read(simulProcessor processor, simulCallbackStruct * cbs, simulPtr _private)
|
|
{
|
|
IntController *IntCtrl = (IntController*) _private;
|
|
simulWord32 reg;
|
|
cbs->x.bus.clocks = 1;
|
|
|
|
reg = IntCtrl->regs.strvr & 0xFFFFFF;
|
|
|
|
return BusWrite(&cbs->x.bus, ®);
|
|
}
|
|
|
|
int STRVR_Write(simulProcessor processor, simulCallbackStruct * cbs, simulPtr _private)
|
|
{
|
|
IntController *IntCtrl = (IntController*) _private;
|
|
simulWord32 reg;
|
|
cbs->x.bus.clocks = 1;
|
|
|
|
BusRead(&cbs->x.bus,®);
|
|
|
|
IntCtrl->regs.strvr = reg & 0xFFFFFF;
|
|
|
|
return SIMUL_MEMORY_OK;
|
|
}
|
|
|
|
/*************** SysTick Current Value Register ***************/
|
|
|
|
int STCVR_Read(simulProcessor processor, simulCallbackStruct * cbs, simulPtr _private)
|
|
{
|
|
IntController *IntCtrl = (IntController*) _private;
|
|
simulWord32 reg;
|
|
cbs->x.bus.clocks = 1;
|
|
|
|
reg = IntCtrl->regs.stcvr & 0xFFFFFF;
|
|
|
|
return BusWrite(&cbs->x.bus, ®);
|
|
}
|
|
|
|
int STCVR_Write(simulProcessor processor, simulCallbackStruct * cbs, simulPtr _private)
|
|
{
|
|
IntController *IntCtrl = (IntController*) _private;
|
|
cbs->x.bus.clocks = 1;
|
|
|
|
IntCtrl->regs.stcvr = 0;
|
|
IntCtrl->regs.stcvr &= ~REG_STCSR_COUNTFLAG;
|
|
|
|
return SIMUL_MEMORY_OK;
|
|
}
|
|
|
|
/*************** SysTick Calibration Value Register ***************/
|
|
|
|
int STCLVR_Read(simulProcessor processor, simulCallbackStruct * cbs, simulPtr _private)
|
|
{
|
|
IntController *IntCtrl = (IntController*) _private;
|
|
simulWord32 reg;
|
|
cbs->x.bus.clocks = 1;
|
|
|
|
reg = IntCtrl->regs.stclvr;
|
|
|
|
return BusWrite(&cbs->x.bus, ®);
|
|
}
|