Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / lib / cpu / src / SS_AsiInfoTable.cc
CommitLineData
920dae64
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: SS_AsiInfoTable.cc
4// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
5// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
6//
7// The above named program is free software; you can redistribute it and/or
8// modify it under the terms of the GNU General Public
9// License version 2 as published by the Free Software Foundation.
10//
11// The above named program is distributed in the hope that it will be
12// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14// General Public License for more details.
15//
16// You should have received a copy of the GNU General Public
17// License along with this work; if not, write to the Free Software
18// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19//
20// ========== Copyright Header End ============================================
21#include "SS_AsiInfoTable.h"
22
23
24SS_AsiInfoTable::SS_AsiInfoTable()
25{
26 SS_AsiInfo::Flags n = SS_AsiInfo::NUCLEUS;
27 SS_AsiInfo::Flags p = SS_AsiInfo::PRIMARY;
28 SS_AsiInfo::Flags s = SS_AsiInfo::SECONDARY;
29 SS_AsiInfo::Flags r = SS_AsiInfo::REAL;
30 SS_AsiInfo::Flags b = SS_AsiInfo::BYPASS;
31 SS_AsiInfo::Flags l = SS_AsiInfo::LITTLE_ENDIAN;
32 SS_AsiInfo::Flags f = SS_AsiInfo::NOFAULT;
33 SS_AsiInfo::Flags a = SS_AsiInfo::AS_IF_USER;
34 SS_AsiInfo::Flags A = SS_AsiInfo::AS_IF_PRIV;
35
36 SS_AsiInfo::Flags h = SS_AsiInfo::HYPERPRIVILEGED;
37 SS_AsiInfo::Flags o = SS_AsiInfo::PRIVILEGED;
38
39 SS_AsiInfo::Flags ld = SS_AsiInfo::CLASS_LD;
40 SS_AsiInfo::Flags ldx = SS_AsiInfo::CLASS_LDX;
41 SS_AsiInfo::Flags st = SS_AsiInfo::CLASS_ST | SS_AsiInfo::CLASS_STF;
42 SS_AsiInfo::Flags stx = SS_AsiInfo::CLASS_STX;
43 SS_AsiInfo::Flags atom = SS_AsiInfo::CLASS_ATOMIC;
44 SS_AsiInfo::Flags pref = SS_AsiInfo::CLASS_PREFETCH;
45
46 SS_AsiInfo::Flags ql = SS_AsiInfo::QUAD_LOAD;
47 SS_AsiInfo::Flags bl = SS_AsiInfo::BLOCK_LOAD;
48 SS_AsiInfo::Flags bs = SS_AsiInfo::BLOCK_STORE;
49 SS_AsiInfo::Flags f8 = SS_AsiInfo::SHORTF_8;
50 SS_AsiInfo::Flags f16 = SS_AsiInfo::SHORTF_16;
51 SS_AsiInfo::Flags p8 = SS_AsiInfo::PARTIAL_8;
52 SS_AsiInfo::Flags p16 = SS_AsiInfo::PARTIAL_16;
53 SS_AsiInfo::Flags p32 = SS_AsiInfo::PARTIAL_32;
54
55 // First assume that all asi are non translating:
56 //
57 // 0x00 ... 0x2f - privileged access, only ldxa, stxa,
58 // 0x30 ... 0x7f - hyperprivileged access, only ldxa, stxa
59 // 0x80 ... 0xff - user access, only ldxa, stxa
60 //
61 // It's the task of the AsiDispatcher to figure out if a certain asi contains
62 // valid registers or not.
63
64 uint_t asi=0;
65 for (; asi < 0x30; asi++)
66 asi_info[asi].set_flags(o|ldx|stx);
67 for (; asi < 0x80; asi++)
68 asi_info[asi].set_flags(h|ldx|stx);
69 for (; asi < SUN_SPARC_MAX_ASI; asi++)
70 asi_info[asi].set_flags(ldx|stx);
71
72 // All the translating asi defined by the SunSparc spec v2 now
73 // overwrite the above set default
74
75 asi_info[SS_Asi::ASI_NUCLEUS ].set_flags(n|b| o|ld|ldx|st|stx|atom|pref);
76 asi_info[SS_Asi::ASI_NUCLEUS_LITTLE ].set_flags(n|b|l| o|ld|ldx|st|stx|atom|pref);
77 asi_info[SS_Asi::ASI_AS_IF_USER_PRIMARY ].set_flags(p| a|o|ld|ldx|st|stx|atom|pref);
78 asi_info[SS_Asi::ASI_AS_IF_USER_PRIMARY_LITTLE ].set_flags(p| l|a|o|ld|ldx|st|stx|atom|pref);
79 asi_info[SS_Asi::ASI_AS_IF_USER_SECONDARY ].set_flags(s| a|o|ld|ldx|st|stx|atom|pref);
80 asi_info[SS_Asi::ASI_AS_IF_USER_SECONDARY_LITTLE ].set_flags(s| l|a|o|ld|ldx|st|stx|atom|pref);
81 asi_info[SS_Asi::ASI_REAL_MEM ].set_flags(r| o|ld|ldx|st|stx|atom|pref);
82 asi_info[SS_Asi::ASI_REAL_MEM_LITTLE ].set_flags(r| l| o|ld|ldx|st|stx|atom|pref);
83 asi_info[SS_Asi::ASI_REAL_IO ].set_flags(r| o|ld|ldx|st|stx);
84 asi_info[SS_Asi::ASI_REAL_IO_LITTLE ].set_flags(r| l| o|ld|ldx|st|stx);
85 asi_info[SS_Asi::ASI_AS_IF_PRIV_NUCLEUS ].set_flags(n| A|h|ld|ldx|st|stx|atom|pref);
86 asi_info[SS_Asi::ASI_AS_IF_PRIV_NUCLEUS_LITTLE ].set_flags(n| l|A|h|ld|ldx|st|stx|atom|pref);
87 asi_info[SS_Asi::ASI_AS_IF_PRIV_PRIMARY ].set_flags(p| A|h|ld|ldx|st|stx|atom|pref);
88 asi_info[SS_Asi::ASI_AS_IF_PRIV_PRIMARY_LITTLE ].set_flags(p| l|A|h|ld|ldx|st|stx|atom|pref);
89 asi_info[SS_Asi::ASI_AS_IF_PRIV_SECONDARY ].set_flags(s| A|h|ld|ldx|st|stx|atom|pref);
90 asi_info[SS_Asi::ASI_AS_IF_PRIV_SECONDARY_LITTLE ].set_flags(s| l|A|h|ld|ldx|st|stx|atom|pref);
91 asi_info[SS_Asi::ASI_PRIMARY ].set_flags(p|b| ld|ldx|st|stx|atom|pref);
92 asi_info[SS_Asi::ASI_PRIMARY_LITTLE ].set_flags(p|b|l| ld|ldx|st|stx|atom|pref);
93 asi_info[SS_Asi::ASI_SECONDARY ].set_flags(s|b| ld|ldx|st|stx|atom|pref);
94 asi_info[SS_Asi::ASI_SECONDARY_LITTLE ].set_flags(s|b|l| ld|ldx|st|stx|atom|pref);
95 asi_info[SS_Asi::ASI_PRIMARY_NO_FAULT ].set_flags(p|b| f| ld|ldx| pref);
96 asi_info[SS_Asi::ASI_PRIMARY_NO_FAULT_LITTLE ].set_flags(p|b|l|f| ld|ldx| pref);
97 asi_info[SS_Asi::ASI_SECONDARY_NO_FAULT ].set_flags(s|b| f| ld|ldx| pref);
98 asi_info[SS_Asi::ASI_SECONDARY_NO_FAULT_LITTLE ].set_flags(s|b|l|f| ld|ldx| pref);
99
100 // only valid with ldda
101 asi_info[SS_Asi::ASI_QUAD_LDD ].set_flags(n|b| o| ql);
102 asi_info[SS_Asi::ASI_QUAD_LDD_LITTLE ].set_flags(n|b|l| o| ql);
103 asi_info[SS_Asi::ASI_QUAD_LDD_REAL ].set_flags(r| o| ql);
104 asi_info[SS_Asi::ASI_QUAD_LDD_REAL_LITTLE ].set_flags(r| l| o| ql);
105
106 // only valid with stdfa
107 asi_info[SS_Asi::ASI_PST8_PRIMARY ].set_flags(p|b| p8);
108 asi_info[SS_Asi::ASI_PST8_PRIMARY_LITTLE ].set_flags(p|b|l| p8);
109 asi_info[SS_Asi::ASI_PST8_SECONDARY ].set_flags(s|b| p8);
110 asi_info[SS_Asi::ASI_PST8_SECONDARY_LITTLE ].set_flags(s|b|l| p8);
111 asi_info[SS_Asi::ASI_PST16_PRIMARY ].set_flags(p|b| p16);
112 asi_info[SS_Asi::ASI_PST16_PRIMARY_LITTLE ].set_flags(p|b|l| p16);
113 asi_info[SS_Asi::ASI_PST16_SECONDARY ].set_flags(s|b| p16);
114 asi_info[SS_Asi::ASI_PST16_SECONDARY_LITTLE ].set_flags(s|b|l| p16);
115 asi_info[SS_Asi::ASI_PST32_PRIMARY ].set_flags(p|b| p32);
116 asi_info[SS_Asi::ASI_PST32_PRIMARY_LITTLE ].set_flags(p|b|l| p32);
117 asi_info[SS_Asi::ASI_PST32_SECONDARY ].set_flags(s|b| p32);
118 asi_info[SS_Asi::ASI_PST32_SECONDARY_LITTLE ].set_flags(s|b|l| p32);
119
120 // only valid with lddfa and stdfa
121 asi_info[SS_Asi::ASI_FL8_PRIMARY ].set_flags(p|b| f8);
122 asi_info[SS_Asi::ASI_FL8_PRIMARY_LITTLE ].set_flags(p|b|l| f8);
123 asi_info[SS_Asi::ASI_FL8_SECONDARY ].set_flags(s|b| f8);
124 asi_info[SS_Asi::ASI_FL8_SECONDARY_LITTLE ].set_flags(s|b|l| f8);
125 asi_info[SS_Asi::ASI_FL16_PRIMARY ].set_flags(p|b| f16);
126 asi_info[SS_Asi::ASI_FL16_PRIMARY_LITTLE ].set_flags(p|b|l| f16);
127 asi_info[SS_Asi::ASI_FL16_SECONDARY ].set_flags(s|b| f16);
128 asi_info[SS_Asi::ASI_FL16_SECONDARY_LITTLE ].set_flags(s|b|l| f16);
129
130 // only valid with lddfa (bl) and stdfa (bs)
131 asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_PRIMARY ].set_flags(p| a|o|bl|bs);
132 asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE ].set_flags(p| l|a|o|bl|bs);
133 asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_SECONDARY ].set_flags(s| a|o|bl|bs);
134 asi_info[SS_Asi::ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE].set_flags(s| l|a|o|bl|bs);
135 asi_info[SS_Asi::ASI_BLOCK_COMMIT_PRIMARY ].set_flags(p|b| bs);
136 asi_info[SS_Asi::ASI_BLOCK_COMMIT_SECONDARY ].set_flags(s|b| bs);
137 asi_info[SS_Asi::ASI_BLOCK_PRIMARY ].set_flags(p|b| bl|bs);
138 asi_info[SS_Asi::ASI_BLOCK_PRIMARY_LITTLE ].set_flags(p|b|l| bl|bs);
139 asi_info[SS_Asi::ASI_BLOCK_SECONDARY ].set_flags(s|b| bl|bs);
140 asi_info[SS_Asi::ASI_BLOCK_SECONDARY_LITTLE ].set_flags(s|b|l| bl|bs);
141}
142
143