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
Branches
No related merge requests found
...@@ -17,15 +17,3 @@ _start: ...@@ -17,15 +17,3 @@ _start:
mv a0, zero mv a0, zero
call main 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); ...@@ -19,9 +19,12 @@ extern void clear_bss(void);
static enum t_test static enum t_test
{ {
TEST_WD, TEST_WD,
TEST_CPU0_RECOVER, TEST_CPU1_RECOVER,
TEST_CPU0_FATAL, TEST_CPU2_RECOVER,
TEST_RAM TEST_CPU3_RECOVER,
TEST_CPU1_FATAL,
TEST_RAM,
TEST_DONE
} next_test; } next_test;
static void static void
...@@ -112,14 +115,15 @@ ram_test(void) ...@@ -112,14 +115,15 @@ ram_test(void)
return 0; return 0;
} }
/* ID must be 0-2 */
static void static void
force_divergence_1 (void) force_divergence (unsigned id)
{ {
unsigned v; unsigned v;
/* Force divergence by executing different code. */ /* Force divergence by executing different code. */
v = SUPERVISOR->force_divergence; v = SUPERVISOR->force_divergence;
if (v != 1) if (v != (1 << id))
uart_putc('D'); uart_putc('D');
/* Must be in lock-step. */ /* Must be in lock-step. */
...@@ -147,22 +151,21 @@ main (void) ...@@ -147,22 +151,21 @@ main (void)
uart_put_hex_digit (next_test); uart_put_hex_digit (next_test);
uart_putc('\n'); uart_putc('\n');
if (v == 0)
clear_bss ();
switch (next_test) { switch (next_test) {
case TEST_WD: case TEST_WD:
next_test = TEST_CPU0_RECOVER; /* Test watchdog - infinite loop */
next_test = TEST_CPU1_RECOVER;
while (1) while (1)
v = pad[0]; v = pad[0];
unreachable();
break; break;
case TEST_CPU0_RECOVER: case TEST_CPU1_RECOVER:
case TEST_CPU2_RECOVER:
case TEST_CPU3_RECOVER:
SUPERVISOR->wd_key = WD_KEY; 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 */ /* Generate reset for recovery */
SUPERVISOR->cpu = HYDRA_SUPERVISOR_REGS_CPU_RECOVERY; SUPERVISOR->cpu = HYDRA_SUPERVISOR_REGS_CPU_RECOVERY;
...@@ -170,12 +173,12 @@ main (void) ...@@ -170,12 +173,12 @@ main (void)
unreachable(); unreachable();
break; break;
case TEST_CPU0_FATAL: case TEST_CPU1_FATAL:
SUPERVISOR->wd_key = WD_KEY; SUPERVISOR->wd_key = WD_KEY;
/* Clear recovery */ /* Clear recovery */
SUPERVISOR->cpu = 0; SUPERVISOR->cpu = 0;
force_divergence_1(); force_divergence(0);
next_test = TEST_RAM; next_test = TEST_RAM;
...@@ -195,10 +198,15 @@ main (void) ...@@ -195,10 +198,15 @@ main (void)
uart_put_hex_digit(v & 0x0f); uart_put_hex_digit(v & 0x0f);
unreachable(); unreachable();
} }
}
while (1) { next_test = TEST_DONE;
/* Fallthrough */
case TEST_DONE:
SUPERVISOR->wd_key = WD_KEY; SUPERVISOR->wd_key = WD_KEY;
SUPERVISOR->wd_period = 100000000;
uart_puts ("Hello diot.\n"); 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