ua2005.cc (4185:42c0395a03f9) ua2005.cc (4194:af4f6022394b)
1/*
2 * Copyright (c) 2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 12 unchanged lines hidden (view full) ---

21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
1/*
2 * Copyright (c) 2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 12 unchanged lines hidden (view full) ---

21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include "arch/sparc/kernel_stats.hh"
29#include "arch/sparc/miscregfile.hh"
30#include "base/bitfield.hh"
31#include "base/trace.hh"
32#include "cpu/base.hh"
33#include "cpu/thread_context.hh"
30#include "arch/sparc/miscregfile.hh"
31#include "base/bitfield.hh"
32#include "base/trace.hh"
33#include "cpu/base.hh"
34#include "cpu/thread_context.hh"
35#include "sim/system.hh"
34
35using namespace SparcISA;
36
37
38void
39MiscRegFile::checkSoftInt(ThreadContext *tc)
40{
41 // If PIL < 14, copy over the tm and sm bits

--- 138 unchanged lines hidden (view full) ---

180#if FULL_SYSTEM
181 if (hpstate & HPSTATE::tlz && tl == 0 && !(hpstate & HPSTATE::hpriv))
182 tc->getCpuPtr()->post_interrupt(IT_TRAP_LEVEL_ZERO,0);
183 else
184 tc->getCpuPtr()->clear_interrupt(IT_TRAP_LEVEL_ZERO,0);
185#endif
186 break;
187 case MISCREG_HTSTATE:
36
37using namespace SparcISA;
38
39
40void
41MiscRegFile::checkSoftInt(ThreadContext *tc)
42{
43 // If PIL < 14, copy over the tm and sm bits

--- 138 unchanged lines hidden (view full) ---

182#if FULL_SYSTEM
183 if (hpstate & HPSTATE::tlz && tl == 0 && !(hpstate & HPSTATE::hpriv))
184 tc->getCpuPtr()->post_interrupt(IT_TRAP_LEVEL_ZERO,0);
185 else
186 tc->getCpuPtr()->clear_interrupt(IT_TRAP_LEVEL_ZERO,0);
187#endif
188 break;
189 case MISCREG_HTSTATE:
188 case MISCREG_STRAND_STS_REG:
189 setRegNoEffect(miscReg, val);
190 break;
191
190 setRegNoEffect(miscReg, val);
191 break;
192
193 case MISCREG_STRAND_STS_REG:
194 if (bits(val,2,2))
195 panic("No support for setting spec_en bit\n");
196 setRegNoEffect(miscReg, bits(val,0,0));
197 if (!bits(val,0,0)) {
198 // Time to go to sleep
199 tc->suspend();
200 if (tc->getKernelStats())
201 tc->getKernelStats()->quiesce();
202 }
203 break;
204
192 default:
193 panic("Invalid write to FS misc register %s\n", getMiscRegName(miscReg));
194 }
195}
196
197MiscReg
198MiscRegFile::readFSReg(int miscReg, ThreadContext * tc)
199{
205 default:
206 panic("Invalid write to FS misc register %s\n", getMiscRegName(miscReg));
207 }
208}
209
210MiscReg
211MiscRegFile::readFSReg(int miscReg, ThreadContext * tc)
212{
213 uint64_t temp;
214
200 switch (miscReg) {
201 /* Privileged registers. */
202 case MISCREG_QUEUE_CPU_MONDO_HEAD:
203 case MISCREG_QUEUE_CPU_MONDO_TAIL:
204 case MISCREG_QUEUE_DEV_MONDO_HEAD:
205 case MISCREG_QUEUE_DEV_MONDO_TAIL:
206 case MISCREG_QUEUE_RES_ERROR_HEAD:
207 case MISCREG_QUEUE_RES_ERROR_TAIL:
208 case MISCREG_QUEUE_NRES_ERROR_HEAD:
209 case MISCREG_QUEUE_NRES_ERROR_TAIL:
210 case MISCREG_SOFTINT:
211 case MISCREG_TICK_CMPR:
212 case MISCREG_STICK_CMPR:
213 case MISCREG_PIL:
214 case MISCREG_HPSTATE:
215 case MISCREG_HINTP:
216 case MISCREG_HTSTATE:
215 switch (miscReg) {
216 /* Privileged registers. */
217 case MISCREG_QUEUE_CPU_MONDO_HEAD:
218 case MISCREG_QUEUE_CPU_MONDO_TAIL:
219 case MISCREG_QUEUE_DEV_MONDO_HEAD:
220 case MISCREG_QUEUE_DEV_MONDO_TAIL:
221 case MISCREG_QUEUE_RES_ERROR_HEAD:
222 case MISCREG_QUEUE_RES_ERROR_TAIL:
223 case MISCREG_QUEUE_NRES_ERROR_HEAD:
224 case MISCREG_QUEUE_NRES_ERROR_TAIL:
225 case MISCREG_SOFTINT:
226 case MISCREG_TICK_CMPR:
227 case MISCREG_STICK_CMPR:
228 case MISCREG_PIL:
229 case MISCREG_HPSTATE:
230 case MISCREG_HINTP:
231 case MISCREG_HTSTATE:
217 case MISCREG_STRAND_STS_REG:
218 case MISCREG_HSTICK_CMPR:
219 return readRegNoEffect(miscReg) ;
220
221 case MISCREG_HTBA:
222 return readRegNoEffect(miscReg) & ULL(~0x7FFF);
223 case MISCREG_HVER:
224 return NWindows | MaxTL << 8 | MaxGL << 16;
225
232 case MISCREG_HSTICK_CMPR:
233 return readRegNoEffect(miscReg) ;
234
235 case MISCREG_HTBA:
236 return readRegNoEffect(miscReg) & ULL(~0x7FFF);
237 case MISCREG_HVER:
238 return NWindows | MaxTL << 8 | MaxGL << 16;
239
240 case MISCREG_STRAND_STS_REG:
241 System *sys;
242 int x;
243 sys = tc->getSystemPtr();
244
245 temp = readRegNoEffect(miscReg) & (STS::active | STS::speculative);
246 // Check that the CPU array is fully populated (by calling getNumCPus())
247 assert(sys->getNumCPUs() > tc->readCpuId());
248
249 temp |= tc->readCpuId() << STS::shft_id;
250
251 for (x = tc->readCpuId() & ~3; x < sys->threadContexts.size(); x++) {
252 switch (sys->threadContexts[x]->status()) {
253 case ThreadContext::Active:
254 temp |= STS::st_run << (STS::shft_fsm0 -
255 ((x & 0x3) * (STS::shft_fsm0-STS::shft_fsm1)));
256 break;
257 case ThreadContext::Suspended:
258 // should this be idle?
259 temp |= STS::st_idle << (STS::shft_fsm0 -
260 ((x & 0x3) * (STS::shft_fsm0-STS::shft_fsm1)));
261 break;
262 case ThreadContext::Halted:
263 temp |= STS::st_halt << (STS::shft_fsm0 -
264 ((x & 0x3) * (STS::shft_fsm0-STS::shft_fsm1)));
265 break;
266 default:
267 panic("What state are we in?!\n");
268 } // switch
269 } // for
270
271 return temp;
226 default:
227 panic("Invalid read to FS misc register\n");
228 }
229}
230/*
231 In Niagra STICK==TICK so this isn't needed
232 case MISCREG_STICK:
233 SparcSystem *sys;

--- 56 unchanged lines hidden ---
272 default:
273 panic("Invalid read to FS misc register\n");
274 }
275}
276/*
277 In Niagra STICK==TICK so this isn't needed
278 case MISCREG_STICK:
279 SparcSystem *sys;

--- 56 unchanged lines hidden ---