// ========== 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.
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
);
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
);
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
);