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