powerpc/boot: Add byteswapping routines in oflib
authorCédric Le Goater <clg@fr.ibm.com>
Thu, 24 Apr 2014 07:23:28 +0000 (09:23 +0200)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 28 Apr 2014 07:35:35 +0000 (17:35 +1000)
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>
arch/powerpc/boot/of.h
arch/powerpc/boot/ofconsole.c
arch/powerpc/boot/oflib.c

index 5da03d9b9463cc7781dd7e58b29887bbef30cfa6..40d95bf7402b64f10c5ab3f2fdfa63e0db8aa84f 100644 (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_ */
index ce0e0242445325feb7251ae9214705e90c42864a..8b754702460aee3e51eabd016d71c888abd4a719 100644 (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;
 }
index 3b0c9458504fe81b794ed4a5050f40dd62076963..0f72b1a42133b8329356f43140e29728851d7bcd 100644 (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 */