29,36 → 29,33 |
#include "ofw.h" |
#include "printf.h" |
|
ofw_entry ofw; |
#define MAX_OFW_ARGS 10 |
|
phandle ofw_chosen; |
ihandle ofw_mmu; |
ihandle ofw_stdout; |
typedef unsigned int ofw_arg_t; |
typedef unsigned int ihandle; |
typedef unsigned int phandle; |
|
/** OpenFirmware command structure |
* |
*/ |
typedef struct { |
const char *service; /**< Command name */ |
unsigned int nargs; /**< Number of in arguments */ |
unsigned int nret; /**< Number of out arguments */ |
ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */ |
} ofw_args_t; |
|
void init(void) |
{ |
ofw_chosen = ofw_find_device("/chosen"); |
if (ofw_chosen == -1) |
halt(); |
typedef void (*ofw_entry)(ofw_args_t *); |
|
if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
ofw_stdout = 0; |
|
ofw_mmu = ofw_open("/mmu"); |
if (ofw_mmu == -1) { |
puts("Unable to open /mmu node\n"); |
halt(); |
} |
} |
ofw_entry ofw; |
|
void halt(void) |
{ |
ofw_call("exit", 0, 0); |
} |
phandle ofw_chosen; |
ihandle ofw_mmu; |
ihandle ofw_stdout; |
|
|
int ofw_call(const char *service, const int nargs, const int nret, ...) |
static int ofw_call(const char *service, const int nargs, const int nret, ...) |
{ |
va_list list; |
ofw_args_t args; |
82,30 → 79,52 |
} |
|
|
ihandle ofw_open(const char *name) |
static phandle ofw_find_device(const char *name) |
{ |
return ofw_call("finddevice", 1, 1, name); |
} |
|
|
static int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen) |
{ |
return ofw_call("getprop", 4, 1, device, name, buf, buflen); |
} |
|
static ihandle ofw_open(const char *name) |
{ |
return ofw_call("open", 1, 1, name); |
} |
|
|
void ofw_write(const char *str, const int len) |
void init(void) |
{ |
if (ofw_stdout == 0) |
return; |
ofw_chosen = ofw_find_device("/chosen"); |
if (ofw_chosen == -1) |
halt(); |
|
ofw_call("write", 3, 1, ofw_stdout, str, len); |
if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
ofw_stdout = 0; |
|
ofw_mmu = ofw_open("/mmu"); |
if (ofw_mmu == -1) { |
puts("Unable to open /mmu node\n"); |
halt(); |
} |
} |
|
|
phandle ofw_find_device(const char *name) |
void halt(void) |
{ |
return ofw_call("finddevice", 1, 1, name); |
ofw_call("exit", 0, 0); |
} |
|
|
int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen) |
void ofw_write(const char *str, const int len) |
{ |
return ofw_call("getprop", 4, 1, device, name, buf, buflen); |
if (ofw_stdout == 0) |
return; |
|
ofw_call("write", 3, 1, ofw_stdout, str, len); |
} |
|
|
119,3 → 138,27 |
{ |
return ofw_call("call-method", 6, 1, "map", ofw_mmu, mode, size, virt, phys); |
} |
|
|
int ofw_memmap(memmap_t *map) |
{ |
int i; |
int ret; |
|
phandle handle = ofw_find_device("/memory"); |
if (handle == -1) |
return false; |
|
ret = ofw_get_property(handle, "reg", &map->zones, sizeof(map->zones)); |
if (ret == -1) |
return false; |
|
map->total = 0; |
map->count = 0; |
for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { |
if (map->zones[i].size == 0) |
break; |
map->count++; |
map->total += map->zones[i].size; |
} |
} |