Skip to content
Snippets Groups Projects
Commit 0f18389a authored by Tristan Gingold's avatar Tristan Gingold
Browse files

sw: test divergence of all cpus

parent 886f5bc2
No related merge requests found
......@@ -17,15 +17,3 @@ _start:
mv a0, zero
call main
.global clear_bss
clear_bss:
# clear the bss segment
la t0, _fbss
la t1, _end
1:
sw zero,0(t0)
addi t0, t0, 4
bltu t0, t1, 1b
ret
......@@ -19,9 +19,12 @@ extern void clear_bss(void);
static enum t_test
{
TEST_WD,
TEST_CPU0_RECOVER,
TEST_CPU0_FATAL,
TEST_RAM
TEST_CPU1_RECOVER,
TEST_CPU2_RECOVER,
TEST_CPU3_RECOVER,
TEST_CPU1_FATAL,
TEST_RAM,
TEST_DONE
} next_test;
static void
......@@ -112,14 +115,15 @@ ram_test(void)
return 0;
}
/* ID must be 0-2 */
static void
force_divergence_1 (void)
force_divergence (unsigned id)
{
unsigned v;
/* Force divergence by executing different code. */
v = SUPERVISOR->force_divergence;
if (v != 1)
if (v != (1 << id))
uart_putc('D');
/* Must be in lock-step. */
......@@ -147,22 +151,21 @@ main (void)
uart_put_hex_digit (next_test);
uart_putc('\n');
if (v == 0)
clear_bss ();
switch (next_test) {
case TEST_WD:
next_test = TEST_CPU0_RECOVER;
/* Test watchdog - infinite loop */
next_test = TEST_CPU1_RECOVER;
while (1)
v = pad[0];
unreachable();
break;
case TEST_CPU0_RECOVER:
case TEST_CPU1_RECOVER:
case TEST_CPU2_RECOVER:
case TEST_CPU3_RECOVER:
SUPERVISOR->wd_key = WD_KEY;
force_divergence_1();
force_divergence(next_test - TEST_CPU1_RECOVER);
next_test = TEST_CPU0_FATAL;
next_test++;
/* Generate reset for recovery */
SUPERVISOR->cpu = HYDRA_SUPERVISOR_REGS_CPU_RECOVERY;
......@@ -170,12 +173,12 @@ main (void)
unreachable();
break;
case TEST_CPU0_FATAL:
case TEST_CPU1_FATAL:
SUPERVISOR->wd_key = WD_KEY;
/* Clear recovery */
SUPERVISOR->cpu = 0;
force_divergence_1();
force_divergence(0);
next_test = TEST_RAM;
......@@ -195,10 +198,15 @@ main (void)
uart_put_hex_digit(v & 0x0f);
unreachable();
}
}
while (1) {
next_test = TEST_DONE;
/* Fallthrough */
case TEST_DONE:
SUPERVISOR->wd_key = WD_KEY;
SUPERVISOR->wd_period = 100000000;
uart_puts ("Hello diot.\n");
while (1)
;
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment