Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / api / rtl / src / SS_ExternalMemory.cc
CommitLineData
920dae64
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: SS_ExternalMemory.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
22#include "SS_ExternalMemory.h"
23
24SS_ExternalMemory SS_ExternalMemory::memory;
25
26uint32_t SS_ExternalMemory::fetch32 ( uint64_t addr )/*{{{*/
27{
28 int sid_local = sid;
29 uint64_t data;
30 uint_t n = 4 - (addr & 4);
31 (ld_callback)(sid_local,addr &~ 7,CODEFETCH,0xf << n,&data);
32 return data >> (n * 8);
33}
34/*}}}*/
35void SS_ExternalMemory::fetch256( uint64_t addr, uint64_t data[4] )/*{{{*/
36{
37 // in a multi-thread environment, SS_ExternalMemory::sid can be changed
38 // by a different thread while this thread is in the middle of ld/st
39 // operation, that may cause ld_callback() to have different sid value, so
40 // store the value in a local variable at the beginning to guarantee all
41 // ld/st calls within this function have the same sid.
42 int sid_local = sid;
43 (ld_callback)(sid_local,addr ,CODEFETCH,0xff,&data[0]);
44 (ld_callback)(sid_local,addr + 8,CODEFETCH,0xff,&data[1]);
45 (ld_callback)(sid_local,addr + 16,CODEFETCH,0xff,&data[2]);
46 (ld_callback)(sid_local,addr + 24,CODEFETCH,0xff,&data[3]);
47}
48/*}}}*/
49void SS_ExternalMemory::fetch512( uint64_t addr, uint64_t data[8] )/*{{{*/
50{
51 int sid_local = sid;
52 (ld_callback)(sid_local,addr ,CODEFETCH,0xff,&data[0]);
53 (ld_callback)(sid_local,addr + 8,CODEFETCH,0xff,&data[1]);
54 (ld_callback)(sid_local,addr + 16,CODEFETCH,0xff,&data[2]);
55 (ld_callback)(sid_local,addr + 24,CODEFETCH,0xff,&data[3]);
56 (ld_callback)(sid_local,addr + 32,CODEFETCH,0xff,&data[4]);
57 (ld_callback)(sid_local,addr + 40,CODEFETCH,0xff,&data[5]);
58 (ld_callback)(sid_local,addr + 48,CODEFETCH,0xff,&data[6]);
59 (ld_callback)(sid_local,addr + 56,CODEFETCH,0xff,&data[7]);
60}
61/*}}}*/
62
63uint8_t SS_ExternalMemory::ld8u ( uint64_t addr )/*{{{*/
64{
65 int sid_local = sid;
66 uint64_t data;
67 uint_t n = 7 - (addr & 7);
68 (ld_callback)(sid_local,addr &~ 7,NORMAL,0x1 << n,&data);
69 return data >> (n * 8);
70}
71/*}}}*/
72int8_t SS_ExternalMemory::ld8s ( uint64_t addr )/*{{{*/
73{
74 int sid_local = sid;
75 uint64_t data;
76 uint_t n = 7 - (addr & 7);
77 (ld_callback)(sid_local,addr &~ 7,NORMAL,0x1 << n,&data);
78 return data >> (n * 8);
79}
80/*}}}*/
81uint16_t SS_ExternalMemory::ld16u( uint64_t addr )/*{{{*/
82{
83 int sid_local = sid;
84 uint64_t data;
85 uint_t n = 6 - (addr & 6);
86 (ld_callback)(sid_local,addr &~ 7,NORMAL,0x3 << n,&data);
87 return data >> (n * 8);
88}
89/*}}}*/
90int16_t SS_ExternalMemory::ld16s( uint64_t addr )/*{{{*/
91{
92 int sid_local = sid;
93 uint64_t data;
94 uint_t n = 6 - (addr & 6);
95 (ld_callback)(sid_local,addr &~ 7,NORMAL,0x3 << n,&data);
96 return data >> (n * 8);
97}
98/*}}}*/
99uint32_t SS_ExternalMemory::ld32u( uint64_t addr )/*{{{*/
100{
101 int sid_local = sid;
102 uint64_t data;
103 uint_t n = 4 - (addr & 4);
104 (ld_callback)(sid_local,addr &~ 7,NORMAL,0xf << n,&data);
105 return data >> (n * 8);
106}
107/*}}}*/
108int32_t SS_ExternalMemory::ld32s( uint64_t addr )/*{{{*/
109{
110 int sid_local = sid;
111 uint64_t data;
112 uint_t n = 4 - (addr & 4);
113 (ld_callback)(sid_local,addr &~ 7,NORMAL,0xf << n,&data);
114 return data >> (n * 8);
115}
116/*}}}*/
117uint64_t SS_ExternalMemory::ld64 ( uint64_t addr )/*{{{*/
118{
119 int sid_local = sid;
120 uint64_t data;
121 (ld_callback)(sid_local,addr,NORMAL,0xff,&data);
122 return data;
123}
124/*}}}*/
125void SS_ExternalMemory::ld128( uint64_t addr, uint64_t data[2] )/*{{{*/
126{
127 int sid_local = sid;
128 (ld_callback)(sid_local,addr ,NORMAL,0xff,&data[0]);
129 (ld_callback)(sid_local,addr + 8,NORMAL,0xff,&data[1]);
130}
131/*}}}*/
132void SS_ExternalMemory::ld256( uint64_t addr, uint64_t data[4] )/*{{{*/
133{
134 int sid_local = sid;
135 (ld_callback)(sid_local,addr ,NORMAL,0xff,&data[0]);
136 (ld_callback)(sid_local,addr + 8,NORMAL,0xff,&data[1]);
137 (ld_callback)(sid_local,addr + 16,NORMAL,0xff,&data[2]);
138 (ld_callback)(sid_local,addr + 24,NORMAL,0xff,&data[3]);
139}
140/*}}}*/
141void SS_ExternalMemory::ld512( uint64_t addr, uint64_t data[8] )/*{{{*/
142{
143 int sid_local = sid;
144 (ld_callback)(sid_local,addr ,NORMAL,0xff,&data[0]);
145 (ld_callback)(sid_local,addr + 8,NORMAL,0xff,&data[1]);
146 (ld_callback)(sid_local,addr + 16,NORMAL,0xff,&data[2]);
147 (ld_callback)(sid_local,addr + 24,NORMAL,0xff,&data[3]);
148 (ld_callback)(sid_local,addr + 32,NORMAL,0xff,&data[4]);
149 (ld_callback)(sid_local,addr + 40,NORMAL,0xff,&data[5]);
150 (ld_callback)(sid_local,addr + 48,NORMAL,0xff,&data[6]);
151 (ld_callback)(sid_local,addr + 56,NORMAL,0xff,&data[7]);
152}
153/*}}}*/
154void SS_ExternalMemory::st8( uint64_t addr, uint8_t data )/*{{{*/
155{
156 int sid_local = sid;
157 uint_t n = 7 - (addr & 7);
158 (st_callback)(sid_local,addr &~ 7,NORMAL,0x1 << n,uint64_t(data) << (n * 8));
159}
160/*}}}*/
161void SS_ExternalMemory::st16( uint64_t addr, uint16_t data )/*{{{*/
162{
163 int sid_local = sid;
164 uint_t n = 6 - (addr & 6);
165 (st_callback)(sid_local,addr &~ 7,NORMAL,0x3 << n,uint64_t(data) << (n * 8));
166}
167/*}}}*/
168void SS_ExternalMemory::st32( uint64_t addr, uint32_t data )/*{{{*/
169{
170 int sid_local = sid;
171 uint_t n = 4 - (addr & 4);
172 (st_callback)(sid_local,addr &~ 7,NORMAL,0xf << n,uint64_t(data) << (n * 8));
173}
174/*}}}*/
175void SS_ExternalMemory::st64( uint64_t addr, uint64_t data )/*{{{*/
176{
177 int sid_local = sid;
178 (st_callback)(sid_local,addr,NORMAL,0xff,data);
179}
180/*}}}*/
181void SS_ExternalMemory::st128( uint64_t addr, uint64_t data[2] )/*{{{*/
182{
183 int sid_local = sid;
184 (st_callback)(sid_local,addr ,NORMAL,0xff,data[0]);
185 (st_callback)(sid_local,addr + 8,NORMAL,0xff,data[1]);
186}
187/*}}}*/
188void SS_ExternalMemory::st512( uint64_t addr, uint64_t data[8] )/*{{{*/
189{
190 int sid_local = sid;
191 (st_callback)(sid_local,addr ,NORMAL,0xff,data[0]);
192 (st_callback)(sid_local,addr + 8,NORMAL,0xff,data[1]);
193 (st_callback)(sid_local,addr + 16,NORMAL,0xff,data[2]);
194 (st_callback)(sid_local,addr + 24,NORMAL,0xff,data[3]);
195 (st_callback)(sid_local,addr + 32,NORMAL,0xff,data[4]);
196 (st_callback)(sid_local,addr + 40,NORMAL,0xff,data[5]);
197 (st_callback)(sid_local,addr + 48,NORMAL,0xff,data[6]);
198 (st_callback)(sid_local,addr + 56,NORMAL,0xff,data[7]);
199}
200/*}}}*/
201void SS_ExternalMemory::st64partial( uint64_t addr, uint64_t data, uint64_t mask ) /*{{{*/
202{
203 int sid_local = sid;
204 (st_callback)(sid_local,addr,NORMAL,mask,data);
205}
206/*}}}*/
207void SS_ExternalMemory::ld128atomic( uint64_t addr, uint64_t data[2] )/*{{{*/
208{
209 int sid_local = sid;
210 (ld_callback)(sid_local,addr ,ATOMIC,0xff,&data[0]);
211 (ld_callback)(sid_local,addr + 8,ATOMIC,0xff,&data[1]);
212}
213/*}}}*/
214uint8_t SS_ExternalMemory::ldstub( uint64_t addr )/*{{{*/
215{
216 int sid_local = sid;
217 uint64_t data;
218 uint_t n = 7 - (addr & 7);
219 (ld_callback)(sid_local,addr &~ 7,ATOMIC,0x1 << n,&data);
220 (st_callback)(sid_local,addr &~ 7,ATOMIC,0x1 << n,0xff << (n * 8));
221 return data >> (n * 8);
222}
223/*}}}*/
224uint32_t SS_ExternalMemory::swap( uint64_t addr, uint32_t rd )/*{{{*/
225{
226 int sid_local = sid;
227 uint64_t data;
228 uint_t n = 4 - (addr & 4);
229 (ld_callback)(sid_local,addr &~ 7,ATOMIC,0xf << n,&data);
230 (st_callback)(sid_local,addr &~ 7,ATOMIC,0xf << n,uint64_t(rd) << (n * 8));
231 return data >> (n * 8);
232}
233/*}}}*/
234uint64_t SS_ExternalMemory::casx( uint64_t addr, uint64_t rd, uint64_t rs2 )/*{{{*/
235{
236 int sid_local = sid;
237 uint64_t data;
238 (ld_callback)(sid_local,addr,ATOMIC,0xff,&data);
239 if (rs2 == data)
240 (st_callback)(sid_local,addr,ATOMIC,0xff,rd);
241 else if (dummy_st_for_cas)
242 (st_callback)(sid_local,addr,ATOMIC,0,rd);
243 return data;
244}
245/*}}}*/
246uint32_t SS_ExternalMemory::cas( uint64_t addr, uint32_t rd, uint32_t rs2 )/*{{{*/
247{
248 int sid_local = sid;
249 uint64_t data;
250 uint_t n = 4 - (addr & 4);
251 (ld_callback)(sid_local,addr &~ 7,ATOMIC,0xf << n,&data);
252 data = uint32_t(data >> (n * 8));
253 if (rs2 == data)
254 (st_callback)(sid_local,addr &~ 7,ATOMIC,0xf << n,uint64_t(rd) << (n * 8));
255 else if (dummy_st_for_cas)
256 (st_callback)(sid_local,addr &~ 7,ATOMIC,0,uint64_t(rd) << (n * 8));
257 return data;
258}
259/*}}}*/
260void SS_ExternalMemory::prefetch( uint64_t addr, uint_t size )/*{{{*/
261{
262}
263/*}}}*/
264void SS_ExternalMemory::flush( uint64_t addr, uint_t size )/*{{{*/
265{
266}
267/*}}}*/