BEGIN { push @INC, "$ENV{DV_ROOT}/verif/diag/assembly/arch/prm/common"; }
&arch_diags::setup_diag_options();
:#define THREAD_COUNT $arch_diags::opt{thrd_count}
:#define THREAD_STRIDE $arch_diags::opt{thrd_stride}
if($arch_diags::opt{hyper}) {
:#define H_HT0_Trap_Instruction_2
:#define My_HT0_Trap_Instruction_2 setx hyp_api, %g1, %g2; jmpl %g2, %g0; nop;
elsif ($arch_diags::opt{enboff}) {
:#define H_T0_Trap_Instruction_2
:#define My_T0_Trap_Instruction_2 setx hyp_api, %g1, %g2; jmpl %g2, %g0; nop;
:#define H_HT0_HTrap_Instruction_0
:#define My_HT0_HTrap_Instruction_0 setx hyp_api, %g1, %g2; jmpl %g2, %g0; nop;
# illinst, fpdis, misalgn, dmisalgn, pirvact, vawatch, dataacc(T)
# 7, 8, 10, 10, 11, 11, 12
my $illinst_vld = $arch_diags::opt{illinst};
my $fpdis_vld = $arch_diags::opt{fpdis} && ($illinst_vld == 0);
my $misalgn_vld = $arch_diags::opt{misalgn} && ($illinst_vld == 0) && ($fpdis_vld == 0);
my $dmisalgn_vld = $arch_diags::opt{dmisalgn} && ($illinst_vld == 0) && ($fpdis_vld == 0) && ($misalgn_vld == 0);
my $privact_vld = $arch_diags::opt{privact} && ($illinst_vld == 0) && ($fpdis_vld == 0) && ($misalgn_vld == 0) && ($dmisalgn_vld == 0);
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);
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);
my $trap_on_inst_op = $illinst_vld || $fpdis_vld || $misalgn_vld || $dmisalgn_vld || $privact_vld || $vawatch_vld;
my $tte_setup_required = $arch_diags::opt{dataacc};
if($arch_diags::opt{enboff}) {
:#define H_T0_Illegal_instruction_0x10
:#define My_T0_Illegal_instruction_0x10 done;
:#define H_HT0_Illegal_instruction_0x10
:#define My_HT0_Illegal_instruction_0x10 done;
:#define CREGS_FPRS_FEF 0
if($arch_diags::opt{hyper}) {
:#define H_HT0_Fp_disabled_0x20
:#define My_HT0_Fp_disabled_0x20 done;
:#define H_T0_Fp_disabled_0x20
:#define My_T0_Fp_disabled_0x20 done;
:#define CREGS_FPRS_FEF 1
if($arch_diags::opt{enboff}) {
:#define H_T0_Mem_Address_Not_Aligned_0x34
:#define My_T0_Mem_Address_Not_Aligned_0x34 done;
:#define H_HT0_Mem_Address_Not_Aligned_0x34
:#define My_HT0_Mem_Address_Not_Aligned_0x34 done;
if($arch_diags::opt{enboff}) {
:#define H_T0_Lddf_Mem_Address_Not_Aligned_0x35
:#define My_T0_Lddf_Mem_Address_Not_Aligned_0x35 done;
:#define H_HT0_Lddf_Mem_Address_Not_Aligned_0x35
:#define My_HT0_Lddf_Mem_Address_Not_Aligned_0x35 done;
if($arch_diags::opt{enboff}) {
:#define H_T0_Privileged_Action_0x37
:#define My_T0_Privileged_Action_0x37 done;
:#define H_HT0_Privileged_Action_0x37
:#define My_HT0_Privileged_Action_0x37 done;
:#define H_HT0_VA_Watchpoint_0x62
:#define My_H_HT0_VA_Watchpoint_0x62 done;
if($arch_diags::opt{enboff}) {
:#define H_T0_Data_Access_Exception_0x30
:#define My_T0_Data_Access_Exception_0x30 done;
:#define H_HT0_DAE_privilege_violation_0x15
:#define SUN_H_HT0_DAE_privilege_violation_0x15 done;
:#define DMMU_SKIP_IF_NO_TTE
:#define IMMU_SKIP_IF_NO_TTE
if($arch_diags::opt{alldest}) {
:#define DMMU_SKIP_IF_NO_TTE
:#define IMMU_SKIP_IF_NO_TTE
# because setup code will be generated based on enabled trap
if($arch_diags::opt{vawatch} || $arch_diags::opt{hyper}) {
if($arch_diags::opt{enboff} == 0) {
:#define MAIN_PAGE_HV_ALSO
if($arch_diags::opt{enboff}) {
:#define HPV_NONSPLIT_MODE
if($arch_diags::opt{cti_inst}) {
:#define USER_PAGE_CUSTOM_MAP
if($arch_diags::opt{cti_inst}) {
:#define USER_PAGE_CUSTOM_MAP
if($arch_diags::opt{inst} eq "tl1") {
if(($arch_diags::opt{super} == 0) || ($arch_diags::opt{hyper} == 0 )) {
:#define ENABLE_HT0_Privileged_Action_0x37
:#define MAIN_PAGE_NUCLEUS_ALSO
if($arch_diags::opt{inst_group} eq "asi") {
if($arch_diags::opt{inst_group} eq "ldst") {
if($arch_diags::opt{hyper}) {
:#define ENABLE_HT0_Mem_Address_Range_0x2e
:#define ENABLE_HT0_Reserved_0x2d
my @next_low_data_va = ();
my @next_rand_data_va = ();
for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) {
# @rand_data_va[$i] = 0x20088000 + ($i<<24);
@rand_data_va[$i] = 0x60000000 + ($i<<18);
@next_rand_data_va[$i] = @rand_data_va[$i];
if($arch_diags::opt{cti_inst}) {
&arch_diags::gen_instr_sec();
for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) {
: setx th_main_jmp$i, %g1, %g2
for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) {
if($arch_diags::opt{inst} eq "tl1") {
if($arch_diags::opt{super}) {
if($arch_diags::opt{hyper}) {
if($arch_diags::opt{mem_inst}) {
my @misalgn_offsets = (0);
if($arch_diags::opt{misalgn}) {
if($arch_diags::opt{inst} eq "ld" || $arch_diags::opt{inst} eq "lda") {
@misalgn_offsets = (1, 2, 3);
if($arch_diags::opt{inst} eq "ldd" || $arch_diags::opt{inst} eq "ldda") {
@misalgn_offsets = (1, 2, 3, 5, 6, 7);
if($arch_diags::opt{dmisalgn}) {
foreach my $misalgn_offset (@misalgn_offsets) {
&arch_diags::gen_all_ldf($arch_diags::opt{inst}, \@next_rand_data_va[$i], \@next_low_data_va,
$arch_diags::opt{alldest}, $misalgn_offset, $arch_diags::opt{vawatch}, $arch_diags::opt{dataacc});
elsif($arch_diags::opt{cti_inst}) {
if($arch_diags::opt{inst_group} eq "fbpfcc") {
&arch_diags::gen_all_fbpfcc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group});
if($arch_diags::opt{inst_group} eq "fbfcc") {
&arch_diags::gen_all_fbfcc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group});
if($arch_diags::opt{inst_group} eq "bicc") {
&arch_diags::gen_all_bicc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group});
if($arch_diags::opt{inst_group} eq "bpcc") {
&arch_diags::gen_all_bpcc($i, $arch_diags::opt{inst}, $arch_diags::opt{inst_group});
elsif($arch_diags::opt{inst_group} eq "asi") {
&arch_diags::gen_all_asi_insts($i, $arch_diags::opt{inst});
elsif($arch_diags::opt{inst_group} eq "ldst") {
&arch_diags::gen_all_ldst_insts($i);
if($trap_on_inst_op == 0 || $tte_setup_required) {
&arch_diags::gen_high_data_sec($arch_diags::opt{dataacc}, $arch_diags::opt{super});
&arch_diags::gen_data_sec(0x0, 8192, $arch_diags::opt{dataacc}, $arch_diags::opt{super});
for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) {
&arch_diags::gen_data_sec(@rand_data_va[$i], @next_rand_data_va[$i], $arch_diags::opt{dataacc}, $arch_diags::opt{super});
&arch_diags::gen_data_sec(0x0, 0x10, $arch_diags::opt{dataacc}, $arch_diags::opt{super});
&arch_diags::gen_scratch_mem_area();
&arch_diags::gen_required_data_sections();
&arch_diags::hyp_helper_apis();