util: Split up the commands into separate files in the m5 util.

This way each individual command can have a unit test written for it,
covering how it gathers its arguments and puts them passes them to the
underlying dispatch function.

Change-Id: Ia629c412c8906fc6f5ae02c509ed630755cee45c
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27564
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Gabe Black
2020-04-07 00:23:05 -07:00
parent 4b1cd4f1a9
commit ff82cba034
15 changed files with 735 additions and 288 deletions

View File

@@ -33,7 +33,6 @@ env.Append(CPPPATH=Dir('.'))
args = 'args.cc'
call_type = 'call_type.cc'
command = 'command.cc'
commands = 'commands.cc'
m5 = 'm5.cc'
m5_mmap = 'm5_mmap.c'
usage = 'usage.cc'
@@ -59,6 +58,7 @@ static_env.Append(LINKFLAGS=[ '-no-pie', '-static' ])
#
libm5 = static_env.StaticLibrary('out/m5', [ m5_mmap ] + m5ops)
commands = env.SConscript('command/SConscript', exports={ "env": static_env })
#
# The m5 stand alone command line utility.

View File

@@ -0,0 +1,44 @@
# Copyright 2020 Google, Inc.
#
# 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.
Import('*')
command_ccs = [
'addsymbol.cc',
'checkpoint.cc',
'dumpresetstats.cc',
'dumpstats.cc',
'exit.cc',
'fail.cc',
'sum.cc',
'initparam.cc',
'loadsymbol.cc',
'readfile.cc',
'resetstats.cc',
'writefile.cc',
]
command_objs = list(map(env.StaticObject, command_ccs))
Return('command_objs')

View File

@@ -0,0 +1,53 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_add_symbol(const DispatchTable &dt, Args &args)
{
uint64_t addr;
if (!args.pop(addr))
usage();
const std::string &symbol = args.pop();
(*dt.m5_add_symbol)(addr, symbol.c_str());
}
Command add_symbol = {
"addsymbol", 2, 2, do_add_symbol, "<address> <symbol>\n"
" Adds a symbol with address \"address\" to gem5's "
"symbol table" };
} // anonymous namespace

View File

@@ -0,0 +1,52 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_checkpoint(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_checkpoint)(ns_delay, ns_period);
}
Command checkpoint = {
"checkpoint", 0, 2, do_checkpoint, "[delay [period]]\n"
" After delay (default 0) take a checkpoint, and then "
"optionally every period after" };
} // anonymous namespace

View File

@@ -0,0 +1,52 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_dump_reset_stats(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_dump_reset_stats)(ns_delay, ns_period);
}
Command dump_reset_stats = {
"dumpresetstats", 0, 2, do_dump_reset_stats, "[delay [period]]\n"
" After delay (default 0) dump and reset the stats, and then "
"optionally every period after" };
} // anonymous namespace

View File

@@ -0,0 +1,52 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_dump_stats(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_dump_stats)(ns_delay, ns_period);
}
Command dump_stats = {
"dumpstats", 0, 2, do_dump_stats, "[delay [period]]\n"
" After delay (default 0) dump the stats, and then optionally "
"every period after" };
} // anonymous namespace

View File

@@ -0,0 +1,51 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_exit(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay;
if (!args.pop(ns_delay, 0))
usage();
(*dt.m5_exit)(ns_delay);
}
Command exit_cmd = {
"exit", 0, 1, do_exit, "[delay]\n"
" Exit after delay, or immediately" };
} // anonymous namespace

View File

@@ -0,0 +1,51 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_fail(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, code;
if (!args.pop(code) || !args.pop(ns_delay, 0))
usage();
(*dt.m5_fail)(ns_delay, code);
}
Command fail_cmd = {
"fail", 1, 2, do_fail, "<code> [delay]\n"
" Exit with failure code code after delay, or immediately" };
} // anonymous namespace

View File

@@ -0,0 +1,53 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include <iostream>
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_initparam(const DispatchTable &dt, Args &args)
{
uint64_t key_str[2];
if (!args.pop(key_str, 2))
usage();
uint64_t val = (*dt.m5_init_param)(key_str[0], key_str[1]);
std::cout << val;
}
Command init_param = {
"initparam", 1, 1, do_initparam, "[key]\n"
" optional key may be at most 16 characters long" };
} // anonymous namespace

View File

@@ -0,0 +1,47 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_loadsymbol(const DispatchTable &dt, Args &args)
{
(*dt.m5_load_symbol)();
}
Command load_symbol = {
"loadsymbol", 0, 0, do_loadsymbol, "\n"
" load a preselected symbol file into gem5's symbol table" };
} // anonymous namespace

View File

@@ -0,0 +1,79 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include <cstring>
#include <iostream>
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
int
read_file(const DispatchTable &dt, std::ostream &os)
{
char buf[256 * 1024];
// Touch all buffer pages to ensure they are mapped in the
// page table. This is required in the case of X86_FS, where
// Linux does demand paging.
memset(buf, 0, sizeof(buf));
int len;
int offset = 0;
while ((len = (*dt.m5_read_file)(buf, sizeof(buf), offset)) > 0) {
os.write(buf, len);
os.flush();
if (!os) {
std::cerr << "Failed to write file" << std::endl;
exit(2);
}
offset += len;
}
return offset;
}
void
do_read_file(const DispatchTable &dt, Args &args)
{
if (args.size() > 0)
usage();
read_file(dt, std::cout);
}
Command read_file_cmd = {
"readfile", 0, 0, do_read_file, "\n"
" read a preselected file from the host and write it to "
"stdout" };
} // anonymous namespace

View File

@@ -0,0 +1,52 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
do_reset_stats(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_reset_stats)(ns_delay, ns_period);
}
Command reset_stats = {
"resetstats", 0, 2, do_reset_stats, "[delay [period]]\n"
" After delay (default 0) reset the stats, and then "
"optionally every period after" };
} // anonymous namespace

View File

@@ -0,0 +1,56 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include <iostream>
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
// For testing purposes.
void
do_sum(const DispatchTable &dt, Args &args)
{
uint64_t a, b, c, d, e, f;
if (!args.pop(a) || !args.pop(b) || !args.pop(c, 0) ||
!args.pop(d, 0) || !args.pop(e, 0) || !args.pop(f, 0))
usage();
unsigned sum = (*dt.m5_sum)(a, b, c, d, e, f);
std::cout << "Sum is " << sum << "." << std::endl;
}
Command sum = {
"sum", 2, 6, do_sum, "<a> <b> [c [d [e [f]]]]\n"
" Sum a-f (defaults are 0), for testing purposes" };
} // anonymous namespace

View File

@@ -0,0 +1,92 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include <cstring>
#include <fstream>
#include <iostream>
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
void
write_file(const DispatchTable &dt, const std::string &filename,
const std::string &host_filename)
{
std::cerr << "opening " << filename << std::endl;
std::ifstream src(filename, std::ios_base::in | std::ios_base::binary);
if (!src) {
std::cerr << "error opening " << filename << std::endl;
return;
}
char buf[256 * 1024];
int offset = 0;
memset(buf, 0, sizeof(buf));
while (true) {
src.seekg(offset);
src.read(buf, sizeof(buf));
int len = src.gcount();
if (!src && !src.eof())
break;
char *wbuf = buf;
while (len) {
int bytes = (*dt.m5_write_file)(
wbuf, len, offset, host_filename.c_str());
len -= bytes;
offset += bytes;
wbuf += bytes;
}
if (src.eof())
break;
}
std::cerr << "Wrote " << offset << " bytes." << std::endl;
}
void
do_write_file(const DispatchTable &dt, Args &args)
{
const std::string &filename = args.pop();
const std::string &host_filename = args.pop(filename);
write_file(dt, filename, host_filename);
}
Command write_file_cmd = {
"writefile", 1, 2, do_write_file, "<filename> [host filename]\n"
" Write a file to the host, optionally with a different "
"name" };
} // anonymous namespace

View File

@@ -1,287 +0,0 @@
/*
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* 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.
*/
#include <cstring>
#include <fstream>
#include <iostream>
#include "args.hh"
#include "command.hh"
#include "dispatch_table.hh"
#include "usage.hh"
namespace
{
int
read_file(const DispatchTable &dt, std::ostream &os)
{
char buf[256 * 1024];
// Touch all buffer pages to ensure they are mapped in the
// page table. This is required in the case of X86_FS, where
// Linux does demand paging.
memset(buf, 0, sizeof(buf));
int len;
int offset = 0;
while ((len = (*dt.m5_read_file)(buf, sizeof(buf), offset)) > 0) {
os.write(buf, len);
os.flush();
if (!os) {
std::cerr << "Failed to write file" << std::endl;
exit(2);
}
offset += len;
}
return offset;
}
void
write_file(const DispatchTable &dt, const std::string &filename,
const std::string &host_filename)
{
std::cerr << "opening " << filename << std::endl;
std::ifstream src(filename, std::ios_base::in | std::ios_base::binary);
if (!src) {
std::cerr << "error opening " << filename << std::endl;
return;
}
char buf[256 * 1024];
int offset = 0;
memset(buf, 0, sizeof(buf));
while (true) {
src.seekg(offset);
src.read(buf, sizeof(buf));
int len = src.gcount();
if (!src && !src.eof())
break;
char *wbuf = buf;
while (len) {
int bytes = (*dt.m5_write_file)(
wbuf, len, offset, host_filename.c_str());
len -= bytes;
offset += bytes;
wbuf += bytes;
}
if (src.eof())
break;
}
std::cerr << "Wrote " << offset << " bytes." << std::endl;
}
void
do_add_symbol(const DispatchTable &dt, Args &args)
{
uint64_t addr;
if (!args.pop(addr))
usage();
const std::string &symbol = args.pop();
(*dt.m5_add_symbol)(addr, symbol.c_str());
}
Command add_symbol = {
"addsymbol", 2, 2, do_add_symbol, "<address> <symbol>\n"
" Adds a symbol with address \"address\" to gem5's "
"symbol table" };
void
do_checkpoint(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_checkpoint)(ns_delay, ns_period);
}
Command checkpoint = {
"checkpoint", 0, 2, do_checkpoint, "[delay [period]]\n"
" After delay (default 0) take a checkpoint, and then "
"optionally every period after" };
void
do_dump_reset_stats(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_dump_reset_stats)(ns_delay, ns_period);
}
Command dump_reset_stats = {
"dumpresetstats", 0, 2, do_dump_reset_stats, "[delay [period]]\n"
" After delay (default 0) dump and reset the stats, and then "
"optionally every period after" };
void
do_dump_stats(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_dump_stats)(ns_delay, ns_period);
}
Command dump_stats = {
"dumpstats", 0, 2, do_dump_stats, "[delay [period]]\n"
" After delay (default 0) dump the stats, and then optionally "
"every period after" };
void
do_exit(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay;
if (!args.pop(ns_delay, 0))
usage();
(*dt.m5_exit)(ns_delay);
}
Command exit_cmd = {
"exit", 0, 1, do_exit, "[delay]\n"
" Exit after delay, or immediately" };
void
do_fail(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, code;
if (!args.pop(code) || !args.pop(ns_delay, 0))
usage();
(*dt.m5_fail)(ns_delay, code);
}
Command fail_cmd = {
"fail", 1, 2, do_fail, "<code> [delay]\n"
" Exit with failure code code after delay, or immediately" };
// For testing purposes.
void
do_sum(const DispatchTable &dt, Args &args)
{
uint64_t a, b, c, d, e, f;
if (!args.pop(a) || !args.pop(b) || !args.pop(c, 0) ||
!args.pop(d, 0) || !args.pop(e, 0) || !args.pop(f, 0))
usage();
unsigned sum = (*dt.m5_sum)(a, b, c, d, e, f);
std::cout << "Sum is " << sum << "." << std::endl;
}
Command sum = {
"sum", 2, 6, do_sum, "<a> <b> [c [d [e [f]]]]\n"
" Sum a-f (defaults are 0), for testing purposes" };
void
do_initparam(const DispatchTable &dt, Args &args)
{
uint64_t key_str[2];
if (!args.pop(key_str, 2))
usage();
uint64_t val = (*dt.m5_init_param)(key_str[0], key_str[1]);
std::cout << val;
}
Command init_param = {
"initparam", 1, 1, do_initparam, "[key]\n"
" optional key may be at most 16 characters long" };
void
do_loadsymbol(const DispatchTable &dt, Args &args)
{
(*dt.m5_load_symbol)();
}
Command load_symbol = {
"loadsymbol", 0, 0, do_loadsymbol, "\n"
" load a preselected symbol file into gem5's symbol table" };
void
do_read_file(const DispatchTable &dt, Args &args)
{
if (args.size() > 0)
usage();
read_file(dt, std::cout);
}
Command read_file_cmd = {
"readfile", 0, 0, do_read_file, "\n"
" read a preselected file from the host and write it to "
"stdout" };
void
do_reset_stats(const DispatchTable &dt, Args &args)
{
uint64_t ns_delay, ns_period;
if (!args.pop(ns_delay, 0) || !args.pop(ns_period, 0))
usage();
(*dt.m5_reset_stats)(ns_delay, ns_period);
}
Command reset_stats = {
"resetstats", 0, 2, do_reset_stats, "[delay [period]]\n"
" After delay (default 0) reset the stats, and then "
"optionally every period after" };
void
do_write_file(const DispatchTable &dt, Args &args)
{
const std::string &filename = args.pop();
const std::string &host_filename = args.pop(filename);
write_file(dt, filename, host_filename);
}
Command write_file_cmd = {
"writefile", 1, 2, do_write_file, "<filename> [host filename]\n"
" Write a file to the host, optionally with a different "
"name" };
} // anonymous namespace