sc_process_handle.hh revision 13317:36c574a4036e
15625Sgblack@eecs.umich.edu/* 25625Sgblack@eecs.umich.edu * Copyright 2018 Google, Inc. 35625Sgblack@eecs.umich.edu * 47087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 57087Snate@binkert.org * modification, are permitted provided that the following conditions are 67087Snate@binkert.org * met: redistributions of source code must retain the above copyright 77087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 87087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 97087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 107087Snate@binkert.org * documentation and/or other materials provided with the distribution; 117087Snate@binkert.org * neither the name of the copyright holders nor the names of its 125625Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 137087Snate@binkert.org * this software without specific prior written permission. 147087Snate@binkert.org * 157087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 167087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 177087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 187087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 197087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 207087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 215625Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 227087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 235625Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245625Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 255625Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265625Sgblack@eecs.umich.edu * 275625Sgblack@eecs.umich.edu * Authors: Gabe Black 285625Sgblack@eecs.umich.edu */ 295625Sgblack@eecs.umich.edu 305625Sgblack@eecs.umich.edu#ifndef __SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__ 315625Sgblack@eecs.umich.edu#define __SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__ 325625Sgblack@eecs.umich.edu 335625Sgblack@eecs.umich.edu#include <exception> 345625Sgblack@eecs.umich.edu#include <vector> 355625Sgblack@eecs.umich.edu 365625Sgblack@eecs.umich.edu#include "../utils/sc_report_handler.hh" 375625Sgblack@eecs.umich.edu#include "messages.hh" 385625Sgblack@eecs.umich.edu#include "sc_object.hh" 395625Sgblack@eecs.umich.edu 405625Sgblack@eecs.umich.edunamespace sc_gem5 415625Sgblack@eecs.umich.edu{ 425625Sgblack@eecs.umich.edu 435625Sgblack@eecs.umich.educlass Process; 445625Sgblack@eecs.umich.edu 455625Sgblack@eecs.umich.edustruct ProcessFuncWrapper 465625Sgblack@eecs.umich.edu{ 475625Sgblack@eecs.umich.edu virtual void call() = 0; 485625Sgblack@eecs.umich.edu virtual ~ProcessFuncWrapper() {} 495625Sgblack@eecs.umich.edu}; 505625Sgblack@eecs.umich.edu 515625Sgblack@eecs.umich.edutemplate <typename T> 525625Sgblack@eecs.umich.edustruct ProcessMemberFuncWrapper : public ProcessFuncWrapper 535625Sgblack@eecs.umich.edu{ 545625Sgblack@eecs.umich.edu typedef void (T::*TFunc)(); 555625Sgblack@eecs.umich.edu T *t; 565625Sgblack@eecs.umich.edu TFunc func; 575625Sgblack@eecs.umich.edu 585625Sgblack@eecs.umich.edu ProcessMemberFuncWrapper(T *t, TFunc func) : t(t), func(func) {} 595625Sgblack@eecs.umich.edu 605625Sgblack@eecs.umich.edu void call() override { (t->*func)(); } 615625Sgblack@eecs.umich.edu}; 625625Sgblack@eecs.umich.edu 635625Sgblack@eecs.umich.edustruct ExceptionWrapperBase 645625Sgblack@eecs.umich.edu{ 655625Sgblack@eecs.umich.edu virtual void throw_it() = 0; 665625Sgblack@eecs.umich.edu}; 675625Sgblack@eecs.umich.edu 685625Sgblack@eecs.umich.edutemplate <typename T> 695625Sgblack@eecs.umich.edustruct ExceptionWrapper : public ExceptionWrapperBase 705625Sgblack@eecs.umich.edu{ 715770Sgblack@eecs.umich.edu const T &t; 725770Sgblack@eecs.umich.edu ExceptionWrapper(const T &t) : t(t) {} 735770Sgblack@eecs.umich.edu 745770Sgblack@eecs.umich.edu void throw_it() { throw t; } 755838Sgblack@eecs.umich.edu}; 765770Sgblack@eecs.umich.edu 775770Sgblack@eecs.umich.eduvoid throw_it_wrapper(Process *p, ExceptionWrapperBase &exc, bool inc_kids); 785770Sgblack@eecs.umich.edu 795770Sgblack@eecs.umich.edu} // namespace sc_gem5 805625Sgblack@eecs.umich.edu 815625Sgblack@eecs.umich.edunamespace sc_core 825625Sgblack@eecs.umich.edu{ 835625Sgblack@eecs.umich.edu 845625Sgblack@eecs.umich.educlass sc_event; 855625Sgblack@eecs.umich.edu 865625Sgblack@eecs.umich.eduenum sc_curr_proc_kind 875625Sgblack@eecs.umich.edu{ 885625Sgblack@eecs.umich.edu SC_NO_PROC_, 895625Sgblack@eecs.umich.edu SC_METHOD_PROC_, 905625Sgblack@eecs.umich.edu SC_THREAD_PROC_, 915625Sgblack@eecs.umich.edu SC_CTHREAD_PROC_ 925625Sgblack@eecs.umich.edu}; 935625Sgblack@eecs.umich.edu 945625Sgblack@eecs.umich.eduenum sc_descendent_inclusion_info 955625Sgblack@eecs.umich.edu{ 965625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS, 975625Sgblack@eecs.umich.edu SC_INCLUDE_DESCENDANTS 985625Sgblack@eecs.umich.edu}; 995625Sgblack@eecs.umich.edu 1005825Sgblack@eecs.umich.educlass sc_unwind_exception : public std::exception 1015825Sgblack@eecs.umich.edu{ 1025825Sgblack@eecs.umich.edu public: 1035625Sgblack@eecs.umich.edu virtual const char *what() const throw(); 1045625Sgblack@eecs.umich.edu virtual bool is_reset() const; 1055625Sgblack@eecs.umich.edu 1065625Sgblack@eecs.umich.edu // Nonstandard. 1075625Sgblack@eecs.umich.edu // These should be protected, but I think this is to enable catch by 1085625Sgblack@eecs.umich.edu // value. 1095625Sgblack@eecs.umich.edu public: 1105625Sgblack@eecs.umich.edu sc_unwind_exception(const sc_unwind_exception &); 1115625Sgblack@eecs.umich.edu virtual ~sc_unwind_exception() throw(); 1125625Sgblack@eecs.umich.edu 1135625Sgblack@eecs.umich.edu protected: 1145625Sgblack@eecs.umich.edu bool _isReset; 1155625Sgblack@eecs.umich.edu sc_unwind_exception(); 1165625Sgblack@eecs.umich.edu}; 1175625Sgblack@eecs.umich.edu 1185625Sgblack@eecs.umich.edu// Deprecated 1195625Sgblack@eecs.umich.edu// An incomplete version of sc_process_b to satisfy the tests. 1205625Sgblack@eecs.umich.educlass sc_process_b : public sc_object 1215625Sgblack@eecs.umich.edu{ 1225625Sgblack@eecs.umich.edu public: 1235625Sgblack@eecs.umich.edu sc_process_b(const char *name) : sc_object(name), file(nullptr), lineno(0) 1245625Sgblack@eecs.umich.edu {} 1255625Sgblack@eecs.umich.edu sc_process_b() : sc_object(), file(nullptr), lineno(0) {} 1265625Sgblack@eecs.umich.edu 1275625Sgblack@eecs.umich.edu const char *file; 1285625Sgblack@eecs.umich.edu int lineno; 1295625Sgblack@eecs.umich.edu}; 1305625Sgblack@eecs.umich.edu 1315625Sgblack@eecs.umich.edu// Nonstandard 1325625Sgblack@eecs.umich.eduvoid sc_set_location(const char *file, int lineno); 1335625Sgblack@eecs.umich.edu 1345625Sgblack@eecs.umich.edu// Deprecated 1355625Sgblack@eecs.umich.edusc_process_b *sc_get_curr_process_handle(); 1365625Sgblack@eecs.umich.edustatic inline sc_process_b * 1375625Sgblack@eecs.umich.edusc_get_current_process_b() 1385625Sgblack@eecs.umich.edu{ 1395625Sgblack@eecs.umich.edu return sc_get_curr_process_handle(); 1405625Sgblack@eecs.umich.edu} 1415625Sgblack@eecs.umich.edu 1425625Sgblack@eecs.umich.edu// Deprecated/nonstandard 1435625Sgblack@eecs.umich.edustruct sc_curr_proc_info 1445625Sgblack@eecs.umich.edu{ 1455625Sgblack@eecs.umich.edu sc_process_b *process_handle; 1465625Sgblack@eecs.umich.edu sc_curr_proc_kind kind; 1475625Sgblack@eecs.umich.edu sc_curr_proc_info() : process_handle(NULL), kind(SC_NO_PROC_) {} 1485625Sgblack@eecs.umich.edu}; 1495625Sgblack@eecs.umich.edutypedef const sc_curr_proc_info *sc_curr_proc_handle; 1505625Sgblack@eecs.umich.edu 1515625Sgblack@eecs.umich.educlass sc_process_handle 1525625Sgblack@eecs.umich.edu{ 1535625Sgblack@eecs.umich.edu private: 1545625Sgblack@eecs.umich.edu ::sc_gem5::Process *_gem5_process; 1555625Sgblack@eecs.umich.edu 1565625Sgblack@eecs.umich.edu public: 1575625Sgblack@eecs.umich.edu sc_process_handle(); 1585625Sgblack@eecs.umich.edu sc_process_handle(const sc_process_handle &); 1595625Sgblack@eecs.umich.edu explicit sc_process_handle(sc_object *); 1605625Sgblack@eecs.umich.edu ~sc_process_handle(); 1615625Sgblack@eecs.umich.edu 1625625Sgblack@eecs.umich.edu // These non-standard operators provide access to the data structure which 1635625Sgblack@eecs.umich.edu // actually tracks the process within gem5. By making them operators, we 1645625Sgblack@eecs.umich.edu // can minimize the symbols added to the class namespace. 1655625Sgblack@eecs.umich.edu operator ::sc_gem5::Process * () const { return _gem5_process; } 1665625Sgblack@eecs.umich.edu sc_process_handle & 1675625Sgblack@eecs.umich.edu operator = (::sc_gem5::Process *p) 1685625Sgblack@eecs.umich.edu { 1695625Sgblack@eecs.umich.edu _gem5_process = p; 1705625Sgblack@eecs.umich.edu return *this; 1715625Sgblack@eecs.umich.edu } 1725625Sgblack@eecs.umich.edu 1735625Sgblack@eecs.umich.edu bool valid() const; 1745625Sgblack@eecs.umich.edu 1755625Sgblack@eecs.umich.edu sc_process_handle &operator = (const sc_process_handle &); 1765625Sgblack@eecs.umich.edu bool operator == (const sc_process_handle &) const; 1775625Sgblack@eecs.umich.edu bool operator != (const sc_process_handle &) const; 1785625Sgblack@eecs.umich.edu bool operator < (const sc_process_handle &) const; 1795625Sgblack@eecs.umich.edu void swap(sc_process_handle &); 1805625Sgblack@eecs.umich.edu 1815625Sgblack@eecs.umich.edu const char *name() const; 1825625Sgblack@eecs.umich.edu sc_curr_proc_kind proc_kind() const; 1835625Sgblack@eecs.umich.edu const std::vector<sc_object *> &get_child_objects() const; 1845625Sgblack@eecs.umich.edu const std::vector<sc_event *> &get_child_events() const; 1855625Sgblack@eecs.umich.edu sc_object *get_parent_object() const; 1865625Sgblack@eecs.umich.edu sc_object *get_process_object() const; 1875625Sgblack@eecs.umich.edu bool dynamic() const; 1885625Sgblack@eecs.umich.edu bool terminated() const; 1895625Sgblack@eecs.umich.edu const sc_event &terminated_event() const; 1905625Sgblack@eecs.umich.edu 1915625Sgblack@eecs.umich.edu void suspend(sc_descendent_inclusion_info include_descendants= 1925625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 1935625Sgblack@eecs.umich.edu void resume(sc_descendent_inclusion_info include_descendants= 1945625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 1955625Sgblack@eecs.umich.edu void disable(sc_descendent_inclusion_info include_descendants= 1965625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 1975625Sgblack@eecs.umich.edu void enable(sc_descendent_inclusion_info include_descendants= 1985625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 1995625Sgblack@eecs.umich.edu void kill(sc_descendent_inclusion_info include_descendants= 2005625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 2015625Sgblack@eecs.umich.edu void reset(sc_descendent_inclusion_info include_descendants= 2025625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 2035625Sgblack@eecs.umich.edu bool is_unwinding(); 2045625Sgblack@eecs.umich.edu const sc_event &reset_event() const; 2055625Sgblack@eecs.umich.edu 2065625Sgblack@eecs.umich.edu void sync_reset_on(sc_descendent_inclusion_info include_descendants= 2075625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 2085625Sgblack@eecs.umich.edu void sync_reset_off(sc_descendent_inclusion_info include_descendants= 2095625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS); 2105625Sgblack@eecs.umich.edu 2115625Sgblack@eecs.umich.edu template <typename T> 2125625Sgblack@eecs.umich.edu void 2135625Sgblack@eecs.umich.edu throw_it(const T &user_defined_exception, 2145625Sgblack@eecs.umich.edu sc_descendent_inclusion_info include_descendants= 2155625Sgblack@eecs.umich.edu SC_NO_DESCENDANTS) 2165625Sgblack@eecs.umich.edu { 2175625Sgblack@eecs.umich.edu if (!_gem5_process) { 2185625Sgblack@eecs.umich.edu SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "throw_it()"); 2195625Sgblack@eecs.umich.edu return; 2205625Sgblack@eecs.umich.edu } 2215625Sgblack@eecs.umich.edu ::sc_gem5::ExceptionWrapper<T> exc(user_defined_exception); 2225625Sgblack@eecs.umich.edu ::sc_gem5::throw_it_wrapper(_gem5_process, exc, 2235625Sgblack@eecs.umich.edu include_descendants == SC_INCLUDE_DESCENDANTS); 2245625Sgblack@eecs.umich.edu } 225}; 226 227sc_process_handle sc_get_current_process_handle(); 228bool sc_is_unwinding(); 229 230// Nonstandard 231// See Accellera's kernel/sim_context.cpp for an explanation of what this is 232// supposed to do. It essentially selects what happens during certain 233// undefined situations. 234extern bool sc_allow_process_control_corners; 235 236} // namespace sc_core 237 238#endif //__SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__ 239