blob: 95e1b4b3a86bb8d82b3066d01ea1a6b9ec884d52 [file] [log] [blame]
3a4
> #include <stdlib.h>
5c6
< #define CyclesForTick (configCPU_CLOCK_HZ/configTICK_RATE_HZ - 50)
---
> #include "debugFlags.h"
6a8,10
> #define CyclesForTick (configCPU_CLOCK_HZ/configTICK_RATE_HZ - 50)
> //debugging
> //TODO core to core comms will use this
8,10c12,14
<
< /*-----------------------------------------------------------*/
<
---
> //---------------------------------------------------
> int globalDelta;
> //---------------------------------------------------
16d19
<
18d20
<
32c34,35
< StackType_t *pxStackStart;
---
> StackType_t *pxStackStart;
>
34,38c37,40
<
< //align to double-word boundary
< pxStackStart = (StackType_t *)(( StackType_t ) pxTopOfStack & ~(0x4));
<
< /* To ensure asserts in tasks.c don't fail, although in this case the assert
---
> //align to double-word boundary
> pxStackStart = (StackType_t *)(( StackType_t ) pxTopOfStack & ~(0x4));
>
> /* To ensure asserts in tasks.c don't fail, although in this case the assert
40c42
< pxTopOfStack--;
---
> pxTopOfStack--;
42,43c44,45
< /* for alignment */
< pxTopOfStack--;
---
> /* for alignment */
> pxTopOfStack--;
45c47
< /* Setup the initial stack of the task. The stack is set exactly as
---
> /* Setup the initial stack of the task. The stack is set exactly as
48c50
< /* First on the stack is the return address - which in this case is the
---
> /* First on the stack is the return address - which in this case is the
51,94c53,96
< *pxTopOfStack = ( StackType_t ) 0xdeadaffe;
< pxTopOfStack--;
< pxTopOfStack--;
< pxTopOfStack--;
<
<
< int i;
<
< for(i=63;i>14;i--) {
< *pxTopOfStack = ( StackType_t ) i<<8; /* higher registers */
< pxTopOfStack--;
< }
<
<
< *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x51aac4de; /* Stack used when task starts goes in R13. */
< pxStackStart = pxTopOfStack;
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
< //*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* frame pointer to stack address. */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
< pxTopOfStack--;
< *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
< pxTopOfStack--;
---
> *pxTopOfStack = ( StackType_t ) 0xdeadaffe;
> pxTopOfStack--;
> pxTopOfStack--;
> pxTopOfStack--;
>
>
> int i;
>
> for(i=63;i>14;i--) {
> *pxTopOfStack = ( StackType_t ) i<<8; /* higher registers */
> pxTopOfStack--;
> }
>
>
> *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x51aac4de; /* Stack used when task starts goes in R13. */
> pxStackStart = pxTopOfStack;
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */
> //*pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* frame pointer to stack address. */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */
> pxTopOfStack--;
> *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */
> pxTopOfStack--;
96c98
< /* When the task starts is will expect to find the function parameter in
---
> /* When the task starts is will expect to find the function parameter in
98,103c100,103
< *pxTopOfStack-- = ( StackType_t ) pvParameters; /* R0 */
<
< // second last thing: program counter, no normal register on epiphany!
< *pxTopOfStack-- = ( StackType_t ) pxCode; /* Stack used when task starts goes in R13. */
<
<
---
> *pxTopOfStack-- = ( StackType_t ) pvParameters; /* R0 */
>
> // second last thing: program counter, no normal register on epiphany!
> *pxTopOfStack-- = ( StackType_t ) pxCode; /* Stack used when task starts goes in R13. */
105c105,107
< /* The last thing onto the stack is the status register, which is set for
---
>
>
> /* The last thing onto the stack is the status register, which is set for
107c109,110
< *pxTopOfStack = ( StackType_t ) 0x03;
---
> *pxTopOfStack = ( StackType_t ) 0x03;
>
109d111
<
111c113
< /* Some optimisation levels use the stack differently to others. This
---
> /* Some optimisation levels use the stack differently to others. This
115,117c117,119
< //*pxTopOfStack = 0;
< //return pxOriginalTOS;
< return pxTopOfStack;
---
> //*pxTopOfStack = 0;
> //return pxOriginalTOS;
> return pxTopOfStack;
120c122
<
---
> /*-----THE PROBLEM FUNCTION---------------*/
122c124
< unsigned memprotectregister = e_reg_read(E_REG_MEMPROTECT);
---
> unsigned memprotectregister = e_reg_read(E_REG_MEMPROTECT);
124,127c126,129
< //clear last 8 bits
< memprotectregister &= 0xffffff00;
< //sets it to the specified value
< memprotectregister |= mask;
---
> //clear last 8 bits
> memprotectregister &= 0xffffff00;
> //sets it to the specified value
> memprotectregister |= mask;
129c131
< e_reg_write(E_REG_MEMPROTECT, memprotectregister);
---
> e_reg_write(E_REG_MEMPROTECT, memprotectregister);
131c133
<
---
> /*-----------------------------------------------------------*/
140,141c142,143
< e_irq_attach(E_USER_INT, handlers[E_USER_INT]);
< e_irq_mask(E_USER_INT, E_FALSE);
---
> e_irq_attach(E_USER_INT, handlers[E_USER_INT]);
> e_irq_mask(E_USER_INT, E_FALSE);
143,144c145,146
< e_irq_attach(E_TIMER0_INT, handlers[E_TIMER0_INT]);
< e_irq_mask(E_TIMER0_INT, E_FALSE);
---
> e_irq_attach(E_TIMER0_INT, handlers[E_TIMER0_INT]);
> e_irq_mask(E_TIMER0_INT, E_FALSE);
146,147c148,149
< e_irq_attach(E_MEM_FAULT, handlers[E_MEM_FAULT]);
< e_irq_mask(E_MEM_FAULT, E_FALSE);
---
> e_irq_attach(E_MEM_FAULT, handlers[E_MEM_FAULT]);
> e_irq_mask(E_MEM_FAULT, E_FALSE);
149,150c151,152
< e_irq_attach(E_SW_EXCEPTION, handlers[E_SW_EXCEPTION]);
< e_irq_mask(E_SW_EXCEPTION, E_FALSE);
---
> e_irq_attach(E_SW_EXCEPTION, handlers[E_SW_EXCEPTION]);
> e_irq_mask(E_SW_EXCEPTION, E_FALSE);
152,153c154,155
< e_irq_attach(E_MESSAGE_INT, handlers[E_MESSAGE_INT]);
< e_irq_mask(E_MESSAGE_INT, E_FALSE);
---
> e_irq_attach(E_MESSAGE_INT, handlers[E_MESSAGE_INT]);
> e_irq_mask(E_MESSAGE_INT, E_FALSE);
155c157,159
< setMemprotectMask(0x0f);
---
> vSetupTimer();
> //condition left for debugging
> if(globalDelta == 0){
157c161
< vSetupTimer();
---
> }else{
158a163
> }
161d165
<
170c174
< e_irq_mask(E_TIMER1_INT, E_TRUE);
---
> e_irq_mask(E_TIMER1_INT, E_TRUE);
180,184c184,188
< // There seems to be no working software interrupt, so we send a user-interrupt to ourself
< e_coreid_t thiscore = e_get_coreid();
< unsigned row, col;
< e_coords_from_coreid(thiscore, &row, &col);
< e_irq_set(row,col,E_USER_INT);
---
> // There seems to be no working software interrupt, so we send a user-interrupt to ourself
> e_coreid_t thiscore = e_get_coreid();
> unsigned row, col;
> e_coords_from_coreid(thiscore, &row, &col);
> e_irq_set(row,col,E_USER_INT);
193,199c197,208
< unsigned int cyclesForTick = CyclesForTick;
< int delta = E_CTIMER_MAX - e_ctimer_get(E_CTIMER_1) - cyclesForTick; //How much off are we this time?
< e_ctimer_set(E_CTIMER_1, E_CTIMER_MAX);
<
< //We are never to early, case is taken on startup
< if(delta < 0)
< delta=0;
---
> unsigned int cyclesForTick = CyclesForTick;
> int delta = E_CTIMER_MAX - e_ctimer_get(E_CTIMER_1) - cyclesForTick; //How much off are we this time?
> e_ctimer_set(E_CTIMER_1, E_CTIMER_MAX);
>
> //We are never to early, case is taken on startup
>
> //debugging
> if(delta < 0){
>
> delta=0;
> }
> globalDelta = delta;
201,202c210,211
< e_ctimer_set(E_CTIMER_0, cyclesForTick-delta);
< e_ctimer_start(E_CTIMER_0, E_CTIMER_CLK);
---
> e_ctimer_set(E_CTIMER_0, cyclesForTick-delta);
> e_ctimer_start(E_CTIMER_0, E_CTIMER_CLK);
208,210c217,219
< volatile int status;
< volatile int pc;
< volatile int no[64]; //collection of all the registers as stored onto the stack
---
> volatile int status;
> volatile int pc;
> volatile int no[64]; //collection of all the registers as stored onto the stack
217,224c226,233
< TaskHandle_t runningTask = xTaskGetCurrentTaskHandle();
< TCB_t **tcb = runningTask;
< struct layout* reg = *tcb;
<
< int bitmask = 1 << (rand()%32);
< int failreg = rand()%64;
< reg->no[failreg] ^= bitmask;
< M[4]++;
---
> TaskHandle_t runningTask = xTaskGetCurrentTaskHandle();
> TCB_t **tcb = runningTask;
> struct layout* reg = *tcb;
>
> int bitmask = 1 << (rand()%32);
> int failreg = rand()%64;
> reg->no[failreg] ^= bitmask;
> M[4]++;
230,251c239,263
< switch (interrupt_mode) {
< case E_TIMER0_INT:
< vSetupTimer();
< if( xTaskIncrementTick() != pdFALSE ) {
< vTaskSwitchContext();
< }
< break;
< case E_SW_EXCEPTION: //triggered extrenally for error injection. Must be that high prority
< injectErrors();
< break;
< case E_USER_INT:
< vTaskSwitchContext();
< break;
< case E_MESSAGE_INT: //message, triggered externally for message transmission
< irqMsg();
< break;
< case E_MEM_FAULT: // written to read-only memory
< while(1);
< break;
< default:
< break;
< }
---
> switch (interrupt_mode) {
> case E_TIMER0_INT:
> vSetupTimer();
> updateTick();
> xTaskIncrementTick();
> vTaskSwitchContext();
> break;
> case E_SW_EXCEPTION: //triggered extrenally for error injection. Must be that high prority
> injectErrors();
> break;
> case E_USER_INT:
> vTaskSwitchContext();
> break;
> case E_MESSAGE_INT: //message, triggered externally for message transmission
> //a message received
> updateDebugFlag(404);
> //irqMsg();
> break;
> case E_MEM_FAULT: // written to read-only memory
> updateDebugFlag(2222);
> //while(1);
> break;
> default:
> break;
> }