powerpc-ofw-boot/src/ofw/interface.c

78 lines
1.4 KiB
C
Raw Normal View History

2023-07-01 15:36:00 +00:00
#include <ofw.h>
extern void (*ofw)();
2023-07-02 10:43:32 +00:00
void* ofw_interpret(char* cmd, int32_t* stack_args, int n_stack_args, int n_ret_args, int32_t* retaddr)
2023-07-01 15:36:00 +00:00
{
2023-07-01 16:23:03 +00:00
struct
{
char* service;
int32_t n_args;
int32_t n_rets;
char* arg1;
int32_t argN[n_stack_args];
int32_t ret1;
2023-07-01 20:31:17 +00:00
int32_t retN[n_ret_args];
2023-07-01 16:23:03 +00:00
} ofw_arg;
2023-07-01 20:31:17 +00:00
SERVICE("interpret", 10, 1+n_stack_args, n_ret_args);
2023-07-01 16:23:03 +00:00
ofw_arg.arg1 = cmd;
int i;
for (i = 0; i < n_stack_args; i++)
{
ofw_arg.argN[i] = stack_args[i];
}
ofw(&ofw_arg);
2023-07-01 16:27:27 +00:00
*retaddr = ofw_arg.ret1;
2023-07-01 20:31:17 +00:00
for (i = 1; i < n_ret_args+1; i++)
2023-07-01 16:23:03 +00:00
{
2023-07-01 16:27:27 +00:00
retaddr[i] = ofw_arg.retN[i];
2023-07-01 16:23:03 +00:00
}
2023-07-01 16:27:27 +00:00
return retaddr;
2023-07-01 15:36:00 +00:00
}
2023-07-02 10:43:32 +00:00
void* ofw_set_callback(void* addr)
2023-07-01 15:36:00 +00:00
{
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;
}
2023-07-02 10:43:32 +00:00
void ofw_set_symbol_lookup(void* sym_to_value, void* value_to_sym)
2023-07-01 15:36:00 +00:00
{
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);
}