1/* 2 * Copyright (c) 2004-2006 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 698 unchanged lines hidden (view full) --- 707*/ 708} 709 710template <class Impl> 711bool 712FullO3CPU<Impl>::drain(Event *drain_event) 713{ 714 drainCount = 0; |
715 fetch.drain(); 716 decode.drain(); 717 rename.drain(); 718 iew.drain(); 719 commit.drain(); |
720 // A bit of a hack...set the drainEvent after all the drain() 721 // calls have been made, that way if all of the stages drain 722 // immediately, the signalDrained() function knows not to call 723 // process on the drain event. 724 drainEvent = drain_event; |
725 726 // Wake the CPU and record activity so everything can drain out if |
727 // the CPU was not able to immediately drain. 728 if (_status != Drained) { 729 wakeCPU(); 730 activityRec.activity(); |
731 |
732 return false; 733 } else { 734 return true; 735 } |
736} 737 738template <class Impl> 739void 740FullO3CPU<Impl>::resume() 741{ 742 if (_status == SwitchedOut) 743 return; --- 10 unchanged lines hidden (view full) --- 754 755template <class Impl> 756void 757FullO3CPU<Impl>::signalDrained() 758{ 759 if (++drainCount == NumStages) { 760 if (tickEvent.scheduled()) 761 tickEvent.squash(); |
762 |
763 _status = Drained; |
764 765 if (drainEvent) { 766 drainEvent->process(); 767 drainEvent = NULL; 768 } |
769 } 770 assert(drainCount <= 5); 771} 772 773template <class Impl> 774void 775FullO3CPU<Impl>::switchOut() 776{ --- 522 unchanged lines hidden --- |