Hanhwi Jang has uploaded this change for review. ( https://gem5-review.googlesource.com/6541

Change subject: util: Implement Lua module for m5ops.
......................................................................

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
---
M util/m5/Makefile.aarch64
M util/m5/Makefile.arm
M util/m5/Makefile.x86
A util/m5/lua_gem5Op.c
M util/m5/m5.c
A util/m5/m5_mmap.h
M util/m5/m5op_x86.S
7 files changed, 395 insertions(+), 31 deletions(-)



diff --git a/util/m5/Makefile.aarch64 b/util/m5/Makefile.aarch64
index 47abca5..cecbc60 100644
--- a/util/m5/Makefile.aarch64
+++ b/util/m5/Makefile.aarch64
@@ -54,13 +54,17 @@
 ### JDK_PATH must be set to build gem5OpJni
 #JDK_PATH=/path/to/jdk/version_number

-CFLAGS=-O2 -I $(JDK_PATH)/include/ -I $(JDK_PATH)/include/linux \
+CFLAGS=-O2 -DM5OP_ADDR=0xFFFF0000 -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
 OBJS=m5.o
 JNI_OBJS=m5op_arm_A64.o jni_gem5Op.o
+LUA_OBJS=lua_gem5Op.o m5op_arm_A64.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

@@ -84,5 +88,11 @@
        $(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.arm b/util/m5/Makefile.arm
index 3e2842c..072f5fb 100644
--- a/util/m5/Makefile.arm
+++ b/util/m5/Makefile.arm
@@ -61,6 +61,11 @@
 LIB_OBJS=m5op_arm.o
 OBJS=m5.o
 JNI_OBJS=m5op_arm.o jni_gem5Op.o
+LUA_OBJS=lua_gem5Op.o m5op_arm.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

@@ -84,6 +89,12 @@
        $(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.x86 b/util/m5/Makefile.x86
index 5ea29cc..ce47c40 100644
--- a/util/m5/Makefile.x86
+++ b/util/m5/Makefile.x86
@@ -31,8 +31,11 @@
 AS=as
 LD=ld

-CFLAGS=-O2 -DM5OP_ADDR=0xFFFF0000 -I$(PWD)/../../include
+CFLAGS=-g -O2 -DM5OP_ADDR=0xFFFF0000 -I$(PWD)/../../include
+gem5OpLua.so: CFLAGS+=-DM5OP_PIC
 OBJS=m5.o m5op_x86.o
+LUA_HEADER_INCLUDE=$(shell pkg-config --cflags-only-I lua51)
+LUA_OBJS=lua_gem5Op.o m5op_x86.o

 all: m5

@@ -40,10 +43,16 @@
        $(CC) $(CFLAGS) -o $@ -c $<

 %.o: %.c
-       $(CC)  $(CFLAGS) -o $@ -c $<
+       $(CC) $(CFLAGS) -o $@ -c $<

 m5: $(OBJS)
        $(CC) -o $@ $(OBJS)

+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
+       rm -f *.o m5 gem5OpLua.so
diff --git a/util/m5/lua_gem5Op.c b/util/m5/lua_gem5Op.c
new file mode 100644
index 0000000..a0429d2
--- /dev/null
+++ b/util/m5/lua_gem5Op.c
@@ -0,0 +1,276 @@
+/* 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 <stdlib.h>
+
+#include <gem5/m5ops.h>
+
+#include "lauxlib.h"
+#include "lua.h"
+#include "lualib.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 38da9dc..48b8ed9 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 @@
     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.h b/util/m5/m5_mmap.h
new file mode 100644
index 0000000..da19afe
--- /dev/null
+++ b/util/m5/m5_mmap.h
@@ -0,0 +1,67 @@
+/*
+ * 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 <sys/mman.h>
+
+void *m5_mem = NULL;
+
+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
+}
diff --git a/util/m5/m5op_x86.S b/util/m5/m5op_x86.S
index 9578741..fc1897c 100644
--- a/util/m5/m5op_x86.S
+++ b/util/m5/m5op_x86.S
@@ -32,7 +32,21 @@

 #include <gem5/asm/generic/m5ops.h>

-#ifdef M5OP_ADDR
+#if defined(M5OP_ADDR) && defined(M5OP_PIC)
+/* Use the memory mapped m5op interface */
+#define TWO_BYTE_OP(name, number)         \
+        .globl name;                      \
+        .func name;                       \
+name:                                     \
+        lea m5_mem@gotpcrel(%rip), %r11;  \
+        mov (%r11), %r11;                 \
+        mov (%r11), %r11;                 \
+        mov $number, %rax;                \
+        shl $8, %rax;                     \
+        mov 0(%r11, %rax, 1), %rax;       \
+        ret;                              \
+        .endfunc;
+#elif defined(M5OP_ADDR) && !defined(M5OP_PIC)
 /* Use the memory mapped m5op interface */
 #define TWO_BYTE_OP(name, number)         \
         .globl name;                      \
@@ -44,7 +58,6 @@
         mov 0(%r11, %rax, 1), %rax;       \
         ret;                              \
         .endfunc;
-
 #else
 /* Use the magic instruction based m5op interface. This does not work
  * in virtualized environments.

--
To view, visit https://gem5-review.googlesource.com/6541
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Icc18a1fb6c050afeb1cf4558fbdc724fb26a90e2
Gerrit-Change-Number: 6541
Gerrit-PatchSet: 1
Gerrit-Owner: Hanhwi Jang <[email protected]>
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to