util: Convert the m5 utility to C++.
authorGabe Black <gabeblack@google.com>
Sat, 4 Apr 2020 07:55:41 +0000 (00:55 -0700)
committerGabe Black <gabeblack@google.com>
Fri, 26 Jun 2020 02:36:48 +0000 (02:36 +0000)
This will make it possible to use the googletest unit testing framework,
and will let us use c++ mechanisms to simplify and streamline the code.

Change-Id: I8ab358de47ce6b5c2d601cc0b9f2a694b2037a9b
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27548
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Gabe Black <gabeblack@google.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Maintainer: Gabe Black <gabeblack@google.com>

41 files changed:
util/m5/SConstruct
util/m5/src/SConscript
util/m5/src/addr_call_type.c [deleted file]
util/m5/src/addr_call_type.cc [new file with mode: 0644]
util/m5/src/addr_call_type.h [deleted file]
util/m5/src/addr_call_type.hh [new file with mode: 0644]
util/m5/src/args.c [deleted file]
util/m5/src/args.cc [new file with mode: 0644]
util/m5/src/args.h [deleted file]
util/m5/src/args.hh [new file with mode: 0644]
util/m5/src/arm/SConsopts
util/m5/src/call_type.c [deleted file]
util/m5/src/call_type.cc [new file with mode: 0644]
util/m5/src/call_type.h [deleted file]
util/m5/src/call_type.hh [new file with mode: 0644]
util/m5/src/commands.c [deleted file]
util/m5/src/commands.cc [new file with mode: 0644]
util/m5/src/commands.h [deleted file]
util/m5/src/commands.hh [new file with mode: 0644]
util/m5/src/dispatch_table.h [deleted file]
util/m5/src/dispatch_table.hh [new file with mode: 0644]
util/m5/src/inst_call_type.c [deleted file]
util/m5/src/inst_call_type.cc [new file with mode: 0644]
util/m5/src/inst_call_type.h [deleted file]
util/m5/src/inst_call_type.hh [new file with mode: 0644]
util/m5/src/lua_gem5Op.c [deleted file]
util/m5/src/lua_gem5Op.cc [new file with mode: 0644]
util/m5/src/m5.c [deleted file]
util/m5/src/m5.cc [new file with mode: 0644]
util/m5/src/m5_mmap.h
util/m5/src/semi_call_type.c [deleted file]
util/m5/src/semi_call_type.cc [new file with mode: 0644]
util/m5/src/semi_call_type.h [deleted file]
util/m5/src/semi_call_type.hh [new file with mode: 0644]
util/m5/src/sparc/SConsopts
util/m5/src/thumb/SConsopts
util/m5/src/usage.c [deleted file]
util/m5/src/usage.cc [new file with mode: 0644]
util/m5/src/usage.h [deleted file]
util/m5/src/usage.hh [new file with mode: 0644]
util/m5/src/x86/SConsopts

index 48073d24f8741af082501b007050edf3d0f9c72f..8ff6aeabfa8bb2c7f90eb1d31e7b17318b2a1771 100644 (file)
@@ -38,6 +38,7 @@ def abspath(d):
     return os.path.abspath(str(d))
 
 # Universal settings.
+main.Append(CXXFLAGS=[ '-O2' ])
 main.Append(CCFLAGS=[ '-O2' ])
 main.Append(CPPPATH=[ common_include ])
 
@@ -45,6 +46,7 @@ main.Append(CPPPATH=[ common_include ])
 main['ENV']['PATH'] = os.environ['PATH']
 
 main['CC'] = '${CROSS_COMPILE}gcc'
+main['CXX'] = '${CROSS_COMPILE}g++'
 main['AS'] = '${CROSS_COMPILE}as'
 main['LD'] = '${CROSS_COMPILE}ld'
 main['AR'] = '${CROSS_COMPILE}ar'
index 6e5cd6cda2328b8bbe42cc66b17ce0501679a9f6..0961f2f5d2520f6d690da1713fa6c640e1f98b57 100644 (file)
@@ -28,15 +28,15 @@ import os
 Import('*')
 
 # Raw source files.
-args = 'args.c'
-call_type = 'call_type.c'
-commands = 'commands.c'
-m5 = 'm5.c'
+args = 'args.cc'
+call_type = 'call_type.cc'
+commands = 'commands.cc'
+m5 = 'm5.cc'
 m5_mmap = 'm5_mmap.c'
-usage = 'usage.c'
+usage = 'usage.cc'
 
 jni = 'jni_gem5Op.c'
-lua = 'lua_gem5Op.c'
+lua = 'lua_gem5Op.cc'
 
 all_call_types = list(env['CALL_TYPE'].values())
 call_types = list([ ct for ct in all_call_types if ct.enabled ])
@@ -52,11 +52,11 @@ static_env = env.Clone()
 static_env.Append(LINKFLAGS=[ '-no-pie', '-static' ])
 
 for ct in all_call_types:
-    static_env.Append(CFLAGS='-DENABLE_CT_%s=%d' %
+    static_env.Append(CXXFLAGS='-DENABLE_CT_%s=%d' %
                 (ct.name, 1 if ct.enabled else 0))
-    static_env.Append(CFLAGS='-DDEFAULT_CT_%s=%d' %
+    static_env.Append(CXXFLAGS='-DDEFAULT_CT_%s=%d' %
                 (ct.name, 1 if ct.default else 0))
-static_env.Append(CFLAGS='-DDEFAULT_CALL_TYPE=%s' % default_call_type.name)
+static_env.Append(CXXFLAGS='-DDEFAULT_CALL_TYPE=%s' % default_call_type.name)
 
 #
 # The m5 library for use in other C/C++ programs.
@@ -67,7 +67,7 @@ libm5 = static_env.StaticLibrary('out/m5', [ m5_mmap ] + m5ops)
 #
 # The m5 stand alone command line utility.
 #
-ct_support = list([ File('%s_call_type.c' % ct.name) for ct in call_types ])
+ct_support = list([ File('%s_call_type.cc' % ct.name) for ct in call_types ])
 m5_bin = static_env.Program('out/m5',
         ct_support + [ args, call_type, commands, m5, m5_mmap, libm5, usage ])
 
diff --git a/util/m5/src/addr_call_type.c b/util/m5/src/addr_call_type.c
deleted file mode 100644 (file)
index 6c6ebe2..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <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;
-}
diff --git a/util/m5/src/addr_call_type.cc b/util/m5/src/addr_call_type.cc
new file mode 100644 (file)
index 0000000..cdf5e5d
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <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;
+}
diff --git a/util/m5/src/addr_call_type.h b/util/m5/src/addr_call_type.h
deleted file mode 100644 (file)
index 33fdf02..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __ADDR_CALL_TYPE_H__
-#define __ADDR_CALL_TYPE_H__
-
-#include "args.h"
-#include "dispatch_table.h"
-
-// Returns 0 if not detected, 1 if detected successfully, and -1 on error.
-int addr_call_type_detect(Args *args);
-DispatchTable *addr_call_type_init();
-
-#endif // __ADDR_CALL_TYPE_H__
diff --git a/util/m5/src/addr_call_type.hh b/util/m5/src/addr_call_type.hh
new file mode 100644 (file)
index 0000000..a327fd6
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __ADDR_CALL_TYPE_HH__
+#define __ADDR_CALL_TYPE_HH__
+
+#include "args.hh"
+#include "dispatch_table.hh"
+
+// Returns 0 if not detected, 1 if detected successfully, and -1 on error.
+int addr_call_type_detect(Args *args);
+DispatchTable *addr_call_type_init();
+
+#endif // __ADDR_CALL_TYPE_HH__
diff --git a/util/m5/src/args.c b/util/m5/src/args.c
deleted file mode 100644 (file)
index 68753e9..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2011, 2017 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <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;
-}
diff --git a/util/m5/src/args.cc b/util/m5/src/args.cc
new file mode 100644 (file)
index 0000000..96689b8
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2011, 2017 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <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;
+}
diff --git a/util/m5/src/args.h b/util/m5/src/args.h
deleted file mode 100644 (file)
index 911db77..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2011, 2017 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __ARGS_H__
-#define __ARGS_H__
-
-#include <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__
diff --git a/util/m5/src/args.hh b/util/m5/src/args.hh
new file mode 100644 (file)
index 0000000..3fc22a2
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011, 2017 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __ARGS_HH__
+#define __ARGS_HH__
+
+#include <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__
index e2517580f7c1859a4698a9f0bc599c25502e28d3..8956b2e2eead90a1998865641786b809dd2e2166 100644 (file)
@@ -27,6 +27,6 @@ Import('*')
 
 env['VARIANT'] = 'arm'
 get_variant_opt('CROSS_COMPILE', 'arm-linux-gnueabihf-')
-env.Append(CFLAGS='-march=armv7-a')
+env.Append(CXXFLAGS='-march=armv7-a')
 
 env['CALL_TYPE']['inst'].impl('m5op.S', default=True)
diff --git a/util/m5/src/call_type.c b/util/m5/src/call_type.c
deleted file mode 100644 (file)
index 5792f07..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "args.h"
-#include "call_type.h"
-#include "usage.h"
-
-#if ENABLE_CT_addr
-#include "addr_call_type.h"
-#endif
-#if ENABLE_CT_inst
-#include "inst_call_type.h"
-#endif
-#if ENABLE_CT_semi
-#include "semi_call_type.h"
-#endif
-
-#define default_call_type_init() \
-    M5OP_MERGE_TOKENS(DEFAULT_CALL_TYPE, _call_type_init())
-
-DispatchTable *
-init_call_type(Args *args)
-{
-#   if ENABLE_CT_inst
-    if (inst_call_type_detect(args))
-        return inst_call_type_init();
-#   endif
-#   if ENABLE_CT_addr
-    int detect = addr_call_type_detect(args);
-    if (detect < 0)
-        usage();
-    if (detect > 0)
-        return addr_call_type_init();
-#   endif
-#   if ENABLE_CT_semi
-    if (semi_call_type_detect(args))
-        return semi_call_type_init();
-#   endif
-    return default_call_type_init();
-}
diff --git a/util/m5/src/call_type.cc b/util/m5/src/call_type.cc
new file mode 100644 (file)
index 0000000..96b8869
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "args.hh"
+#include "call_type.hh"
+#include "usage.hh"
+
+#if ENABLE_CT_addr
+#include "addr_call_type.hh"
+#endif
+#if ENABLE_CT_inst
+#include "inst_call_type.hh"
+#endif
+#if ENABLE_CT_semi
+#include "semi_call_type.hh"
+#endif
+
+#define default_call_type_init() \
+    M5OP_MERGE_TOKENS(DEFAULT_CALL_TYPE, _call_type_init())
+
+DispatchTable *
+init_call_type(Args *args)
+{
+#   if ENABLE_CT_inst
+    if (inst_call_type_detect(args))
+        return inst_call_type_init();
+#   endif
+#   if ENABLE_CT_addr
+    int detect = addr_call_type_detect(args);
+    if (detect < 0)
+        usage();
+    if (detect > 0)
+        return addr_call_type_init();
+#   endif
+#   if ENABLE_CT_semi
+    if (semi_call_type_detect(args))
+        return semi_call_type_init();
+#   endif
+    return default_call_type_init();
+}
diff --git a/util/m5/src/call_type.h b/util/m5/src/call_type.h
deleted file mode 100644 (file)
index 7166670..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __CALL_TYPE_H__
-#define __CALL_TYPE_H__
-
-#include "args.h"
-#include "dispatch_table.h"
-
-DispatchTable *init_call_type(Args *args);
-
-#endif // __CALL_TYPE_H__
diff --git a/util/m5/src/call_type.hh b/util/m5/src/call_type.hh
new file mode 100644 (file)
index 0000000..92cd9c9
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __CALL_TYPE_HH__
+#define __CALL_TYPE_HH__
+
+#include "args.hh"
+#include "dispatch_table.hh"
+
+DispatchTable *init_call_type(Args *args);
+
+#endif // __CALL_TYPE_HH__
diff --git a/util/m5/src/commands.c b/util/m5/src/commands.c
deleted file mode 100644 (file)
index 8dd459c..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <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);
diff --git a/util/m5/src/commands.cc b/util/m5/src/commands.cc
new file mode 100644 (file)
index 0000000..9cd43c0
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <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);
diff --git a/util/m5/src/commands.h b/util/m5/src/commands.h
deleted file mode 100644 (file)
index 5d489ba..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __COMMANDS_H__
-#define __COMMANDS_H__
-
-#include "args.h"
-#include "dispatch_table.h"
-
-typedef struct CommandInfo
-{
-    // The name of the command.
-    char *name;
-    // A function which processes command line arguments and passes them to
-    // the underlying function through the dispatch table.
-    void (*func)(DispatchTable *dt, Args *args);
-    // Help text for this command.
-    char *usage;
-} CommandInfo;
-
-// The commands themselves.
-extern CommandInfo command_table[];
-
-// The number of commands.
-extern int num_commands;
-
-#endif // __COMMANDS_H__
diff --git a/util/m5/src/commands.hh b/util/m5/src/commands.hh
new file mode 100644 (file)
index 0000000..05b54f6
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __COMMANDS_HH__
+#define __COMMANDS_HH__
+
+#include "args.hh"
+#include "dispatch_table.hh"
+
+struct CommandInfo
+{
+    // The name of the command.
+    const char *name;
+    // A function which processes command line arguments and passes them to
+    // the underlying function through the dispatch table.
+    void (*func)(DispatchTable *dt, Args *args);
+    // Help text for this command.
+    const char *usage;
+};
+
+// The commands themselves.
+extern CommandInfo command_table[];
+
+// The number of commands.
+extern int num_commands;
+
+#endif // __COMMANDS_HH__
diff --git a/util/m5/src/dispatch_table.h b/util/m5/src/dispatch_table.h
deleted file mode 100644 (file)
index c9f1906..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __DISPATCH_TABLE_H__
-#define __DISPATCH_TABLE_H__
-
-#include <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__
diff --git a/util/m5/src/dispatch_table.hh b/util/m5/src/dispatch_table.hh
new file mode 100644 (file)
index 0000000..fdac054
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __DISPATCH_TABLE_HH__
+#define __DISPATCH_TABLE_HH__
+
+#include <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__
diff --git a/util/m5/src/inst_call_type.c b/util/m5/src/inst_call_type.c
deleted file mode 100644 (file)
index 98c1db2..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <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;
-}
diff --git a/util/m5/src/inst_call_type.cc b/util/m5/src/inst_call_type.cc
new file mode 100644 (file)
index 0000000..5fbd756
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <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;
+}
diff --git a/util/m5/src/inst_call_type.h b/util/m5/src/inst_call_type.h
deleted file mode 100644 (file)
index 549a3dc..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __INST_CALL_TYPE_H__
-#define __INST_CALL_TYPE_H__
-
-#include "args.h"
-#include "dispatch_table.h"
-
-int inst_call_type_detect(Args *args);
-DispatchTable *inst_call_type_init();
-
-#endif // __INST_CALL_TYPE_H__
diff --git a/util/m5/src/inst_call_type.hh b/util/m5/src/inst_call_type.hh
new file mode 100644 (file)
index 0000000..a0d76fe
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INST_CALL_TYPE_HH__
+#define __INST_CALL_TYPE_HH__
+
+#include "args.hh"
+#include "dispatch_table.hh"
+
+int inst_call_type_detect(Args *args);
+DispatchTable *inst_call_type_init();
+
+#endif // __INST_CALL_TYPE_HH__
diff --git a/util/m5/src/lua_gem5Op.c b/util/m5/src/lua_gem5Op.c
deleted file mode 100644 (file)
index 89aec14..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-/* Copyright (c) 2017 Hanhwi Jang
- * All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include <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;
-}
diff --git a/util/m5/src/lua_gem5Op.cc b/util/m5/src/lua_gem5Op.cc
new file mode 100644 (file)
index 0000000..3c8b204
--- /dev/null
@@ -0,0 +1,286 @@
+/* Copyright (c) 2017 Hanhwi Jang
+ * All rights reserved.
+
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include <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;
+}
diff --git a/util/m5/src/m5.c b/util/m5/src/m5.c
deleted file mode 100644 (file)
index e4b187f..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2011, 2017 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <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();
-}
diff --git a/util/m5/src/m5.cc b/util/m5/src/m5.cc
new file mode 100644 (file)
index 0000000..8a48337
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2011, 2017 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <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();
+}
index 552b400d07572b1eed6a64f1001ef3ae768120c7..d7fe19b3dcfa6f442e1ff96b7eb0ba7761483c6c 100644 (file)
 #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__
diff --git a/util/m5/src/semi_call_type.c b/util/m5/src/semi_call_type.c
deleted file mode 100644 (file)
index d57e348..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <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;
-}
diff --git a/util/m5/src/semi_call_type.cc b/util/m5/src/semi_call_type.cc
new file mode 100644 (file)
index 0000000..85057c2
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <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;
+}
diff --git a/util/m5/src/semi_call_type.h b/util/m5/src/semi_call_type.h
deleted file mode 100644 (file)
index 111ae21..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2020 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __SEMI_CALL_TYPE_H__
-#define __SEMI_CALL_TYPE_H__
-
-#include "args.h"
-#include "dispatch_table.h"
-
-int semi_call_type_detect(Args *args);
-DispatchTable *semi_call_type_init();
-
-#endif // __SEMI_CALL_TYPE_H__
diff --git a/util/m5/src/semi_call_type.hh b/util/m5/src/semi_call_type.hh
new file mode 100644 (file)
index 0000000..73081dd
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SEMI_CALL_TYPE_HH__
+#define __SEMI_CALL_TYPE_HH__
+
+#include "args.hh"
+#include "dispatch_table.hh"
+
+int semi_call_type_detect(Args *args);
+DispatchTable *semi_call_type_init();
+
+#endif // __SEMI_CALL_TYPE_HH__
index aa6f4be21d43d114b1c806f5104e617a14c44e63..d55ff7abfafee81a6489b7ed6e6a21bb01ed8caf 100644 (file)
@@ -27,6 +27,6 @@ Import('*')
 
 env['VARIANT'] = 'sparc'
 get_variant_opt('CROSS_COMPILE', 'sparc64-linux-gnu-')
-env.Append(CFLAGS='-m64')
+env.Append(CXXFLAGS='-m64')
 
 env['CALL_TYPE']['inst'].impl('m5op.S', default=True)
index e0b0245eb0c94ca39bd89300bcc538a87e41e662..55860d1e58795f21bd7a81eb7c5537e872481538 100644 (file)
@@ -27,6 +27,6 @@ Import('*')
 
 env['VARIANT'] = 'thumb'
 get_variant_opt('CROSS_COMPILE', 'arm-linux-gnueabihf-')
-env.Append(CFLAGS=[ '-mthumb', '-march=armv7' ])
+env.Append(CXXFLAGS=[ '-mthumb', '-march=armv7' ])
 
 env['CALL_TYPE']['inst'].impl('m5op.S', default=True)
diff --git a/util/m5/src/usage.c b/util/m5/src/usage.c
deleted file mode 100644 (file)
index 822d9f0..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2011, 2017 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <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);
-}
diff --git a/util/m5/src/usage.cc b/util/m5/src/usage.cc
new file mode 100644 (file)
index 0000000..620d8cd
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2011, 2017 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <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);
+}
diff --git a/util/m5/src/usage.h b/util/m5/src/usage.h
deleted file mode 100644 (file)
index d1e148d..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2011, 2017 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __USAGE_H__
-#define __USAGE_H__
-
-extern const char *progname;
-
-void usage();
-
-#endif // __USAGE_H__
diff --git a/util/m5/src/usage.hh b/util/m5/src/usage.hh
new file mode 100644 (file)
index 0000000..b1023ea
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2011, 2017 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __USAGE_HH__
+#define __USAGE_HH__
+
+extern const char *progname;
+
+void usage();
+
+#endif // __USAGE_HH__
index 8763f293b25ef06b28cd9adfabf7a97d9611bdba..47572ab0a3cf8f650e402865a2bedc472cbe5fd3 100644 (file)
@@ -27,7 +27,8 @@ Import('*')
 
 env['VARIANT'] = 'x86'
 get_variant_opt('CROSS_COMPILE', '')
-env.Append(CFLAGS='-DM5OP_ADDR=0xFFFF0000')
+env.Append(CXXFLAGS='-DM5OP_ADDR=0xFFFF0000')
+env.Append(CCFLAGS='-DM5OP_ADDR=0xFFFF0000')
 
 env['CALL_TYPE']['inst'].impl('m5op.S')
 env['CALL_TYPE']['addr'].impl('m5op_addr.S', default=True)