Deleted Added
sdiff udiff text old ( 4395:9acb011a6c35 ) new ( 4997:e7380529bd2d )
full compact
1/*
2 * Copyright (c) 2002-2005 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;

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

63 AlphaISA::AlphaFault *reset = new AlphaISA::ResetFault;
64
65 tc->setPC(tc->readMiscRegNoEffect(IPR_PAL_BASE) + reset->vect());
66 tc->setNextPC(tc->readPC() + sizeof(MachInst));
67
68 delete reset;
69}
70
71
72template <class CPU>
73void
74AlphaISA::processInterrupts(CPU *cpu)
75{
76 //Check if there are any outstanding interrupts
77 //Handle the interrupts
78 int ipl = 0;
79 int summary = 0;

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

150}
151
152int
153AlphaISA::MiscRegFile::getDataAsid()
154{
155 return EV5::DTB_ASN_ASN(ipr[IPR_DTB_ASN]);
156}
157
158#endif
159
160////////////////////////////////////////////////////////////////////////
161//
162//
163//
164void
165AlphaISA::initIPRs(ThreadContext *tc, int cpuId)
166{
167 for (int i = 0; i < NumInternalProcRegs; ++i) {
168 tc->setMiscRegNoEffect(i, 0);
169 }
170
171 tc->setMiscRegNoEffect(IPR_PAL_BASE, EV5::PalBase);
172 tc->setMiscRegNoEffect(IPR_MCSR, 0x6);
173 tc->setMiscRegNoEffect(IPR_PALtemp16, cpuId);
174}
175
176AlphaISA::MiscReg
177AlphaISA::MiscRegFile::readIpr(int idx, ThreadContext *tc)
178{
179 uint64_t retval = 0; // return value, default 0
180
181 switch (idx) {
182 case AlphaISA::IPR_PALtemp0:
183 case AlphaISA::IPR_PALtemp1:

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

337 // isa_desc).
338 ipr[idx] = val;
339 break;
340
341 case AlphaISA::IPR_PALtemp23:
342 // write entire quad w/ no side-effect
343 old = ipr[idx];
344 ipr[idx] = val;
345#if FULL_SYSTEM
346 if (tc->getKernelStats())
347 tc->getKernelStats()->context(old, val, tc);
348#endif
349 break;
350
351 case AlphaISA::IPR_DTB_PTE:
352 // write entire quad w/ no side-effect, tag is forthcoming
353 ipr[idx] = val;
354 break;
355
356 case AlphaISA::IPR_EXC_ADDR:

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

367 case AlphaISA::IPR_IPLR:
368#ifdef DEBUG
369 if (break_ipl != -1 && break_ipl == (val & 0x1f))
370 debug_break();
371#endif
372
373 // only write least significant five bits - interrupt level
374 ipr[idx] = val & 0x1f;
375#if FULL_SYSTEM
376 if (tc->getKernelStats())
377 tc->getKernelStats()->swpipl(ipr[idx]);
378#endif
379 break;
380
381 case AlphaISA::IPR_DTB_CM:
382#if FULL_SYSTEM
383 if (val & 0x18) {
384 if (tc->getKernelStats())
385 tc->getKernelStats()->mode(TheISA::Kernel::user, tc);
386 } else {
387 if (tc->getKernelStats())
388 tc->getKernelStats()->mode(TheISA::Kernel::kernel, tc);
389 }
390#endif
391
392 case AlphaISA::IPR_ICM:
393 // only write two mode bits - processor mode
394 ipr[idx] = val & 0x18;
395 break;
396
397 case AlphaISA::IPR_ALT_MODE:
398 // only write two mode bits - processor mode

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

471 tc->getDTBPtr()->flushProcesses();
472 break;
473
474 case AlphaISA::IPR_DTB_IS:
475 // really a control write
476 ipr[idx] = val;
477
478 tc->getDTBPtr()->flushAddr(val,
479 EV5::DTB_ASN_ASN(ipr[AlphaISA::IPR_DTB_ASN]));
480 break;
481
482 case AlphaISA::IPR_DTB_TAG: {
483 struct AlphaISA::PTE pte;
484
485 // FIXME: granularity hints NYI...
486 if (EV5::DTB_PTE_GH(ipr[AlphaISA::IPR_DTB_PTE]) != 0)
487 panic("PTE GH field != 0");
488
489 // write entire quad
490 ipr[idx] = val;
491
492 // construct PTE for new entry
493 pte.ppn = EV5::DTB_PTE_PPN(ipr[AlphaISA::IPR_DTB_PTE]);
494 pte.xre = EV5::DTB_PTE_XRE(ipr[AlphaISA::IPR_DTB_PTE]);
495 pte.xwe = EV5::DTB_PTE_XWE(ipr[AlphaISA::IPR_DTB_PTE]);
496 pte.fonr = EV5::DTB_PTE_FONR(ipr[AlphaISA::IPR_DTB_PTE]);
497 pte.fonw = EV5::DTB_PTE_FONW(ipr[AlphaISA::IPR_DTB_PTE]);
498 pte.asma = EV5::DTB_PTE_ASMA(ipr[AlphaISA::IPR_DTB_PTE]);
499 pte.asn = EV5::DTB_ASN_ASN(ipr[AlphaISA::IPR_DTB_ASN]);
500
501 // insert new TAG/PTE value into data TLB
502 tc->getDTBPtr()->insert(val, pte);
503 }
504 break;
505
506 case AlphaISA::IPR_ITB_PTE: {
507 struct AlphaISA::PTE pte;
508
509 // FIXME: granularity hints NYI...
510 if (EV5::ITB_PTE_GH(val) != 0)
511 panic("PTE GH field != 0");
512
513 // write entire quad
514 ipr[idx] = val;
515
516 // construct PTE for new entry
517 pte.ppn = EV5::ITB_PTE_PPN(val);
518 pte.xre = EV5::ITB_PTE_XRE(val);
519 pte.xwe = 0;
520 pte.fonr = EV5::ITB_PTE_FONR(val);
521 pte.fonw = EV5::ITB_PTE_FONW(val);
522 pte.asma = EV5::ITB_PTE_ASMA(val);
523 pte.asn = EV5::ITB_ASN_ASN(ipr[AlphaISA::IPR_ITB_ASN]);
524
525 // insert new TAG/PTE value into data TLB
526 tc->getITBPtr()->insert(ipr[AlphaISA::IPR_ITB_TAG], pte);
527 }
528 break;
529
530 case AlphaISA::IPR_ITB_IA:
531 // really a control write

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

541 tc->getITBPtr()->flushProcesses();
542 break;
543
544 case AlphaISA::IPR_ITB_IS:
545 // really a control write
546 ipr[idx] = val;
547
548 tc->getITBPtr()->flushAddr(val,
549 EV5::ITB_ASN_ASN(ipr[AlphaISA::IPR_ITB_ASN]));
550 break;
551
552 default:
553 // invalid IPR
554 panic("Tried to write to invalid ipr %d\n", idx);
555 }
556
557 // no error...
558}
559
560
561void
562AlphaISA::copyIprs(ThreadContext *src, ThreadContext *dest)
563{
564 for (int i = 0; i < NumInternalProcRegs; ++i) {
565 dest->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i));
566 }
567}
568
569#if FULL_SYSTEM
570
571/**
572 * Check for special simulator handling of specific PAL calls.
573 * If return value is false, actual PAL call will be suppressed.
574 */
575bool
576SimpleThread::simPalCheck(int palFunc)
577{

--- 21 unchanged lines hidden ---