aboutsummaryrefslogtreecommitdiff
path: root/debug/programs/trigger.S
blob: ebfce1ca4ffdf94ba5135759f612bf13db6b4163 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "../../env/encoding.h"

#undef MCONTROL_TYPE
#undef MCONTROL_DMODE
#ifdef __riscv64
# define MCONTROL_TYPE    (0xf<<(64-4))
# define MCONTROL_DMODE   (1<<(64-5))
#else
# define MCONTROL_TYPE    (0xf<<(32-4))
# define MCONTROL_DMODE   (1<<(32-5))
#endif

        .global         main

        .section        .text
main:

        la      a0, data
        li      t0, 0
just_before_read_loop:
        li      t2, 16
read_loop:
        lw      t1, 0(a0)
        addi    t0, t0, 1
        addi    a0, a0, 4
        blt     t0, t2, read_loop

        la      a0, data
just_before_write_loop:
        li      t0, 1
write_loop:
        sw      t0, 0(a0)
        addi    t0, t0, 1
        addi    a0, a0, 4
        blt     t0, t2, write_loop

        j       main_exit

write_valid:
        li      t0, 0
        li      t2, MCONTROL_DMODE
        li      t3, MCONTROL_TYPE
write_valid_loop:
        csrw    CSR_TSELECT, t0
        csrr    t1, CSR_TSELECT
        bne     t0, t1, main_exit
        addi    t0, t0, 1
        csrr    t1, CSR_TDATA1
        and     t4, t1, t3
        beqz    t4, main_error  # type is 0
        and     t1, t1, t2
        bnez    t1, write_valid_loop
        # Found an entry with dmode=0
        csrw    CSR_TDATA1, zero        # this should succeed

write_invalid:
        li      t0, 0
        li      t2, MCONTROL_DMODE
        li      t3, MCONTROL_TYPE
write_invalid_loop:
        csrw    CSR_TSELECT, t0
        csrr    t1, CSR_TSELECT
        bne     t0, t1, main_exit
        addi    t0, t0, 1
        csrr    t1, CSR_TDATA1
        and     t4, t1, t3
        beqz    t4, main_error  # type is 0
        and     t1, t1, t2
        beqz    t1, write_invalid_loop
        # Found an entry with dmode=1
write_invalid_illegal:
        csrw    CSR_TDATA1, zero        # this should fail


main_exit:
        li      a0, 0
        j       _exit

main_error:
        li      a0, 1
        j       _exit

        .data
data:   .word   0x40
        .word   0x41
        .word   0x42
        .word   0x43
        .word   0x44
        .word   0x45
        .word   0x46
        .word   0x47
        .word   0x48
        .word   0x49
        .word   0x4a
        .word   0x4b
        .word   0x4c
        .word   0x4d
        .word   0x4e
        .word   0x4f