Commit | Line | Data |
---|---|---|
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 | ||
24 | SS_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 |