112464Sjang.hanhwi@gmail.com/* Copyright (c) 2017 Hanhwi Jang 212464Sjang.hanhwi@gmail.com * All rights reserved. 312464Sjang.hanhwi@gmail.com 412464Sjang.hanhwi@gmail.com * Redistribution and use in source and binary forms, with or without 512464Sjang.hanhwi@gmail.com * modification, are permitted provided that the following conditions are 612464Sjang.hanhwi@gmail.com * met: redistributions of source code must retain the above copyright 712464Sjang.hanhwi@gmail.com * notice, this list of conditions and the following disclaimer; 812464Sjang.hanhwi@gmail.com * redistributions in binary form must reproduce the above copyright 912464Sjang.hanhwi@gmail.com * notice, this list of conditions and the following disclaimer in the 1012464Sjang.hanhwi@gmail.com * documentation and/or other materials provided with the distribution; 1112464Sjang.hanhwi@gmail.com * neither the name of the copyright holders nor the names of its 1212464Sjang.hanhwi@gmail.com * contributors may be used to endorse or promote products derived from 1312464Sjang.hanhwi@gmail.com * this software without specific prior written permission. 1412464Sjang.hanhwi@gmail.com 1512464Sjang.hanhwi@gmail.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612464Sjang.hanhwi@gmail.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712464Sjang.hanhwi@gmail.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812464Sjang.hanhwi@gmail.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912464Sjang.hanhwi@gmail.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012464Sjang.hanhwi@gmail.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112464Sjang.hanhwi@gmail.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212464Sjang.hanhwi@gmail.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312464Sjang.hanhwi@gmail.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412464Sjang.hanhwi@gmail.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512464Sjang.hanhwi@gmail.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612464Sjang.hanhwi@gmail.com * 2712464Sjang.hanhwi@gmail.com * Authors: Hanhwi Jang 2812464Sjang.hanhwi@gmail.com */ 2912464Sjang.hanhwi@gmail.com 3012464Sjang.hanhwi@gmail.com 3112464Sjang.hanhwi@gmail.com#include <assert.h> 3212464Sjang.hanhwi@gmail.com#include <lauxlib.h> 3312464Sjang.hanhwi@gmail.com#include <lua.h> 3412464Sjang.hanhwi@gmail.com#include <lualib.h> 3512464Sjang.hanhwi@gmail.com#include <stdlib.h> 3612464Sjang.hanhwi@gmail.com 3712464Sjang.hanhwi@gmail.com#include <gem5/m5ops.h> 3812464Sjang.hanhwi@gmail.com 3912464Sjang.hanhwi@gmail.com#include "m5_mmap.h" 4012464Sjang.hanhwi@gmail.com 4112464Sjang.hanhwi@gmail.comstatic int 4212464Sjang.hanhwi@gmail.comdo_arm(lua_State *L) 4312464Sjang.hanhwi@gmail.com{ 4412464Sjang.hanhwi@gmail.com uint64_t address = lua_tointeger(L, 1); 4512464Sjang.hanhwi@gmail.com m5_arm(address); 4612464Sjang.hanhwi@gmail.com return 0; 4712464Sjang.hanhwi@gmail.com} 4812464Sjang.hanhwi@gmail.com 4912464Sjang.hanhwi@gmail.comstatic int 5012464Sjang.hanhwi@gmail.comdo_quiesce(lua_State *L) 5112464Sjang.hanhwi@gmail.com{ 5212464Sjang.hanhwi@gmail.com m5_quiesce(); 5312464Sjang.hanhwi@gmail.com return 0; 5412464Sjang.hanhwi@gmail.com} 5512464Sjang.hanhwi@gmail.com 5612464Sjang.hanhwi@gmail.comstatic int 5712464Sjang.hanhwi@gmail.comdo_quiesce_ns(lua_State *L) 5812464Sjang.hanhwi@gmail.com{ 5912464Sjang.hanhwi@gmail.com uint64_t ns = lua_tointeger(L, 1); 6012464Sjang.hanhwi@gmail.com m5_quiesce_ns(ns); 6112464Sjang.hanhwi@gmail.com return 0; 6212464Sjang.hanhwi@gmail.com} 6312464Sjang.hanhwi@gmail.com 6412464Sjang.hanhwi@gmail.comstatic int 6512464Sjang.hanhwi@gmail.comdo_quiesce_cycle(lua_State *L) 6612464Sjang.hanhwi@gmail.com{ 6712464Sjang.hanhwi@gmail.com uint64_t cycles = lua_tointeger(L, 1); 6812464Sjang.hanhwi@gmail.com m5_quiesce_cycle(cycles); 6912464Sjang.hanhwi@gmail.com return 0; 7012464Sjang.hanhwi@gmail.com} 7112464Sjang.hanhwi@gmail.com 7212464Sjang.hanhwi@gmail.comstatic int 7312464Sjang.hanhwi@gmail.comdo_quiesce_time(lua_State *L) 7412464Sjang.hanhwi@gmail.com{ 7512464Sjang.hanhwi@gmail.com uint64_t ns = m5_quiesce_time(); 7612464Sjang.hanhwi@gmail.com lua_pushinteger(L, ns); 7712464Sjang.hanhwi@gmail.com return 1; 7812464Sjang.hanhwi@gmail.com} 7912464Sjang.hanhwi@gmail.com 8012464Sjang.hanhwi@gmail.comstatic int 8112464Sjang.hanhwi@gmail.comdo_rpns(lua_State *L) 8212464Sjang.hanhwi@gmail.com{ 8312464Sjang.hanhwi@gmail.com uint64_t ns = m5_rpns(); 8412464Sjang.hanhwi@gmail.com lua_pushinteger(L, ns); 8512464Sjang.hanhwi@gmail.com return 1; 8612464Sjang.hanhwi@gmail.com} 8712464Sjang.hanhwi@gmail.com 8812464Sjang.hanhwi@gmail.comstatic int 8912464Sjang.hanhwi@gmail.comdo_wake_cpu(lua_State *L) 9012464Sjang.hanhwi@gmail.com{ 9112464Sjang.hanhwi@gmail.com uint64_t cpuid = lua_tointeger(L, 1); 9212464Sjang.hanhwi@gmail.com m5_wake_cpu(cpuid); 9312464Sjang.hanhwi@gmail.com return 0; 9412464Sjang.hanhwi@gmail.com} 9512464Sjang.hanhwi@gmail.com 9612464Sjang.hanhwi@gmail.comstatic int 9712464Sjang.hanhwi@gmail.comdo_exit(lua_State *L) 9812464Sjang.hanhwi@gmail.com{ 9912464Sjang.hanhwi@gmail.com uint64_t ns_delay = lua_tointeger(L, 1); 10012464Sjang.hanhwi@gmail.com m5_exit(ns_delay); 10112464Sjang.hanhwi@gmail.com return 0; 10212464Sjang.hanhwi@gmail.com} 10312464Sjang.hanhwi@gmail.com 10412464Sjang.hanhwi@gmail.comstatic int 10512464Sjang.hanhwi@gmail.comdo_fail(lua_State *L) 10612464Sjang.hanhwi@gmail.com{ 10712464Sjang.hanhwi@gmail.com uint64_t ns_delay = lua_tointeger(L, 1); 10812464Sjang.hanhwi@gmail.com uint64_t code = lua_tointeger(L, 2); 10912464Sjang.hanhwi@gmail.com m5_fail(ns_delay, code); 11012464Sjang.hanhwi@gmail.com return 0; 11112464Sjang.hanhwi@gmail.com} 11212464Sjang.hanhwi@gmail.com 11312464Sjang.hanhwi@gmail.comstatic int 11412464Sjang.hanhwi@gmail.comdo_init_param(lua_State *L) 11512464Sjang.hanhwi@gmail.com{ 11612464Sjang.hanhwi@gmail.com uint64_t key_str1 = lua_tointeger(L, 1); 11712464Sjang.hanhwi@gmail.com uint64_t key_str2 = lua_tointeger(L, 2); 11812464Sjang.hanhwi@gmail.com lua_pushinteger(L, m5_init_param(key_str1, key_str2)); 11912464Sjang.hanhwi@gmail.com return 1; 12012464Sjang.hanhwi@gmail.com} 12112464Sjang.hanhwi@gmail.com 12212464Sjang.hanhwi@gmail.comstatic int 12312464Sjang.hanhwi@gmail.comdo_checkpoint(lua_State *L) 12412464Sjang.hanhwi@gmail.com{ 12512464Sjang.hanhwi@gmail.com uint64_t delay = lua_tointeger(L, 1); 12612464Sjang.hanhwi@gmail.com uint64_t period = lua_tointeger(L, 2); 12712464Sjang.hanhwi@gmail.com m5_checkpoint(delay, period); 12812464Sjang.hanhwi@gmail.com return 0; 12912464Sjang.hanhwi@gmail.com} 13012464Sjang.hanhwi@gmail.com 13112464Sjang.hanhwi@gmail.comstatic int 13212464Sjang.hanhwi@gmail.comdo_reset_stats(lua_State *L) 13312464Sjang.hanhwi@gmail.com{ 13412464Sjang.hanhwi@gmail.com uint64_t ns_delay = lua_tointeger(L, 1); 13512464Sjang.hanhwi@gmail.com uint64_t ns_period = lua_tointeger(L, 2); 13612464Sjang.hanhwi@gmail.com m5_reset_stats(ns_delay, ns_period); 13712464Sjang.hanhwi@gmail.com return 0; 13812464Sjang.hanhwi@gmail.com} 13912464Sjang.hanhwi@gmail.com 14012464Sjang.hanhwi@gmail.comstatic int 14112464Sjang.hanhwi@gmail.comdo_dump_stats(lua_State *L) 14212464Sjang.hanhwi@gmail.com{ 14312464Sjang.hanhwi@gmail.com uint64_t delay = lua_tointeger(L, 1); 14412464Sjang.hanhwi@gmail.com uint64_t period = lua_tointeger(L, 2); 14512464Sjang.hanhwi@gmail.com m5_dump_stats(delay, period); 14612464Sjang.hanhwi@gmail.com return 0; 14712464Sjang.hanhwi@gmail.com} 14812464Sjang.hanhwi@gmail.com 14912464Sjang.hanhwi@gmail.comstatic int 15012464Sjang.hanhwi@gmail.comdo_dump_reset_stats(lua_State *L) 15112464Sjang.hanhwi@gmail.com{ 15212464Sjang.hanhwi@gmail.com uint64_t delay = lua_tointeger(L, 1); 15312464Sjang.hanhwi@gmail.com uint64_t period = lua_tointeger(L, 2); 15412464Sjang.hanhwi@gmail.com m5_dump_reset_stats(delay, period); 15512464Sjang.hanhwi@gmail.com return 0; 15612464Sjang.hanhwi@gmail.com} 15712464Sjang.hanhwi@gmail.com 15812464Sjang.hanhwi@gmail.comstatic int 15912464Sjang.hanhwi@gmail.comdo_read_file(lua_State *L) 16012464Sjang.hanhwi@gmail.com{ 16112464Sjang.hanhwi@gmail.com uint64_t len = lua_tointeger(L, 1); 16212464Sjang.hanhwi@gmail.com uint64_t offset = lua_tointeger(L, 2); 16312464Sjang.hanhwi@gmail.com char *buf = malloc(len); 16412464Sjang.hanhwi@gmail.com uint64_t readlen = m5_read_file(buf, len, offset); 16512464Sjang.hanhwi@gmail.com lua_pushlstring(L, buf, readlen); 16612464Sjang.hanhwi@gmail.com return 1; 16712464Sjang.hanhwi@gmail.com} 16812464Sjang.hanhwi@gmail.com 16912464Sjang.hanhwi@gmail.comstatic int 17012464Sjang.hanhwi@gmail.comdo_write_file(lua_State *L) 17112464Sjang.hanhwi@gmail.com{ 17212464Sjang.hanhwi@gmail.com const char* buf = lua_tostring(L, 1); 17312464Sjang.hanhwi@gmail.com uint64_t len = lua_tointeger(L, 2); 17412464Sjang.hanhwi@gmail.com assert(len <= lua_strlen(L, 1)); 17512464Sjang.hanhwi@gmail.com uint64_t offset = lua_tointeger(L, 3); 17612464Sjang.hanhwi@gmail.com const char *filename = lua_tostring(L, 4); 17712464Sjang.hanhwi@gmail.com uint64_t w_len = m5_write_file((void *)buf, len, offset, filename); 17812464Sjang.hanhwi@gmail.com lua_pushinteger(L, w_len); 17912464Sjang.hanhwi@gmail.com return 1; 18012464Sjang.hanhwi@gmail.com} 18112464Sjang.hanhwi@gmail.com 18212464Sjang.hanhwi@gmail.comstatic int 18312464Sjang.hanhwi@gmail.comdo_debug_break(lua_State *L) 18412464Sjang.hanhwi@gmail.com{ 18512464Sjang.hanhwi@gmail.com m5_debug_break(); 18612464Sjang.hanhwi@gmail.com return 0; 18712464Sjang.hanhwi@gmail.com} 18812464Sjang.hanhwi@gmail.com 18912464Sjang.hanhwi@gmail.comstatic int 19012464Sjang.hanhwi@gmail.comdo_switch_cpu(lua_State *L) 19112464Sjang.hanhwi@gmail.com{ 19212464Sjang.hanhwi@gmail.com m5_switch_cpu(); 19312464Sjang.hanhwi@gmail.com return 0; 19412464Sjang.hanhwi@gmail.com} 19512464Sjang.hanhwi@gmail.com 19612464Sjang.hanhwi@gmail.comstatic int 19712464Sjang.hanhwi@gmail.comdo_dist_toggle_sync(lua_State *L) 19812464Sjang.hanhwi@gmail.com{ 19912464Sjang.hanhwi@gmail.com m5_dist_toggle_sync(); 20012464Sjang.hanhwi@gmail.com return 0; 20112464Sjang.hanhwi@gmail.com} 20212464Sjang.hanhwi@gmail.com 20312464Sjang.hanhwi@gmail.comstatic int 20412464Sjang.hanhwi@gmail.comdo_add_symbol(lua_State *L) 20512464Sjang.hanhwi@gmail.com{ 20612464Sjang.hanhwi@gmail.com uint64_t addr = lua_tointeger(L, 1); 20712464Sjang.hanhwi@gmail.com char *string = (char*) lua_tostring(L, 2); 20812464Sjang.hanhwi@gmail.com m5_add_symbol(addr, string); 20912464Sjang.hanhwi@gmail.com return 0; 21012464Sjang.hanhwi@gmail.com} 21112464Sjang.hanhwi@gmail.com 21212464Sjang.hanhwi@gmail.comstatic int 21312464Sjang.hanhwi@gmail.comdo_loadsymbol(lua_State *L) 21412464Sjang.hanhwi@gmail.com{ 21512464Sjang.hanhwi@gmail.com m5_load_symbol(); 21612464Sjang.hanhwi@gmail.com return 0; 21712464Sjang.hanhwi@gmail.com} 21812464Sjang.hanhwi@gmail.com 21912464Sjang.hanhwi@gmail.comstatic int 22012464Sjang.hanhwi@gmail.comdo_panic(lua_State *L) 22112464Sjang.hanhwi@gmail.com{ 22212464Sjang.hanhwi@gmail.com m5_panic(); 22312464Sjang.hanhwi@gmail.com return 0; 22412464Sjang.hanhwi@gmail.com} 22512464Sjang.hanhwi@gmail.com 22612464Sjang.hanhwi@gmail.comstatic int 22712464Sjang.hanhwi@gmail.comdo_work_begin(lua_State *L) 22812464Sjang.hanhwi@gmail.com{ 22912464Sjang.hanhwi@gmail.com uint64_t workid = lua_tointeger(L, 1); 23012464Sjang.hanhwi@gmail.com uint64_t threadid = lua_tointeger(L, 2); 23112464Sjang.hanhwi@gmail.com m5_work_begin(workid, threadid); 23212464Sjang.hanhwi@gmail.com return 0; 23312464Sjang.hanhwi@gmail.com} 23412464Sjang.hanhwi@gmail.com 23512464Sjang.hanhwi@gmail.comstatic int 23612464Sjang.hanhwi@gmail.comdo_work_end(lua_State *L) 23712464Sjang.hanhwi@gmail.com{ 23812464Sjang.hanhwi@gmail.com uint64_t workid = lua_tointeger(L, 1); 23912464Sjang.hanhwi@gmail.com uint64_t threadid = lua_tointeger(L, 2); 24012464Sjang.hanhwi@gmail.com m5_work_end(workid, threadid); 24112464Sjang.hanhwi@gmail.com return 0; 24212464Sjang.hanhwi@gmail.com} 24312464Sjang.hanhwi@gmail.com 24412464Sjang.hanhwi@gmail.comint 24512464Sjang.hanhwi@gmail.comluaopen_gem5OpLua(lua_State *L) 24612464Sjang.hanhwi@gmail.com{ 24712464Sjang.hanhwi@gmail.com map_m5_mem(); 24812464Sjang.hanhwi@gmail.com#define ADD_FUNC(fname) do{ \ 24912464Sjang.hanhwi@gmail.com lua_pushcfunction(L, fname); \ 25012464Sjang.hanhwi@gmail.com lua_setfield(L, -2, #fname); \ 25112464Sjang.hanhwi@gmail.com }while (0) 25212464Sjang.hanhwi@gmail.com 25312464Sjang.hanhwi@gmail.com lua_newtable(L); 25412464Sjang.hanhwi@gmail.com ADD_FUNC(do_arm); 25512464Sjang.hanhwi@gmail.com ADD_FUNC(do_quiesce); 25612464Sjang.hanhwi@gmail.com ADD_FUNC(do_quiesce_ns); 25712464Sjang.hanhwi@gmail.com ADD_FUNC(do_quiesce_cycle); 25812464Sjang.hanhwi@gmail.com ADD_FUNC(do_quiesce_time); 25912464Sjang.hanhwi@gmail.com ADD_FUNC(do_rpns); 26012464Sjang.hanhwi@gmail.com ADD_FUNC(do_wake_cpu); 26112464Sjang.hanhwi@gmail.com ADD_FUNC(do_exit); 26212464Sjang.hanhwi@gmail.com ADD_FUNC(do_fail); 26312464Sjang.hanhwi@gmail.com ADD_FUNC(do_init_param); 26412464Sjang.hanhwi@gmail.com ADD_FUNC(do_checkpoint); 26512464Sjang.hanhwi@gmail.com ADD_FUNC(do_reset_stats); 26612464Sjang.hanhwi@gmail.com ADD_FUNC(do_dump_stats); 26712464Sjang.hanhwi@gmail.com ADD_FUNC(do_dump_reset_stats); 26812464Sjang.hanhwi@gmail.com ADD_FUNC(do_read_file); 26912464Sjang.hanhwi@gmail.com ADD_FUNC(do_write_file); 27012464Sjang.hanhwi@gmail.com ADD_FUNC(do_debug_break); 27112464Sjang.hanhwi@gmail.com ADD_FUNC(do_switch_cpu); 27212464Sjang.hanhwi@gmail.com ADD_FUNC(do_dist_toggle_sync); 27312464Sjang.hanhwi@gmail.com ADD_FUNC(do_add_symbol); 27412464Sjang.hanhwi@gmail.com ADD_FUNC(do_loadsymbol); 27512464Sjang.hanhwi@gmail.com ADD_FUNC(do_panic); 27612464Sjang.hanhwi@gmail.com ADD_FUNC(do_work_begin); 27712464Sjang.hanhwi@gmail.com ADD_FUNC(do_work_end); 27812464Sjang.hanhwi@gmail.com#undef ADD_FUNC 27912464Sjang.hanhwi@gmail.com return 1; 28012464Sjang.hanhwi@gmail.com} 281