From 3ccef3dd7702530718f145c4c30061688ebe276f Mon Sep 17 00:00:00 2001 From: Hanhwi Jang Date: Sun, 10 Dec 2017 02:02:34 +0900 Subject: [PATCH] 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. 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 Maintainer: Andreas Sandberg --- util/m5/Makefile.aarch64 | 18 ++- util/m5/Makefile.alpha | 2 +- util/m5/Makefile.arm | 19 ++- util/m5/Makefile.sparc | 2 +- util/m5/Makefile.thumb | 7 +- util/m5/Makefile.x86 | 23 +++- util/m5/lua_gem5Op.c | 280 +++++++++++++++++++++++++++++++++++++++ util/m5/m5.c | 24 +--- util/m5/m5_mmap.c | 73 ++++++++++ util/m5/m5_mmap.h | 53 ++++++++ util/m5/m5op_x86.S | 1 + 11 files changed, 462 insertions(+), 40 deletions(-) create mode 100644 util/m5/lua_gem5Op.c create mode 100644 util/m5/m5_mmap.c create mode 100644 util/m5/m5_mmap.h 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 +#include +#include +#include +#include + +#include + +#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 #include - -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 +#include +#include +#include +#include +#include + +#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 +#include + +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. -- 2.30.2