aboutsummaryrefslogtreecommitdiff
path: root/test3.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2017-02-09 17:20:51 +0000
committerPeter Maydell <peter.maydell@linaro.org>2017-02-09 17:20:51 +0000
commit36f2bd63d4ae9757e6ece2e1c3a25aa844926539 (patch)
tree178f80ff17adc0253aabd3b604c2d2831516ccd4 /test3.c
parent1f50c3f3294c6b67cf69cd71d919e58ed886ac41 (diff)
test3: Update to use tapit output format and add to runtests
Update the test3 code to use tapit output format so we can add it to the tests run by the runtests script. Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'test3.c')
-rw-r--r--test3.c89
1 files changed, 51 insertions, 38 deletions
diff --git a/test3.c b/test3.c
index 0c83aeb..1dca0c7 100644
--- a/test3.c
+++ b/test3.c
@@ -1,25 +1,28 @@
/* Test exception escalation in armv7-m
*/
#include "armv7m.h"
+#include "testme.h"
static
-volatile int test;
+unsigned testseq;
+
+#define SEQ() __atomic_add_fetch(&testseq, 1, __ATOMIC_RELAXED)
+
+#define CHECK_SEQ(N) testEqI(N, SEQ(), "SEQ " #N)
static
void hard(void)
{
+ int test = SEQ();
+
switch(test) {
- case 2:
- puts("8. in HardFault\n");
- break;
- case 3:
- puts("11. in HardFault\n");
- break;
- case 5:
- puts("17. in HardFault\n");
+ case 8:
+ case 11:
+ case 17:
+ testPass("in HardFault");
break;
default:
- puts("Fail HardFault\n");
+ testFail("Fail HardFault");
abort();
}
}
@@ -27,15 +30,15 @@ void hard(void)
static
void svc(void)
{
+ int test = SEQ();
+
switch(test) {
- case 0:
- puts("2. in SVC\n");
- break;
- case 4:
- puts("14. in SVC\n");
+ case 2:
+ case 14:
+ testPass("in SVC");
break;
default:
- puts("Fail SVC\n");
+ testFail("Fail SVC");
abort();
}
}
@@ -43,12 +46,14 @@ void svc(void)
static __attribute__((unused))
void pendsv(void)
{
+ int test = SEQ();
+
switch(test) {
- case 1:
- puts("5. in PendSV\n");
+ case 5:
+ testPass("in PendSV");
break;
default:
- puts("Fail PendSV\n");
+ testFail("Fail PendSV");
abort();
}
}
@@ -59,48 +64,56 @@ void main(void)
run_table.pendsv = pendsv;
run_table.svc = svc;
+ testInit(12);
+
out32(SCB(0xd0c), 0x05fa0000 | (PRIGROUP<<8));
- test = 0;
CPSIE(if);
- puts("1. trigger SVC\n");
+ SEQ();
+ testDiag("trigger SVC");
SVC(42);
- puts("3. Back in main\n");
+ testDiag("Back in main");
+ CHECK_SEQ(3);
- test = 1;
- puts("4. trigger PendSV\n");
+ testDiag("trigger PendSV");
+ SEQ();
out32((void*)0xe000ed04, 1<<28);
- puts("6. Back in main\n");
+ testDiag("Back in main");
+ CHECK_SEQ(6);
- test = 2;
- puts("7. trigger HardFault\n");
+ testDiag("trigger HardFault via SVC escalating to HF due to PRIMASK");
+ SEQ();
CPSID(i); /* mask prio lower than -1 [0,255] */
SVC(42);
- puts("9. Back in main\n");
+ testDiag("Back in main");
+ CHECK_SEQ(9);
- test = 3;
CPSIE(i);
basepri(1);
out32(SCB(0xd1c), PRIO(7,0)<<24); /* PRIO SVC */
//out32(SCB(0xd1c), 1<<21); /* PRIO PendSV */
- puts("10. trigger HardFault\n");
+ testDiag("trigger HardFault via SVC escalating to HF due to priority");
+ SEQ();
SVC(42);
- puts("12. Back in main\n");
+ testDiag("Back in main");
+ CHECK_SEQ(12);
- test = 4;
out32(SCB(0xd1c), PRIO(0,0)<<24); /* PRIO SVC */
- puts("13. trigger SVC\n");
+ testDiag("trigger SVC");
+ SEQ();
SVC(42);
- puts("15. Back in main\n");
+ testDiag("Back in main");
+ CHECK_SEQ(15);
- test = 5;
out32(SCB(0xd1c), PRIO(2,0)<<24); /* PRIO SVC */
basepri(2);
- puts("16. trigger HardFault\n");
+ testDiag("trigger HardFault via SVC escalating to HF due to BASEPRI");
+ SEQ();
SVC(42);
- puts("18. Back in main\n");
+ testDiag("Back in main");
+ CHECK_SEQ(18);
- puts("Done\n");
+ testDiag("Done");
}