misc.isa (8304:16911ff780d3) misc.isa (8518:9c87727099ce)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating

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

497 yieldIop = InstObjParams("yield", "YieldInst", "PredOp", \
498 { "code" : "", "predicate_test" : predicateTest })
499 header_output += BasicDeclare.subst(yieldIop)
500 decoder_output += BasicConstructor.subst(yieldIop)
501 exec_output += PredOpExecute.subst(yieldIop)
502
503 wfeCode = '''
504#if FULL_SYSTEM
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating

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

497 yieldIop = InstObjParams("yield", "YieldInst", "PredOp", \
498 { "code" : "", "predicate_test" : predicateTest })
499 header_output += BasicDeclare.subst(yieldIop)
500 decoder_output += BasicConstructor.subst(yieldIop)
501 exec_output += PredOpExecute.subst(yieldIop)
502
503 wfeCode = '''
504#if FULL_SYSTEM
505 // WFE Sleeps if SevMailbox==0 and no unmasked interrupts are pending
505 if (SevMailbox == 1) {
506 SevMailbox = 0;
507 PseudoInst::quiesceSkip(xc->tcBase());
506 if (SevMailbox == 1) {
507 SevMailbox = 0;
508 PseudoInst::quiesceSkip(xc->tcBase());
509 } else if (xc->tcBase()->getCpuPtr()->getInterruptController()->checkInterrupts(xc->tcBase())) {
510 PseudoInst::quiesceSkip(xc->tcBase());
508 } else {
509 PseudoInst::quiesce(xc->tcBase());
510 }
511#endif
512 '''
511 } else {
512 PseudoInst::quiesce(xc->tcBase());
513 }
514#endif
515 '''
516 wfePredFixUpCode = '''
517#if FULL_SYSTEM
518 // WFE is predicated false, reset SevMailbox to reduce spurious sleeps
519 // and SEV interrupts
520 SevMailbox = 1;
521#endif
522 '''
513 wfeIop = InstObjParams("wfe", "WfeInst", "PredOp", \
523 wfeIop = InstObjParams("wfe", "WfeInst", "PredOp", \
514 { "code" : wfeCode, "predicate_test" : predicateTest },
524 { "code" : wfeCode,
525 "pred_fixup" : wfePredFixUpCode,
526 "predicate_test" : predicateTest },
515 ["IsNonSpeculative", "IsQuiesce", "IsSerializeAfter"])
516 header_output += BasicDeclare.subst(wfeIop)
517 decoder_output += BasicConstructor.subst(wfeIop)
527 ["IsNonSpeculative", "IsQuiesce", "IsSerializeAfter"])
528 header_output += BasicDeclare.subst(wfeIop)
529 decoder_output += BasicConstructor.subst(wfeIop)
518 exec_output += QuiescePredOpExecute.subst(wfeIop)
530 exec_output += QuiescePredOpExecuteWithFixup.subst(wfeIop)
519
520 wfiCode = '''
521#if FULL_SYSTEM
522 // WFI doesn't sleep if interrupts are pending (masked or not)
523 if (xc->tcBase()->getCpuPtr()->getInterruptController()->checkRaw()) {
524 PseudoInst::quiesceSkip(xc->tcBase());
525 } else {
526 PseudoInst::quiesce(xc->tcBase());
527 }
528#endif
529 '''
530 wfiIop = InstObjParams("wfi", "WfiInst", "PredOp", \
531 { "code" : wfiCode, "predicate_test" : predicateTest },
532 ["IsNonSpeculative", "IsQuiesce", "IsSerializeAfter"])
533 header_output += BasicDeclare.subst(wfiIop)
534 decoder_output += BasicConstructor.subst(wfiIop)
535 exec_output += QuiescePredOpExecute.subst(wfiIop)
536
537 sevCode = '''
531
532 wfiCode = '''
533#if FULL_SYSTEM
534 // WFI doesn't sleep if interrupts are pending (masked or not)
535 if (xc->tcBase()->getCpuPtr()->getInterruptController()->checkRaw()) {
536 PseudoInst::quiesceSkip(xc->tcBase());
537 } else {
538 PseudoInst::quiesce(xc->tcBase());
539 }
540#endif
541 '''
542 wfiIop = InstObjParams("wfi", "WfiInst", "PredOp", \
543 { "code" : wfiCode, "predicate_test" : predicateTest },
544 ["IsNonSpeculative", "IsQuiesce", "IsSerializeAfter"])
545 header_output += BasicDeclare.subst(wfiIop)
546 decoder_output += BasicConstructor.subst(wfiIop)
547 exec_output += QuiescePredOpExecute.subst(wfiIop)
548
549 sevCode = '''
538 // Need a way for O3 to not scoreboard these accesses as pipe flushes.
550#if FULL_SYSTEM
539 SevMailbox = 1;
540 System *sys = xc->tcBase()->getSystemPtr();
541 for (int x = 0; x < sys->numContexts(); x++) {
542 ThreadContext *oc = sys->getThreadContext(x);
543 if (oc == xc->tcBase())
544 continue;
551 SevMailbox = 1;
552 System *sys = xc->tcBase()->getSystemPtr();
553 for (int x = 0; x < sys->numContexts(); x++) {
554 ThreadContext *oc = sys->getThreadContext(x);
555 if (oc == xc->tcBase())
556 continue;
545 // Only wake if they were sleeping
557 // Wake CPU with interrupt if they were sleeping
546 if (oc->readMiscReg(MISCREG_SEV_MAILBOX) == 0) {
558 if (oc->readMiscReg(MISCREG_SEV_MAILBOX) == 0) {
547 oc->setMiscReg(MISCREG_SEV_MAILBOX, 1);
548 PseudoInst::wakeCPU(xc->tcBase(), x);
559 // Post Interrupt and wake cpu if needed
560 oc->getCpuPtr()->postInterrupt(INT_SEV, 0);
549 }
550 }
561 }
562 }
563#endif
551 '''
552 sevIop = InstObjParams("sev", "SevInst", "PredOp", \
553 { "code" : sevCode, "predicate_test" : predicateTest },
554 ["IsNonSpeculative", "IsSquashAfter"])
555 header_output += BasicDeclare.subst(sevIop)
556 decoder_output += BasicConstructor.subst(sevIop)
557 exec_output += PredOpExecute.subst(sevIop)
558

--- 234 unchanged lines hidden ---
564 '''
565 sevIop = InstObjParams("sev", "SevInst", "PredOp", \
566 { "code" : sevCode, "predicate_test" : predicateTest },
567 ["IsNonSpeculative", "IsSquashAfter"])
568 header_output += BasicDeclare.subst(sevIop)
569 decoder_output += BasicConstructor.subst(sevIop)
570 exec_output += PredOpExecute.subst(sevIop)
571

--- 234 unchanged lines hidden ---