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>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
280
util/m5/lua_gem5Op.c
Normal file
280
util/m5/lua_gem5Op.c
Normal file
@@ -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;
|
||||
}
|
||||
24
util/m5/m5.c
24
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[])
|
||||
{
|
||||
|
||||
73
util/m5/m5_mmap.c
Normal file
73
util/m5/m5_mmap.c
Normal file
@@ -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
|
||||
}
|
||||
53
util/m5/m5_mmap.h
Normal file
53
util/m5/m5_mmap.h
Normal file
@@ -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
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user