1# mach: frv fr500 fr550
2# sim: --memory-region 0xff000000,4 --memory-region 0xfe000000,00404000
3# xfail: "crashes with bad write" *-*
4
5; Exit with return code
6
7	.macro exit rc
8	setlos.p	#1,gr7
9	setlos          \rc,gr8
10	tira		gr0,#0
11	.endm
12
13; Pass the test case
14	.macro pass
15pass:
16	setlos.p	#5,gr10
17	setlos		#1,gr8
18	setlos		#5,gr7
19	sethi.p		%hi(passmsg),gr9
20	setlo		%lo(passmsg),gr9
21	tira		gr0,#0
22	exit		#0
23	.endm
24
25; Fail the testcase
26	.macro fail
27fail\@:
28	setlos.p	#5,gr10
29	setlos		#1,gr8
30	setlos		#5,gr7
31	sethi.p		%hi(failmsg),gr9
32	setlo		%lo(failmsg),gr9
33	tira		gr0,#0
34	exit		#1
35	.endm
36
37	.data
38failmsg:
39	.ascii "fail\n"
40passmsg:
41	.ascii "pass\n"
42
43	.text
44	.global _start
45_start:
46	movsg		hsr0,gr10	; enable insn and data caches
47	sethi.p		0xc800,gr11	; in copy-back mode
48	setlo		0x0000,gr11
49	or		gr10,gr11,gr10
50	movgs		gr10,hsr0
51	
52	sethi.p		0x7,sp
53	setlo		0x0000,sp
54
55	; fill the cache
56	sethi.p		%hi(done1),gr10
57	setlo		%lo(done1),gr10
58	movgs		gr10,lr
59	setlos.p	0x1000,gr10
60	setlos		0x0,gr11
61	movgs		gr10,lcr
62write1:	st.p		gr11,@(sp,gr11)
63	addi.p		gr11,4,gr11
64	bctrlr.p	1,0
65	bra		write1
66done1:
67	; read it back
68	sethi.p		%hi(done2),gr10
69	setlo		%lo(done2),gr10
70	movgs		gr10,lr
71	setlos.p	0x1000,gr10
72	setlos		0x0,gr11
73	movgs		gr10,lcr
74read1:	ld		@(sp,gr11),gr12
75	cmp		gr11,gr12,icc0
76	bne		icc0,1,fail
77	addi.p		gr11,4,gr11
78	bctrlr.p	1,0
79	bra		read1
80done2:	
81	
82	; fill the cache twice
83	sethi.p		%hi(done3),gr10
84	setlo		%lo(done3),gr10
85	movgs		gr10,lr
86	setlos.p	0x2000,gr10
87	setlos		0x0,gr11
88	movgs		gr10,lcr
89write3:	st.p		gr11,@(sp,gr11)
90	addi.p		gr11,4,gr11
91	bctrlr.p	1,0
92	bra		write3
93done3:
94	; read it back
95	sethi.p		%hi(done4),gr10
96	setlo		%lo(done4),gr10
97	movgs		gr10,lr
98	setlos.p	0x2000,gr10
99	setlos		0x0,gr11
100	movgs		gr10,lcr
101read4:	ld		@(sp,gr11),gr12
102	cmp		gr11,gr12,icc0
103	bne		icc0,1,fail
104	addi.p		gr11,4,gr11
105	bctrlr.p	1,0
106	bra		read4
107done4:	
108	; read it back in reverse
109	sethi.p		%hi(done5),gr10
110	setlo		%lo(done5),gr10
111	movgs		gr10,lr
112	setlos.p	0x2000,gr10
113	setlos		0x7ffc,gr11
114	movgs		gr10,lcr
115read5:	ld		@(sp,gr11),gr12
116	cmp		gr11,gr12,icc0
117	bne		icc0,1,fail
118	subi.p		gr11,4,gr11
119	bctrlr.p	1,0
120	bra		read5
121done5:	
122
123	; access data and insns in non-cache areas
124	sethi.p		0x8038,gr11		; bctrlr 0,0
125	setlo		0x2000,gr11
126
127	sethi.p		0xff00,gr10		; documented area
128	setlo		0x0000,gr10
129	sti		gr11,@(gr10,0)
130	jmpl		@(gr10,gr0)
131
132	;  enable RAM mode
133	movsg		hsr0,gr10
134	sethi.p		0x0040,gr12
135	setlo		0x0000,gr12
136	or		gr10,gr12,gr10
137	movgs		gr10,hsr0
138
139	sethi.p		0xfe00,gr10		; documented area
140	setlo		0x0400,gr10
141	sti		gr11,@(gr10,0)
142	jmpl		@(gr10,gr0)
143
144	sethi.p		0xfe40,gr10		; documented area
145	setlo		0x0400,gr10
146	sti		gr11,@(gr10,0)
147	dcf		@(gr10,gr0)
148	jmpl		@(gr10,gr0)
149
150	sethi.p		0x0007,gr10		; non RAM area
151	setlo		0x0000,gr10
152	sti		gr11,@(gr10,0)
153	jmpl		@(gr10,gr0)
154
155	sethi.p		0xfe00,gr10		; insn RAM area
156	setlo		0x0000,gr10
157	sti		gr11,@(gr10,0)
158	jmpl		@(gr10,gr0)
159
160	sethi.p		0xfe40,gr10		; data RAM area
161	setlo		0x0000,gr10
162	sti		gr11,@(gr10,0)
163	dcf		@(gr10,gr0)
164	jmpl		@(gr10,gr0)
165	
166	pass
167fail:
168	fail
169