Am 18.12.2010 um 18:02 schrieb Andreas Färber:
Am 18.12.2010 um 17:09 schrieb Blue Swirl:
On Sat, Dec 18, 2010 at 1:09 AM, Andreas Färber <andreas.faerber@web.de
wrote: #define PROM_MAX_ARGS 10 typedef struct prom_args {
const char *service;
long nargs;
long nret;
unsigned long args[PROM_MAX_ARGS];
-} prom_args_t; +#ifdef CONFIG_PPC64
- prom_uarg_t service;
+#else
- const char *service;
+#endif
- prom_arg_t nargs;
- prom_arg_t nret;
- prom_uarg_t args[PROM_MAX_ARGS];
+} __attribute__((packed)) prom_args_t;
+static inline void* arg2pointer(prom_uarg_t value) +{
- return (void*)(uintptr_t)value;
+}
Perhaps the the type of the return value should be const char * instead, that may reduce the number of casts.
Will try. I followed the cell2pointer() model.
+static inline const char* get_service(prom_args_t *pb) +{ +#ifdef CONFIG_PPC64
- return arg2pointer(pb->service);
+#else
- return pb->service;
+#endif
I don't think arg2pointer() has any effect for non-PPC64 hosts, so you could also unconditionally use arg2pointer().
CC target/libopenbios/client.o cc1: warnings being treated as errors ../libopenbios/client.c: In function 'get_service': ../libopenbios/client.c:72:5: error: passing argument 1 of 'arg2pointer' makes integer from pointer without a cast ../libopenbios/client.c:65:21: note: expected 'prom_uarg_t' but argument is of type 'const char *' make[1]: *** [target/libopenbios/client.o] Error 1
A possible solution would be to always declare the service field as prom_uarg_t but then it cannot easily be inspected in gdb.
Andreas