1 //
2 // Copyright (c) 2010-2023 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 using Antmicro.Renode.Core;
9 using Antmicro.Migrant.Hooks;
10 using Microsoft.Scripting.Hosting;
11 using Antmicro.Migrant;
12 using Antmicro.Renode.Logging;
13 using Antmicro.Renode.Peripherals;
14 using Antmicro.Renode.Core.Structure.Registers;
15 
16 namespace Antmicro.Renode.Hooks
17 {
18     public class RegisterCollectionHookPythonEngine<T, R> : PythonEngine
19         where T: struct
20         where R: IRegisterCollection
21     {
RegisterCollectionHookPythonEngine(IProvidesRegisterCollection<R> registerCollectionProvider, string script)22         public RegisterCollectionHookPythonEngine(IProvidesRegisterCollection<R> registerCollectionProvider, string script)
23         {
24             this.registerCollectionProvider = registerCollectionProvider;
25             this.script = script;
26 
27             InnerInit();
28             Hook = (address, value) =>
29             {
30                 Scope.SetVariable("address", address);
31                 Scope.SetVariable("value", value);
32                 Execute(code, error =>
33                 {
34                     Logger.Log(LogLevel.Error, "Python runtime error: {0}", error);
35                 });
36             };
37         }
38 
39         public Action<long, T?> Hook { get; }
40 
41         public T? Value => (T?)Scope.GetVariable("value");
42 
43         [PostDeserialization]
InnerInit()44         private void InnerInit()
45         {
46             Scope.SetVariable("self", registerCollectionProvider);
47 
48             var source = Engine.CreateScriptSourceFromString(script);
49             code = Compile(source);
50         }
51 
52         [Transient]
53         private CompiledCode code;
54 
55         private readonly string script;
56         private readonly IProvidesRegisterCollection<R> registerCollectionProvider;
57     }
58 }
59 
60