diff --git a/proxyclient/m1n1/proxy.py b/proxyclient/m1n1/proxy.py index 18294ca4a..2ac999304 100644 --- a/proxyclient/m1n1/proxy.py +++ b/proxyclient/m1n1/proxy.py @@ -558,6 +558,8 @@ class M1N1Proxy(Reloadable): P_SMP_STOP_SECONDARIES = 0x506 P_SMP_CALL_EL1 = 0x507 P_SMP_CALL_SYNC_EL1 = 0x508 + P_SMP_CALL_EL0 = 0x509 + P_SMP_CALL_SYNC_EL0 = 0x50a P_HEAPBLOCK_ALLOC = 0x600 P_MALLOC = 0x601 @@ -970,6 +972,14 @@ def smp_call_sync_el1(self, cpu, addr, *args): if len(args) > 3: raise ValueError("Too many arguments") return self.request(self.P_SMP_CALL_SYNC_EL1, cpu, addr, *args) + def smp_call_el0(self, cpu, addr, *args): + if len(args) > 3: + raise ValueError("Too many arguments") + self.request(self.P_SMP_CALL_EL0, cpu, addr, *args) + def smp_call_sync_el0(self, cpu, addr, *args): + if len(args) > 3: + raise ValueError("Too many arguments") + return self.request(self.P_SMP_CALL_SYNC_EL0, cpu, addr, *args) def heapblock_alloc(self, size): return self.request(self.P_HEAPBLOCK_ALLOC, size) diff --git a/src/proxy.c b/src/proxy.c index 05dcd7006..49b33825f 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -358,6 +358,15 @@ int proxy_process(ProxyRequest *request, ProxyReply *reply) request->args[3], request->args[4]); reply->retval = smp_wait(request->args[0]); break; + case P_SMP_CALL_EL0: + smp_call4(request->args[0], el0_call, request->args[1], request->args[2], + request->args[3], request->args[4]); + break; + case P_SMP_CALL_EL0_SYNC: + smp_call4(request->args[0], el0_call, request->args[1], request->args[2], + request->args[3], request->args[4]); + reply->retval = smp_wait(request->args[0]); + break; case P_HEAPBLOCK_ALLOC: reply->retval = (u64)heapblock_alloc(request->args[0]); diff --git a/src/proxy.h b/src/proxy.h index 675d607df..c6c5006fe 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -88,6 +88,8 @@ typedef enum { P_SMP_STOP_SECONDARIES, P_SMP_CALL_EL1, P_SMP_CALL_EL1_SYNC, + P_SMP_CALL_EL0, + P_SMP_CALL_EL0_SYNC, P_HEAPBLOCK_ALLOC = 0x600, // Heap and memory management ops P_MALLOC,