80 lines
1.4 KiB
C
80 lines
1.4 KiB
C
#include <ofw.h>
|
|
|
|
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);
|
|
}
|
|
|
|
|