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