Skip to content

Commit ab7a811

Browse files
committed
(litmus_tests/exc) add some faulting exceptions litmus tests
1 parent 635faaa commit ab7a811

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
2+
#include "lib.h"
3+
4+
#define VARS x, y, z
5+
#define REGS p1x0, p1x2
6+
7+
static void P0(litmus_test_run* data) {
8+
asm volatile(
9+
"mov x0, #1\n\t"
10+
"str x0, [%[x]]\n\t"
11+
"dmb sy\n\t"
12+
"mov x2, #1\n\t"
13+
"str x2, [%[y]]\n\t"
14+
:
15+
: ASM_VARS(data, VARS), ASM_REGS(data, REGS)
16+
: "cc", "memory", "x0", "x2"
17+
);
18+
}
19+
20+
static void svc_handler(void) {
21+
asm volatile(
22+
/* x3 = X */
23+
"ldr x2, [x3]\n\t"
24+
"eret\n\t"
25+
);
26+
}
27+
28+
static void P1(litmus_test_run* data) {
29+
asm volatile(
30+
/* load variables into machine registers */
31+
"mov x1, %[y]\n\t"
32+
"mov x3, %[x]\n\t"
33+
"mov x5, %[z]\n\t"
34+
35+
/* run the test */
36+
"ldr x0, [x1]\n\t"
37+
"ldr x4, [x5]\n\t"
38+
39+
/* extract values */
40+
"str x0, [%[outp1r0]]\n\t"
41+
"str x2, [%[outp1r2]]\n\t"
42+
"dmb st\n\t"
43+
:
44+
: ASM_VARS(data, VARS), ASM_REGS(data, REGS)
45+
: "cc", "memory", "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7" /* dont touch parameter registers */
46+
);
47+
}
48+
49+
litmus_test_t MP_dmb_fault = {
50+
"MP+dmb+fault",
51+
MAKE_THREADS(2),
52+
MAKE_VARS(VARS),
53+
MAKE_REGS(REGS),
54+
INIT_STATE(3, INIT_VAR(x, 0), INIT_VAR(y, 0), INIT_UNMAPPED(z)),
55+
.requires_pgtable = 1,
56+
.thread_sync_handlers =
57+
(u32 * *[]){
58+
(u32*[]){ NULL, NULL },
59+
(u32*[]){ (u32*)svc_handler, NULL },
60+
},
61+
.interesting_result = (u64[]){
62+
/* p1:x0 =*/1,
63+
/* p1:x2 =*/0,
64+
},
65+
};
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
2+
#include "lib.h"
3+
4+
#define VARS x, y, z
5+
#define REGS p1x0, p1x2
6+
7+
static void svc_handler(void) {
8+
asm volatile(
9+
/* x3 = Y */
10+
"mov x2, #1\n\t"
11+
"str x2, [x3]\n\t"
12+
"eret\n\t"
13+
);
14+
}
15+
16+
static void P0(litmus_test_run* data) {
17+
asm volatile(
18+
"mov x1, %[x]\n\t"
19+
"mov x3, %[y]\n\t"
20+
"mov x5, %[y]\n\t"
21+
22+
"mov x0, #1\n\t"
23+
"str x0, [x1]\n\t"
24+
"ldr x4, [x5]\n\t"
25+
:
26+
: ASM_VARS(data, VARS), ASM_REGS(data, REGS)
27+
: "cc", "memory", "x0", "x1", "x2", "x3"
28+
);
29+
}
30+
31+
static void P1(litmus_test_run* data) {
32+
asm volatile(
33+
/* load variables into machine registers */
34+
"mov x1, %[y]\n\t"
35+
"mov x3, %[x]\n\t"
36+
37+
"ldr x0,[x1]\n\t"
38+
"dmb sy\n\t"
39+
"ldr x2,[x3]\n\t"
40+
41+
/* extract values */
42+
"str x0, [%[outp1r0]]\n\t"
43+
"str x2, [%[outp1r2]]\n\t"
44+
:
45+
: ASM_VARS(data, VARS), ASM_REGS(data, REGS)
46+
: "cc", "memory", "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7" /* dont touch parameter registers */
47+
);
48+
}
49+
50+
litmus_test_t MP_fault_dmb = {
51+
"MP+fault+dmb",
52+
MAKE_THREADS(2),
53+
MAKE_VARS(VARS),
54+
MAKE_REGS(REGS),
55+
INIT_STATE(3, INIT_VAR(x, 0), INIT_VAR(y, 0), INIT_UNMAPPED(z)),
56+
.requires_pgtable = 1,
57+
.thread_sync_handlers =
58+
(u32 * *[]){
59+
(u32*[]){ (u32*)svc_handler, NULL },
60+
(u32*[]){ NULL, NULL },
61+
},
62+
.interesting_result = (u64[]){
63+
/* p1:x0 =*/1,
64+
/* p1:x2 =*/0,
65+
},
66+
};

0 commit comments

Comments
 (0)