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++)