From 803d40b487c2742a2190f91ba0dfe8f9f4d46fb1 Mon Sep 17 00:00:00 2001 From: aramya <22577625+thamugadi@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:23:03 +0100 Subject: [PATCH] interpret --- entry/ofw/interface.c | 34 +++++++++++++++++++++++++++++++++- entry/ofw/tree.c | 4 ++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/entry/ofw/interface.c b/entry/ofw/interface.c index 7ac9395..2a88b43 100644 --- a/entry/ofw/interface.c +++ b/entry/ofw/interface.c @@ -2,8 +2,40 @@ extern void (*ofw)(); -void* interpret(char* cmd, ...) +void* interpret(char* cmd, int32_t* stack_args, int n_stack_args, int32_t* retaddr) { + struct + { + char* service; + int32_t n_args; + int32_t n_rets; + char* arg1; + int32_t argN[n_stack_args]; + int32_t ret1; + int32_t retN[16]; + } ofw_arg; + + SERVICE("interpret", 10, 1+n_stack_args, 16); + + ofw_arg.arg1 = cmd; + + int i; + for (i = 0; i < n_stack_args; i++) + { + ofw_arg.argN[i] = stack_args[i]; + } + + ofw(&ofw_arg); + + int32_t* addr = claim(retaddr, 17, 1); + + *addr = ofw_arg.ret1; + for (i = 1; i < 17; i++) + { + addr[i] = ofw_arg.retN[i]; + } + + return addr; } void* set_callback(void* addr) diff --git a/entry/ofw/tree.c b/entry/ofw/tree.c index 784e885..a3ca984 100644 --- a/entry/ofw/tree.c +++ b/entry/ofw/tree.c @@ -246,7 +246,7 @@ int32_t package_to_path(phandle package, void* buf, int32_t buflen) } -void* call_method(char* method, ihandle instance, int32_t* stack_args, int32_t n_stack_args) +void* call_method(char* method, ihandle instance, int32_t* stack_args, int32_t n_stack_args, int32_t* retaddr) { struct { @@ -273,7 +273,7 @@ void* call_method(char* method, ihandle instance, int32_t* stack_args, int32_t n ofw(&ofw_arg); - int32_t* addr = claim((int32_t*)0x04000000, 17, 1); + int32_t* addr = claim(retaddr, 17, 1); *addr = ofw_arg.ret1; for (i = 1; i < 17; i++)