return os.path.abspath(str(d))
# Universal settings.
+main.Append(CXXFLAGS=[ '-O2' ])
main.Append(CCFLAGS=[ '-O2' ])
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'
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 ])
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.
#
# 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 ])
+++ /dev/null
-/*
- * 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 <string.h>
-
-#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;
-}
--- /dev/null
+/*
+ * 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 <cstring>
+
+#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;
+}
+++ /dev/null
-/*
- * 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__
--- /dev/null
+/*
+ * 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__
+++ /dev/null
-/*
- * 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 <inttypes.h>
-#include <stdlib.h>
-#include <string.h>
-
-#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;
-}
--- /dev/null
+/*
+ * 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 <cinttypes>
+#include <cstdlib>
+#include <cstring>
+
+#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;
+}
+++ /dev/null
-/*
- * 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 <stddef.h>
-#include <stdint.h>
-
-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__
--- /dev/null
+/*
+ * 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 <cstddef>
+#include <cstdint>
+
+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__
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)
+++ /dev/null
-/*
- * 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();
-}
--- /dev/null
+/*
+ * 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();
+}
+++ /dev/null
-/*
- * 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__
--- /dev/null
+/*
+ * 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__
+++ /dev/null
-/*
- * 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 <err.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#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, "<address> <symbol> // 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, "<code> [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, "<filename> [host filename] // "
- "Write a file to the host, "
- "optionally with a different "
- "name" },
-};
-
-int num_commands = sizeof(command_table) / sizeof(CommandInfo);
--- /dev/null
+/*
+ * 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 <err.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <cinttypes>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#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, "<address> <symbol> // 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, "<code> [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, "<filename> [host filename] // "
+ "Write a file to the host, "
+ "optionally with a different "
+ "name" },
+};
+
+int num_commands = sizeof(command_table) / sizeof(CommandInfo);
+++ /dev/null
-/*
- * 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__
--- /dev/null
+/*
+ * 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__
+++ /dev/null
-/*
- * 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 <gem5/asm/generic/m5ops.h>
-#include <gem5/m5ops.h>
-
-/*
- * 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__
--- /dev/null
+/*
+ * 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 <gem5/asm/generic/m5ops.h>
+#include <gem5/m5ops.h>
+
+/*
+ * 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__
+++ /dev/null
-/*
- * 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 <string.h>
-
-#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;
-}
--- /dev/null
+/*
+ * 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 <cstring>
+
+#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;
+}
+++ /dev/null
-/*
- * 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__
--- /dev/null
+/*
+ * 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__
+++ /dev/null
-/* 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 <assert.h>
-#include <lauxlib.h>
-#include <lua.h>
-#include <lualib.h>
-#include <stdlib.h>
-
-#include <gem5/m5ops.h>
-
-#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;
-}
--- /dev/null
+/* 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 <lauxlib.h>
+#include <lua.h>
+#include <lualib.h>
+
+#include <cassert>
+#include <cstdlib>
+
+#include <gem5/m5ops.h>
+
+#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;
+}
+++ /dev/null
-/*
- * 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 <stdlib.h>
-#include <string.h>
-
-#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();
-}
--- /dev/null
+/*
+ * 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 <cstdlib>
+#include <cstring>
+
+#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();
+}
#ifndef __UTIL_M5_MMAP_H__
#define __UTIL_M5_MMAP_H__
-#include <fcntl.h>
#include <stdint.h>
-#include <sys/mman.h>
+
+#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__
+++ /dev/null
-/*
- * 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 <string.h>
-
-#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;
-}
--- /dev/null
+/*
+ * 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 <cstring>
+
+#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;
+}
+++ /dev/null
-/*
- * 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__
--- /dev/null
+/*
+ * 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__
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)
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)
+++ /dev/null
-/*
- * 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 <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "commands.h"
-#include "usage.h"
-
-const char *progname = "{progname}";
-
-void
-usage()
-{
- fprintf(stderr, "Usage: %s [call type] <command> [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
- "<address override>",
-# 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);
-}
--- /dev/null
+/*
+ * 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 <cinttypes>
+#include <cstdio>
+#include <cstdlib>
+
+#include "commands.hh"
+#include "usage.hh"
+
+const char *progname = "{progname}";
+
+void
+usage()
+{
+ fprintf(stderr, "Usage: %s [call type] <command> [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
+ "<address override>",
+# 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);
+}
+++ /dev/null
-/*
- * 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__
--- /dev/null
+/*
+ * 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__
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)