From: Gabe Black Date: Sat, 4 Apr 2020 07:55:41 +0000 (-0700) Subject: util: Convert the m5 utility to C++. X-Git-Tag: v20.1.0.0~532 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4b0162342b304ac12d10afac18c1c8656ec2493d;p=gem5.git util: Convert the m5 utility to C++. This will make it possible to use the googletest unit testing framework, and will let us use c++ mechanisms to simplify and streamline the code. Change-Id: I8ab358de47ce6b5c2d601cc0b9f2a694b2037a9b Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27548 Tested-by: kokoro Reviewed-by: Gabe Black Reviewed-by: Daniel Carvalho Maintainer: Gabe Black --- diff --git a/util/m5/SConstruct b/util/m5/SConstruct index 48073d24f..8ff6aeabf 100644 --- a/util/m5/SConstruct +++ b/util/m5/SConstruct @@ -38,6 +38,7 @@ def abspath(d): return os.path.abspath(str(d)) # Universal settings. +main.Append(CXXFLAGS=[ '-O2' ]) main.Append(CCFLAGS=[ '-O2' ]) main.Append(CPPPATH=[ common_include ]) @@ -45,6 +46,7 @@ main.Append(CPPPATH=[ common_include ]) main['ENV']['PATH'] = os.environ['PATH'] main['CC'] = '${CROSS_COMPILE}gcc' +main['CXX'] = '${CROSS_COMPILE}g++' main['AS'] = '${CROSS_COMPILE}as' main['LD'] = '${CROSS_COMPILE}ld' main['AR'] = '${CROSS_COMPILE}ar' diff --git a/util/m5/src/SConscript b/util/m5/src/SConscript index 6e5cd6cda..0961f2f5d 100644 --- a/util/m5/src/SConscript +++ b/util/m5/src/SConscript @@ -28,15 +28,15 @@ import os Import('*') # Raw source files. -args = 'args.c' -call_type = 'call_type.c' -commands = 'commands.c' -m5 = 'm5.c' +args = 'args.cc' +call_type = 'call_type.cc' +commands = 'commands.cc' +m5 = 'm5.cc' m5_mmap = 'm5_mmap.c' -usage = 'usage.c' +usage = 'usage.cc' jni = 'jni_gem5Op.c' -lua = 'lua_gem5Op.c' +lua = 'lua_gem5Op.cc' all_call_types = list(env['CALL_TYPE'].values()) call_types = list([ ct for ct in all_call_types if ct.enabled ]) @@ -52,11 +52,11 @@ static_env = env.Clone() static_env.Append(LINKFLAGS=[ '-no-pie', '-static' ]) for ct in all_call_types: - static_env.Append(CFLAGS='-DENABLE_CT_%s=%d' % + static_env.Append(CXXFLAGS='-DENABLE_CT_%s=%d' % (ct.name, 1 if ct.enabled else 0)) - static_env.Append(CFLAGS='-DDEFAULT_CT_%s=%d' % + static_env.Append(CXXFLAGS='-DDEFAULT_CT_%s=%d' % (ct.name, 1 if ct.default else 0)) -static_env.Append(CFLAGS='-DDEFAULT_CALL_TYPE=%s' % default_call_type.name) +static_env.Append(CXXFLAGS='-DDEFAULT_CALL_TYPE=%s' % default_call_type.name) # # The m5 library for use in other C/C++ programs. @@ -67,7 +67,7 @@ libm5 = static_env.StaticLibrary('out/m5', [ m5_mmap ] + m5ops) # # The m5 stand alone command line utility. # -ct_support = list([ File('%s_call_type.c' % ct.name) for ct in call_types ]) +ct_support = list([ File('%s_call_type.cc' % ct.name) for ct in call_types ]) m5_bin = static_env.Program('out/m5', ct_support + [ args, call_type, commands, m5, m5_mmap, libm5, usage ]) diff --git a/util/m5/src/addr_call_type.c b/util/m5/src/addr_call_type.c deleted file mode 100644 index 6c6ebe22c..000000000 --- a/util/m5/src/addr_call_type.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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. - */ - -#include - -#include "addr_call_type.h" -#include "args.h" -#include "m5_mmap.h" - -#define M5OP(name, func) __typeof__(name) M5OP_MERGE_TOKENS(name, _addr); -M5OP_FOREACH -#undef M5OP - -static DispatchTable addr_dispatch = { -#define M5OP(name, func) .name = &M5OP_MERGE_TOKENS(name, _addr), -M5OP_FOREACH -#undef M5OP -}; - -int -addr_call_type_detect(Args *args) -{ - static const char *prefix = "--addr"; - const size_t prefix_len = strlen(prefix); - uint64_t addr_override; - - // If the first argument starts with --addr... - if (args->argc && memcmp(args->argv[0], prefix, prefix_len) == 0) { - const char *argv0 = pop_arg(args); - - // If there's more text in this argument... - if (strlen(argv0) != prefix_len) { - // If it doesn't start with '=', it's malformed. - if (argv0[prefix_len] != '=') - return -1; - // Attempt to extract an address after the '='. - const char *temp_argv[] = { &argv0[prefix_len + 1] }; - Args temp_args = { 1, temp_argv }; - if (!parse_int_args(&temp_args, &addr_override, 1)) - return -1; - // If we found an address, use it to override m5op_addr. - m5op_addr = addr_override; - return 1; - } - // If an address override wasn't part of the first argument, check if - // it's the second argument. If not, then there's no override. - if (args->argc && parse_int_args(args, &addr_override, 1)) { - m5op_addr = addr_override; - return 1; - } - // If the default address was zero, an override is required. - if (!m5op_addr) - return -1; - return 1; - } - return 0; -} - -DispatchTable * -addr_call_type_init() -{ - map_m5_mem(); - return &addr_dispatch; -} diff --git a/util/m5/src/addr_call_type.cc b/util/m5/src/addr_call_type.cc new file mode 100644 index 000000000..cdf5e5d7f --- /dev/null +++ b/util/m5/src/addr_call_type.cc @@ -0,0 +1,91 @@ +/* + * 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. + */ + +#include + +#include "addr_call_type.hh" +#include "args.hh" +#include "m5_mmap.h" + +extern "C" +{ +#define M5OP(name, func) __typeof__(name) M5OP_MERGE_TOKENS(name, _addr); +M5OP_FOREACH +#undef M5OP +} + +static DispatchTable addr_dispatch = { +#define M5OP(name, func) .name = &::M5OP_MERGE_TOKENS(name, _addr), +M5OP_FOREACH +#undef M5OP +}; + +int +addr_call_type_detect(Args *args) +{ + static const char *prefix = "--addr"; + const size_t prefix_len = strlen(prefix); + uint64_t addr_override; + + // If the first argument starts with --addr... + if (args->argc && memcmp(args->argv[0], prefix, prefix_len) == 0) { + const char *argv0 = pop_arg(args); + + // If there's more text in this argument... + if (strlen(argv0) != prefix_len) { + // If it doesn't start with '=', it's malformed. + if (argv0[prefix_len] != '=') + return -1; + // Attempt to extract an address after the '='. + const char *temp_argv[] = { &argv0[prefix_len + 1] }; + Args temp_args = { 1, temp_argv }; + if (!parse_int_args(&temp_args, &addr_override, 1)) + return -1; + // If we found an address, use it to override m5op_addr. + m5op_addr = addr_override; + return 1; + } + // If an address override wasn't part of the first argument, check if + // it's the second argument. If not, then there's no override. + if (args->argc && parse_int_args(args, &addr_override, 1)) { + m5op_addr = addr_override; + return 1; + } + // If the default address was zero, an override is required. + if (!m5op_addr) + return -1; + return 1; + } + return 0; +} + +DispatchTable * +addr_call_type_init() +{ + map_m5_mem(); + return &addr_dispatch; +} diff --git a/util/m5/src/addr_call_type.h b/util/m5/src/addr_call_type.h deleted file mode 100644 index 33fdf02b3..000000000 --- a/util/m5/src/addr_call_type.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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. - */ - -#ifndef __ADDR_CALL_TYPE_H__ -#define __ADDR_CALL_TYPE_H__ - -#include "args.h" -#include "dispatch_table.h" - -// Returns 0 if not detected, 1 if detected successfully, and -1 on error. -int addr_call_type_detect(Args *args); -DispatchTable *addr_call_type_init(); - -#endif // __ADDR_CALL_TYPE_H__ diff --git a/util/m5/src/addr_call_type.hh b/util/m5/src/addr_call_type.hh new file mode 100644 index 000000000..a327fd64e --- /dev/null +++ b/util/m5/src/addr_call_type.hh @@ -0,0 +1,38 @@ +/* + * 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. + */ + +#ifndef __ADDR_CALL_TYPE_HH__ +#define __ADDR_CALL_TYPE_HH__ + +#include "args.hh" +#include "dispatch_table.hh" + +// Returns 0 if not detected, 1 if detected successfully, and -1 on error. +int addr_call_type_detect(Args *args); +DispatchTable *addr_call_type_init(); + +#endif // __ADDR_CALL_TYPE_HH__ diff --git a/util/m5/src/args.c b/util/m5/src/args.c deleted file mode 100644 index 68753e9f7..000000000 --- a/util/m5/src/args.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2011, 2017 ARM Limited - * All rights reserved - * - * The license below extends only to copyright in the software and shall - * not be construed as granting a license to any other intellectual - * property including but not limited to intellectual property relating - * to a hardware implementation of the functionality of the software - * licensed hereunder. You may use the software subject to the license - * terms below provided that you ensure that this notice is replicated - * unmodified and in its entirety in all distributions of the software, - * modified or unmodified, in source code or in binary form. - * - * 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 -#include -#include - -#include "args.h" - -int -parse_int_args(Args *args, uint64_t ints[], int len) -{ - if (args->argc > len) - return 0; - -// On 32 bit platforms we need to use strtoull to do the conversion -#ifdef __LP64__ -#define strto64 strtoul -#else -#define strto64 strtoull -#endif - for (int i = 0; i < len; ++i) { - const char *arg = pop_arg(args); - ints[i] = arg ? strto64(arg, NULL, 0) : 0; - } - -#undef strto64 - return 1; -} - -int -pack_arg_into_regs(Args *args, uint64_t regs[], int num_regs) -{ - const size_t RegSize = sizeof(regs[0]); - const size_t MaxLen = num_regs * RegSize; - const char *arg = pop_arg(args); - - memset(regs, 0, MaxLen); - - size_t len = arg ? strlen(arg) : 0; - - if (len > MaxLen) - return 0; - - while (len) { - for (int offset = 0; offset < RegSize && len; offset++, len--) { - int shift = offset * 8; - *regs |= (uint64_t)(uint8_t)*arg++ << shift; - } - regs++; - } - return 1; -} diff --git a/util/m5/src/args.cc b/util/m5/src/args.cc new file mode 100644 index 000000000..96689b802 --- /dev/null +++ b/util/m5/src/args.cc @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2011, 2017 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * 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 +#include +#include + +#include "args.hh" + +int +parse_int_args(Args *args, uint64_t ints[], int len) +{ + if (args->argc > len) + return 0; + +// On 32 bit platforms we need to use strtoull to do the conversion +#ifdef __LP64__ +#define strto64 strtoul +#else +#define strto64 strtoull +#endif + for (int i = 0; i < len; ++i) { + const char *arg = pop_arg(args); + ints[i] = arg ? strto64(arg, NULL, 0) : 0; + } + +#undef strto64 + return 1; +} + +int +pack_arg_into_regs(Args *args, uint64_t regs[], int num_regs) +{ + const size_t RegSize = sizeof(regs[0]); + const size_t MaxLen = num_regs * RegSize; + const char *arg = pop_arg(args); + + memset(regs, 0, MaxLen); + + size_t len = arg ? strlen(arg) : 0; + + if (len > MaxLen) + return 0; + + while (len) { + for (int offset = 0; offset < RegSize && len; offset++, len--) { + int shift = offset * 8; + *regs |= (uint64_t)(uint8_t)*arg++ << shift; + } + regs++; + } + return 1; +} diff --git a/util/m5/src/args.h b/util/m5/src/args.h deleted file mode 100644 index 911db7786..000000000 --- a/util/m5/src/args.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2011, 2017 ARM Limited - * All rights reserved - * - * The license below extends only to copyright in the software and shall - * not be construed as granting a license to any other intellectual - * property including but not limited to intellectual property relating - * to a hardware implementation of the functionality of the software - * licensed hereunder. You may use the software subject to the license - * terms below provided that you ensure that this notice is replicated - * unmodified and in its entirety in all distributions of the software, - * modified or unmodified, in source code or in binary form. - * - * 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. - */ - -#ifndef __ARGS_H__ -#define __ARGS_H__ - -#include -#include - -typedef struct Args -{ - int argc; - const char **argv; -} Args; - -static inline const char * -pop_arg(Args *args) -{ - if (!args->argc) - return NULL; - args->argc--; - return (args->argv++)[0]; -} - -int parse_int_args(Args *args, uint64_t ints[], int len); -int pack_arg_into_regs(Args *args, uint64_t regs[], int num_regs); - -#endif // __ARGS_H__ diff --git a/util/m5/src/args.hh b/util/m5/src/args.hh new file mode 100644 index 000000000..3fc22a295 --- /dev/null +++ b/util/m5/src/args.hh @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2011, 2017 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * 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. + */ + +#ifndef __ARGS_HH__ +#define __ARGS_HH__ + +#include +#include + +struct Args +{ + int argc; + const char **argv; +}; + +static inline const char * +pop_arg(Args *args) +{ + if (!args->argc) + return NULL; + args->argc--; + return (args->argv++)[0]; +} + +int parse_int_args(Args *args, uint64_t ints[], int len); +int pack_arg_into_regs(Args *args, uint64_t regs[], int num_regs); + +#endif // __ARGS_HH__ diff --git a/util/m5/src/arm/SConsopts b/util/m5/src/arm/SConsopts index e2517580f..8956b2e2e 100644 --- a/util/m5/src/arm/SConsopts +++ b/util/m5/src/arm/SConsopts @@ -27,6 +27,6 @@ Import('*') env['VARIANT'] = 'arm' get_variant_opt('CROSS_COMPILE', 'arm-linux-gnueabihf-') -env.Append(CFLAGS='-march=armv7-a') +env.Append(CXXFLAGS='-march=armv7-a') env['CALL_TYPE']['inst'].impl('m5op.S', default=True) diff --git a/util/m5/src/call_type.c b/util/m5/src/call_type.c deleted file mode 100644 index 5792f07a0..000000000 --- a/util/m5/src/call_type.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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. - */ - -#include "args.h" -#include "call_type.h" -#include "usage.h" - -#if ENABLE_CT_addr -#include "addr_call_type.h" -#endif -#if ENABLE_CT_inst -#include "inst_call_type.h" -#endif -#if ENABLE_CT_semi -#include "semi_call_type.h" -#endif - -#define default_call_type_init() \ - M5OP_MERGE_TOKENS(DEFAULT_CALL_TYPE, _call_type_init()) - -DispatchTable * -init_call_type(Args *args) -{ -# if ENABLE_CT_inst - if (inst_call_type_detect(args)) - return inst_call_type_init(); -# endif -# if ENABLE_CT_addr - int detect = addr_call_type_detect(args); - if (detect < 0) - usage(); - if (detect > 0) - return addr_call_type_init(); -# endif -# if ENABLE_CT_semi - if (semi_call_type_detect(args)) - return semi_call_type_init(); -# endif - return default_call_type_init(); -} diff --git a/util/m5/src/call_type.cc b/util/m5/src/call_type.cc new file mode 100644 index 000000000..96b886933 --- /dev/null +++ b/util/m5/src/call_type.cc @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "args.hh" +#include "call_type.hh" +#include "usage.hh" + +#if ENABLE_CT_addr +#include "addr_call_type.hh" +#endif +#if ENABLE_CT_inst +#include "inst_call_type.hh" +#endif +#if ENABLE_CT_semi +#include "semi_call_type.hh" +#endif + +#define default_call_type_init() \ + M5OP_MERGE_TOKENS(DEFAULT_CALL_TYPE, _call_type_init()) + +DispatchTable * +init_call_type(Args *args) +{ +# if ENABLE_CT_inst + if (inst_call_type_detect(args)) + return inst_call_type_init(); +# endif +# if ENABLE_CT_addr + int detect = addr_call_type_detect(args); + if (detect < 0) + usage(); + if (detect > 0) + return addr_call_type_init(); +# endif +# if ENABLE_CT_semi + if (semi_call_type_detect(args)) + return semi_call_type_init(); +# endif + return default_call_type_init(); +} diff --git a/util/m5/src/call_type.h b/util/m5/src/call_type.h deleted file mode 100644 index 7166670d3..000000000 --- a/util/m5/src/call_type.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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. - */ - -#ifndef __CALL_TYPE_H__ -#define __CALL_TYPE_H__ - -#include "args.h" -#include "dispatch_table.h" - -DispatchTable *init_call_type(Args *args); - -#endif // __CALL_TYPE_H__ diff --git a/util/m5/src/call_type.hh b/util/m5/src/call_type.hh new file mode 100644 index 000000000..92cd9c960 --- /dev/null +++ b/util/m5/src/call_type.hh @@ -0,0 +1,36 @@ +/* + * 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. + */ + +#ifndef __CALL_TYPE_HH__ +#define __CALL_TYPE_HH__ + +#include "args.hh" +#include "dispatch_table.hh" + +DispatchTable *init_call_type(Args *args); + +#endif // __CALL_TYPE_HH__ diff --git a/util/m5/src/commands.c b/util/m5/src/commands.c deleted file mode 100644 index 8dd459c29..000000000 --- a/util/m5/src/commands.c +++ /dev/null @@ -1,257 +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 -#include -#include -#include -#include -#include -#include - -#include "args.h" -#include "commands.h" -#include "usage.h" - -static int -read_file(DispatchTable *dt, int dest_fid) -{ - uint8_t buf[256*1024]; - int offset = 0; - int len, ret; - - // 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)); - - while ((len = (*dt->m5_read_file)(buf, sizeof(buf), offset)) > 0) { - uint8_t *base = buf; - offset += len; - do { - ret = write(dest_fid, base, len); - if (ret < 0) { - perror("Failed to write file"); - exit(2); - } else if (ret == 0) { - fprintf(stderr, "Failed to write file: " - "Unhandled short write\n"); - exit(2); - } - - base += ret; - len -= ret; - } while (len); - } - - return offset; -} - -static void -write_file(DispatchTable *dt, const char *filename, const char *host_filename) -{ - fprintf(stderr, "opening %s\n", filename); - int src_fid = open(filename, O_RDONLY); - - if (src_fid < 0) { - fprintf(stderr, "error opening %s\n", filename); - return; - } - - char buf[256*1024]; - int offset = 0; - int len; - int bytes = 0; - - memset(buf, 0, sizeof(buf)); - - while ((len = read(src_fid, buf, sizeof(buf))) > 0) { - bytes += (*dt->m5_write_file)(buf, len, offset, host_filename); - offset += len; - } - fprintf(stderr, "written %d bytes\n", bytes); - - close(src_fid); -} - -static void -do_exit(DispatchTable *dt, Args *args) -{ - if (args->argc > 1) - usage(); - - uint64_t ints[1]; - if (!parse_int_args(args, ints, 1)) - usage(); - (*dt->m5_exit)(ints[0]); -} - -static void -do_fail(DispatchTable *dt, Args *args) -{ - if (args->argc < 1 || args->argc > 2) - usage(); - - uint64_t ints[2] = { 0, 0 }; - if (!parse_int_args(args, ints, args->argc)) - usage(); - (*dt->m5_fail)(ints[1], ints[0]); -} - -static void -do_reset_stats(DispatchTable *dt, Args *args) -{ - uint64_t ints[2]; - if (!parse_int_args(args, ints, 2)) - usage(); - (*dt->m5_reset_stats)(ints[0], ints[1]); -} - -static void -do_dump_stats(DispatchTable *dt, Args *args) -{ - uint64_t ints[2]; - if (!parse_int_args(args, ints, 2)) - usage(); - (*dt->m5_dump_stats)(ints[0], ints[1]); -} - -static void -do_dump_reset_stats(DispatchTable *dt, Args *args) -{ - uint64_t ints[2]; - if (!parse_int_args(args, ints, 2)) - usage(); - (*dt->m5_dump_reset_stats)(ints[0], ints[1]); -} - -static void -do_read_file(DispatchTable *dt, Args *args) -{ - if (args->argc > 0) - usage(); - - read_file(dt, STDOUT_FILENO); -} - -static void -do_write_file(DispatchTable *dt, Args *args) -{ - if (args->argc != 1 && args->argc != 2) - usage(); - - const char *filename = pop_arg(args); - const char *host_filename = pop_arg(args); - if (!host_filename) - host_filename = filename; - - write_file(dt, filename, host_filename); -} - -static void -do_checkpoint(DispatchTable *dt, Args *args) -{ - uint64_t ints[2]; - if (!parse_int_args(args, ints, 2)) - usage(); - (*dt->m5_checkpoint)(ints[0], ints[1]); -} - -static void -do_addsymbol(DispatchTable *dt, Args *args) -{ - if (args->argc != 2) - usage(); - - uint64_t addr = strtoul(pop_arg(args), NULL, 0); - const char *symbol = pop_arg(args); - (*dt->m5_add_symbol)(addr, symbol); -} - - -static void -do_loadsymbol(DispatchTable *dt, Args *args) -{ - if (args->argc > 0) - usage(); - - (*dt->m5_load_symbol)(); -} - -static void -do_initparam(DispatchTable *dt, Args *args) -{ - if (args->argc > 1) - usage(); - - uint64_t key_str[2]; - if (!pack_arg_into_regs(args, key_str, 2)) - usage(); - uint64_t val = (*dt->m5_init_param)(key_str[0], key_str[1]); - printf("%"PRIu64, val); -} - -struct CommandInfo command_table[] = { - { "addsymbol", do_addsymbol, "
// Adds a " - "symbol with address \"address\" " - "to gem5's symbol table" }, - { "checkpoint", do_checkpoint, "[delay [period]] // After " - "delay (default 0) take a " - "checkpoint, and then optionally " - "every period after" }, - { "dumpresetstats", do_dump_reset_stats, "[delay [period]] // After " - "delay (default 0) dump and " - "reset the stats, and then " - "optionally every period after" }, - { "dumpstats", do_dump_stats, "[delay [period]] // After " - "delay (default 0) dump the " - "stats, and then optionally " - "every period after" }, - { "exit", do_exit, "[delay] // Exit after delay, " - "or immediately" }, - { "fail", do_fail, " [delay] // Exit with " - "failure code code after delay, " - "or immediately" }, - { "initparam", do_initparam, "[key] // optional key may be at " - "most 16 characters long" }, - { "loadsymbol", do_loadsymbol, "load a preselected symbol file " - "into gem5's symbol table" }, - { "readfile", do_read_file, "read a preselected file from " - "the host and write it to " - "stdout" }, - { "resetstats", do_reset_stats, "[delay [period]] // After " - "delay (default 0) reset the " - "stats, and then optionally " - "every period after" }, - { "writefile", do_write_file, " [host filename] // " - "Write a file to the host, " - "optionally with a different " - "name" }, -}; - -int num_commands = sizeof(command_table) / sizeof(CommandInfo); diff --git a/util/m5/src/commands.cc b/util/m5/src/commands.cc new file mode 100644 index 000000000..9cd43c0ce --- /dev/null +++ b/util/m5/src/commands.cc @@ -0,0 +1,258 @@ +/* + * 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 +#include +#include + +#include +#include +#include +#include + +#include "args.hh" +#include "commands.hh" +#include "usage.hh" + +static int +read_file(DispatchTable *dt, int dest_fid) +{ + uint8_t buf[256*1024]; + int offset = 0; + int len, ret; + + // 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)); + + while ((len = (*dt->m5_read_file)(buf, sizeof(buf), offset)) > 0) { + uint8_t *base = buf; + offset += len; + do { + ret = write(dest_fid, base, len); + if (ret < 0) { + perror("Failed to write file"); + exit(2); + } else if (ret == 0) { + fprintf(stderr, "Failed to write file: " + "Unhandled short write\n"); + exit(2); + } + + base += ret; + len -= ret; + } while (len); + } + + return offset; +} + +static void +write_file(DispatchTable *dt, const char *filename, const char *host_filename) +{ + fprintf(stderr, "opening %s\n", filename); + int src_fid = open(filename, O_RDONLY); + + if (src_fid < 0) { + fprintf(stderr, "error opening %s\n", filename); + return; + } + + char buf[256*1024]; + int offset = 0; + int len; + int bytes = 0; + + memset(buf, 0, sizeof(buf)); + + while ((len = read(src_fid, buf, sizeof(buf))) > 0) { + bytes += (*dt->m5_write_file)(buf, len, offset, host_filename); + offset += len; + } + fprintf(stderr, "written %d bytes\n", bytes); + + close(src_fid); +} + +static void +do_exit(DispatchTable *dt, Args *args) +{ + if (args->argc > 1) + usage(); + + uint64_t ints[1]; + if (!parse_int_args(args, ints, 1)) + usage(); + (*dt->m5_exit)(ints[0]); +} + +static void +do_fail(DispatchTable *dt, Args *args) +{ + if (args->argc < 1 || args->argc > 2) + usage(); + + uint64_t ints[2] = { 0, 0 }; + if (!parse_int_args(args, ints, args->argc)) + usage(); + (*dt->m5_fail)(ints[1], ints[0]); +} + +static void +do_reset_stats(DispatchTable *dt, Args *args) +{ + uint64_t ints[2]; + if (!parse_int_args(args, ints, 2)) + usage(); + (*dt->m5_reset_stats)(ints[0], ints[1]); +} + +static void +do_dump_stats(DispatchTable *dt, Args *args) +{ + uint64_t ints[2]; + if (!parse_int_args(args, ints, 2)) + usage(); + (*dt->m5_dump_stats)(ints[0], ints[1]); +} + +static void +do_dump_reset_stats(DispatchTable *dt, Args *args) +{ + uint64_t ints[2]; + if (!parse_int_args(args, ints, 2)) + usage(); + (*dt->m5_dump_reset_stats)(ints[0], ints[1]); +} + +static void +do_read_file(DispatchTable *dt, Args *args) +{ + if (args->argc > 0) + usage(); + + read_file(dt, STDOUT_FILENO); +} + +static void +do_write_file(DispatchTable *dt, Args *args) +{ + if (args->argc != 1 && args->argc != 2) + usage(); + + const char *filename = pop_arg(args); + const char *host_filename = pop_arg(args); + if (!host_filename) + host_filename = filename; + + write_file(dt, filename, host_filename); +} + +static void +do_checkpoint(DispatchTable *dt, Args *args) +{ + uint64_t ints[2]; + if (!parse_int_args(args, ints, 2)) + usage(); + (*dt->m5_checkpoint)(ints[0], ints[1]); +} + +static void +do_addsymbol(DispatchTable *dt, Args *args) +{ + if (args->argc != 2) + usage(); + + uint64_t addr = strtoul(pop_arg(args), NULL, 0); + const char *symbol = pop_arg(args); + (*dt->m5_add_symbol)(addr, symbol); +} + + +static void +do_loadsymbol(DispatchTable *dt, Args *args) +{ + if (args->argc > 0) + usage(); + + (*dt->m5_load_symbol)(); +} + +static void +do_initparam(DispatchTable *dt, Args *args) +{ + if (args->argc > 1) + usage(); + + uint64_t key_str[2]; + if (!pack_arg_into_regs(args, key_str, 2)) + usage(); + uint64_t val = (*dt->m5_init_param)(key_str[0], key_str[1]); + std::cout << val; +} + +CommandInfo command_table[] = { + { "addsymbol", do_addsymbol, "
// Adds a " + "symbol with address \"address\" " + "to gem5's symbol table" }, + { "checkpoint", do_checkpoint, "[delay [period]] // After " + "delay (default 0) take a " + "checkpoint, and then optionally " + "every period after" }, + { "dumpresetstats", do_dump_reset_stats, "[delay [period]] // After " + "delay (default 0) dump and " + "reset the stats, and then " + "optionally every period after" }, + { "dumpstats", do_dump_stats, "[delay [period]] // After " + "delay (default 0) dump the " + "stats, and then optionally " + "every period after" }, + { "exit", do_exit, "[delay] // Exit after delay, " + "or immediately" }, + { "fail", do_fail, " [delay] // Exit with " + "failure code code after delay, " + "or immediately" }, + { "initparam", do_initparam, "[key] // optional key may be at " + "most 16 characters long" }, + { "loadsymbol", do_loadsymbol, "load a preselected symbol file " + "into gem5's symbol table" }, + { "readfile", do_read_file, "read a preselected file from " + "the host and write it to " + "stdout" }, + { "resetstats", do_reset_stats, "[delay [period]] // After " + "delay (default 0) reset the " + "stats, and then optionally " + "every period after" }, + { "writefile", do_write_file, " [host filename] // " + "Write a file to the host, " + "optionally with a different " + "name" }, +}; + +int num_commands = sizeof(command_table) / sizeof(CommandInfo); diff --git a/util/m5/src/commands.h b/util/m5/src/commands.h deleted file mode 100644 index 5d489ba81..000000000 --- a/util/m5/src/commands.h +++ /dev/null @@ -1,52 +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. - */ - -#ifndef __COMMANDS_H__ -#define __COMMANDS_H__ - -#include "args.h" -#include "dispatch_table.h" - -typedef struct CommandInfo -{ - // The name of the command. - char *name; - // A function which processes command line arguments and passes them to - // the underlying function through the dispatch table. - void (*func)(DispatchTable *dt, Args *args); - // Help text for this command. - char *usage; -} CommandInfo; - -// The commands themselves. -extern CommandInfo command_table[]; - -// The number of commands. -extern int num_commands; - -#endif // __COMMANDS_H__ diff --git a/util/m5/src/commands.hh b/util/m5/src/commands.hh new file mode 100644 index 000000000..05b54f642 --- /dev/null +++ b/util/m5/src/commands.hh @@ -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. + */ + +#ifndef __COMMANDS_HH__ +#define __COMMANDS_HH__ + +#include "args.hh" +#include "dispatch_table.hh" + +struct CommandInfo +{ + // The name of the command. + const char *name; + // A function which processes command line arguments and passes them to + // the underlying function through the dispatch table. + void (*func)(DispatchTable *dt, Args *args); + // Help text for this command. + const char *usage; +}; + +// The commands themselves. +extern CommandInfo command_table[]; + +// The number of commands. +extern int num_commands; + +#endif // __COMMANDS_HH__ diff --git a/util/m5/src/dispatch_table.h b/util/m5/src/dispatch_table.h deleted file mode 100644 index c9f1906b4..000000000 --- a/util/m5/src/dispatch_table.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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. - */ - -#ifndef __DISPATCH_TABLE_H__ -#define __DISPATCH_TABLE_H__ - -#include -#include - -/* - * This structure holds function pointers, one for each m5 operation, which can - * be filled with different implementations. Conceptually they're like virtual - * functions. They can then be passed to a consumer which knows which function - * it wants, but not exactly how/where it's implemented. - */ -typedef struct DispatchTable -{ -#define M5OP(name, func) __typeof__(&name) name; -M5OP_FOREACH -#undef M5OP -} DispatchTable; - -#endif // __DISPATCH_TABLE_H__ diff --git a/util/m5/src/dispatch_table.hh b/util/m5/src/dispatch_table.hh new file mode 100644 index 000000000..fdac0540d --- /dev/null +++ b/util/m5/src/dispatch_table.hh @@ -0,0 +1,47 @@ +/* + * 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. + */ + +#ifndef __DISPATCH_TABLE_HH__ +#define __DISPATCH_TABLE_HH__ + +#include +#include + +/* + * This structure holds function pointers, one for each m5 operation, which can + * be filled with different implementations. Conceptually they're like virtual + * functions. They can then be passed to a consumer which knows which function + * it wants, but not exactly how/where it's implemented. + */ +struct DispatchTable +{ +#define M5OP(name, func) __typeof__(&::name) name; +M5OP_FOREACH +#undef M5OP +}; + +#endif // __DISPATCH_TABLE_HH__ diff --git a/util/m5/src/inst_call_type.c b/util/m5/src/inst_call_type.c deleted file mode 100644 index 98c1db271..000000000 --- a/util/m5/src/inst_call_type.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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. - */ - -#include - -#include "inst_call_type.h" - -static DispatchTable inst_dispatch = { -#define M5OP(name, func) .name = &name, -M5OP_FOREACH -#undef M5OP -}; - -int -inst_call_type_detect(Args *args) -{ - if (args->argc && strcmp(args->argv[0], "--inst") == 0) { - pop_arg(args); - return 1; - } - return 0; -} - -DispatchTable * -inst_call_type_init() -{ - return &inst_dispatch; -} diff --git a/util/m5/src/inst_call_type.cc b/util/m5/src/inst_call_type.cc new file mode 100644 index 000000000..5fbd756d9 --- /dev/null +++ b/util/m5/src/inst_call_type.cc @@ -0,0 +1,52 @@ +/* + * 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. + */ + +#include + +#include "inst_call_type.hh" + +static DispatchTable inst_dispatch = { +#define M5OP(name, func) .name = &::name, +M5OP_FOREACH +#undef M5OP +}; + +int +inst_call_type_detect(Args *args) +{ + if (args->argc && strcmp(args->argv[0], "--inst") == 0) { + pop_arg(args); + return 1; + } + return 0; +} + +DispatchTable * +inst_call_type_init() +{ + return &inst_dispatch; +} diff --git a/util/m5/src/inst_call_type.h b/util/m5/src/inst_call_type.h deleted file mode 100644 index 549a3dcd8..000000000 --- a/util/m5/src/inst_call_type.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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. - */ - -#ifndef __INST_CALL_TYPE_H__ -#define __INST_CALL_TYPE_H__ - -#include "args.h" -#include "dispatch_table.h" - -int inst_call_type_detect(Args *args); -DispatchTable *inst_call_type_init(); - -#endif // __INST_CALL_TYPE_H__ diff --git a/util/m5/src/inst_call_type.hh b/util/m5/src/inst_call_type.hh new file mode 100644 index 000000000..a0d76fe69 --- /dev/null +++ b/util/m5/src/inst_call_type.hh @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#ifndef __INST_CALL_TYPE_HH__ +#define __INST_CALL_TYPE_HH__ + +#include "args.hh" +#include "dispatch_table.hh" + +int inst_call_type_detect(Args *args); +DispatchTable *inst_call_type_init(); + +#endif // __INST_CALL_TYPE_HH__ diff --git a/util/m5/src/lua_gem5Op.c b/util/m5/src/lua_gem5Op.c deleted file mode 100644 index 89aec1432..000000000 --- a/util/m5/src/lua_gem5Op.c +++ /dev/null @@ -1,278 +0,0 @@ -/* Copyright (c) 2017 Hanhwi Jang - * 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 -#include -#include -#include -#include - -#include - -#include "m5_mmap.h" - -static int -do_arm(lua_State *L) -{ - uint64_t address = lua_tointeger(L, 1); - m5_arm(address); - return 0; -} - -static int -do_quiesce(lua_State *L) -{ - m5_quiesce(); - return 0; -} - -static int -do_quiesce_ns(lua_State *L) -{ - uint64_t ns = lua_tointeger(L, 1); - m5_quiesce_ns(ns); - return 0; -} - -static int -do_quiesce_cycle(lua_State *L) -{ - uint64_t cycles = lua_tointeger(L, 1); - m5_quiesce_cycle(cycles); - return 0; -} - -static int -do_quiesce_time(lua_State *L) -{ - uint64_t ns = m5_quiesce_time(); - lua_pushinteger(L, ns); - return 1; -} - -static int -do_rpns(lua_State *L) -{ - uint64_t ns = m5_rpns(); - lua_pushinteger(L, ns); - return 1; -} - -static int -do_wake_cpu(lua_State *L) -{ - uint64_t cpuid = lua_tointeger(L, 1); - m5_wake_cpu(cpuid); - return 0; -} - -static int -do_exit(lua_State *L) -{ - uint64_t ns_delay = lua_tointeger(L, 1); - m5_exit(ns_delay); - return 0; -} - -static int -do_fail(lua_State *L) -{ - uint64_t ns_delay = lua_tointeger(L, 1); - uint64_t code = lua_tointeger(L, 2); - m5_fail(ns_delay, code); - return 0; -} - -static int -do_init_param(lua_State *L) -{ - uint64_t key_str1 = lua_tointeger(L, 1); - uint64_t key_str2 = lua_tointeger(L, 2); - lua_pushinteger(L, m5_init_param(key_str1, key_str2)); - return 1; -} - -static int -do_checkpoint(lua_State *L) -{ - uint64_t delay = lua_tointeger(L, 1); - uint64_t period = lua_tointeger(L, 2); - m5_checkpoint(delay, period); - return 0; -} - -static int -do_reset_stats(lua_State *L) -{ - uint64_t ns_delay = lua_tointeger(L, 1); - uint64_t ns_period = lua_tointeger(L, 2); - m5_reset_stats(ns_delay, ns_period); - return 0; -} - -static int -do_dump_stats(lua_State *L) -{ - uint64_t delay = lua_tointeger(L, 1); - uint64_t period = lua_tointeger(L, 2); - m5_dump_stats(delay, period); - return 0; -} - -static int -do_dump_reset_stats(lua_State *L) -{ - uint64_t delay = lua_tointeger(L, 1); - uint64_t period = lua_tointeger(L, 2); - m5_dump_reset_stats(delay, period); - return 0; -} - -static int -do_read_file(lua_State *L) -{ - uint64_t len = lua_tointeger(L, 1); - uint64_t offset = lua_tointeger(L, 2); - char *buf = malloc(len); - uint64_t readlen = m5_read_file(buf, len, offset); - lua_pushlstring(L, buf, readlen); - return 1; -} - -static int -do_write_file(lua_State *L) -{ - const char* buf = lua_tostring(L, 1); - uint64_t len = lua_tointeger(L, 2); - assert(len <= lua_strlen(L, 1)); - uint64_t offset = lua_tointeger(L, 3); - const char *filename = lua_tostring(L, 4); - uint64_t w_len = m5_write_file((void *)buf, len, offset, filename); - lua_pushinteger(L, w_len); - return 1; -} - -static int -do_debug_break(lua_State *L) -{ - m5_debug_break(); - return 0; -} - -static int -do_switch_cpu(lua_State *L) -{ - m5_switch_cpu(); - return 0; -} - -static int -do_dist_toggle_sync(lua_State *L) -{ - m5_dist_toggle_sync(); - return 0; -} - -static int -do_add_symbol(lua_State *L) -{ - uint64_t addr = lua_tointeger(L, 1); - char *string = (char*) lua_tostring(L, 2); - m5_add_symbol(addr, string); - return 0; -} - -static int -do_loadsymbol(lua_State *L) -{ - m5_load_symbol(); - return 0; -} - -static int -do_panic(lua_State *L) -{ - m5_panic(); - return 0; -} - -static int -do_work_begin(lua_State *L) -{ - uint64_t workid = lua_tointeger(L, 1); - uint64_t threadid = lua_tointeger(L, 2); - m5_work_begin(workid, threadid); - return 0; -} - -static int -do_work_end(lua_State *L) -{ - uint64_t workid = lua_tointeger(L, 1); - uint64_t threadid = lua_tointeger(L, 2); - m5_work_end(workid, threadid); - return 0; -} - -int -luaopen_gem5OpLua(lua_State *L) -{ - map_m5_mem(); -#define ADD_FUNC(fname) do{ \ - lua_pushcfunction(L, fname); \ - lua_setfield(L, -2, #fname); \ - }while (0) - - lua_newtable(L); - ADD_FUNC(do_arm); - ADD_FUNC(do_quiesce); - ADD_FUNC(do_quiesce_ns); - ADD_FUNC(do_quiesce_cycle); - ADD_FUNC(do_quiesce_time); - ADD_FUNC(do_rpns); - ADD_FUNC(do_wake_cpu); - ADD_FUNC(do_exit); - ADD_FUNC(do_fail); - ADD_FUNC(do_init_param); - ADD_FUNC(do_checkpoint); - ADD_FUNC(do_reset_stats); - ADD_FUNC(do_dump_stats); - ADD_FUNC(do_dump_reset_stats); - ADD_FUNC(do_read_file); - ADD_FUNC(do_write_file); - ADD_FUNC(do_debug_break); - ADD_FUNC(do_switch_cpu); - ADD_FUNC(do_dist_toggle_sync); - ADD_FUNC(do_add_symbol); - ADD_FUNC(do_loadsymbol); - ADD_FUNC(do_panic); - ADD_FUNC(do_work_begin); - ADD_FUNC(do_work_end); -#undef ADD_FUNC - return 1; -} diff --git a/util/m5/src/lua_gem5Op.cc b/util/m5/src/lua_gem5Op.cc new file mode 100644 index 000000000..3c8b20454 --- /dev/null +++ b/util/m5/src/lua_gem5Op.cc @@ -0,0 +1,286 @@ +/* Copyright (c) 2017 Hanhwi Jang + * 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 +#include +#include + +#include +#include + +#include + +#include "m5_mmap.h" + +static int +do_arm(lua_State *L) +{ + uint64_t address = lua_tointeger(L, 1); + m5_arm(address); + return 0; +} + +static int +do_quiesce(lua_State *L) +{ + m5_quiesce(); + return 0; +} + +static int +do_quiesce_ns(lua_State *L) +{ + uint64_t ns = lua_tointeger(L, 1); + m5_quiesce_ns(ns); + return 0; +} + +static int +do_quiesce_cycle(lua_State *L) +{ + uint64_t cycles = lua_tointeger(L, 1); + m5_quiesce_cycle(cycles); + return 0; +} + +static int +do_quiesce_time(lua_State *L) +{ + uint64_t ns = m5_quiesce_time(); + lua_pushinteger(L, ns); + return 1; +} + +static int +do_rpns(lua_State *L) +{ + uint64_t ns = m5_rpns(); + lua_pushinteger(L, ns); + return 1; +} + +static int +do_wake_cpu(lua_State *L) +{ + uint64_t cpuid = lua_tointeger(L, 1); + m5_wake_cpu(cpuid); + return 0; +} + +static int +do_exit(lua_State *L) +{ + uint64_t ns_delay = lua_tointeger(L, 1); + m5_exit(ns_delay); + return 0; +} + +static int +do_fail(lua_State *L) +{ + uint64_t ns_delay = lua_tointeger(L, 1); + uint64_t code = lua_tointeger(L, 2); + m5_fail(ns_delay, code); + return 0; +} + +static int +do_init_param(lua_State *L) +{ + uint64_t key_str1 = lua_tointeger(L, 1); + uint64_t key_str2 = lua_tointeger(L, 2); + lua_pushinteger(L, m5_init_param(key_str1, key_str2)); + return 1; +} + +static int +do_checkpoint(lua_State *L) +{ + uint64_t delay = lua_tointeger(L, 1); + uint64_t period = lua_tointeger(L, 2); + m5_checkpoint(delay, period); + return 0; +} + +static int +do_reset_stats(lua_State *L) +{ + uint64_t ns_delay = lua_tointeger(L, 1); + uint64_t ns_period = lua_tointeger(L, 2); + m5_reset_stats(ns_delay, ns_period); + return 0; +} + +static int +do_dump_stats(lua_State *L) +{ + uint64_t delay = lua_tointeger(L, 1); + uint64_t period = lua_tointeger(L, 2); + m5_dump_stats(delay, period); + return 0; +} + +static int +do_dump_reset_stats(lua_State *L) +{ + uint64_t delay = lua_tointeger(L, 1); + uint64_t period = lua_tointeger(L, 2); + m5_dump_reset_stats(delay, period); + return 0; +} + +static int +do_read_file(lua_State *L) +{ + uint64_t len = lua_tointeger(L, 1); + uint64_t offset = lua_tointeger(L, 2); + char *buf = (char *)malloc(len); + uint64_t readlen = m5_read_file(buf, len, offset); + lua_pushlstring(L, buf, readlen); + return 1; +} + +static int +do_write_file(lua_State *L) +{ + const char* buf = lua_tostring(L, 1); + uint64_t len = lua_tointeger(L, 2); + assert(len <= lua_strlen(L, 1)); + uint64_t offset = lua_tointeger(L, 3); + const char *filename = lua_tostring(L, 4); + uint64_t w_len = m5_write_file((void *)buf, len, offset, filename); + lua_pushinteger(L, w_len); + return 1; +} + +static int +do_debug_break(lua_State *L) +{ + m5_debug_break(); + return 0; +} + +static int +do_switch_cpu(lua_State *L) +{ + m5_switch_cpu(); + return 0; +} + +static int +do_dist_toggle_sync(lua_State *L) +{ + m5_dist_toggle_sync(); + return 0; +} + +static int +do_add_symbol(lua_State *L) +{ + uint64_t addr = lua_tointeger(L, 1); + char *string = (char*) lua_tostring(L, 2); + m5_add_symbol(addr, string); + return 0; +} + +static int +do_loadsymbol(lua_State *L) +{ + m5_load_symbol(); + return 0; +} + +static int +do_panic(lua_State *L) +{ + m5_panic(); + return 0; +} + +static int +do_work_begin(lua_State *L) +{ + uint64_t workid = lua_tointeger(L, 1); + uint64_t threadid = lua_tointeger(L, 2); + m5_work_begin(workid, threadid); + return 0; +} + +static int +do_work_end(lua_State *L) +{ + uint64_t workid = lua_tointeger(L, 1); + uint64_t threadid = lua_tointeger(L, 2); + m5_work_end(workid, threadid); + return 0; +} + +extern "C" +{ + +int luaopen_gem5OpLua(lua_State *); + +} + +int +luaopen_gem5OpLua(lua_State *L) +{ + map_m5_mem(); +#define ADD_FUNC(fname) do{ \ + lua_pushcfunction(L, fname); \ + lua_setfield(L, -2, #fname); \ + }while (0) + + lua_newtable(L); + ADD_FUNC(do_arm); + ADD_FUNC(do_quiesce); + ADD_FUNC(do_quiesce_ns); + ADD_FUNC(do_quiesce_cycle); + ADD_FUNC(do_quiesce_time); + ADD_FUNC(do_rpns); + ADD_FUNC(do_wake_cpu); + ADD_FUNC(do_exit); + ADD_FUNC(do_fail); + ADD_FUNC(do_init_param); + ADD_FUNC(do_checkpoint); + ADD_FUNC(do_reset_stats); + ADD_FUNC(do_dump_stats); + ADD_FUNC(do_dump_reset_stats); + ADD_FUNC(do_read_file); + ADD_FUNC(do_write_file); + ADD_FUNC(do_debug_break); + ADD_FUNC(do_switch_cpu); + ADD_FUNC(do_dist_toggle_sync); + ADD_FUNC(do_add_symbol); + ADD_FUNC(do_loadsymbol); + ADD_FUNC(do_panic); + ADD_FUNC(do_work_begin); + ADD_FUNC(do_work_end); +#undef ADD_FUNC + return 1; +} diff --git a/util/m5/src/m5.c b/util/m5/src/m5.c deleted file mode 100644 index e4b187f5a..000000000 --- a/util/m5/src/m5.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2011, 2017 ARM Limited - * All rights reserved - * - * The license below extends only to copyright in the software and shall - * not be construed as granting a license to any other intellectual - * property including but not limited to intellectual property relating - * to a hardware implementation of the functionality of the software - * licensed hereunder. You may use the software subject to the license - * terms below provided that you ensure that this notice is replicated - * unmodified and in its entirety in all distributions of the software, - * modified or unmodified, in source code or in binary form. - * - * 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 -#include - -#include "args.h" -#include "call_type.h" -#include "commands.h" -#include "usage.h" - -int -main(int argc, const char *argv[]) -{ - Args args = { argc, argv }; - - if (!args.argc) - usage(); - - progname = pop_arg(&args); - - DispatchTable *dt = init_call_type(&args); - - const char *command = pop_arg(&args); - - if (!command) - usage(); - - for (int i = 0; i < num_commands; ++i) { - if (strcmp(command, command_table[i].name) != 0) - continue; - - command_table[i].func(dt, &args); - exit(0); - } - - usage(); -} diff --git a/util/m5/src/m5.cc b/util/m5/src/m5.cc new file mode 100644 index 000000000..8a4833748 --- /dev/null +++ b/util/m5/src/m5.cc @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2011, 2017 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * 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 +#include + +#include "args.hh" +#include "call_type.hh" +#include "commands.hh" +#include "usage.hh" + +int +main(int argc, const char *argv[]) +{ + Args args = { argc, argv }; + + if (!args.argc) + usage(); + + progname = pop_arg(&args); + + DispatchTable *dt = init_call_type(&args); + + const char *command = pop_arg(&args); + + if (!command) + usage(); + + for (int i = 0; i < num_commands; ++i) { + if (strcmp(command, command_table[i].name) != 0) + continue; + + command_table[i].func(dt, &args); + exit(0); + } + + usage(); +} diff --git a/util/m5/src/m5_mmap.h b/util/m5/src/m5_mmap.h index 552b400d0..d7fe19b3d 100644 --- a/util/m5/src/m5_mmap.h +++ b/util/m5/src/m5_mmap.h @@ -41,13 +41,19 @@ #ifndef __UTIL_M5_MMAP_H__ #define __UTIL_M5_MMAP_H__ -#include #include -#include + +#ifdef __cplusplus +extern "C" { +#endif extern void *m5_mem; extern uint64_t m5op_addr; void map_m5_mem(); +#ifdef __cplusplus +} #endif + +#endif // __UTIL_M5_MMAP_H__ diff --git a/util/m5/src/semi_call_type.c b/util/m5/src/semi_call_type.c deleted file mode 100644 index d57e34805..000000000 --- a/util/m5/src/semi_call_type.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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. - */ - -#include - -#include "semi_call_type.h" - -#define M5OP(name, func) __typeof__(name) M5OP_MERGE_TOKENS(name, _semi); -M5OP_FOREACH -#undef M5OP - -static DispatchTable semi_dispatch = { -#define M5OP(name, func) .name = &M5OP_MERGE_TOKENS(name, _semi), -M5OP_FOREACH -#undef M5OP -}; - -int -semi_call_type_detect(Args *args) -{ - if (args->argc && strcmp(args->argv[0], "--semi") == 0) { - pop_arg(args); - return 1; - } - return 0; -} - -DispatchTable * -semi_call_type_init() -{ - return &semi_dispatch; -} diff --git a/util/m5/src/semi_call_type.cc b/util/m5/src/semi_call_type.cc new file mode 100644 index 000000000..85057c241 --- /dev/null +++ b/util/m5/src/semi_call_type.cc @@ -0,0 +1,59 @@ +/* + * 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. + */ + +#include + +#include "semi_call_type.hh" + +extern "C" +{ +#define M5OP(name, func) __typeof__(name) M5OP_MERGE_TOKENS(name, _semi); +M5OP_FOREACH +#undef M5OP +} + +static DispatchTable semi_dispatch = { +#define M5OP(name, func) .name = &::M5OP_MERGE_TOKENS(name, _semi), +M5OP_FOREACH +#undef M5OP +}; + +int +semi_call_type_detect(Args *args) +{ + if (args->argc && strcmp(args->argv[0], "--semi") == 0) { + pop_arg(args); + return 1; + } + return 0; +} + +DispatchTable * +semi_call_type_init() +{ + return &semi_dispatch; +} diff --git a/util/m5/src/semi_call_type.h b/util/m5/src/semi_call_type.h deleted file mode 100644 index 111ae218c..000000000 --- a/util/m5/src/semi_call_type.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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. - */ - -#ifndef __SEMI_CALL_TYPE_H__ -#define __SEMI_CALL_TYPE_H__ - -#include "args.h" -#include "dispatch_table.h" - -int semi_call_type_detect(Args *args); -DispatchTable *semi_call_type_init(); - -#endif // __SEMI_CALL_TYPE_H__ diff --git a/util/m5/src/semi_call_type.hh b/util/m5/src/semi_call_type.hh new file mode 100644 index 000000000..73081dd7e --- /dev/null +++ b/util/m5/src/semi_call_type.hh @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#ifndef __SEMI_CALL_TYPE_HH__ +#define __SEMI_CALL_TYPE_HH__ + +#include "args.hh" +#include "dispatch_table.hh" + +int semi_call_type_detect(Args *args); +DispatchTable *semi_call_type_init(); + +#endif // __SEMI_CALL_TYPE_HH__ diff --git a/util/m5/src/sparc/SConsopts b/util/m5/src/sparc/SConsopts index aa6f4be21..d55ff7abf 100644 --- a/util/m5/src/sparc/SConsopts +++ b/util/m5/src/sparc/SConsopts @@ -27,6 +27,6 @@ Import('*') env['VARIANT'] = 'sparc' get_variant_opt('CROSS_COMPILE', 'sparc64-linux-gnu-') -env.Append(CFLAGS='-m64') +env.Append(CXXFLAGS='-m64') env['CALL_TYPE']['inst'].impl('m5op.S', default=True) diff --git a/util/m5/src/thumb/SConsopts b/util/m5/src/thumb/SConsopts index e0b0245eb..55860d1e5 100644 --- a/util/m5/src/thumb/SConsopts +++ b/util/m5/src/thumb/SConsopts @@ -27,6 +27,6 @@ Import('*') env['VARIANT'] = 'thumb' get_variant_opt('CROSS_COMPILE', 'arm-linux-gnueabihf-') -env.Append(CFLAGS=[ '-mthumb', '-march=armv7' ]) +env.Append(CXXFLAGS=[ '-mthumb', '-march=armv7' ]) env['CALL_TYPE']['inst'].impl('m5op.S', default=True) diff --git a/util/m5/src/usage.c b/util/m5/src/usage.c deleted file mode 100644 index 822d9f0a7..000000000 --- a/util/m5/src/usage.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2011, 2017 ARM Limited - * All rights reserved - * - * The license below extends only to copyright in the software and shall - * not be construed as granting a license to any other intellectual - * property including but not limited to intellectual property relating - * to a hardware implementation of the functionality of the software - * licensed hereunder. You may use the software subject to the license - * terms below provided that you ensure that this notice is replicated - * unmodified and in its entirety in all distributions of the software, - * modified or unmodified, in source code or in binary form. - * - * 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 -#include -#include - -#include "commands.h" -#include "usage.h" - -const char *progname = "{progname}"; - -void -usage() -{ - fprintf(stderr, "Usage: %s [call type] [arguments]\n", progname); - fprintf(stderr, "\n"); - fprintf(stderr, "Call types:\n"); -# if ENABLE_CT_addr - fprintf(stderr, " --addr %s%s\n", -# if defined(M5OP_ADDR) - "[address override]", -# else - "
", -# endif - DEFAULT_CT_addr ? " (default)" : ""); - fprintf(stderr, " Use the address based invocation method.\n"); -# if defined(M5OP_ADDR) - fprintf(stderr, " The default address is %#"PRIx64".\n", - (uint64_t)M5OP_ADDR); -# endif -# endif -# if ENABLE_CT_inst - fprintf(stderr, " --inst%s\n", DEFAULT_CT_inst ? " (default)" : ""); - fprintf(stderr, " Use the instruction based invocation method.\n"); -# endif -# if ENABLE_CT_semi - fprintf(stderr, " --semi%s\n", DEFAULT_CT_semi ? " (default)" : ""); - fprintf(stderr, " Use the semi-hosting based invocation method.\n"); -# endif - fprintf(stderr, "\n"); - fprintf(stderr, "Commands:\n"); - for (int i = 0; i < num_commands; ++i) { - fprintf(stderr, " %s %s\n", - command_table[i].name, command_table[i].usage); - } - fprintf(stderr, "\n"); - fprintf(stderr, "All times in nanoseconds!\n"); - - exit(1); -} diff --git a/util/m5/src/usage.cc b/util/m5/src/usage.cc new file mode 100644 index 000000000..620d8cd2e --- /dev/null +++ b/util/m5/src/usage.cc @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2011, 2017 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * 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 +#include +#include + +#include "commands.hh" +#include "usage.hh" + +const char *progname = "{progname}"; + +void +usage() +{ + fprintf(stderr, "Usage: %s [call type] [arguments]\n", progname); + fprintf(stderr, "\n"); + fprintf(stderr, "Call types:\n"); +# if ENABLE_CT_addr + fprintf(stderr, " --addr %s%s\n", +# if defined(M5OP_ADDR) + "[address override]", +# else + "
", +# endif + DEFAULT_CT_addr ? " (default)" : ""); + fprintf(stderr, " Use the address based invocation method.\n"); +# if defined(M5OP_ADDR) + fprintf(stderr, " The default address is %#" PRIx64 ".\n", + (uint64_t)M5OP_ADDR); +# endif +# endif +# if ENABLE_CT_inst + fprintf(stderr, " --inst%s\n", DEFAULT_CT_inst ? " (default)" : ""); + fprintf(stderr, " Use the instruction based invocation method.\n"); +# endif +# if ENABLE_CT_semi + fprintf(stderr, " --semi%s\n", DEFAULT_CT_semi ? " (default)" : ""); + fprintf(stderr, " Use the semi-hosting based invocation method.\n"); +# endif + fprintf(stderr, "\n"); + fprintf(stderr, "Commands:\n"); + for (int i = 0; i < num_commands; ++i) { + fprintf(stderr, " %s %s\n", + command_table[i].name, command_table[i].usage); + } + fprintf(stderr, "\n"); + fprintf(stderr, "All times in nanoseconds!\n"); + + exit(1); +} diff --git a/util/m5/src/usage.h b/util/m5/src/usage.h deleted file mode 100644 index d1e148d83..000000000 --- a/util/m5/src/usage.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2011, 2017 ARM Limited - * All rights reserved - * - * The license below extends only to copyright in the software and shall - * not be construed as granting a license to any other intellectual - * property including but not limited to intellectual property relating - * to a hardware implementation of the functionality of the software - * licensed hereunder. You may use the software subject to the license - * terms below provided that you ensure that this notice is replicated - * unmodified and in its entirety in all distributions of the software, - * modified or unmodified, in source code or in binary form. - * - * 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. - */ - -#ifndef __USAGE_H__ -#define __USAGE_H__ - -extern const char *progname; - -void usage(); - -#endif // __USAGE_H__ diff --git a/util/m5/src/usage.hh b/util/m5/src/usage.hh new file mode 100644 index 000000000..b1023eab2 --- /dev/null +++ b/util/m5/src/usage.hh @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2011, 2017 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * 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. + */ + +#ifndef __USAGE_HH__ +#define __USAGE_HH__ + +extern const char *progname; + +void usage(); + +#endif // __USAGE_HH__ diff --git a/util/m5/src/x86/SConsopts b/util/m5/src/x86/SConsopts index 8763f293b..47572ab0a 100644 --- a/util/m5/src/x86/SConsopts +++ b/util/m5/src/x86/SConsopts @@ -27,7 +27,8 @@ Import('*') env['VARIANT'] = 'x86' get_variant_opt('CROSS_COMPILE', '') -env.Append(CFLAGS='-DM5OP_ADDR=0xFFFF0000') +env.Append(CXXFLAGS='-DM5OP_ADDR=0xFFFF0000') +env.Append(CCFLAGS='-DM5OP_ADDR=0xFFFF0000') env['CALL_TYPE']['inst'].impl('m5op.S') env['CALL_TYPE']['addr'].impl('m5op_addr.S', default=True)