summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHanhwi Jang <jang.hanhwi@gmail.com>2017-12-10 02:02:34 +0900
committerHanhwi Jang <jang.hanhwi@gmail.com>2018-01-25 12:11:24 +0000
commit3ccef3dd7702530718f145c4c30061688ebe276f (patch)
tree2ca19a4ff18b9f27baff911bde45ee4ce633f305
parent83f2b253989fd6dfc8f48d5368ae351ade91cfc6 (diff)
downloadgem5-3ccef3dd7702530718f145c4c30061688ebe276f.tar.xz
util: Implement Lua module for m5ops.
This module allows m5ops to be executed in Lua programs. To compile it (in util/m5): The following command generates Lua moduel, gem5OpLua.so. make -f Makefile.<arch> gem5OpLua.so To use it: First, put gem5OpLua.so in Lua library search path. Then, import the module and execute the m5op function. Example usage, creating a checkpoint. m5 = require("gem5OpLua") m5.do_checkpoint(0, 0) Change-Id: Icc18a1fb6c050afeb1cf4558fbdc724fb26a90e2 Reviewed-on: https://gem5-review.googlesource.com/6541 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
-rw-r--r--util/m5/Makefile.aarch6418
-rw-r--r--util/m5/Makefile.alpha2
-rw-r--r--util/m5/Makefile.arm19
-rw-r--r--util/m5/Makefile.sparc2
-rw-r--r--util/m5/Makefile.thumb7
-rw-r--r--util/m5/Makefile.x8623
-rw-r--r--util/m5/lua_gem5Op.c280
-rw-r--r--util/m5/m5.c24
-rw-r--r--util/m5/m5_mmap.c73
-rw-r--r--util/m5/m5_mmap.h53
-rw-r--r--util/m5/m5op_x86.S1
11 files changed, 462 insertions, 40 deletions
diff --git a/util/m5/Makefile.aarch64 b/util/m5/Makefile.aarch64
index 47abca5f6..08180665a 100644
--- a/util/m5/Makefile.aarch64
+++ b/util/m5/Makefile.aarch64
@@ -58,9 +58,13 @@ CFLAGS=-O2 -I $(JDK_PATH)/include/ -I $(JDK_PATH)/include/linux \
-I$(PWD)/../../include -march=armv8-a
LDFLAGS=-static -L. -lm5
-LIB_OBJS=m5op_arm_A64.o
+LIB_OBJS=m5op_arm_A64.o m5_mmap.o
OBJS=m5.o
JNI_OBJS=m5op_arm_A64.o jni_gem5Op.o
+LUA_OBJS=lua_gem5Op.o m5op_arm_A64.o m5_mmap.o
+
+### Need to install lua5.1 library to compile gem5OpLua.so
+LUA_HEADER_INCLUDE=$(shell pkg-config --cflags lua51) -I/usr/include/x86_64-linux-gnu
all: libm5.a m5
@@ -71,10 +75,10 @@ all: libm5.a m5
$(CC) $(CFLAGS) -o $@ -c $<
m5: $(OBJS) libm5.a
- $(CC) -o $@ $(OBJS) $(LDFLAGS)
+ $(CC) -o $@ $^ $(LDFLAGS)
libm5.a: $(LIB_OBJS)
- $(AR) rcs $@ $<
+ $(AR) rcs $@ $^
gem5OpJni: gem5OpJni.jar $(JNI_OBJS)
$(CC) --shared -o lib$@.so $(JNI_OBJS)
@@ -84,5 +88,11 @@ gem5OpJni.jar:
$(JH) jni.gem5Op; \
$(JR) cvf $@ jni/*.class
+lua_gem5Op.o: lua_gem5Op.c
+ $(CC) $(CFLAGS) $(LUA_HEADER_INCLUDE) -o $@ -c $<
+
+gem5OpLua.so: $(LUA_OBJS)
+ $(CC) $(CFLAGS) $^ -o $@ -shared
+
clean:
- rm -f *.o m5 libgemOpJni.so gem5OpJni.jar jni/*.class libm5.a
+ rm -f *.o m5 libgem5OpJni.so gem5OpJni.jar jni/*.class libm5.a gem5OpLua.so
diff --git a/util/m5/Makefile.alpha b/util/m5/Makefile.alpha
index 591a06ec7..c21f67cf1 100644
--- a/util/m5/Makefile.alpha
+++ b/util/m5/Makefile.alpha
@@ -36,7 +36,7 @@ AS=$(CROSS_COMPILE)as
LD=$(CROSS_COMPILE)ld
CFLAGS=-O2 -I$(PWD)/../../include
-OBJS=m5.o m5op_alpha.o
+OBJS=m5.o m5op_alpha.o m5_mmap.o
all: m5
diff --git a/util/m5/Makefile.arm b/util/m5/Makefile.arm
index 3e2842c6b..14d73538b 100644
--- a/util/m5/Makefile.arm
+++ b/util/m5/Makefile.arm
@@ -58,9 +58,14 @@ CFLAGS=-O2 -I $(JDK_PATH)/include/ -I $(JDK_PATH)/include/linux \
-I$(PWD)/../../include -march=armv7-a
LDFLAGS=-L. -lm5 -static
-LIB_OBJS=m5op_arm.o
+LIB_OBJS=m5op_arm.o m5_mmap.o
OBJS=m5.o
JNI_OBJS=m5op_arm.o jni_gem5Op.o
+LUA_OBJS=lua_gem5Op.o m5op_arm.o m5_mmap.o
+
+### Need to install lua5.1 library to compile gem5OpLua.so
+LUA_HEADER_INCLUDE=$(shell pkg-config --cflags lua51) \
+ -I/usr/include/x86_64-linux-gnu
all: libm5.a m5
@@ -71,10 +76,10 @@ all: libm5.a m5
$(CC) $(CFLAGS) -o $@ -c $<
m5: $(OBJS) libm5.a
- $(CC) -o $@ $(OBJS) $(LDFLAGS)
+ $(CC) -o $@ $^ $(LDFLAGS)
libm5.a: $(LIB_OBJS)
- $(AR) rcs $@ $<
+ $(AR) rcs $@ $^
gem5OpJni: gem5OpJni.jar $(JNI_OBJS)
$(CC) --shared -o lib$@.so $(JNI_OBJS)
@@ -84,6 +89,12 @@ gem5OpJni.jar:
$(JH) jni.gem5Op; \
$(JR) cvf $@ jni/*.class
+lua_gem5Op.o: lua_gem5Op.c
+ $(CC) $(CFLAGS) $(LUA_HEADER_INCLUDE) -o $@ -c $< -fPIC
+
+gem5OpLua.so: $(LUA_OBJS)
+ $(CC) $(CFLAGS) $^ -o $@ -shared
+
clean:
rm -f *.o m5 libgem5OpJni.so gem5OpJni.jar jni/*.class libm5.a \
- jni_gem5Op.h
+ jni_gem5Op.h gem5OpLua.so
diff --git a/util/m5/Makefile.sparc b/util/m5/Makefile.sparc
index b3cb1a6fd..e1b17ea2c 100644
--- a/util/m5/Makefile.sparc
+++ b/util/m5/Makefile.sparc
@@ -36,7 +36,7 @@ AS=$(CROSS_COMPILE)as
LD=$(CROSS_COMPILE)ld
CFLAGS=-O2 -m64 -I$(PWD)/../../include
-OBJS=m5.o m5op_sparc.o
+OBJS=m5.o m5op_sparc.o m5_mmap.o
all: m5
diff --git a/util/m5/Makefile.thumb b/util/m5/Makefile.thumb
index 397b8f7c3..60b6803b2 100644
--- a/util/m5/Makefile.thumb
+++ b/util/m5/Makefile.thumb
@@ -54,8 +54,7 @@ CFLAGS=-O2 -mthumb -I$(PWD)/../../include
LDFLAGS=-L. -lm5
OBJS=m5.o
-LIB_OBJS=m5op_arm.o
-
+LIB_OBJS=m5op_arm.o m5_mmap.o
all: libm5.a m5
@@ -65,11 +64,11 @@ all: libm5.a m5
%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<
-m5: $(OBJS)
+m5: $(OBJS) libm5.a
$(CC) -o $@ -march=armv7 -mthumb $(OBJS) $(LDFLAGS)
libm5.a: $(LIB_OBJS)
- $(AR) rcs $@ $<
+ $(AR) rcs $@ $^
clean:
diff --git a/util/m5/Makefile.x86 b/util/m5/Makefile.x86
index 5ea29ccaa..890e4b151 100644
--- a/util/m5/Makefile.x86
+++ b/util/m5/Makefile.x86
@@ -32,7 +32,9 @@ AS=as
LD=ld
CFLAGS=-O2 -DM5OP_ADDR=0xFFFF0000 -I$(PWD)/../../include
-OBJS=m5.o m5op_x86.o
+OBJS=m5.o m5op_x86.o m5_mmap.o
+LUA_HEADER_INCLUDE=$(shell pkg-config --cflags-only-I lua51)
+LUA_OBJS=lua_gem5Op.opic m5op_x86.opic m5_mmap.opic
all: m5
@@ -40,10 +42,25 @@ all: m5
$(CC) $(CFLAGS) -o $@ -c $<
%.o: %.c
- $(CC) $(CFLAGS) -o $@ -c $<
+ $(CC) $(CFLAGS) -o $@ -c $<
+
+%.opic : %.S
+ $(CC) $(CFLAGS) -fPIC -o $@ -c $<
+
+%.opic : %.c
+ $(CC) $(CFLAGS) -fPIC -o $@ -c $<
m5: $(OBJS)
$(CC) -o $@ $(OBJS)
+m5op_x86.opic: m5op_x86.S
+ $(CC) $(CFLAGS) -DM5OP_PIC -fPIC -o $@ -c $<
+
+lua_gem5Op.opic: lua_gem5Op.c
+ $(CC) $(CFLAGS) $(LUA_HEADER_INCLUDE) -fPIC -o $@ -c $<
+
+gem5OpLua.so: $(LUA_OBJS)
+ $(CC) $(CFLAGS) -fPIC $^ -o $@ -shared
+
clean:
- rm -f *.o m5
+ rm -f *.o *.opic m5 gem5OpLua.so
diff --git a/util/m5/lua_gem5Op.c b/util/m5/lua_gem5Op.c
new file mode 100644
index 000000000..598187747
--- /dev/null
+++ b/util/m5/lua_gem5Op.c
@@ -0,0 +1,280 @@
+/* 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.
+ *
+ * Authors: Hanhwi Jang
+ */
+
+
+#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/m5.c b/util/m5/m5.c
index 38da9dc37..48b8ed9b7 100644
--- a/util/m5/m5.c
+++ b/util/m5/m5.c
@@ -58,8 +58,7 @@
#include <unistd.h>
#include <gem5/m5ops.h>
-
-void *m5_mem = NULL;
+#include "m5_mmap.h"
char *progname;
char *command = "unspecified";
@@ -375,27 +374,6 @@ usage()
exit(1);
}
-static void
-map_m5_mem()
-{
-#ifdef M5OP_ADDR
- int fd;
-
- fd = open("/dev/mem", O_RDWR | O_SYNC);
- if (fd == -1) {
- perror("Can't open /dev/mem");
- exit(1);
- }
-
- m5_mem = mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
- M5OP_ADDR);
- if (!m5_mem) {
- perror("Can't mmap /dev/mem");
- exit(1);
- }
-#endif
-}
-
int
main(int argc, char *argv[])
{
diff --git a/util/m5/m5_mmap.c b/util/m5/m5_mmap.c
new file mode 100644
index 000000000..dfb6b450d
--- /dev/null
+++ b/util/m5/m5_mmap.c
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ *
+ * Authors: Nathan Binkert
+ */
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "m5_mmap.h"
+
+void *m5_mem = NULL;
+
+void
+map_m5_mem()
+{
+#ifdef M5OP_ADDR
+ int fd;
+
+ fd = open("/dev/mem", O_RDWR | O_SYNC);
+ if (fd == -1) {
+ perror("Can't open /dev/mem");
+ exit(1);
+ }
+
+ m5_mem = mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
+ M5OP_ADDR);
+ if (!m5_mem) {
+ perror("Can't mmap /dev/mem");
+ exit(1);
+ }
+#endif
+}
diff --git a/util/m5/m5_mmap.h b/util/m5/m5_mmap.h
new file mode 100644
index 000000000..077704d28
--- /dev/null
+++ b/util/m5/m5_mmap.h
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ *
+ * Authors: Nathan Binkert
+ */
+
+#ifndef __UTIL_M5_MMAP_H__
+#define __UTIL_M5_MMAP_H__
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+extern void *m5_mem;
+
+void map_m5_mem();
+
+#endif
diff --git a/util/m5/m5op_x86.S b/util/m5/m5op_x86.S
index 69995e0ab..2a8abbb6e 100644
--- a/util/m5/m5op_x86.S
+++ b/util/m5/m5op_x86.S
@@ -58,6 +58,7 @@ name: \
mov 0(%r11, %rax, 1), %rax; \
ret; \
.endfunc;
+
#else
/* Use the magic instruction based m5op interface. This does not work
* in virtualized environments.