xref: /openbmc/qemu/tests/tcg/xtensa/test_mmu.S (revision 11314643c35401b18c5374f4ec82ee7d3d5d2692)
1a2e67072SMax Filippov#include "macros.inc"
2c09015ddSAnthony Liguori
3c09015ddSAnthony Liguoritest_suite mmu
4c09015ddSAnthony Liguori
5*da60ecd6SMax Filippov#if XCHAL_HAVE_PTP_MMU
6*da60ecd6SMax Filippov#define BASE 0x20000000
7*da60ecd6SMax Filippov#define TLB_BASE 0x80000000
83db8a95eSMax Filippov
9d0fa1f0dSMax Filippov.purgem test_init
10c09015ddSAnthony Liguori
11ca3164dfSMax Filippov.macro clean_tlb_way way, page_size, n_entries
12ca3164dfSMax Filippov    movi    a2, \way
13ca3164dfSMax Filippov    movi    a3, \page_size
14ca3164dfSMax Filippov    movi    a4, \n_entries
15ca3164dfSMax Filippov    loop    a4, 1f
16ca3164dfSMax Filippov    idtlb   a2
17ca3164dfSMax Filippov    iitlb   a2
18ca3164dfSMax Filippov    add     a2, a2, a3
19ca3164dfSMax Filippov1:
20ca3164dfSMax Filippov.endm
21ca3164dfSMax Filippov
22d0fa1f0dSMax Filippov.macro test_init
23ca3164dfSMax Filippov    clean_tlb_way 0, 0x00001000, 4
24ca3164dfSMax Filippov    clean_tlb_way 1, 0x00001000, 4
25ca3164dfSMax Filippov    clean_tlb_way 2, 0x00001000, 4
26ca3164dfSMax Filippov    clean_tlb_way 3, 0x00001000, 4
27ca3164dfSMax Filippov    clean_tlb_way 4, 0x00100000, 4
28c09015ddSAnthony Liguori    movi    a2, 0x00000007
29c09015ddSAnthony Liguori    idtlb   a2
30ca3164dfSMax Filippov    movi    a2, 0x00000008
31ca3164dfSMax Filippov    idtlb   a2
32ca3164dfSMax Filippov    movi    a2, 0x00000009
33ca3164dfSMax Filippov    idtlb   a2
34*da60ecd6SMax Filippov#if XCHAL_HAVE_SPANNING_WAY
35*da60ecd6SMax Filippov    movi    a2, BASE | XCHAL_SPANNING_WAY
36*da60ecd6SMax Filippov    idtlb   a2
37*da60ecd6SMax Filippov    iitlb   a2
38*da60ecd6SMax Filippov    movi    a2, TLB_BASE | XCHAL_SPANNING_WAY
39*da60ecd6SMax Filippov    idtlb   a2
40*da60ecd6SMax Filippov    iitlb   a2
41*da60ecd6SMax Filippov    movi    a2, TLB_BASE
42*da60ecd6SMax Filippov    wsr     a2, ptevaddr
43*da60ecd6SMax Filippov#endif
44c09015ddSAnthony Liguori.endm
45c09015ddSAnthony Liguori
46c09015ddSAnthony Liguoritest tlb_group
47c09015ddSAnthony Liguori    movi    a2, 0x04000002 /* PPN */
48*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
49c09015ddSAnthony Liguori    wdtlb   a2, a3
50c09015ddSAnthony Liguori    witlb   a2, a3
51c09015ddSAnthony Liguori    movi    a3, 0x00200004
52c09015ddSAnthony Liguori    rdtlb0  a1, a3
53c09015ddSAnthony Liguori    ritlb0  a2, a3
54*da60ecd6SMax Filippov    movi    a3, BASE + 0x01000001
55c09015ddSAnthony Liguori    assert  eq, a1, a3
56c09015ddSAnthony Liguori    assert  eq, a2, a3
57c09015ddSAnthony Liguori    movi    a3, 0x00200004
58c09015ddSAnthony Liguori    rdtlb1  a1, a3
59c09015ddSAnthony Liguori    ritlb1  a2, a3
60c09015ddSAnthony Liguori    movi    a3, 0x04000002
61c09015ddSAnthony Liguori    assert  eq, a1, a3
62c09015ddSAnthony Liguori    assert  eq, a2, a3
63*da60ecd6SMax Filippov    movi    a3, BASE + 0x01234567
64c09015ddSAnthony Liguori    pdtlb   a1, a3
65c09015ddSAnthony Liguori    pitlb   a2, a3
66*da60ecd6SMax Filippov    movi    a3, BASE + 0x01234014
67c09015ddSAnthony Liguori    assert  eq, a1, a3
68*da60ecd6SMax Filippov    movi    a3, BASE + 0x0123400c
69c09015ddSAnthony Liguori    assert  eq, a2, a3
70c09015ddSAnthony Liguori    movi    a3, 0x00200004
71c09015ddSAnthony Liguori    idtlb   a3
72c09015ddSAnthony Liguori    iitlb   a3
73*da60ecd6SMax Filippov    movi    a3, BASE + 0x01234567
74c09015ddSAnthony Liguori    pdtlb   a1, a3
75c09015ddSAnthony Liguori    pitlb   a2, a3
76c09015ddSAnthony Liguori    movi    a3, 0x00000010
77c09015ddSAnthony Liguori    and     a1, a1, a3
78c09015ddSAnthony Liguori    assert  eqi, a1, 0
79c09015ddSAnthony Liguori    movi    a3, 0x00000008
80c09015ddSAnthony Liguori    and     a2, a2, a3
81c09015ddSAnthony Liguori    assert  eqi, a2, 0
82c09015ddSAnthony Liguoritest_end
83c09015ddSAnthony Liguori
84c09015ddSAnthony Liguoritest itlb_miss
85c09015ddSAnthony Liguori    set_vector kernel, 1f
86c09015ddSAnthony Liguori
87*da60ecd6SMax Filippov    movi    a3, BASE + 0x00100000
88c09015ddSAnthony Liguori    jx      a3
89c09015ddSAnthony Liguori    test_fail
90c09015ddSAnthony Liguori1:
91c09015ddSAnthony Liguori    rsr     a2, excvaddr
92c09015ddSAnthony Liguori    assert  eq, a2, a3
93c09015ddSAnthony Liguori    rsr     a2, exccause
94c09015ddSAnthony Liguori    movi    a3, 16
95c09015ddSAnthony Liguori    assert  eq, a2, a3
96c09015ddSAnthony Liguoritest_end
97c09015ddSAnthony Liguori
98c09015ddSAnthony Liguoritest dtlb_miss
99c09015ddSAnthony Liguori    set_vector kernel, 1f
100c09015ddSAnthony Liguori
101*da60ecd6SMax Filippov    movi    a3, BASE + 0x00100000
102c09015ddSAnthony Liguori    l8ui    a2, a3, 0
103c09015ddSAnthony Liguori    test_fail
104c09015ddSAnthony Liguori1:
105c09015ddSAnthony Liguori    rsr     a2, excvaddr
106c09015ddSAnthony Liguori    assert  eq, a2, a3
107c09015ddSAnthony Liguori    rsr     a2, exccause
108c09015ddSAnthony Liguori    movi    a3, 24
109c09015ddSAnthony Liguori    assert  eq, a2, a3
110c09015ddSAnthony Liguoritest_end
111c09015ddSAnthony Liguori
112c09015ddSAnthony Liguoritest itlb_multi_hit
113c09015ddSAnthony Liguori    set_vector kernel, 1f
114c09015ddSAnthony Liguori
115c09015ddSAnthony Liguori    movi    a2, 0x04000002 /* PPN */
116c09015ddSAnthony Liguori    movi    a3, 0xf0000004 /* VPN */
117c09015ddSAnthony Liguori    witlb   a2, a3
118c09015ddSAnthony Liguori    movi    a3, 0xf0000000
119c09015ddSAnthony Liguori    pitlb   a2, a3
120c09015ddSAnthony Liguori    test_fail
121c09015ddSAnthony Liguori1:
122c09015ddSAnthony Liguori    rsr     a2, exccause
123c09015ddSAnthony Liguori    movi    a3, 17
124c09015ddSAnthony Liguori    assert  eq, a2, a3
125c09015ddSAnthony Liguoritest_end
126c09015ddSAnthony Liguori
127c09015ddSAnthony Liguoritest dtlb_multi_hit
128c09015ddSAnthony Liguori    set_vector kernel, 1f
129c09015ddSAnthony Liguori
130c09015ddSAnthony Liguori    movi    a2, 0x04000002 /* PPN */
131*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
132c09015ddSAnthony Liguori    wdtlb   a2, a3
133*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200007 /* VPN */
134c09015ddSAnthony Liguori    wdtlb   a2, a3
135*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200000
136c09015ddSAnthony Liguori    pdtlb   a2, a3
137c09015ddSAnthony Liguori    test_fail
138c09015ddSAnthony Liguori1:
139c09015ddSAnthony Liguori    rsr     a2, exccause
140c09015ddSAnthony Liguori    movi    a3, 25
141c09015ddSAnthony Liguori    assert  eq, a2, a3
142c09015ddSAnthony Liguoritest_end
143c09015ddSAnthony Liguori
144c09015ddSAnthony Liguoritest inst_fetch_privilege
145c09015ddSAnthony Liguori    set_vector kernel, 3f
146c09015ddSAnthony Liguori
147c09015ddSAnthony Liguori    movi    a2, 0x4004f
148c09015ddSAnthony Liguori    wsr     a2, ps
149c09015ddSAnthony Liguori1:
150c09015ddSAnthony Liguori    isync
151c09015ddSAnthony Liguori    nop
152c09015ddSAnthony Liguori2:
153c09015ddSAnthony Liguori    test_fail
154c09015ddSAnthony Liguori3:
155c09015ddSAnthony Liguori    movi    a1, 1b
156c09015ddSAnthony Liguori    rsr     a2, excvaddr
157c09015ddSAnthony Liguori    rsr     a3, epc1
158c09015ddSAnthony Liguori    assert  ge, a2, a1
159c09015ddSAnthony Liguori    assert  ge, a3, a1
160c09015ddSAnthony Liguori    movi    a1, 2b
161c09015ddSAnthony Liguori    assert  lt, a2, a1
162c09015ddSAnthony Liguori    assert  lt, a3, a1
163c09015ddSAnthony Liguori    rsr     a2, exccause
164c09015ddSAnthony Liguori    movi    a3, 18
165c09015ddSAnthony Liguori    assert  eq, a2, a3
166c09015ddSAnthony Liguori    rsr     a2, ps
167c09015ddSAnthony Liguori    movi    a3, 0x4005f
168c09015ddSAnthony Liguori    assert  eq, a2, a3
169c09015ddSAnthony Liguoritest_end
170c09015ddSAnthony Liguori
171c09015ddSAnthony Liguoritest load_store_privilege
172c09015ddSAnthony Liguori    set_vector kernel, 2f
173c09015ddSAnthony Liguori
174c09015ddSAnthony Liguori    movi    a3, 10f
175c09015ddSAnthony Liguori    pitlb   a3, a3
176c09015ddSAnthony Liguori    ritlb1  a2, a3
177c09015ddSAnthony Liguori    movi    a1, 0x10
178c09015ddSAnthony Liguori    or      a2, a2, a1
179c09015ddSAnthony Liguori    movi    a1, 0x000ff000
180c09015ddSAnthony Liguori    and     a3, a3, a1
181c09015ddSAnthony Liguori    movi    a1, 4
182c09015ddSAnthony Liguori    or      a3, a3, a1
183*da60ecd6SMax Filippov    movi    a5, BASE
184*da60ecd6SMax Filippov    add     a3, a3, a5
185c09015ddSAnthony Liguori    witlb   a2, a3
186c09015ddSAnthony Liguori    movi    a3, 10f
187c09015ddSAnthony Liguori    movi    a1, 0x000fffff
188c09015ddSAnthony Liguori    and     a1, a3, a1
189*da60ecd6SMax Filippov    add     a1, a1, a5
190c09015ddSAnthony Liguori
191c09015ddSAnthony Liguori    movi    a2, 0x04000003 /* PPN */
192*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
193c09015ddSAnthony Liguori    wdtlb   a2, a3
194*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200001
195c09015ddSAnthony Liguori    movi    a2, 0x4004f
196c09015ddSAnthony Liguori    jx      a1
197c09015ddSAnthony Liguori10:
198c09015ddSAnthony Liguori    wsr     a2, ps
199c09015ddSAnthony Liguori    isync
200c09015ddSAnthony Liguori1:
201c09015ddSAnthony Liguori    l8ui    a2, a3, 0
202c09015ddSAnthony Liguori    test_fail
203c09015ddSAnthony Liguori2:
204c09015ddSAnthony Liguori    rsr     a2, excvaddr
205c09015ddSAnthony Liguori    assert  eq, a2, a3
206c09015ddSAnthony Liguori    rsr     a2, epc1
207c09015ddSAnthony Liguori    movi    a3, 1b
208c09015ddSAnthony Liguori    movi    a1, 0x000fffff
209c09015ddSAnthony Liguori    and     a3, a3, a1
210*da60ecd6SMax Filippov    add     a3, a3, a5
211c09015ddSAnthony Liguori    assert  eq, a2, a3
212c09015ddSAnthony Liguori    rsr     a2, exccause
213c09015ddSAnthony Liguori    movi    a3, 26
214c09015ddSAnthony Liguori    assert  eq, a2, a3
215c09015ddSAnthony Liguori    rsr     a2, ps
216c09015ddSAnthony Liguori    movi    a3, 0x4005f
217c09015ddSAnthony Liguori    assert  eq, a2, a3
218c09015ddSAnthony Liguoritest_end
219c09015ddSAnthony Liguori
220c09015ddSAnthony Liguoritest cring_load_store_privilege
221c09015ddSAnthony Liguori    set_vector kernel, 0
222c09015ddSAnthony Liguori    set_vector double, 2f
223c09015ddSAnthony Liguori
224c09015ddSAnthony Liguori    movi    a2, 0x04000003 /* PPN */
225*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
226c09015ddSAnthony Liguori    wdtlb   a2, a3
227*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004
228c09015ddSAnthony Liguori    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
229c09015ddSAnthony Liguori    wsr     a2, ps
230c09015ddSAnthony Liguori    isync
231c09015ddSAnthony Liguori    l8ui    a2, a3, 0      /* cring used */
232c09015ddSAnthony Liguori1:
233c09015ddSAnthony Liguori    l32e    a2, a3, -4     /* ring used */
234c09015ddSAnthony Liguori    test_fail
235c09015ddSAnthony Liguori2:
236c09015ddSAnthony Liguori    rsr     a2, excvaddr
237c09015ddSAnthony Liguori    addi    a2, a2, 4
238c09015ddSAnthony Liguori    assert  eq, a2, a3
239c09015ddSAnthony Liguori    rsr     a2, depc
240c09015ddSAnthony Liguori    movi    a3, 1b
241c09015ddSAnthony Liguori    assert  eq, a2, a3
242c09015ddSAnthony Liguori    rsr     a2, exccause
243c09015ddSAnthony Liguori    movi    a3, 26
244c09015ddSAnthony Liguori    assert  eq, a2, a3
245c09015ddSAnthony Liguori    rsr     a2, ps
246c09015ddSAnthony Liguori    movi    a3, 0x4005f
247c09015ddSAnthony Liguori    assert  eq, a2, a3
248c09015ddSAnthony Liguoritest_end
249c09015ddSAnthony Liguori
250c09015ddSAnthony Liguoritest inst_fetch_prohibited
251c09015ddSAnthony Liguori    set_vector kernel, 2f
252c09015ddSAnthony Liguori
253c09015ddSAnthony Liguori    movi    a3, 10f
254c09015ddSAnthony Liguori    pitlb   a3, a3
255c09015ddSAnthony Liguori    ritlb1  a2, a3
256c09015ddSAnthony Liguori    movi    a1, 0xfffff000
257c09015ddSAnthony Liguori    and     a2, a2, a1
258c09015ddSAnthony Liguori    movi    a1, 0x4
259c09015ddSAnthony Liguori    or      a2, a2, a1
260c09015ddSAnthony Liguori    movi    a1, 0x000ff000
261c09015ddSAnthony Liguori    and     a3, a3, a1
262c09015ddSAnthony Liguori    movi    a1, 4
263c09015ddSAnthony Liguori    or      a3, a3, a1
264*da60ecd6SMax Filippov    movi    a5, BASE
265*da60ecd6SMax Filippov    add     a3, a3, a5
266c09015ddSAnthony Liguori    witlb   a2, a3
267c09015ddSAnthony Liguori    movi    a3, 10f
268c09015ddSAnthony Liguori    movi    a1, 0x000fffff
269c09015ddSAnthony Liguori    and     a1, a3, a1
270*da60ecd6SMax Filippov    add     a1, a1, a5
271c09015ddSAnthony Liguori    jx      a1
272c09015ddSAnthony Liguori    .align  4
273c09015ddSAnthony Liguori10:
274c09015ddSAnthony Liguori    nop
275c09015ddSAnthony Liguori    test_fail
276c09015ddSAnthony Liguori2:
277c09015ddSAnthony Liguori    rsr     a2, excvaddr
278c09015ddSAnthony Liguori    assert  eq, a2, a1
279c09015ddSAnthony Liguori    rsr     a2, epc1
280c09015ddSAnthony Liguori    assert  eq, a2, a1
281c09015ddSAnthony Liguori    rsr     a2, exccause
282c09015ddSAnthony Liguori    movi    a3, 20
283c09015ddSAnthony Liguori    assert  eq, a2, a3
284c09015ddSAnthony Liguoritest_end
285c09015ddSAnthony Liguori
286c09015ddSAnthony Liguoritest load_prohibited
287c09015ddSAnthony Liguori    set_vector kernel, 2f
288c09015ddSAnthony Liguori
289c09015ddSAnthony Liguori    movi    a2, 0x0400000c /* PPN */
290*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
291c09015ddSAnthony Liguori    wdtlb   a2, a3
292*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200002
293c09015ddSAnthony Liguori1:
294c09015ddSAnthony Liguori    l8ui    a2, a3, 0
295c09015ddSAnthony Liguori    test_fail
296c09015ddSAnthony Liguori2:
297c09015ddSAnthony Liguori    rsr     a2, excvaddr
298c09015ddSAnthony Liguori    assert  eq, a2, a3
299c09015ddSAnthony Liguori    rsr     a2, epc1
300c09015ddSAnthony Liguori    movi    a3, 1b
301c09015ddSAnthony Liguori    assert  eq, a2, a3
302c09015ddSAnthony Liguori    rsr     a2, exccause
303c09015ddSAnthony Liguori    movi    a3, 28
304c09015ddSAnthony Liguori    assert  eq, a2, a3
305c09015ddSAnthony Liguoritest_end
306c09015ddSAnthony Liguori
307c09015ddSAnthony Liguoritest store_prohibited
308c09015ddSAnthony Liguori    set_vector kernel, 2f
309c09015ddSAnthony Liguori
310c09015ddSAnthony Liguori    movi    a2, 0x04000001 /* PPN */
311*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200004 /* VPN */
312c09015ddSAnthony Liguori    wdtlb   a2, a3
313*da60ecd6SMax Filippov    movi    a3, BASE + 0x01200003
314c09015ddSAnthony Liguori    l8ui    a2, a3, 0
315c09015ddSAnthony Liguori1:
316c09015ddSAnthony Liguori    s8i     a2, a3, 0
317c09015ddSAnthony Liguori    test_fail
318c09015ddSAnthony Liguori2:
319c09015ddSAnthony Liguori    rsr     a2, excvaddr
320c09015ddSAnthony Liguori    assert  eq, a2, a3
321c09015ddSAnthony Liguori    rsr     a2, epc1
322c09015ddSAnthony Liguori    movi    a3, 1b
323c09015ddSAnthony Liguori    assert  eq, a2, a3
324c09015ddSAnthony Liguori    rsr     a2, exccause
325c09015ddSAnthony Liguori    movi    a3, 29
326c09015ddSAnthony Liguori    assert  eq, a2, a3
327c09015ddSAnthony Liguoritest_end
328c09015ddSAnthony Liguori
329c305e32fSMax Filippov/* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
330c305e32fSMax Filippov * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
331c305e32fSMax Filippov */
332c305e32fSMax Filippov.macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
333*da60ecd6SMax Filippov    movi    a2, TLB_BASE
334c09015ddSAnthony Liguori    wsr     a2, ptevaddr
335c305e32fSMax Filippov
336*da60ecd6SMax Filippov    movi    a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
337c305e32fSMax Filippov    movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
338c305e32fSMax Filippov    wdtlb   a4, a3
339c305e32fSMax Filippov    isync
340c305e32fSMax Filippov
341c305e32fSMax Filippov    movi    a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
342c305e32fSMax Filippov    movi    a1, ((\vaddr) >> 12) << 2
343c305e32fSMax Filippov    add     a2, a1, a2
344c305e32fSMax Filippov    s32i    a3, a2, 0
345c305e32fSMax Filippov
346*da60ecd6SMax Filippov    movi    a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
347c305e32fSMax Filippov    movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
348c305e32fSMax Filippov    wdtlb   a4, a3
349c305e32fSMax Filippov    isync
350c305e32fSMax Filippov
351c305e32fSMax Filippov    movi    a3, (\vaddr)
352c305e32fSMax Filippov.endm
353c305e32fSMax Filippov
354c305e32fSMax Filippov/* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
355c305e32fSMax Filippov.macro go_ring ring, excm, vaddr
356c305e32fSMax Filippov    movi    a3, 10f
357c305e32fSMax Filippov    pitlb   a3, a3
358c305e32fSMax Filippov    ritlb1  a2, a3
359c305e32fSMax Filippov    movi    a1, 0x10
360c305e32fSMax Filippov    or      a2, a2, a1
361c305e32fSMax Filippov    movi    a1, 0x000ff000
362c305e32fSMax Filippov    and     a3, a3, a1
363c305e32fSMax Filippov    movi    a1, 4
364c305e32fSMax Filippov    or      a3, a3, a1
365*da60ecd6SMax Filippov    movi    a5, BASE
366*da60ecd6SMax Filippov    add     a3, a3, a5
367c305e32fSMax Filippov    witlb   a2, a3
368c305e32fSMax Filippov    movi    a3, 10f
369c305e32fSMax Filippov    movi    a1, 0x000fffff
370c305e32fSMax Filippov    and     a1, a3, a1
371*da60ecd6SMax Filippov    add     a1, a1, a5
372c305e32fSMax Filippov
373c305e32fSMax Filippov    movi    a2, 0
374c305e32fSMax Filippov    wsr     a2, excvaddr
375c305e32fSMax Filippov
376c305e32fSMax Filippov    movi    a3, \vaddr
377c305e32fSMax Filippov    movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
378c305e32fSMax Filippov    jx      a1
379c305e32fSMax Filippov10:
380c305e32fSMax Filippov    wsr     a2, ps
381c305e32fSMax Filippov    isync
382c305e32fSMax Filippov.endm
383c305e32fSMax Filippov
384c305e32fSMax Filippov/* in: a3 -- virtual address to test */
385c305e32fSMax Filippov.macro assert_auto_tlb
386c305e32fSMax Filippov    movi    a2, 0x4000f
387c305e32fSMax Filippov    wsr     a2, ps
388c305e32fSMax Filippov    isync
389c305e32fSMax Filippov    pdtlb   a2, a3
390c305e32fSMax Filippov    movi    a1, 0xfffff01f
391c305e32fSMax Filippov    and     a2, a2, a1
392c305e32fSMax Filippov    movi    a1, 0xfffff000
393c305e32fSMax Filippov    and     a1, a1, a3
394c305e32fSMax Filippov    xor     a1, a1, a2
395c305e32fSMax Filippov    assert  gei, a1, 0x10
396c305e32fSMax Filippov    movi    a2, 0x14
397c305e32fSMax Filippov    assert  lt, a1, a2
398c305e32fSMax Filippov.endm
399c305e32fSMax Filippov
400c305e32fSMax Filippov/* in: a3 -- virtual address to test */
401c305e32fSMax Filippov.macro assert_no_auto_tlb
402c305e32fSMax Filippov    movi    a2, 0x4000f
403c305e32fSMax Filippov    wsr     a2, ps
404c305e32fSMax Filippov    isync
405c09015ddSAnthony Liguori    pdtlb   a2, a3
406c09015ddSAnthony Liguori    movi    a1, 0x10
407c09015ddSAnthony Liguori    and     a1, a1, a2
408c09015ddSAnthony Liguori    assert  eqi, a1, 0
409c305e32fSMax Filippov.endm
410c305e32fSMax Filippov
411c305e32fSMax Filippov.macro assert_sr sr, v
412c305e32fSMax Filippov    rsr     a2, \sr
413c305e32fSMax Filippov    movi    a1, (\v)
414c305e32fSMax Filippov    assert  eq, a1, a2
415c305e32fSMax Filippov.endm
416c305e32fSMax Filippov
417c305e32fSMax Filippov.macro assert_epc1_1m vaddr
418c305e32fSMax Filippov    movi    a2, (\vaddr)
419c305e32fSMax Filippov    movi    a1, 0xfffff
420c305e32fSMax Filippov    and     a1, a1, a2
421*da60ecd6SMax Filippov    movi    a5, BASE
422*da60ecd6SMax Filippov    add     a1, a1, a5
423c305e32fSMax Filippov    rsr     a2, epc1
424c305e32fSMax Filippov    assert  eq, a1, a2
425c305e32fSMax Filippov.endm
426c305e32fSMax Filippov
427c305e32fSMax Filippovtest dtlb_autoload
428c305e32fSMax Filippov    set_vector kernel, 0
429c305e32fSMax Filippov
430*da60ecd6SMax Filippov    pt_setup    0, 3, 1, BASE + 0x1000, 0x1000, 3
431c305e32fSMax Filippov    assert_no_auto_tlb
432c305e32fSMax Filippov
433c09015ddSAnthony Liguori    l8ui    a1, a3, 0
434c305e32fSMax Filippov
435c305e32fSMax Filippov    rsr     a2, excvaddr
436c305e32fSMax Filippov    assert  eq, a2, a3
437c305e32fSMax Filippov
438c305e32fSMax Filippov    assert_auto_tlb
439c305e32fSMax Filippovtest_end
440c305e32fSMax Filippov
441c305e32fSMax Filippovtest autoload_load_store_privilege
442c305e32fSMax Filippov    set_vector kernel, 0
443c305e32fSMax Filippov    set_vector double, 2f
444c305e32fSMax Filippov
445*da60ecd6SMax Filippov    pt_setup    0, 3, 0, BASE + 0x2000, 0x2000, 3
446*da60ecd6SMax Filippov    movi    a3, BASE + 0x2004
447c305e32fSMax Filippov    assert_no_auto_tlb
448c305e32fSMax Filippov
449c305e32fSMax Filippov    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
450c305e32fSMax Filippov    wsr     a2, ps
451c305e32fSMax Filippov    isync
452c305e32fSMax Filippov1:
453c305e32fSMax Filippov    l32e    a2, a3, -4     /* ring used */
454c305e32fSMax Filippov    test_fail
455c305e32fSMax Filippov2:
456c305e32fSMax Filippov    rsr     a2, excvaddr
457c305e32fSMax Filippov    addi    a1, a3, -4
458c305e32fSMax Filippov    assert  eq, a1, a2
459c305e32fSMax Filippov
460c305e32fSMax Filippov    assert_auto_tlb
461c305e32fSMax Filippov    assert_sr depc, 1b
462c305e32fSMax Filippov    assert_sr exccause, 26
463c305e32fSMax Filippovtest_end
464c305e32fSMax Filippov
465c305e32fSMax Filippovtest autoload_pte_load_prohibited
466c305e32fSMax Filippov    set_vector kernel, 2f
467c305e32fSMax Filippov
468*da60ecd6SMax Filippov    pt_setup    0, 3, 0, BASE + 0x3000, 0, 0xc
469c305e32fSMax Filippov    assert_no_auto_tlb
470c305e32fSMax Filippov1:
471c305e32fSMax Filippov    l32i    a2, a3, 0
472c305e32fSMax Filippov    test_fail
473c305e32fSMax Filippov2:
474c305e32fSMax Filippov    rsr     a2, excvaddr
475c305e32fSMax Filippov    assert  eq, a2, a3
476c305e32fSMax Filippov
477c305e32fSMax Filippov    assert_auto_tlb
478c305e32fSMax Filippov    assert_sr epc1, 1b
479c305e32fSMax Filippov    assert_sr exccause, 28
480c305e32fSMax Filippovtest_end
481c305e32fSMax Filippov
482c305e32fSMax Filippovtest autoload_pt_load_prohibited
483c305e32fSMax Filippov    set_vector kernel, 2f
484c305e32fSMax Filippov
485*da60ecd6SMax Filippov    pt_setup    0, 0xc, 0, BASE + 0x4000, 0x4000, 3
486c305e32fSMax Filippov    assert_no_auto_tlb
487c305e32fSMax Filippov1:
488c305e32fSMax Filippov    l32i    a2, a3, 0
489c305e32fSMax Filippov    test_fail
490c305e32fSMax Filippov2:
491c305e32fSMax Filippov    rsr     a2, excvaddr
492c305e32fSMax Filippov    assert  eq, a2, a3
493c305e32fSMax Filippov
494c305e32fSMax Filippov    assert_no_auto_tlb
495c305e32fSMax Filippov    assert_sr epc1, 1b
496c305e32fSMax Filippov    assert_sr exccause, 24
497c305e32fSMax Filippovtest_end
498c305e32fSMax Filippov
499c305e32fSMax Filippovtest autoload_pt_privilege
500c305e32fSMax Filippov    set_vector  kernel, 2f
501*da60ecd6SMax Filippov    pt_setup    0, 3, 1, BASE + 0x5000, 0, 3
502*da60ecd6SMax Filippov    go_ring     1, 0, BASE + 0x5001
503c305e32fSMax Filippov
504c305e32fSMax Filippov    l8ui    a2, a3, 0
505c305e32fSMax Filippov1:
506c305e32fSMax Filippov    syscall
507c305e32fSMax Filippov2:
508c305e32fSMax Filippov    rsr     a2, excvaddr
509c305e32fSMax Filippov    assert  eq, a2, a3
510c305e32fSMax Filippov
511c305e32fSMax Filippov    assert_auto_tlb
512c305e32fSMax Filippov    assert_epc1_1m 1b
513c305e32fSMax Filippov    assert_sr exccause, 1
514c305e32fSMax Filippovtest_end
515c305e32fSMax Filippov
516c305e32fSMax Filippovtest autoload_pte_privilege
517c305e32fSMax Filippov    set_vector  kernel, 2f
518*da60ecd6SMax Filippov    pt_setup    0, 3, 0, BASE + 0x6000, 0, 3
519*da60ecd6SMax Filippov    go_ring     1, 0, BASE + 0x6001
520c305e32fSMax Filippov1:
521c305e32fSMax Filippov    l8ui    a2, a3, 0
522c305e32fSMax Filippov    syscall
523c305e32fSMax Filippov2:
524c305e32fSMax Filippov    rsr     a2, excvaddr
525c305e32fSMax Filippov    assert  eq, a2, a3
526c305e32fSMax Filippov
527c305e32fSMax Filippov    assert_auto_tlb
528c305e32fSMax Filippov    assert_epc1_1m 1b
529c305e32fSMax Filippov    assert_sr exccause, 26
530c305e32fSMax Filippovtest_end
531c305e32fSMax Filippov
532c305e32fSMax Filippovtest autoload_3_level_pt
533c305e32fSMax Filippov    set_vector  kernel, 2f
534*da60ecd6SMax Filippov    pt_setup    1, 3, 1, BASE + 0x00400000, 0, 3
535*da60ecd6SMax Filippov    pt_setup    1, 3, 1, TLB_BASE + ((BASE + 0x00400000) >> 10), 0x2000000, 3
536*da60ecd6SMax Filippov    go_ring     1, 0, BASE + 0x00400001
537c305e32fSMax Filippov1:
538c305e32fSMax Filippov    l8ui    a2, a3, 0
539c305e32fSMax Filippov    syscall
540c305e32fSMax Filippov2:
541c305e32fSMax Filippov    rsr     a2, excvaddr
542c305e32fSMax Filippov    assert  eq, a2, a3
543c305e32fSMax Filippov
544c305e32fSMax Filippov    assert_no_auto_tlb
545c305e32fSMax Filippov    assert_epc1_1m 1b
546c305e32fSMax Filippov    assert_sr exccause, 24
547c09015ddSAnthony Liguoritest_end
548c09015ddSAnthony Liguori
54957a74051SMax Filippovtest cross_page_insn
55057a74051SMax Filippov    set_vector kernel, 2f
55157a74051SMax Filippov
55257a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
553*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007000 /* VPN */
55457a74051SMax Filippov    witlb   a2, a3
55557a74051SMax Filippov    wdtlb   a2, a3
556*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
55757a74051SMax Filippov    witlb   a2, a3
55857a74051SMax Filippov    wdtlb   a2, a3
55957a74051SMax Filippov
560*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
56157a74051SMax Filippov    movi    a3, 20f
56257a74051SMax Filippov    movi    a4, 21f
56357a74051SMax Filippov    sub     a4, a4, a3
56457a74051SMax Filippov    loop    a4, 1f
56557a74051SMax Filippov    l8ui    a5, a3, 0
56657a74051SMax Filippov    s8i     a5, a2, 0
56757a74051SMax Filippov    addi    a2, a2, 1
56857a74051SMax Filippov    addi    a3, a3, 1
56957a74051SMax Filippov1:
570*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
571*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
57257a74051SMax Filippov    /* DTLB: OK, ITLB: OK */
57357a74051SMax Filippov    jx      a2
57457a74051SMax Filippov
57557a74051SMax Filippov    .begin  no-transform
57657a74051SMax Filippov20:
57757a74051SMax Filippov    l32i    a2, a3, 0
57857a74051SMax Filippov    syscall
57957a74051SMax Filippov21:
58057a74051SMax Filippov    .end    no-transform
58157a74051SMax Filippov
58257a74051SMax Filippov2:
58357a74051SMax Filippov    rsr     a2, exccause
58457a74051SMax Filippov    movi    a3, 1
58557a74051SMax Filippov    assert  eq, a2, a3
58657a74051SMax Filippov    rsr     a2, epc1
587*da60ecd6SMax Filippov    movi    a3, BASE + 0x8002
58857a74051SMax Filippov    assert  eq, a2, a3
58957a74051SMax Filippov    rsr     a2, excsave1
590*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
59157a74051SMax Filippov    assert  ne, a2, a3
59257a74051SMax Filippov
59357a74051SMax Filippov    reset_ps
59457a74051SMax Filippov    set_vector kernel, 3f
59557a74051SMax Filippov
59657a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
597*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
59857a74051SMax Filippov    wdtlb   a2, a3
599*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
600*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
60157a74051SMax Filippov    /* DTLB: FAIL, ITLB: OK */
60257a74051SMax Filippov    jx      a2
60357a74051SMax Filippov3:
60457a74051SMax Filippov    rsr     a2, exccause
60557a74051SMax Filippov    movi    a3, 28
60657a74051SMax Filippov    assert  eq, a2, a3
60757a74051SMax Filippov    rsr     a2, epc1
608*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
60957a74051SMax Filippov    assert  eq, a2, a3
61057a74051SMax Filippov    rsr     a2, excsave1
611*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
61257a74051SMax Filippov    assert  eq, a2, a3
61357a74051SMax Filippov
61457a74051SMax Filippov    reset_ps
61557a74051SMax Filippov    set_vector kernel, 4f
61657a74051SMax Filippov
61757a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
618*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
61957a74051SMax Filippov    witlb   a2, a3
62057a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
62157a74051SMax Filippov    wdtlb   a2, a3
622*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
623*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
62457a74051SMax Filippov    /* DTLB: OK, ITLB: FAIL */
62557a74051SMax Filippov    jx      a2
62657a74051SMax Filippov4:
62757a74051SMax Filippov    rsr     a2, exccause
62857a74051SMax Filippov    movi    a3, 20
62957a74051SMax Filippov    assert  eq, a2, a3
63057a74051SMax Filippov    rsr     a2, epc1
631*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
63257a74051SMax Filippov    assert  eq, a2, a3
63357a74051SMax Filippov    rsr     a2, excsave1
634*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
63557a74051SMax Filippov    assert  eq, a2, a3
63657a74051SMax Filippov
63757a74051SMax Filippov    reset_ps
63857a74051SMax Filippov    set_vector kernel, 5f
63957a74051SMax Filippov
64057a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
641*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
64257a74051SMax Filippov    wdtlb   a2, a3
643*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007fff
644*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
64557a74051SMax Filippov    /* DTLB: FAIL, ITLB: FAIL */
64657a74051SMax Filippov    jx      a2
64757a74051SMax Filippov5:
64857a74051SMax Filippov    rsr     a2, exccause
64957a74051SMax Filippov    movi    a3, 20
65057a74051SMax Filippov    assert  eq, a2, a3
65157a74051SMax Filippov    rsr     a2, epc1
652*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
65357a74051SMax Filippov    assert  eq, a2, a3
65457a74051SMax Filippov    rsr     a2, excsave1
655*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007fff
65657a74051SMax Filippov    assert  eq, a2, a3
65757a74051SMax Filippovtest_end
65857a74051SMax Filippov
65957a74051SMax Filippovtest cross_page_tb
66057a74051SMax Filippov    set_vector kernel, 2f
66157a74051SMax Filippov
66257a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
663*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007000 /* VPN */
66457a74051SMax Filippov    witlb   a2, a3
66557a74051SMax Filippov    wdtlb   a2, a3
666*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
66757a74051SMax Filippov    witlb   a2, a3
66857a74051SMax Filippov    wdtlb   a2, a3
66957a74051SMax Filippov
670*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
67157a74051SMax Filippov    movi    a3, 20f
67257a74051SMax Filippov    movi    a4, 21f
67357a74051SMax Filippov    sub     a4, a4, a3
67457a74051SMax Filippov    loop    a4, 1f
67557a74051SMax Filippov    l8ui    a5, a3, 0
67657a74051SMax Filippov    s8i     a5, a2, 0
67757a74051SMax Filippov    addi    a2, a2, 1
67857a74051SMax Filippov    addi    a3, a3, 1
67957a74051SMax Filippov1:
680*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
681*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
68257a74051SMax Filippov    /* DTLB: OK, ITLB: OK */
68357a74051SMax Filippov    jx      a2
68457a74051SMax Filippov
68557a74051SMax Filippov    .begin  no-transform
68657a74051SMax Filippov20:
68757a74051SMax Filippov    l32i    a2, a3, 0
68857a74051SMax Filippov    syscall
68957a74051SMax Filippov21:
69057a74051SMax Filippov    .end    no-transform
69157a74051SMax Filippov
69257a74051SMax Filippov2:
69357a74051SMax Filippov    rsr     a2, exccause
69457a74051SMax Filippov    movi    a3, 1
69557a74051SMax Filippov    assert  eq, a2, a3
69657a74051SMax Filippov    rsr     a2, epc1
697*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
69857a74051SMax Filippov    assert  eq, a2, a3
69957a74051SMax Filippov    rsr     a2, excsave1
700*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
70157a74051SMax Filippov    assert  ne, a2, a3
70257a74051SMax Filippov
70357a74051SMax Filippov    reset_ps
70457a74051SMax Filippov    set_vector kernel, 3f
70557a74051SMax Filippov
70657a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
707*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
70857a74051SMax Filippov    wdtlb   a2, a3
709*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
710*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
71157a74051SMax Filippov    /* DTLB: FAIL, ITLB: OK */
71257a74051SMax Filippov    jx      a2
71357a74051SMax Filippov3:
71457a74051SMax Filippov    rsr     a2, exccause
71557a74051SMax Filippov    movi    a3, 28
71657a74051SMax Filippov    assert  eq, a2, a3
71757a74051SMax Filippov    rsr     a2, epc1
718*da60ecd6SMax Filippov    movi    a3, BASE + 0x7ffc
71957a74051SMax Filippov    assert  eq, a2, a3
72057a74051SMax Filippov    rsr     a2, excsave1
721*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
72257a74051SMax Filippov    assert  eq, a2, a3
72357a74051SMax Filippov
72457a74051SMax Filippov    reset_ps
72557a74051SMax Filippov    set_vector kernel, 4f
72657a74051SMax Filippov
72757a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
728*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
72957a74051SMax Filippov    witlb   a2, a3
73057a74051SMax Filippov    movi    a2, 0x04000003 /* PPN */
73157a74051SMax Filippov    wdtlb   a2, a3
732*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
733*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
73457a74051SMax Filippov    /* DTLB: OK, ITLB: FAIL */
73557a74051SMax Filippov    jx      a2
73657a74051SMax Filippov4:
73757a74051SMax Filippov    rsr     a2, exccause
73857a74051SMax Filippov    movi    a3, 20
73957a74051SMax Filippov    assert  eq, a2, a3
74057a74051SMax Filippov    rsr     a2, epc1
741*da60ecd6SMax Filippov    movi    a3, BASE + 0x7fff
74257a74051SMax Filippov    assert  eq, a2, a3
74357a74051SMax Filippov    rsr     a2, excsave1
744*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
74557a74051SMax Filippov    assert  ne, a2, a3
74657a74051SMax Filippov
74757a74051SMax Filippov    reset_ps
74857a74051SMax Filippov    set_vector kernel, 5f
74957a74051SMax Filippov
75057a74051SMax Filippov    movi    a2, 0x0400000c /* PPN */
751*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000 /* VPN */
75257a74051SMax Filippov    wdtlb   a2, a3
753*da60ecd6SMax Filippov    movi    a2, BASE + 0x00007ffc
754*da60ecd6SMax Filippov    movi    a3, BASE + 0x00008000
75557a74051SMax Filippov    /* DTLB: FAIL, ITLB: FAIL */
75657a74051SMax Filippov    jx      a2
75757a74051SMax Filippov5:
75857a74051SMax Filippov    rsr     a2, exccause
75957a74051SMax Filippov    movi    a3, 28
76057a74051SMax Filippov    assert  eq, a2, a3
76157a74051SMax Filippov    rsr     a2, epc1
762*da60ecd6SMax Filippov    movi    a3, BASE + 0x7ffc
76357a74051SMax Filippov    assert  eq, a2, a3
76457a74051SMax Filippov    rsr     a2, excsave1
765*da60ecd6SMax Filippov    movi    a3, BASE + 0x00007ffc
76657a74051SMax Filippov    assert  eq, a2, a3
76757a74051SMax Filippovtest_end
76857a74051SMax Filippov
7693db8a95eSMax Filippov#endif
7703db8a95eSMax Filippov
771c09015ddSAnthony Liguoritest_suite_end
772