mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 17:12:06 +00:00
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:
parent
163bed77b9
commit
926e6940f5
@ -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_ */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user