#include extern void (*ofw)(); 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) { struct { char* service; int32_t n_args; int32_t n_rets; void* arg; void* ret; } ofw_arg; SERVICE("set-callback", 13, 1, 1); ofw_arg.arg = addr; ofw(&ofw_arg); return ofw_arg.ret; } void set_symbol_lookup(void* sym_to_value, void* value_to_sym) { struct { char* service; int32_t n_args; int32_t n_rets; void* arg1; void* arg2; } ofw_arg; SERVICE("set-symbol-lookup", 17, 2, 0); ofw_arg.arg1 = sym_to_value; ofw_arg.arg2 = value_to_sym; ofw(&ofw_arg); }