lua_gem5Op.c revision 12464:a02f2484c710
17202Sgblack@eecs.umich.edu/* Copyright (c) 2017 Hanhwi Jang 210037SARM gem5 Developers * All rights reserved. 39913Ssteve.reinhardt@amd.com 47202Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 57202Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 67202Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 77202Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 87202Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 97202Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 107202Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 117202Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 127202Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 137202Sgblack@eecs.umich.edu * this software without specific prior written permission. 147202Sgblack@eecs.umich.edu 157202Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 167202Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 177202Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 187202Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 197202Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 207202Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 217202Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 227202Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 237202Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 247202Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 257202Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 267202Sgblack@eecs.umich.edu * 277202Sgblack@eecs.umich.edu * Authors: Hanhwi Jang 287202Sgblack@eecs.umich.edu */ 297202Sgblack@eecs.umich.edu 307202Sgblack@eecs.umich.edu 317202Sgblack@eecs.umich.edu#include <assert.h> 327202Sgblack@eecs.umich.edu#include <lauxlib.h> 337202Sgblack@eecs.umich.edu#include <lua.h> 347202Sgblack@eecs.umich.edu#include <lualib.h> 357202Sgblack@eecs.umich.edu#include <stdlib.h> 367202Sgblack@eecs.umich.edu 377202Sgblack@eecs.umich.edu#include <gem5/m5ops.h> 387202Sgblack@eecs.umich.edu 397202Sgblack@eecs.umich.edu#include "m5_mmap.h" 407202Sgblack@eecs.umich.edu 417202Sgblack@eecs.umich.edustatic int 4211793Sbrandon.potter@amd.comdo_arm(lua_State *L) 439913Ssteve.reinhardt@amd.com{ 447202Sgblack@eecs.umich.edu uint64_t address = lua_tointeger(L, 1); 457202Sgblack@eecs.umich.edu m5_arm(address); 467202Sgblack@eecs.umich.edu return 0; 477202Sgblack@eecs.umich.edu} 487202Sgblack@eecs.umich.edu 497202Sgblack@eecs.umich.edustatic int 5012104Snathanael.premillieu@arm.comdo_quiesce(lua_State *L) 517202Sgblack@eecs.umich.edu{ 527202Sgblack@eecs.umich.edu m5_quiesce(); 537202Sgblack@eecs.umich.edu return 0; 5412106SRekai.GonzalezAlberquilla@arm.com} 5512106SRekai.GonzalezAlberquilla@arm.com 567202Sgblack@eecs.umich.edustatic int 577202Sgblack@eecs.umich.edudo_quiesce_ns(lua_State *L) 5812106SRekai.GonzalezAlberquilla@arm.com{ 597202Sgblack@eecs.umich.edu uint64_t ns = lua_tointeger(L, 1); 607202Sgblack@eecs.umich.edu m5_quiesce_ns(ns); 617202Sgblack@eecs.umich.edu return 0; 627202Sgblack@eecs.umich.edu} 6312106SRekai.GonzalezAlberquilla@arm.com 647202Sgblack@eecs.umich.edustatic int 657202Sgblack@eecs.umich.edudo_quiesce_cycle(lua_State *L) 667202Sgblack@eecs.umich.edu{ 677202Sgblack@eecs.umich.edu uint64_t cycles = lua_tointeger(L, 1); 687202Sgblack@eecs.umich.edu m5_quiesce_cycle(cycles); 697202Sgblack@eecs.umich.edu return 0; 707202Sgblack@eecs.umich.edu} 717202Sgblack@eecs.umich.edu 727202Sgblack@eecs.umich.edustatic int 737202Sgblack@eecs.umich.edudo_quiesce_time(lua_State *L) 747202Sgblack@eecs.umich.edu{ 757202Sgblack@eecs.umich.edu uint64_t ns = m5_quiesce_time(); 767202Sgblack@eecs.umich.edu lua_pushinteger(L, ns); 777202Sgblack@eecs.umich.edu return 1; 787202Sgblack@eecs.umich.edu} 797202Sgblack@eecs.umich.edu 807202Sgblack@eecs.umich.edustatic int 817202Sgblack@eecs.umich.edudo_rpns(lua_State *L) 8212106SRekai.GonzalezAlberquilla@arm.com{ 8312106SRekai.GonzalezAlberquilla@arm.com uint64_t ns = m5_rpns(); 847202Sgblack@eecs.umich.edu lua_pushinteger(L, ns); 857202Sgblack@eecs.umich.edu return 1; 8612106SRekai.GonzalezAlberquilla@arm.com} 877202Sgblack@eecs.umich.edu 887202Sgblack@eecs.umich.edustatic int 897202Sgblack@eecs.umich.edudo_wake_cpu(lua_State *L) 907202Sgblack@eecs.umich.edu{ 9112106SRekai.GonzalezAlberquilla@arm.com uint64_t cpuid = lua_tointeger(L, 1); 927202Sgblack@eecs.umich.edu m5_wake_cpu(cpuid); 937202Sgblack@eecs.umich.edu return 0; 947202Sgblack@eecs.umich.edu} 957202Sgblack@eecs.umich.edu 967202Sgblack@eecs.umich.edustatic int 977202Sgblack@eecs.umich.edudo_exit(lua_State *L) 987202Sgblack@eecs.umich.edu{ 997202Sgblack@eecs.umich.edu uint64_t ns_delay = lua_tointeger(L, 1); 1007202Sgblack@eecs.umich.edu m5_exit(ns_delay); 1017202Sgblack@eecs.umich.edu return 0; 1027202Sgblack@eecs.umich.edu} 1037202Sgblack@eecs.umich.edu 1047202Sgblack@eecs.umich.edustatic int 1057202Sgblack@eecs.umich.edudo_fail(lua_State *L) 1067202Sgblack@eecs.umich.edu{ 1077202Sgblack@eecs.umich.edu uint64_t ns_delay = lua_tointeger(L, 1); 1087202Sgblack@eecs.umich.edu uint64_t code = lua_tointeger(L, 2); 1097202Sgblack@eecs.umich.edu m5_fail(ns_delay, code); 1107202Sgblack@eecs.umich.edu return 0; 1117202Sgblack@eecs.umich.edu} 1127202Sgblack@eecs.umich.edu 1137202Sgblack@eecs.umich.edustatic int 1147202Sgblack@eecs.umich.edudo_init_param(lua_State *L) 1157202Sgblack@eecs.umich.edu{ 1167202Sgblack@eecs.umich.edu uint64_t key_str1 = lua_tointeger(L, 1); 1177202Sgblack@eecs.umich.edu uint64_t key_str2 = lua_tointeger(L, 2); 1187202Sgblack@eecs.umich.edu lua_pushinteger(L, m5_init_param(key_str1, key_str2)); 1197202Sgblack@eecs.umich.edu return 1; 1207202Sgblack@eecs.umich.edu} 1217202Sgblack@eecs.umich.edu 1227202Sgblack@eecs.umich.edustatic int 1237202Sgblack@eecs.umich.edudo_checkpoint(lua_State *L) 1247202Sgblack@eecs.umich.edu{ 1257202Sgblack@eecs.umich.edu uint64_t delay = lua_tointeger(L, 1); 1267202Sgblack@eecs.umich.edu uint64_t period = lua_tointeger(L, 2); 1277202Sgblack@eecs.umich.edu m5_checkpoint(delay, period); 1287202Sgblack@eecs.umich.edu return 0; 1297202Sgblack@eecs.umich.edu} 1307202Sgblack@eecs.umich.edu 1317202Sgblack@eecs.umich.edustatic int 1327202Sgblack@eecs.umich.edudo_reset_stats(lua_State *L) 1337202Sgblack@eecs.umich.edu{ 1347202Sgblack@eecs.umich.edu uint64_t ns_delay = lua_tointeger(L, 1); 1357202Sgblack@eecs.umich.edu uint64_t ns_period = lua_tointeger(L, 2); 1367202Sgblack@eecs.umich.edu m5_reset_stats(ns_delay, ns_period); 1377202Sgblack@eecs.umich.edu return 0; 1387202Sgblack@eecs.umich.edu} 1397202Sgblack@eecs.umich.edu 1407202Sgblack@eecs.umich.edustatic int 1417202Sgblack@eecs.umich.edudo_dump_stats(lua_State *L) 1427202Sgblack@eecs.umich.edu{ 14312104Snathanael.premillieu@arm.com uint64_t delay = lua_tointeger(L, 1); 1447202Sgblack@eecs.umich.edu uint64_t period = lua_tointeger(L, 2); 1457202Sgblack@eecs.umich.edu m5_dump_stats(delay, period); 1467208Sgblack@eecs.umich.edu return 0; 1477208Sgblack@eecs.umich.edu} 14810037SARM gem5 Developers 14910037SARM gem5 Developersstatic int 15010037SARM gem5 Developersdo_dump_reset_stats(lua_State *L) 15110037SARM gem5 Developers{ 15212104Snathanael.premillieu@arm.com uint64_t delay = lua_tointeger(L, 1); 15310037SARM gem5 Developers uint64_t period = lua_tointeger(L, 2); 15412104Snathanael.premillieu@arm.com m5_dump_reset_stats(delay, period); 15510037SARM gem5 Developers return 0; 15612104Snathanael.premillieu@arm.com} 15710037SARM gem5 Developers 15810037SARM gem5 Developersstatic int 15910037SARM gem5 Developersdo_read_file(lua_State *L) 16010037SARM gem5 Developers{ 16110037SARM gem5 Developers uint64_t len = lua_tointeger(L, 1); 16210037SARM gem5 Developers uint64_t offset = lua_tointeger(L, 2); 16310037SARM gem5 Developers char *buf = malloc(len); 16410037SARM gem5 Developers uint64_t readlen = m5_read_file(buf, len, offset); 16512104Snathanael.premillieu@arm.com lua_pushlstring(L, buf, readlen); 16610037SARM gem5 Developers return 1; 16712104Snathanael.premillieu@arm.com} 16810037SARM gem5 Developers 16912104Snathanael.premillieu@arm.comstatic int 17010037SARM gem5 Developersdo_write_file(lua_State *L) 17110037SARM gem5 Developers{ 17210037SARM gem5 Developers const char* buf = lua_tostring(L, 1); 17310037SARM gem5 Developers uint64_t len = lua_tointeger(L, 2); 1747306Sgblack@eecs.umich.edu assert(len <= lua_strlen(L, 1)); 1757306Sgblack@eecs.umich.edu uint64_t offset = lua_tointeger(L, 3); 1767306Sgblack@eecs.umich.edu const char *filename = lua_tostring(L, 4); 1777306Sgblack@eecs.umich.edu uint64_t w_len = m5_write_file((void *)buf, len, offset, filename); 1787306Sgblack@eecs.umich.edu lua_pushinteger(L, w_len); 1797306Sgblack@eecs.umich.edu return 1; 1807306Sgblack@eecs.umich.edu} 1817306Sgblack@eecs.umich.edu 1827306Sgblack@eecs.umich.edustatic int 1837332Sgblack@eecs.umich.edudo_debug_break(lua_State *L) 1847332Sgblack@eecs.umich.edu{ 1857332Sgblack@eecs.umich.edu m5_debug_break(); 1867332Sgblack@eecs.umich.edu return 0; 18712104Snathanael.premillieu@arm.com} 1887332Sgblack@eecs.umich.edu 1897332Sgblack@eecs.umich.edustatic int 1907332Sgblack@eecs.umich.edudo_switch_cpu(lua_State *L) 1917332Sgblack@eecs.umich.edu{ 1927332Sgblack@eecs.umich.edu m5_switch_cpu(); 1937261Sgblack@eecs.umich.edu return 0; 1947208Sgblack@eecs.umich.edu} 1957208Sgblack@eecs.umich.edu 1967208Sgblack@eecs.umich.edustatic int 19712104Snathanael.premillieu@arm.comdo_dist_toggle_sync(lua_State *L) 1987208Sgblack@eecs.umich.edu{ 19912104Snathanael.premillieu@arm.com m5_dist_toggle_sync(); 2007208Sgblack@eecs.umich.edu return 0; 2017208Sgblack@eecs.umich.edu} 2027225Sgblack@eecs.umich.edu 2037225Sgblack@eecs.umich.edustatic int 2047233Sgblack@eecs.umich.edudo_add_symbol(lua_State *L) 2057233Sgblack@eecs.umich.edu{ 2067233Sgblack@eecs.umich.edu uint64_t addr = lua_tointeger(L, 1); 2077233Sgblack@eecs.umich.edu char *string = (char*) lua_tostring(L, 2); 20812104Snathanael.premillieu@arm.com m5_add_symbol(addr, string); 2097233Sgblack@eecs.umich.edu return 0; 21012104Snathanael.premillieu@arm.com} 2117233Sgblack@eecs.umich.edu 21212104Snathanael.premillieu@arm.comstatic int 2137233Sgblack@eecs.umich.edudo_loadsymbol(lua_State *L) 2147233Sgblack@eecs.umich.edu{ 2157233Sgblack@eecs.umich.edu m5_load_symbol(); 2167233Sgblack@eecs.umich.edu return 0; 2177233Sgblack@eecs.umich.edu} 2187241Sgblack@eecs.umich.edu 2197241Sgblack@eecs.umich.edustatic int 2207241Sgblack@eecs.umich.edudo_panic(lua_State *L) 2217241Sgblack@eecs.umich.edu{ 22212104Snathanael.premillieu@arm.com m5_panic(); 2237241Sgblack@eecs.umich.edu return 0; 22412104Snathanael.premillieu@arm.com} 2257241Sgblack@eecs.umich.edu 22612104Snathanael.premillieu@arm.comstatic int 2277241Sgblack@eecs.umich.edudo_work_begin(lua_State *L) 22812104Snathanael.premillieu@arm.com{ 2297241Sgblack@eecs.umich.edu uint64_t workid = lua_tointeger(L, 1); 2307241Sgblack@eecs.umich.edu uint64_t threadid = lua_tointeger(L, 2); 2317241Sgblack@eecs.umich.edu m5_work_begin(workid, threadid); 2327241Sgblack@eecs.umich.edu return 0; 2337238Sgblack@eecs.umich.edu} 2347238Sgblack@eecs.umich.edu 2357238Sgblack@eecs.umich.edustatic int 2367238Sgblack@eecs.umich.edudo_work_end(lua_State *L) 23712104Snathanael.premillieu@arm.com{ 2387238Sgblack@eecs.umich.edu uint64_t workid = lua_tointeger(L, 1); 23912104Snathanael.premillieu@arm.com uint64_t threadid = lua_tointeger(L, 2); 2407238Sgblack@eecs.umich.edu m5_work_end(workid, threadid); 24112104Snathanael.premillieu@arm.com return 0; 2427238Sgblack@eecs.umich.edu} 2437238Sgblack@eecs.umich.edu 2447238Sgblack@eecs.umich.eduint 2457238Sgblack@eecs.umich.eduluaopen_gem5OpLua(lua_State *L) 2467331Sgblack@eecs.umich.edu{ 2477331Sgblack@eecs.umich.edu map_m5_mem(); 2487331Sgblack@eecs.umich.edu#define ADD_FUNC(fname) do{ \ 2497331Sgblack@eecs.umich.edu lua_pushcfunction(L, fname); \ 25012104Snathanael.premillieu@arm.com lua_setfield(L, -2, #fname); \ 2517331Sgblack@eecs.umich.edu }while (0) 25212104Snathanael.premillieu@arm.com 2537331Sgblack@eecs.umich.edu lua_newtable(L); 2547331Sgblack@eecs.umich.edu ADD_FUNC(do_arm); 2557331Sgblack@eecs.umich.edu ADD_FUNC(do_quiesce); 2567331Sgblack@eecs.umich.edu ADD_FUNC(do_quiesce_ns); 2577331Sgblack@eecs.umich.edu ADD_FUNC(do_quiesce_cycle); 25810418Sandreas.hansson@arm.com ADD_FUNC(do_quiesce_time); 25910418Sandreas.hansson@arm.com ADD_FUNC(do_rpns); 26010418Sandreas.hansson@arm.com ADD_FUNC(do_wake_cpu); 26110418Sandreas.hansson@arm.com ADD_FUNC(do_exit); 26212104Snathanael.premillieu@arm.com ADD_FUNC(do_fail); 26310418Sandreas.hansson@arm.com ADD_FUNC(do_init_param); 26412104Snathanael.premillieu@arm.com ADD_FUNC(do_checkpoint); 26510418Sandreas.hansson@arm.com ADD_FUNC(do_reset_stats); 26610418Sandreas.hansson@arm.com ADD_FUNC(do_dump_stats); 26710418Sandreas.hansson@arm.com ADD_FUNC(do_dump_reset_stats); 26810418Sandreas.hansson@arm.com ADD_FUNC(do_read_file); 26910418Sandreas.hansson@arm.com ADD_FUNC(do_write_file); 27010418Sandreas.hansson@arm.com ADD_FUNC(do_debug_break); 27110418Sandreas.hansson@arm.com ADD_FUNC(do_switch_cpu); 27210418Sandreas.hansson@arm.com ADD_FUNC(do_dist_toggle_sync); 27310418Sandreas.hansson@arm.com ADD_FUNC(do_add_symbol); 27412104Snathanael.premillieu@arm.com ADD_FUNC(do_loadsymbol); 27510418Sandreas.hansson@arm.com ADD_FUNC(do_panic); 27612104Snathanael.premillieu@arm.com ADD_FUNC(do_work_begin); 27710418Sandreas.hansson@arm.com ADD_FUNC(do_work_end); 27810418Sandreas.hansson@arm.com#undef ADD_FUNC 27910418Sandreas.hansson@arm.com return 1; 28010418Sandreas.hansson@arm.com} 28110418Sandreas.hansson@arm.com