powerpc/boot: Add byteswapping routines in oflib

Values will need to be byte-swapped when calling prom (big endian) from
a little endian boot wrapper.

Signed-off-by: Cédric Le Goater <clg@fr.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Cédric Le Goater 2014-04-24 09:23:28 +02:00 committed by Benjamin Herrenschmidt
parent 163bed77b9
commit 926e6940f5
3 changed files with 18 additions and 13 deletions

View File

@ -20,4 +20,7 @@ void of_console_init(void);
typedef u32 __be32;
#define cpu_to_be32(x) (x)
#define be32_to_cpu(x) (x)
#endif /* _PPC_BOOT_OF_H_ */

View File

@ -18,7 +18,7 @@
#include "of.h"
static void *of_stdout_handle;
static unsigned int of_stdout_handle;
static int of_console_open(void)
{
@ -27,8 +27,10 @@ static int of_console_open(void)
if (((devp = of_finddevice("/chosen")) != NULL)
&& (of_getprop(devp, "stdout", &of_stdout_handle,
sizeof(of_stdout_handle))
== sizeof(of_stdout_handle)))
== sizeof(of_stdout_handle))) {
of_stdout_handle = be32_to_cpu(of_stdout_handle);
return 0;
}
return -1;
}

View File

@ -42,13 +42,13 @@ int of_call_prom(const char *service, int nargs, int nret, ...)
struct prom_args args;
va_list list;
args.service = ADDR(service);
args.nargs = nargs;
args.nret = nret;
args.service = cpu_to_be32(ADDR(service));
args.nargs = cpu_to_be32(nargs);
args.nret = cpu_to_be32(nret);
va_start(list, nret);
for (i = 0; i < nargs; i++)
args.args[i] = va_arg(list, prom_arg_t);
args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
va_end(list);
for (i = 0; i < nret; i++)
@ -57,7 +57,7 @@ int of_call_prom(const char *service, int nargs, int nret, ...)
if (prom(&args) < 0)
return -1;
return (nret > 0)? args.args[nargs]: 0;
return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
}
static int of_call_prom_ret(const char *service, int nargs, int nret,
@ -67,13 +67,13 @@ static int of_call_prom_ret(const char *service, int nargs, int nret,
struct prom_args args;
va_list list;
args.service = ADDR(service);
args.nargs = nargs;
args.nret = nret;
args.service = cpu_to_be32(ADDR(service));
args.nargs = cpu_to_be32(nargs);
args.nret = cpu_to_be32(nret);
va_start(list, rets);
for (i = 0; i < nargs; i++)
args.args[i] = va_arg(list, prom_arg_t);
args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
va_end(list);
for (i = 0; i < nret; i++)
@ -84,9 +84,9 @@ static int of_call_prom_ret(const char *service, int nargs, int nret,
if (rets != (void *) 0)
for (i = 1; i < nret; ++i)
rets[i-1] = args.args[nargs+i];
rets[i-1] = be32_to_cpu(args.args[nargs+i]);
return (nret > 0)? args.args[nargs]: 0;
return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
}
/* returns true if s2 is a prefix of s1 */