sencha: add support for exposing the cheriot_mpact simulator cli
The cheriot_mpact command line can be (optionally) enabled on an inet
socket (default port# 4567). When enabled cpu1 will not run (and renode
will block) until a "run" command is issued on the cli.
NB: this requires an updated cheriot toolchain
Change-Id: Idcdcadd09703c03a2f71f656b49f065bfec786e1
diff --git a/sencha.resc b/sencha.resc
index a9ced9d..ab84cc2 100644
--- a/sencha.resc
+++ b/sencha.resc
@@ -60,6 +60,10 @@
$cheriotLibrary ?= @out/cheriot/sim/librenode_mpact_cheriot.so
sysbus.cpu1 CpuLibraryPath $cheriotLibrary
+# Enable the command line interface on port 4567
+$cli_port?= 4567
+#sysbus.cpu1 CliPort $cli_port
+
# Setup ram_smc to coordinate with cpu1
sysbus.ram_smc CpuLibraryPath $cheriotLibrary
sysbus.ram_smc Start
diff --git a/shodan_infrastructure/MpactCheriotCPU.cs b/shodan_infrastructure/MpactCheriotCPU.cs
index 20161b4..3d2f0de 100644
--- a/shodan_infrastructure/MpactCheriotCPU.cs
+++ b/shodan_infrastructure/MpactCheriotCPU.cs
@@ -68,7 +68,7 @@
public MpactCheriotCPU(uint id, UInt64 memoryBase, UInt64 memorySize,
UInt64 revocationMemoryBase, UInt64 clintMMRBase,
string cpuType, IMachine machine, Endianess endianness,
- CpuBitness bitness = CpuBitness.Bits32)
+ CpuBitness bitness = CpuBitness.Bits32)
: base(id, cpuType, machine, endianness, bitness)
{
this.memoryBase = memoryBase;
@@ -79,7 +79,6 @@
value_ptr = Marshal.AllocHGlobal(8);
reg_info_ptr = Marshal.AllocHGlobal(Marshal.SizeOf<RegInfo>());
string_ptr = Marshal.AllocHGlobal(maxStringLen);
- run_cb_delegate = new ActionInt32(RunComplete);
read_sysmem_delegate = new FuncInt32UInt64IntPtrInt32(ReadSysMemory);
write_sysmem_delegate = new FuncInt32UInt64IntPtrInt32(WriteSysMemory);
cpuLibraryRegistered = false;
@@ -110,13 +109,21 @@
return;
}
// Set up configuration array.
- var config_names = new string[4] {"memoryBase", "memorySize", "revocationMemoryBase", "clintMMRBase"};
- var config_values = new string[4];
- config_values[0] = "0x" + memoryBase.ToString("X");
- config_values[1] = "0x" + memorySize.ToString("X");
- config_values[2] = "0x" + revocationMemBase.ToString("X");
- config_values[3] = "0x" + clintBase.ToString("X");
- Int32 cfg_res = set_config(mpact_id, config_names, config_values, 4);
+ var config_names = new List<string>();
+ var config_values = new List<string>();
+ config_names.Add("memoryBase");
+ config_names.Add("memorySize");
+ config_names.Add("revocationMemoryBase");
+ config_names.Add("clintMMRBase");
+ config_values.Add("0x" + memoryBase.ToString("X"));
+ config_values.Add("0x" + memorySize.ToString("X"));
+ config_values.Add("0x" + revocationMemBase.ToString("X"));
+ config_values.Add("0x" + clintBase.ToString("X"));
+ if (cli_port != -1) {
+ config_names.Add("cliPort");
+ config_values.Add("0x" + cli_port.ToString("X"));
+ }
+ Int32 cfg_res = set_config(mpact_id, config_names.ToArray(), config_values.ToArray(), config_names.Count);
if (cfg_res < 0) {
LogAndThrowRE("Failed to set configuration information");
}
@@ -134,8 +141,6 @@
public override void Dispose()
{
base.Dispose();
- // Cleanup: simulator and any unmanaged resources.
- halt(mpact_id, error_ptr);
destruct(mpact_id);
}
@@ -173,6 +178,8 @@
}
}
+ public int CliPort { get => cli_port; set => cli_port = value; }
+
public override ulong ExecutedInstructions => totalExecutedInstructions;
public override ExecutionMode ExecutionMode
@@ -341,15 +348,6 @@
return load_image(mpact_id, file_name, address);
}
- public void RunComplete(Int32 result) {
- Console.Error.WriteLine($"RunComplete({result})");
- }
-
- public void Run() {
- Int32 status = run(mpact_id, run_cb_delegate);
- Console.Error.WriteLine($"Run -> {status}");
- }
-
public void OnGPIO(int number, bool value) {
if (mpact_id <= 0) {
this.Log(LogLevel.Noisy, "OnGPIO: no simulator, discard gpio {0}:{1}", number, value);
@@ -493,8 +491,7 @@
private Dictionary<string, Int32> registerNamesMap = new Dictionary<string, Int32>();
private string cpuLibraryPath;
private bool cpuLibraryRegistered;
- private string executableFile;
- private string simulationFilePath;
+ private int cli_port = -1;
private NativeBinder binder;
private readonly object nativeLock;
private readonly Int32 maxStringLen = 32;
@@ -502,7 +499,6 @@
private IntPtr error_ptr {get; set;}
private IntPtr reg_info_ptr {get; set;}
private IntPtr string_ptr {get; set;}
- private ActionInt32 run_cb_delegate;
private FuncInt32UInt64IntPtrInt32 read_sysmem_delegate;
private FuncInt32UInt64IntPtrInt32 write_sysmem_delegate;
#pragma warning disable 649
@@ -532,10 +528,6 @@
private FuncInt32Int32UInt64IntPtrInt32 read_memory; // (Int32 id, UInt64 address, IntPtr buffer, Int32 size);
[Import(UseExceptionWrapper = false)]
private FuncInt32Int32UInt64IntPtrInt32 write_memory; // (Int32 id, UInt64 address, IntPtr buffer, Int32 size);
- [Import(UseExceptionWrapper = false)]
- private FuncInt32Int32ActionInt32 run; // (Int32 id, void callback(Int32) )
- [Import(UseExceptionWrapper = false)]
- private FuncInt32Int32IntPtr halt; // (Int32 id, IntPtr *value)
// Set config.
[Import(UseExceptionWrapper = false)]
private FuncInt32Int32StringArrStringArrInt32 set_config; // Int32 set_config(Int32 id, string[] names string[] values, Int32 size);