diff options
Diffstat (limited to 'src/mem/ruby/interfaces/mf_api.hh')
-rw-r--r-- | src/mem/ruby/interfaces/mf_api.hh | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/mem/ruby/interfaces/mf_api.hh b/src/mem/ruby/interfaces/mf_api.hh new file mode 100644 index 000000000..c04a39308 --- /dev/null +++ b/src/mem/ruby/interfaces/mf_api.hh @@ -0,0 +1,165 @@ + +/* + * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/*------------------------------------------------------------------------*/ +/* Includes */ +/*------------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------*/ +/* Macro declarations */ +/*------------------------------------------------------------------------*/ + +#ifndef _MF_MEMORY_API_H_ +#define _MF_MEMORY_API_H_ + +#ifdef SIMICS30 +#ifndef pa_t +typedef physical_address_t pa_t; +typedef physical_address_t la_t; +#endif +#endif + +/** + * Defines types of memory requests + */ +typedef enum OpalMemop { + OPAL_LOAD, + OPAL_STORE, + OPAL_IFETCH, + OPAL_ATOMIC, +} OpalMemop_t; + +/*------------------------------------------------------------------------*/ +/* Class declaration(s) */ +/*------------------------------------------------------------------------*/ + +/** +* structure which provides an interface between ruby and opal. +*/ +typedef struct mf_opal_api { + /** + * @name Methods + */ + //@{ + /** + * notify processor model that data from address address is available at proc + */ + void (*hitCallback)( int cpuNumber, pa_t phys_address, OpalMemop_t type, int thread ); + + /** + * notify opal that ruby is loaded, or removed + */ + void (*notifyCallback)( int status ); + + /** + * query for the number of instructions executed on a given processor. + */ + integer_t (*getInstructionCount)( int cpuNumber ); + + // for printing out debug info on crash + void (*printDebug)(); + + /** query Opal for the current time */ + uint64 (*getOpalTime)(int cpuNumber); + + /** For WATTCH power stats */ + // Called whenever L2 is accessed + void (*incrementL2Access)(int cpuNumber); + // Called whenever prefetcher is accessed + void (*incrementPrefetcherAccess)(int cpuNumber, int num_prefetches, int isinstr); + + /* Called whenever there's an L2 miss */ + void (*notifyL2Miss)(int cpuNumber, physical_address_t physicalAddr, OpalMemop_t type, int tagexists); + + //@} +} mf_opal_api_t; + +typedef struct mf_ruby_api { + /** + * @name Methods + */ + //@{ + /** + * Check to see if the system is ready for more requests + */ + int (*isReady)( int cpuNumber, la_t logicalAddr, pa_t physicalAddr, OpalMemop_t typeOfRequest, int thread ); + + /** + * Make a 'mandatory' request to the memory hierarchy + */ + void (*makeRequest)( int cpuNumber, la_t logicalAddr, pa_t physicalAddr, + int requestSize, OpalMemop_t typeOfRequest, + la_t virtualPC, int isPriv, int thread); + + /** + * Make a prefetch request to the memory hierarchy + */ + void (*makePrefetch)( int cpuNumber, la_t logicalAddr, pa_t physicalAddr, + int requestSize, OpalMemop_t typeOfRequest, + la_t virtualPC, int isPriv, int thread); + + /** + * Ask the memory hierarchy for 'stale' data that can be used for speculation + * Returns true (1) if the tag matches, false (0) if not. + */ + int (*staleDataRequest)( int cpuNumber, pa_t physicalAddr, + int requestSize, int8 *buffer ); + + /** + * Advance ruby's cycle time one step + */ + void (*advanceTime)( void ); + + /** + * Get ruby's cycle time count. + */ + uint64 (*getTime)( void ); + + /** prints Ruby's outstanding request table */ + void (*printProgress)(int cpuNumber); + + /** + * notify ruby that opal is loaded, or removed + */ + void (*notifyCallback)( int status ); + + // Returns the number of outstanding request + int (*getNumberOutstanding)(int cpuNumber); + + // Returns the number of outstanding demand requests + int (*getNumberOutstandingDemand)(int cpuNumber ); + + // Returns the number of outstanding prefetch request + int (*getNumberOutstandingPrefetch)(int cpuNumber ); + + + //@} +} mf_ruby_api_t; + +#endif //_MF_MEMORY_API_H_ |