31,22 → 31,8 |
#include <asm.h> |
#include <types.h> |
|
#define MAX_OFW_ARGS 10 |
uintptr_t ofw_cif; |
|
/** OpenFirmware command structure |
* |
*/ |
typedef struct { |
const char *service; /**< Command name */ |
unsigned long nargs; /**< Number of in arguments */ |
unsigned long nret; /**< Number of out arguments */ |
ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */ |
} ofw_args_t; |
|
typedef void (*ofw_entry)(ofw_args_t *); |
|
ofw_entry ofw; |
|
phandle ofw_chosen; |
ihandle ofw_stdout; |
phandle ofw_root; |
72,11 → 58,11 |
for (i = 0; i < nret; i++) |
args.args[i + nargs] = 0; |
|
ofw(&args); |
|
(void) ofw(&args); |
|
for (i = 1; i < nret; i++) |
rets[i - 1] = args.args[i + nargs]; |
|
|
return args.args[nargs]; |
} |
|
176,15 → 162,30 |
halt(); |
} |
|
if (ofw_translate_failed(result[0])) |
return NULL; |
|
if (sizeof(unative_t) == 8) |
shift = 32; |
else |
shift = 0; |
|
return (void *) (((result[2]&0xffffffff)<<shift)|((result[3])&0xffffffff)); |
return (void *) ((result[2]<<shift)|result[3]); |
} |
|
void *ofw_claim(const void *virt, const int len) |
{ |
ofw_arg_t retaddr; |
int shift; |
|
if (ofw_call("call-method", 5, 2, &retaddr, "claim", ofw_mmu, 0, len, virt) != 0) { |
puts("Error: MMU method claim() failed, halting.\n"); |
halt(); |
} |
|
return (void *) retaddr; |
} |
|
int ofw_map(const void *phys, const void *virt, const int size, const int mode) |
{ |
uintptr_t phys_hi, phys_lo; |