Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / lib / cpu / src / SS_AsiInfoTable.cc
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T2 Processor File: SS_AsiInfoTable.cc
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
//
// The above named program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// The above named program is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this work; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
// ========== Copyright Header End ============================================
#include "SS_AsiInfoTable.h"
SS_AsiInfoTable::SS_AsiInfoTable()
{
SS_AsiInfo::Flags n = SS_AsiInfo::NUCLEUS;
SS_AsiInfo::Flags p = SS_AsiInfo::PRIMARY;
SS_AsiInfo::Flags s = SS_AsiInfo::SECONDARY;
SS_AsiInfo::Flags r = SS_AsiInfo::REAL;
SS_AsiInfo::Flags b = SS_AsiInfo::BYPASS;
SS_AsiInfo::Flags l = SS_AsiInfo::LITTLE_ENDIAN;
SS_AsiInfo::Flags f = SS_AsiInfo::NOFAULT;
SS_AsiInfo::Flags a = SS_AsiInfo::AS_IF_USER;
SS_AsiInfo::Flags A = SS_AsiInfo::AS_IF_PRIV;
SS_AsiInfo::Flags h = SS_AsiInfo::HYPERPRIVILEGED;
SS_AsiInfo::Flags o = SS_AsiInfo::PRIVILEGED;
SS_AsiInfo::Flags ld = SS_AsiInfo::CLASS_LD;
SS_AsiInfo::Flags ldx = SS_AsiInfo::CLASS_LDX;
SS_AsiInfo::Flags st = SS_AsiInfo::CLASS_ST | SS_AsiInfo::CLASS_STF;
SS_AsiInfo::Flags stx = SS_AsiInfo::CLASS_STX;
SS_AsiInfo::Flags atom = SS_AsiInfo::CLASS_ATOMIC;
SS_AsiInfo::Flags pref = SS_AsiInfo::CLASS_PREFETCH;
SS_AsiInfo::Flags ql = SS_AsiInfo::QUAD_LOAD;
SS_AsiInfo::Flags bl = SS_AsiInfo::BLOCK_LOAD;
SS_AsiInfo::Flags bs = SS_AsiInfo::BLOCK_STORE;
SS_AsiInfo::Flags f8 = SS_AsiInfo::SHORTF_8;
SS_AsiInfo::Flags f16 = SS_AsiInfo::SHORTF_16;
SS_AsiInfo::Flags p8 = SS_AsiInfo::PARTIAL_8;
SS_AsiInfo::Flags p16 = SS_AsiInfo::PARTIAL_16;
SS_AsiInfo::Flags p32 = SS_AsiInfo::PARTIAL_32;
// First assume that all asi are non translating:
//
// 0x00 ... 0x2f - privileged access, only ldxa, stxa,
// 0x30 ... 0x7f - hyperprivileged access, only ldxa, stxa
// 0x80 ... 0xff - user access, only ldxa, stxa
//
// It's the task of the AsiDispatcher to figure out if a certain asi contains
// valid registers or not.
uint_t asi=0;
for (; asi < 0x30; asi++)
asi_info[asi].set_flags(o|ldx|stx);
for (; asi < 0x80; asi++)
asi_info[asi].set_flags(h|ldx|stx);
for (; asi < SUN_SPARC_MAX_ASI; asi++)
asi_info[asi].set_flags(ldx|stx);
// All the translating asi defined by the SunSparc spec v2 now
// overwrite the above set default
asi_info[SS_Asi::ASI_NUCLEUS ].set_flags(n|b| o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_NUCLEUS_LITTLE ].set_flags(n|b|l| o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_USER_PRIMARY ].set_flags(p| a|o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_USER_PRIMARY_LITTLE ].set_flags(p| l|a|o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_USER_SECONDARY ].set_flags(s| a|o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_USER_SECONDARY_LITTLE ].set_flags(s| l|a|o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_REAL_MEM ].set_flags(r| o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_REAL_MEM_LITTLE ].set_flags(r| l| o|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_REAL_IO ].set_flags(r| o|ld|ldx|st|stx);
asi_info[SS_Asi::ASI_REAL_IO_LITTLE ].set_flags(r| l| o|ld|ldx|st|stx);
asi_info[SS_Asi::ASI_AS_IF_PRIV_NUCLEUS ].set_flags(n| A|h|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_PRIV_NUCLEUS_LITTLE ].set_flags(n| l|A|h|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_PRIV_PRIMARY ].set_flags(p| A|h|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_PRIV_PRIMARY_LITTLE ].set_flags(p| l|A|h|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_PRIV_SECONDARY ].set_flags(s| A|h|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_AS_IF_PRIV_SECONDARY_LITTLE ].set_flags(s| l|A|h|ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_PRIMARY ].set_flags(p|b| ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_PRIMARY_LITTLE ].set_flags(p|b|l| ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_SECONDARY ].set_flags(s|b| ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_SECONDARY_LITTLE ].set_flags(s|b|l| ld|ldx|st|stx|atom|pref);
asi_info[SS_Asi::ASI_PRIMARY_NO_FAULT ].set_flags(p|b| f| ld|ldx| pref);
asi_info[SS_Asi::ASI_PRIMARY_NO_FAULT_LITTLE ].set_flags(p|b|l|f| ld|ldx| pref);
asi_info[SS_Asi::ASI_SECONDARY_NO_FAULT ].set_flags(s|b| f| ld|ldx| pref);
asi_info[SS_Asi::ASI_SECONDARY_NO_FAULT_LITTLE ].set_flags(s|b|l|f| ld|ldx| pref);
// only valid with ldda
asi_info[SS_Asi::ASI_QUAD_LDD ].set_flags(n|b| o| ql);
asi_info[SS_Asi::ASI_QUAD_LDD_LITTLE ].set_flags(n|b|l| o| ql);
asi_info[SS_Asi::ASI_QUAD_LDD_REAL ].set_flags(r| o| ql);
asi_info[SS_Asi::ASI_QUAD_LDD_REAL_LITTLE ].set_flags(r| l| o| ql);
// only valid with stdfa
asi_info[SS_Asi::ASI_PST8_PRIMARY ].set_flags(p|b| p8);
asi_info[SS_Asi::ASI_PST8_PRIMARY_LITTLE ].set_flags(p|b|l| p8);
asi_info[SS_Asi::ASI_PST8_SECONDARY ].set_flags(s|b| p8);
asi_info[SS_Asi::ASI_PST8_SECONDARY_LITTLE ].set_flags(s|b|l| p8);
asi_info[SS_Asi::ASI_PST16_PRIMARY ].set_flags(p|b| p16);
asi_info[SS_Asi::ASI_PST16_PRIMARY_LITTLE ].set_flags(p|b|l| p16);
asi_info[SS_Asi::ASI_PST16_SECONDARY ].set_flags(s|b| p16);
asi_info[SS_Asi::ASI_PST16_SECONDARY_LITTLE ].set_flags(s|b|l| p16);
asi_info[SS_Asi::ASI_PST32_PRIMARY ].set_flags(p|b| p32);
asi_info[SS_Asi::ASI_PST32_PRIMARY_LITTLE ].set_flags(p|b|l| p32);
asi_info[SS_Asi::ASI_PST32_SECONDARY ].set_flags(s|b| p32);
asi_info[SS_Asi::ASI_PST32_SECONDARY_LITTLE ].set_flags(s|b|l| p32);
// only valid with lddfa and stdfa
asi_info[SS_Asi::ASI_FL8_PRIMARY ].set_flags(p|b| f8);
asi_info[SS_Asi::ASI_FL8_PRIMARY_LITTLE ].set_flags(p|b|l| f8);
asi_info[SS_Asi::ASI_FL8_SECONDARY ].set_flags(s|b| f8);
asi_info[SS_Asi::ASI_FL8_SECONDARY_LITTLE ].set_flags(s|b|l| f8);
asi_info[SS_Asi::ASI_FL16_PRIMARY ].set_flags(p|b| f16);
asi_info[SS_Asi::ASI_FL16_PRIMARY_LITTLE ].set_flags(p|b|l| f16);
asi_info[SS_Asi::ASI_FL16_SECONDARY ].set_flags(s|b| f16);
asi_info[SS_Asi::ASI_FL16_SECONDARY_LITTLE ].set_flags(s|b|l| f16);
// only valid with lddfa (bl) and stdfa (bs)
asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_PRIMARY ].set_flags(p| a|o|bl|bs);
asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE ].set_flags(p| l|a|o|bl|bs);
asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_SECONDARY ].set_flags(s| a|o|bl|bs);
asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE].set_flags(s| l|a|o|bl|bs);
asi_info[SS_Asi::ASI_BLOCK_COMMIT_PRIMARY ].set_flags(p|b| bs);
asi_info[SS_Asi::ASI_BLOCK_COMMIT_SECONDARY ].set_flags(s|b| bs);
asi_info[SS_Asi::ASI_BLOCK_PRIMARY ].set_flags(p|b| bl|bs);
asi_info[SS_Asi::ASI_BLOCK_PRIMARY_LITTLE ].set_flags(p|b|l| bl|bs);
asi_info[SS_Asi::ASI_BLOCK_SECONDARY ].set_flags(s|b| bl|bs);
asi_info[SS_Asi::ASI_BLOCK_SECONDARY_LITTLE ].set_flags(s|b|l| bl|bs);
}