Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / diag / assembly / arch / prm / common / ldf_alldest.pal
BEGIN { push @INC, "$ENV{DV_ROOT}/verif/diag/assembly/arch/prm/common"; }
use strict;
use arch_diags;
&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;
}
else {
:#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($illinst_vld) {
if($arch_diags::opt{enboff}) {
:#define H_T0_Illegal_instruction_0x10
:#define My_T0_Illegal_instruction_0x10 done;
}
else {
:#define H_HT0_Illegal_instruction_0x10
:#define My_HT0_Illegal_instruction_0x10 done;
}
}
if($fpdis_vld) {
:#define CREGS_FPRS_FEF 0
if($arch_diags::opt{hyper}) {
:#define H_HT0_Fp_disabled_0x20
:#define My_HT0_Fp_disabled_0x20 done;
}
else {
:#define H_T0_Fp_disabled_0x20
:#define My_T0_Fp_disabled_0x20 done;
}
}
else {
:#define CREGS_FPRS_FEF 1
}
if($misalgn_vld) {
if($arch_diags::opt{enboff}) {
:#define H_T0_Mem_Address_Not_Aligned_0x34
:#define My_T0_Mem_Address_Not_Aligned_0x34 done;
}
else {
:#define H_HT0_Mem_Address_Not_Aligned_0x34
:#define My_HT0_Mem_Address_Not_Aligned_0x34 done;
}
}
if($dmisalgn_vld) {
if($arch_diags::opt{enboff}) {
:#define H_T0_Lddf_Mem_Address_Not_Aligned_0x35
:#define My_T0_Lddf_Mem_Address_Not_Aligned_0x35 done;
}
else {
:#define H_HT0_Lddf_Mem_Address_Not_Aligned_0x35
:#define My_HT0_Lddf_Mem_Address_Not_Aligned_0x35 done;
}
}
if($privact_vld) {
if($arch_diags::opt{enboff}) {
:#define H_T0_Privileged_Action_0x37
:#define My_T0_Privileged_Action_0x37 done;
}
else {
:#define H_HT0_Privileged_Action_0x37
:#define My_HT0_Privileged_Action_0x37 done;
}
}
if($vawatch_vld) {
:#define H_HT0_VA_Watchpoint_0x62
:#define My_H_HT0_VA_Watchpoint_0x62 done;
}
if($dataacc_vld) {
if($arch_diags::opt{enboff}) {
:#define H_T0_Data_Access_Exception_0x30
:#define My_T0_Data_Access_Exception_0x30 done;
}
else {
:#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") {
:#define JBI_CONFIG
}
if($arch_diags::opt{inst_group} eq "ldst") {
if($arch_diags::opt{hyper}) {
}
else {
:#define ENABLE_HT0_Mem_Address_Range_0x2e
:#define ENABLE_HT0_Reserved_0x2d
}
}
:#include "hboot.s"
my @next_low_data_va = ();
my @rand_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];
}
@next_low_data_va = ();
if($arch_diags::opt{cti_inst}) {
&arch_diags::gen_instr_sec();
}
:.text
:.global main
:main:
:th_fork(th_main)
for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) {
: th_main_$i:
: setx th_main_jmp$i, %g1, %g2
: jmp %g2
: nop
}
for(my $i=0; $i<$arch_diags::opt{thrd_count}; $i++) {
: th_main_jmp$i:
if($arch_diags::opt{inst} eq "tl1") {
: ta T_CHANGE_TO_TL1
}
if($arch_diags::opt{super}) {
: ta T_CHANGE_PRIV
}
if($arch_diags::opt{hyper}) {
: ta T_CHANGE_HPRIV
}
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}) {
@misalgn_offsets = (4);
}
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);
}
else {
}
: nop
: ta T_GOOD_TRAP
: nop
}
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});
}
}
else {
&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();