Subversion Repositories HelenOS-historic

Compare Revisions

Regard whitespace Rev 964 → Rev 963

/boot/trunk/arch/ppc32/loader/ofw.c
29,33 → 29,36
#include "ofw.h"
#include "printf.h"
 
#define MAX_OFW_ARGS 10
ofw_entry ofw;
 
typedef unsigned int ofw_arg_t;
typedef unsigned int ihandle;
typedef unsigned int phandle;
phandle ofw_chosen;
ihandle ofw_mmu;
ihandle ofw_stdout;
 
/** 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;
 
typedef void (*ofw_entry)(ofw_args_t *);
void init(void)
{
ofw_chosen = ofw_find_device("/chosen");
if (ofw_chosen == -1)
halt();
 
if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0)
ofw_stdout = 0;
 
ofw_entry ofw;
ofw_mmu = ofw_open("/mmu");
if (ofw_mmu == -1) {
puts("Unable to open /mmu node\n");
halt();
}
}
 
phandle ofw_chosen;
ihandle ofw_mmu;
ihandle ofw_stdout;
void halt(void)
{
ofw_call("exit", 0, 0);
}
 
 
static int ofw_call(const char *service, const int nargs, const int nret, ...)
int ofw_call(const char *service, const int nargs, const int nret, ...)
{
va_list list;
ofw_args_t args;
79,52 → 82,30
}
 
 
static phandle ofw_find_device(const char *name)
ihandle ofw_open(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 init(void)
void ofw_write(const char *str, const int len)
{
ofw_chosen = ofw_find_device("/chosen");
if (ofw_chosen == -1)
halt();
if (ofw_stdout == 0)
return;
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_call("write", 3, 1, ofw_stdout, str, len);
}
}
 
 
void halt(void)
phandle ofw_find_device(const char *name)
{
ofw_call("exit", 0, 0);
return ofw_call("finddevice", 1, 1, name);
}
 
 
void ofw_write(const char *str, const int len)
int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
{
if (ofw_stdout == 0)
return;
ofw_call("write", 3, 1, ofw_stdout, str, len);
return ofw_call("getprop", 4, 1, device, name, buf, buflen);
}
 
 
138,27 → 119,3
{
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;
}
}