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 --- |