Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | BEGIN { push @INC, "$ENV{DV_ROOT}/verif/diag/assembly/arch/prm/common"; } |
2 | ||
3 | use strict; | |
4 | use arch_diags; | |
5 | ||
6 | &arch_diags::setup_diag_options(); | |
7 | ||
8 | :#define THREAD_COUNT $arch_diags::opt{thrd_count} | |
9 | :#define THREAD_STRIDE $arch_diags::opt{thrd_stride} | |
10 | ||
11 | if($arch_diags::opt{hyper}) { | |
12 | :#define H_HT0_Trap_Instruction_2 | |
13 | :#define My_HT0_Trap_Instruction_2 setx hyp_api, %g1, %g2; jmpl %g2, %g0; nop; | |
14 | } | |
15 | elsif ($arch_diags::opt{enboff}) { | |
16 | :#define H_T0_Trap_Instruction_2 | |
17 | :#define My_T0_Trap_Instruction_2 setx hyp_api, %g1, %g2; jmpl %g2, %g0; nop; | |
18 | } | |
19 | else { | |
20 | :#define H_HT0_HTrap_Instruction_0 | |
21 | :#define My_HT0_HTrap_Instruction_0 setx hyp_api, %g1, %g2; jmpl %g2, %g0; nop; | |
22 | } | |
23 | ||
24 | # illinst, fpdis, misalgn, dmisalgn, pirvact, vawatch, dataacc(T) | |
25 | # 7, 8, 10, 10, 11, 11, 12 | |
26 | ||
27 | my $illinst_vld = $arch_diags::opt{illinst}; | |
28 | my $fpdis_vld = $arch_diags::opt{fpdis} && ($illinst_vld == 0); | |
29 | my $misalgn_vld = $arch_diags::opt{misalgn} && ($illinst_vld == 0) && ($fpdis_vld == 0); | |
30 | my $dmisalgn_vld = $arch_diags::opt{dmisalgn} && ($illinst_vld == 0) && ($fpdis_vld == 0) && ($misalgn_vld == 0); | |
31 | my $privact_vld = $arch_diags::opt{privact} && ($illinst_vld == 0) && ($fpdis_vld == 0) && ($misalgn_vld == 0) && ($dmisalgn_vld == 0); | |
32 | my $vawatch_vld = $arch_diags::opt{vawatch} && ($illinst_vld == 0) && ($fpdis_vld == 0) && ($misalgn_vld == 0) && ($dmisalgn_vld == 0) && ($privact_vld == 0) && ($arch_diags::opt{hyper} == 0); | |
33 | my $dataacc_vld = $arch_diags::opt{dataacc} && ($illinst_vld == 0) && ($fpdis_vld == 0) && ($misalgn_vld == 0) && ($dmisalgn_vld == 0) && ($privact_vld == 0) && ($vawatch_vld == 0); | |
34 | ||
35 | my $trap_on_inst_op = $illinst_vld || $fpdis_vld || $misalgn_vld || $dmisalgn_vld || $privact_vld || $vawatch_vld; | |
36 | my $tte_setup_required = $arch_diags::opt{dataacc}; | |
37 | ||
38 | if($illinst_vld) { | |
39 | if($arch_diags::opt{enboff}) { | |
40 | :#define H_T0_Illegal_instruction_0x10 | |
41 | :#define My_T0_Illegal_instruction_0x10 done; | |
42 | } | |
43 | else { | |
44 | :#define H_HT0_Illegal_instruction_0x10 | |
45 | :#define My_HT0_Illegal_instruction_0x10 done; | |
46 | } | |
47 | } | |
48 | ||
49 | if($fpdis_vld) { | |
50 | :#define CREGS_FPRS_FEF 0 | |
51 | if($arch_diags::opt{hyper}) { | |
52 | :#define H_HT0_Fp_disabled_0x20 | |
53 | :#define My_HT0_Fp_disabled_0x20 done; | |
54 | } | |
55 | else { | |
56 | :#define H_T0_Fp_disabled_0x20 | |
57 | :#define My_T0_Fp_disabled_0x20 done; | |
58 | } | |
59 | } | |
60 | else { | |
61 | :#define CREGS_FPRS_FEF 1 | |
62 | } | |
63 | ||
64 | if($misalgn_vld) { | |
65 | if($arch_diags::opt{enboff}) { | |
66 | :#define H_T0_Mem_Address_Not_Aligned_0x34 | |
67 | :#define My_T0_Mem_Address_Not_Aligned_0x34 done; | |
68 | } | |
69 | else { | |
70 | :#define H_HT0_Mem_Address_Not_Aligned_0x34 | |
71 | :#define My_HT0_Mem_Address_Not_Aligned_0x34 done; | |
72 | } | |
73 | } | |
74 | ||
75 | if($dmisalgn_vld) { | |
76 | if($arch_diags::opt{enboff}) { | |
77 | :#define H_T0_Lddf_Mem_Address_Not_Aligned_0x35 | |
78 | :#define My_T0_Lddf_Mem_Address_Not_Aligned_0x35 done; | |
79 | } | |
80 | else { | |
81 | :#define H_HT0_Lddf_Mem_Address_Not_Aligned_0x35 | |
82 | :#define My_HT0_Lddf_Mem_Address_Not_Aligned_0x35 done; | |
83 | } | |
84 | } | |
85 | ||
86 | if($privact_vld) { | |
87 | if($arch_diags::opt{enboff}) { | |
88 | :#define H_T0_Privileged_Action_0x37 | |
89 | :#define My_T0_Privileged_Action_0x37 done; | |
90 | } | |
91 | else { | |
92 | :#define H_HT0_Privileged_Action_0x37 | |
93 | :#define My_HT0_Privileged_Action_0x37 done; | |
94 | } | |
95 | } | |
96 | ||
97 | if($vawatch_vld) { | |
98 | :#define H_HT0_VA_Watchpoint_0x62 | |
99 | :#define My_H_HT0_VA_Watchpoint_0x62 done; | |
100 | } | |
101 | ||
102 | if($dataacc_vld) { | |
103 | if($arch_diags::opt{enboff}) { | |
104 | :#define H_T0_Data_Access_Exception_0x30 | |
105 | :#define My_T0_Data_Access_Exception_0x30 done; | |
106 | } | |
107 | else { | |
108 | :#define H_HT0_DAE_privilege_violation_0x15 | |
109 | :#define SUN_H_HT0_DAE_privilege_violation_0x15 done; | |
110 | :#define DMMU_SKIP_IF_NO_TTE | |
111 | :#define IMMU_SKIP_IF_NO_TTE | |
112 | } | |
113 | } | |
114 | ||
115 | if($arch_diags::opt{alldest}) { | |
116 | :#define DMMU_SKIP_IF_NO_TTE | |
117 | :#define IMMU_SKIP_IF_NO_TTE | |
118 | } | |
119 | ||
120 | ||
121 | # because setup code will be generated based on enabled trap | |
122 | if($arch_diags::opt{vawatch} || $arch_diags::opt{hyper}) { | |
123 | if($arch_diags::opt{enboff} == 0) { | |
124 | :#define MAIN_PAGE_HV_ALSO | |
125 | } | |
126 | } | |
127 | ||
128 | if($arch_diags::opt{enboff}) { | |
129 | :#define HPV_NONSPLIT_MODE | |
130 | } | |
131 | ||
132 | if($arch_diags::opt{cti_inst}) { | |
133 | :#define USER_PAGE_CUSTOM_MAP | |
134 | } | |
135 | ||
136 | if($arch_diags::opt{cti_inst}) { | |
137 | :#define USER_PAGE_CUSTOM_MAP | |
138 | } | |
139 | ||
140 | if($arch_diags::opt{inst} eq "tl1") { | |
141 | if(($arch_diags::opt{super} == 0) || ($arch_diags::opt{hyper} == 0 )) { | |
142 | :#define ENABLE_HT0_Privileged_Action_0x37 | |
143 | } | |
144 | :#define MAIN_PAGE_NUCLEUS_ALSO | |
145 | } | |
146 | ||
147 | if($arch_diags::opt{inst_group} eq "asi") { | |
148 | :#define JBI_CONFIG | |
149 | } | |
150 | ||
151 | if($arch_diags::opt{inst_group} eq "ldst") { | |
152 | if($arch_diags::opt{hyper}) { | |
153 | } | |
154 | else { | |
155 | :#define ENABLE_HT0_Mem_Address_Range_0x2e | |
156 | :#define ENABLE_HT0_Reserved_0x2d | |
157 | } | |
158 | } | |
159 | ||
160 | :#include "hboot.s" | |
161 | ||
162 | my @next_low_data_va = (); | |
163 | ||
164 | my @rand_data_va = (); | |
165 | my @next_rand_data_va = (); | |
166 | for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) { | |
167 | # @rand_data_va[$i] = 0x20088000 + ($i<<24); | |
168 | @rand_data_va[$i] = 0x60000000 + ($i<<18); | |
169 | @next_rand_data_va[$i] = @rand_data_va[$i]; | |
170 | } | |
171 | @next_low_data_va = (); | |
172 | ||
173 | if($arch_diags::opt{cti_inst}) { | |
174 | &arch_diags::gen_instr_sec(); | |
175 | } | |
176 | ||
177 | :.text | |
178 | :.global main | |
179 | :main: | |
180 | :th_fork(th_main) | |
181 | ||
182 | for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) { | |
183 | : th_main_$i: | |
184 | : setx th_main_jmp$i, %g1, %g2 | |
185 | : jmp %g2 | |
186 | : nop | |
187 | } | |
188 | ||
189 | for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) { | |
190 | : th_main_jmp$i: | |
191 | ||
192 | if($arch_diags::opt{inst} eq "tl1") { | |
193 | : ta T_CHANGE_TO_TL1 | |
194 | } | |
195 | ||
196 | if($arch_diags::opt{super}) { | |
197 | : ta T_CHANGE_PRIV | |
198 | } | |
199 | if($arch_diags::opt{hyper}) { | |
200 | : ta T_CHANGE_HPRIV | |
201 | } | |
202 | ||
203 | if($arch_diags::opt{mem_inst}) { | |
204 | my @misalgn_offsets = (0); | |
205 | if($arch_diags::opt{misalgn}) { | |
206 | if($arch_diags::opt{inst} eq "ld" || $arch_diags::opt{inst} eq "lda") { | |
207 | @misalgn_offsets = (1, 2, 3); | |
208 | } | |
209 | if($arch_diags::opt{inst} eq "ldd" || $arch_diags::opt{inst} eq "ldda") { | |
210 | @misalgn_offsets = (1, 2, 3, 5, 6, 7); | |
211 | } | |
212 | } | |
213 | if($arch_diags::opt{dmisalgn}) { | |
214 | @misalgn_offsets = (4); | |
215 | } | |
216 | ||
217 | foreach my $misalgn_offset (@misalgn_offsets) { | |
218 | &arch_diags::gen_all_ldf($arch_diags::opt{inst}, \@next_rand_data_va[$i], \@next_low_data_va, | |
219 | $arch_diags::opt{alldest}, $misalgn_offset, $arch_diags::opt{vawatch}, $arch_diags::opt{dataacc}); | |
220 | } | |
221 | } | |
222 | elsif($arch_diags::opt{cti_inst}) { | |
223 | if($arch_diags::opt{inst_group} eq "fbpfcc") { | |
224 | &arch_diags::gen_all_fbpfcc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group}); | |
225 | } | |
226 | if($arch_diags::opt{inst_group} eq "fbfcc") { | |
227 | &arch_diags::gen_all_fbfcc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group}); | |
228 | } | |
229 | if($arch_diags::opt{inst_group} eq "bicc") { | |
230 | &arch_diags::gen_all_bicc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group}); | |
231 | } | |
232 | if($arch_diags::opt{inst_group} eq "bpcc") { | |
233 | &arch_diags::gen_all_bpcc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group}); | |
234 | } | |
235 | } | |
236 | elsif($arch_diags::opt{inst_group} eq "asi") { | |
237 | &arch_diags::gen_all_asi_insts($i, $arch_diags::opt{inst}); | |
238 | } | |
239 | elsif($arch_diags::opt{inst_group} eq "ldst") { | |
240 | &arch_diags::gen_all_ldst_insts($i); | |
241 | } | |
242 | else { | |
243 | } | |
244 | ||
245 | : nop | |
246 | : ta T_GOOD_TRAP | |
247 | : nop | |
248 | } | |
249 | ||
250 | if($trap_on_inst_op == 0 || $tte_setup_required) { | |
251 | &arch_diags::gen_high_data_sec($arch_diags::opt{dataacc}, $arch_diags::opt{super}); | |
252 | &arch_diags::gen_data_sec(0x0, 8192, $arch_diags::opt{dataacc}, $arch_diags::opt{super}); | |
253 | ||
254 | for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) { | |
255 | &arch_diags::gen_data_sec(@rand_data_va[$i], @next_rand_data_va[$i], $arch_diags::opt{dataacc}, $arch_diags::opt{super}); | |
256 | } | |
257 | } | |
258 | else { | |
259 | &arch_diags::gen_data_sec(0x0, 0x10, $arch_diags::opt{dataacc}, $arch_diags::opt{super}); | |
260 | } | |
261 | ||
262 | &arch_diags::gen_scratch_mem_area(); | |
263 | &arch_diags::gen_required_data_sections(); | |
264 | ||
265 | &arch_diags::hyp_helper_apis(); | |
266 |