isa.cc (8873:f349cc840cab) isa.cc (8887:20ea02da9c53)
1/*
2 * Copyright (c) 2010-2012 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

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

34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Gabe Black
38 * Ali Saidi
39 */
40
41#include "arch/arm/isa.hh"
1/*
2 * Copyright (c) 2010-2012 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

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

34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Gabe Black
38 * Ali Saidi
39 */
40
41#include "arch/arm/isa.hh"
42#include "config/use_checker.hh"
42#include "cpu/checker/cpu.hh"
43#include "debug/Arm.hh"
44#include "debug/MiscRegs.hh"
45#include "sim/faults.hh"
46#include "sim/stat_control.hh"
47#include "sim/system.hh"
48
43#include "debug/Arm.hh"
44#include "debug/MiscRegs.hh"
45#include "sim/faults.hh"
46#include "sim/stat_control.hh"
47#include "sim/system.hh"
48
49#if USE_CHECKER
50#include "cpu/checker/cpu.hh"
51#endif
52
53namespace ArmISA
54{
55
56void
57ISA::clear()
58{
59 SCTLR sctlr_rst = miscRegs[MISCREG_SCTLR_RST];
60 uint32_t midr = miscRegs[MISCREG_MIDR];

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

289 tc->getDTBPtr()->invalidateMiscReg();
290 }
291
292 DPRINTF(Arm, "Updating CPSR from %#x to %#x f:%d i:%d a:%d mode:%#x\n",
293 miscRegs[misc_reg], cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode);
294 PCState pc = tc->pcState();
295 pc.nextThumb(cpsr.t);
296 pc.nextJazelle(cpsr.j);
49namespace ArmISA
50{
51
52void
53ISA::clear()
54{
55 SCTLR sctlr_rst = miscRegs[MISCREG_SCTLR_RST];
56 uint32_t midr = miscRegs[MISCREG_MIDR];

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

285 tc->getDTBPtr()->invalidateMiscReg();
286 }
287
288 DPRINTF(Arm, "Updating CPSR from %#x to %#x f:%d i:%d a:%d mode:%#x\n",
289 miscRegs[misc_reg], cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode);
290 PCState pc = tc->pcState();
291 pc.nextThumb(cpsr.t);
292 pc.nextJazelle(cpsr.j);
297#if USE_CHECKER
298 tc->pcStateNoRecord(pc);
299#else
300 tc->pcState(pc);
301#endif //USE_CHECKER
293
294 // Follow slightly different semantics if a CheckerCPU object
295 // is connected
296 CheckerCPU *checker = tc->getCheckerCpuPtr();
297 if (checker) {
298 tc->pcStateNoRecord(pc);
299 } else {
300 tc->pcState(pc);
301 }
302 } else if (misc_reg >= MISCREG_CP15_UNIMP_START &&
303 misc_reg < MISCREG_CP15_END) {
304 panic("Unimplemented CP15 register %s wrote with %#x.\n",
305 miscRegName[misc_reg], val);
306 } else {
307 switch (misc_reg) {
308 case MISCREG_CPACR:
309 {

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

396 if (!other_sctlr.c && oc->status() != ThreadContext::Halted)
397 return;
398 }
399
400 for (x = 0; x < sys->numContexts(); x++) {
401 oc = sys->getThreadContext(x);
402 oc->getDTBPtr()->allCpusCaching();
403 oc->getITBPtr()->allCpusCaching();
302 } else if (misc_reg >= MISCREG_CP15_UNIMP_START &&
303 misc_reg < MISCREG_CP15_END) {
304 panic("Unimplemented CP15 register %s wrote with %#x.\n",
305 miscRegName[misc_reg], val);
306 } else {
307 switch (misc_reg) {
308 case MISCREG_CPACR:
309 {

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

396 if (!other_sctlr.c && oc->status() != ThreadContext::Halted)
397 return;
398 }
399
400 for (x = 0; x < sys->numContexts(); x++) {
401 oc = sys->getThreadContext(x);
402 oc->getDTBPtr()->allCpusCaching();
403 oc->getITBPtr()->allCpusCaching();
404#if USE_CHECKER
405 CheckerCPU *checker =
406 dynamic_cast<CheckerCPU*>(oc->getCheckerCpuPtr());
404
405 // If CheckerCPU is connected, need to notify it.
406 CheckerCPU *checker = oc->getCheckerCpuPtr();
407 if (checker) {
408 checker->getDTBPtr()->allCpusCaching();
409 checker->getITBPtr()->allCpusCaching();
410 }
407 if (checker) {
408 checker->getDTBPtr()->allCpusCaching();
409 checker->getITBPtr()->allCpusCaching();
410 }
411#endif
412 }
413 return;
414 }
415 case MISCREG_TLBTR:
416 case MISCREG_MVFR0:
417 case MISCREG_MVFR1:
418 case MISCREG_MPIDR:
419 case MISCREG_FPSID:
420 return;
421 case MISCREG_TLBIALLIS:
422 case MISCREG_TLBIALL:
423 sys = tc->getSystemPtr();
424 for (x = 0; x < sys->numContexts(); x++) {
425 oc = sys->getThreadContext(x);
426 assert(oc->getITBPtr() && oc->getDTBPtr());
427 oc->getITBPtr()->flushAll();
428 oc->getDTBPtr()->flushAll();
411 }
412 return;
413 }
414 case MISCREG_TLBTR:
415 case MISCREG_MVFR0:
416 case MISCREG_MVFR1:
417 case MISCREG_MPIDR:
418 case MISCREG_FPSID:
419 return;
420 case MISCREG_TLBIALLIS:
421 case MISCREG_TLBIALL:
422 sys = tc->getSystemPtr();
423 for (x = 0; x < sys->numContexts(); x++) {
424 oc = sys->getThreadContext(x);
425 assert(oc->getITBPtr() && oc->getDTBPtr());
426 oc->getITBPtr()->flushAll();
427 oc->getDTBPtr()->flushAll();
429#if USE_CHECKER
430 CheckerCPU *checker =
431 dynamic_cast<CheckerCPU*>(oc->getCheckerCpuPtr());
428
429 // If CheckerCPU is connected, need to notify it of a flush
430 CheckerCPU *checker = oc->getCheckerCpuPtr();
432 if (checker) {
433 checker->getITBPtr()->flushAll();
434 checker->getDTBPtr()->flushAll();
435 }
431 if (checker) {
432 checker->getITBPtr()->flushAll();
433 checker->getDTBPtr()->flushAll();
434 }
436#endif
437 }
438 return;
439 case MISCREG_ITLBIALL:
440 tc->getITBPtr()->flushAll();
441 return;
442 case MISCREG_DTLBIALL:
443 tc->getDTBPtr()->flushAll();
444 return;
445 case MISCREG_TLBIMVAIS:
446 case MISCREG_TLBIMVA:
447 sys = tc->getSystemPtr();
448 for (x = 0; x < sys->numContexts(); x++) {
449 oc = sys->getThreadContext(x);
450 assert(oc->getITBPtr() && oc->getDTBPtr());
451 oc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
452 bits(newVal, 7,0));
453 oc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
454 bits(newVal, 7,0));
435 }
436 return;
437 case MISCREG_ITLBIALL:
438 tc->getITBPtr()->flushAll();
439 return;
440 case MISCREG_DTLBIALL:
441 tc->getDTBPtr()->flushAll();
442 return;
443 case MISCREG_TLBIMVAIS:
444 case MISCREG_TLBIMVA:
445 sys = tc->getSystemPtr();
446 for (x = 0; x < sys->numContexts(); x++) {
447 oc = sys->getThreadContext(x);
448 assert(oc->getITBPtr() && oc->getDTBPtr());
449 oc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
450 bits(newVal, 7,0));
451 oc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
452 bits(newVal, 7,0));
455#if USE_CHECKER
456 CheckerCPU *checker =
457 dynamic_cast<CheckerCPU*>(oc->getCheckerCpuPtr());
453
454 CheckerCPU *checker = oc->getCheckerCpuPtr();
458 if (checker) {
459 checker->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
460 bits(newVal, 7,0));
461 checker->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
462 bits(newVal, 7,0));
463 }
455 if (checker) {
456 checker->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
457 bits(newVal, 7,0));
458 checker->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
459 bits(newVal, 7,0));
460 }
464#endif
465 }
466 return;
467 case MISCREG_TLBIASIDIS:
468 case MISCREG_TLBIASID:
469 sys = tc->getSystemPtr();
470 for (x = 0; x < sys->numContexts(); x++) {
471 oc = sys->getThreadContext(x);
472 assert(oc->getITBPtr() && oc->getDTBPtr());
473 oc->getITBPtr()->flushAsid(bits(newVal, 7,0));
474 oc->getDTBPtr()->flushAsid(bits(newVal, 7,0));
461 }
462 return;
463 case MISCREG_TLBIASIDIS:
464 case MISCREG_TLBIASID:
465 sys = tc->getSystemPtr();
466 for (x = 0; x < sys->numContexts(); x++) {
467 oc = sys->getThreadContext(x);
468 assert(oc->getITBPtr() && oc->getDTBPtr());
469 oc->getITBPtr()->flushAsid(bits(newVal, 7,0));
470 oc->getDTBPtr()->flushAsid(bits(newVal, 7,0));
475#if USE_CHECKER
476 CheckerCPU *checker =
477 dynamic_cast<CheckerCPU*>(oc->getCheckerCpuPtr());
471 CheckerCPU *checker = oc->getCheckerCpuPtr();
478 if (checker) {
479 checker->getITBPtr()->flushAsid(bits(newVal, 7,0));
480 checker->getDTBPtr()->flushAsid(bits(newVal, 7,0));
481 }
472 if (checker) {
473 checker->getITBPtr()->flushAsid(bits(newVal, 7,0));
474 checker->getDTBPtr()->flushAsid(bits(newVal, 7,0));
475 }
482#endif
483 }
484 return;
485 case MISCREG_TLBIMVAAIS:
486 case MISCREG_TLBIMVAA:
487 sys = tc->getSystemPtr();
488 for (x = 0; x < sys->numContexts(); x++) {
489 oc = sys->getThreadContext(x);
490 assert(oc->getITBPtr() && oc->getDTBPtr());
491 oc->getITBPtr()->flushMva(mbits(newVal, 31,12));
492 oc->getDTBPtr()->flushMva(mbits(newVal, 31,12));
476 }
477 return;
478 case MISCREG_TLBIMVAAIS:
479 case MISCREG_TLBIMVAA:
480 sys = tc->getSystemPtr();
481 for (x = 0; x < sys->numContexts(); x++) {
482 oc = sys->getThreadContext(x);
483 assert(oc->getITBPtr() && oc->getDTBPtr());
484 oc->getITBPtr()->flushMva(mbits(newVal, 31,12));
485 oc->getDTBPtr()->flushMva(mbits(newVal, 31,12));
493#if USE_CHECKER
494 CheckerCPU *checker =
495 dynamic_cast<CheckerCPU*>(oc->getCheckerCpuPtr());
486
487 CheckerCPU *checker = oc->getCheckerCpuPtr();
496 if (checker) {
497 checker->getITBPtr()->flushMva(mbits(newVal, 31,12));
498 checker->getDTBPtr()->flushMva(mbits(newVal, 31,12));
499 }
488 if (checker) {
489 checker->getITBPtr()->flushMva(mbits(newVal, 31,12));
490 checker->getDTBPtr()->flushMva(mbits(newVal, 31,12));
491 }
500#endif
501 }
502 return;
503 case MISCREG_ITLBIMVA:
504 tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
505 bits(newVal, 7,0));
506 return;
507 case MISCREG_DTLBIMVA:
508 tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),

--- 108 unchanged lines hidden ---
492 }
493 return;
494 case MISCREG_ITLBIMVA:
495 tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
496 bits(newVal, 7,0));
497 return;
498 case MISCREG_DTLBIMVA:
499 tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),

--- 108 unchanged lines hidden ---