misc.isa (12358:386d26feb00f) misc.isa (12403:7be05f61abf3)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010-2013,2017 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

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

665
666 yieldIop = InstObjParams("yield", "YieldInst", "PredOp", \
667 { "code" : "", "predicate_test" : predicateTest })
668 header_output += BasicDeclare.subst(yieldIop)
669 decoder_output += BasicConstructor.subst(yieldIop)
670 exec_output += PredOpExecute.subst(yieldIop)
671
672 wfeCode = '''
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010-2013,2017 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

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

665
666 yieldIop = InstObjParams("yield", "YieldInst", "PredOp", \
667 { "code" : "", "predicate_test" : predicateTest })
668 header_output += BasicDeclare.subst(yieldIop)
669 decoder_output += BasicConstructor.subst(yieldIop)
670 exec_output += PredOpExecute.subst(yieldIop)
671
672 wfeCode = '''
673 HCR hcr = Hcr;
674 CPSR cpsr = Cpsr;
675 SCR scr = Scr64;
673 CPSR cpsr = Cpsr;
674 SCR scr = Scr64;
676 SCTLR sctlr = Sctlr;
677
678 // WFE Sleeps if SevMailbox==0 and no unmasked interrupts are pending,
679 ThreadContext *tc = xc->tcBase();
680 if (SevMailbox == 1) {
681 SevMailbox = 0;
682 PseudoInst::quiesceSkip(tc);
683 } else if (tc->getCpuPtr()->getInterruptController(
684 tc->threadId())->checkInterrupts(tc)) {
685 PseudoInst::quiesceSkip(tc);
675
676 // WFE Sleeps if SevMailbox==0 and no unmasked interrupts are pending,
677 ThreadContext *tc = xc->tcBase();
678 if (SevMailbox == 1) {
679 SevMailbox = 0;
680 PseudoInst::quiesceSkip(tc);
681 } else if (tc->getCpuPtr()->getInterruptController(
682 tc->threadId())->checkInterrupts(tc)) {
683 PseudoInst::quiesceSkip(tc);
686 } else if (cpsr.el == EL0 && !sctlr.ntwe) {
687 PseudoInst::quiesceSkip(tc);
688 fault = std::make_shared<SupervisorTrap>(machInst, 0x1E00001,
689 EC_TRAPPED_WFI_WFE);
690 } else if (ArmSystem::haveVirtualization(tc) &&
691 !inSecureState(scr, cpsr) && (cpsr.mode != MODE_HYP) &&
692 hcr.twe) {
693 PseudoInst::quiesceSkip(tc);
694 fault = std::make_shared<HypervisorTrap>(machInst, 0x1E00001,
695 EC_TRAPPED_WFI_WFE);
696 } else if (ArmSystem::haveSecurity(tc) && cpsr.el != EL3 && scr.twe) {
697 PseudoInst::quiesceSkip(tc);
698 fault = std::make_shared<SecureMonitorTrap>(machInst, 0x1E00001,
699 EC_TRAPPED_WFI_WFE);
700 } else {
684 } else {
701 PseudoInst::quiesce(tc);
685 fault = trapWFx(tc, cpsr, scr, true);
686 if (fault == NoFault) {
687 PseudoInst::quiesce(tc);
688 } else {
689 PseudoInst::quiesceSkip(tc);
690 }
702 }
703 '''
704 wfePredFixUpCode = '''
705 // WFE is predicated false, reset SevMailbox to reduce spurious sleeps
706 // and SEV interrupts
707 SevMailbox = 1;
708 '''
709 wfeIop = InstObjParams("wfe", "WfeInst", "PredOp", \

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

715 header_output += BasicDeclare.subst(wfeIop)
716 decoder_output += BasicConstructor.subst(wfeIop)
717 exec_output += QuiescePredOpExecuteWithFixup.subst(wfeIop)
718
719 wfiCode = '''
720 HCR hcr = Hcr;
721 CPSR cpsr = Cpsr;
722 SCR scr = Scr64;
691 }
692 '''
693 wfePredFixUpCode = '''
694 // WFE is predicated false, reset SevMailbox to reduce spurious sleeps
695 // and SEV interrupts
696 SevMailbox = 1;
697 '''
698 wfeIop = InstObjParams("wfe", "WfeInst", "PredOp", \

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

704 header_output += BasicDeclare.subst(wfeIop)
705 decoder_output += BasicConstructor.subst(wfeIop)
706 exec_output += QuiescePredOpExecuteWithFixup.subst(wfeIop)
707
708 wfiCode = '''
709 HCR hcr = Hcr;
710 CPSR cpsr = Cpsr;
711 SCR scr = Scr64;
723 SCTLR sctlr = Sctlr;
724
725 // WFI doesn't sleep if interrupts are pending (masked or not)
726 ThreadContext *tc = xc->tcBase();
727 if (tc->getCpuPtr()->getInterruptController(
728 tc->threadId())->checkWfiWake(hcr, cpsr, scr)) {
729 PseudoInst::quiesceSkip(tc);
712
713 // WFI doesn't sleep if interrupts are pending (masked or not)
714 ThreadContext *tc = xc->tcBase();
715 if (tc->getCpuPtr()->getInterruptController(
716 tc->threadId())->checkWfiWake(hcr, cpsr, scr)) {
717 PseudoInst::quiesceSkip(tc);
730 } else if (cpsr.el == EL0 && !sctlr.ntwi) {
731 PseudoInst::quiesceSkip(tc);
732 fault = std::make_shared<SupervisorTrap>(machInst, 0x1E00000,
733 EC_TRAPPED_WFI_WFE);
734 } else if (ArmSystem::haveVirtualization(tc) && hcr.twi &&
735 (cpsr.mode != MODE_HYP) && !inSecureState(scr, cpsr)) {
736 PseudoInst::quiesceSkip(tc);
737 fault = std::make_shared<HypervisorTrap>(machInst, 0x1E00000,
738 EC_TRAPPED_WFI_WFE);
739 } else if (ArmSystem::haveSecurity(tc) && cpsr.el != EL3 && scr.twi) {
740 PseudoInst::quiesceSkip(tc);
741 fault = std::make_shared<SecureMonitorTrap>(machInst, 0x1E00000,
742 EC_TRAPPED_WFI_WFE);
743 } else {
718 } else {
744 PseudoInst::quiesce(tc);
719 fault = trapWFx(tc, cpsr, scr, false);
720 if (fault == NoFault) {
721 PseudoInst::quiesce(tc);
722 } else {
723 PseudoInst::quiesceSkip(tc);
724 }
745 }
746 tc->getCpuPtr()->clearInterrupt(tc->threadId(), INT_ABT, 0);
747 '''
748 wfiIop = InstObjParams("wfi", "WfiInst", "PredOp", \
749 { "code" : wfiCode, "predicate_test" : predicateTest },
750 ["IsNonSpeculative", "IsQuiesce",
751 "IsSerializeAfter", "IsUnverifiable"])
752 header_output += BasicDeclare.subst(wfiIop)

--- 503 unchanged lines hidden ---
725 }
726 tc->getCpuPtr()->clearInterrupt(tc->threadId(), INT_ABT, 0);
727 '''
728 wfiIop = InstObjParams("wfi", "WfiInst", "PredOp", \
729 { "code" : wfiCode, "predicate_test" : predicateTest },
730 ["IsNonSpeculative", "IsQuiesce",
731 "IsSerializeAfter", "IsUnverifiable"])
732 header_output += BasicDeclare.subst(wfiIop)

--- 503 unchanged lines hidden ---