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