On ppc64 neither long nor pointers can be used for the client interface. Introduce new types prom_[u]arg_t to abstract this and add helpers get_service() and arg2pointer() as well as format strings.
Signed-off-by: Andreas Färber andreas.faerber@web.de --- libopenbios/client.c | 302 ++++++++++++++++++++++++++++---------------------- 1 files changed, 170 insertions(+), 132 deletions(-)
diff --git a/libopenbios/client.c b/libopenbios/client.c index d8a9fdf..d986226 100644 --- a/libopenbios/client.c +++ b/libopenbios/client.c @@ -30,13 +30,47 @@ * (it doesn't) or if the function is unimplemented. */
+#ifdef CONFIG_PPC64 +typedef int prom_arg_t; +typedef unsigned int prom_uarg_t; +#define PRIdARG "d" +#define PRIxARG "x" +#define FMT_arg "%" PRIdARG +#define FMT_argx "%08" PRIxARG +#else +typedef long prom_arg_t; +typedef unsigned long prom_uarg_t; +#define PRIdARG "ld" +#define PRIxARG "lx" +#define FMT_arg "%" PRIdARG +#define FMT_argx "%08" PRIxARG +#endif + #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; +} + +static inline const char* get_service(prom_args_t *pb) +{ +#ifdef CONFIG_PPC64 + return arg2pointer(pb->service); +#else + return pb->service; +#endif +}
#ifdef DEBUG_CIF static void memdump(const char *mem, unsigned long size) @@ -73,83 +107,84 @@ static void memdump(const char *mem, unsigned long size) static void dump_service(prom_args_t *pb) { int i; - if (strcmp(pb->service, "test") == 0) { - printk("test("%s") = ", (char*)pb->args[0]); - } else if (strcmp(pb->service, "peer") == 0) { - printk("peer(0x%08lx) = ", pb->args[0]); - } else if (strcmp(pb->service, "child") == 0) { - printk("child(0x%08lx) = ", pb->args[0]); - } else if (strcmp(pb->service, "parent") == 0) { - printk("parent(0x%08lx) = ", pb->args[0]); - } else if (strcmp(pb->service, "instance-to-package") == 0) { - printk("instance-to-package(0x%08lx) = ", pb->args[0]); - } else if (strcmp(pb->service, "getproplen") == 0) { - printk("getproplen(0x%08lx, "%s") = ", - pb->args[0], (char*)pb->args[1]); - } else if (strcmp(pb->service, "getprop") == 0) { - printk("getprop(0x%08lx, "%s", 0x%08lx, %ld) = ", - pb->args[0], (char*)pb->args[1], + const char *service = get_service(pb); + if (strcmp(service, "test") == 0) { + printk("test("%s") = ", (char*)arg2pointer(pb->args[0])); + } else if (strcmp(service, "peer") == 0) { + printk("peer(0x" FMT_argx ") = ", pb->args[0]); + } else if (strcmp(service, "child") == 0) { + printk("child(0x" FMT_argx ") = ", pb->args[0]); + } else if (strcmp(service, "parent") == 0) { + printk("parent(0x" FMT_argx ") = ", pb->args[0]); + } else if (strcmp(service, "instance-to-package") == 0) { + printk("instance-to-package(0x" FMT_argx ") = ", pb->args[0]); + } else if (strcmp(service, "getproplen") == 0) { + printk("getproplen(0x" FMT_argx ", "%s") = ", + pb->args[0], (char*)arg2pointer(pb->args[1])); + } else if (strcmp(service, "getprop") == 0) { + printk("getprop(0x" FMT_argx ", "%s", 0x" FMT_argx ", " FMT_arg ") = ", + pb->args[0], (char*)arg2pointer(pb->args[1]), pb->args[2], pb->args[3]); - } else if (strcmp(pb->service, "nextprop") == 0) { - printk("nextprop(0x%08lx, "%s", 0x%08lx) = ", - pb->args[0], (char*)pb->args[1], pb->args[2]); - } else if (strcmp(pb->service, "setprop") == 0) { - printk("setprop(0x%08lx, "%s", 0x%08lx, %ld)\n", - pb->args[0], (char*)pb->args[1], + } else if (strcmp(service, "nextprop") == 0) { + printk("nextprop(0x" FMT_argx ", "%s", 0x" FMT_argx ") = ", + pb->args[0], (char*)arg2pointer(pb->args[1]), pb->args[2]); + } else if (strcmp(service, "setprop") == 0) { + printk("setprop(0x" FMT_argx ", "%s", 0x" FMT_argx ", " FMT_arg ")\n", + pb->args[0], (char*)arg2pointer(pb->args[1]), pb->args[2], pb->args[3]); - memdump((char*)pb->args[2], pb->args[3]); + memdump((char*)arg2pointer(pb->args[2]), pb->args[3]); printk(" = "); - } else if (strcmp(pb->service, "canon") == 0) { - printk("canon("%s", 0x%08lx, %ld)\n", - (char*)pb->args[0], pb->args[1], pb->args[2]); - } else if (strcmp(pb->service, "finddevice") == 0) { - printk("finddevice("%s") = ", (char*)pb->args[0]); - } else if (strcmp(pb->service, "instance-to-path") == 0) { - printk("instance-to-path(0x%08lx, 0x%08lx, %ld) = ", + } else if (strcmp(service, "canon") == 0) { + printk("canon("%s", 0x" FMT_argx ", " FMT_arg ")\n", + (char*)arg2pointer(pb->args[0]), pb->args[1], pb->args[2]); + } else if (strcmp(service, "finddevice") == 0) { + printk("finddevice("%s") = ", (char*)arg2pointer(pb->args[0])); + } else if (strcmp(service, "instance-to-path") == 0) { + printk("instance-to-path(0x" FMT_argx ", 0x" FMT_argx ", " FMT_arg ") = ", pb->args[0], pb->args[1], pb->args[2]); - } else if (strcmp(pb->service, "package-to-path") == 0) { - printk("package-to-path(0x%08lx, 0x%08lx, %ld) = ", + } else if (strcmp(service, "package-to-path") == 0) { + printk("package-to-path(0x" FMT_argx ", 0x" FMT_argx ", " FMT_arg ") = ", pb->args[0], pb->args[1], pb->args[2]); - } else if (strcmp(pb->service, "open") == 0) { - printk("open("%s") = ", (char*)pb->args[0]); - } else if (strcmp(pb->service, "close") == 0) { - printk("close(0x%08lx)\n", pb->args[0]); - } else if (strcmp(pb->service, "read") == 0) { + } else if (strcmp(service, "open") == 0) { + printk("open("%s") = ", (char*)arg2pointer(pb->args[0])); + } else if (strcmp(service, "close") == 0) { + printk("close(0x" FMT_argx ")\n", pb->args[0]); + } else if (strcmp(service, "read") == 0) { #ifdef DUMP_IO - printk("read(0x%08lx, 0x%08lx, %ld) = ", + printk("read(0x" FMT_argx ", 0x" FMT_argx ", " FMT_arg ") = ", pb->args[0], pb->args[1], pb->args[2]); #endif - } else if (strcmp(pb->service, "write") == 0) { + } else if (strcmp(service, "write") == 0) { #ifdef DUMP_IO - printk("write(0x%08lx, 0x%08lx, %ld)\n", + printk("write(0x" FMT_argx ", 0x" FMT_argx ", " FMT_arg ")\n", pb->args[0], pb->args[1], pb->args[2]); - memdump((char*)pb->args[1], pb->args[2]); + memdump((char*)arg2pointer(pb->args[1]), pb->args[2]); printk(" = "); #endif - } else if (strcmp(pb->service, "seek") == 0) { + } else if (strcmp(service, "seek") == 0) { #ifdef DUMP_IO - printk("seek(0x%08lx, 0x%08lx, 0x%08lx) = ", + printk("seek(0x" FMT_argx ", 0x" FMT_argx ", 0x" FMT_argx ") = ", pb->args[0], pb->args[1], pb->args[2]); #endif - } else if (strcmp(pb->service, "claim") == 0) { - printk("claim(0x%08lx, %ld, %ld) = ", + } else if (strcmp(service, "claim") == 0) { + printk("claim(0x" FMT_argx ", " FMT_arg ", " FMT_arg ") = ", pb->args[0], pb->args[1], pb->args[2]); - } else if (strcmp(pb->service, "release") == 0) { - printk("release(0x%08lx, %ld)\n", + } else if (strcmp(service, "release") == 0) { + printk("release(0x" FMT_argx ", " FMT_arg ")\n", pb->args[0], pb->args[1]); - } else if (strcmp(pb->service, "boot") == 0) { - printk("boot "%s"\n", (char*)pb->args[0]); - } else if (strcmp(pb->service, "enter") == 0) { + } else if (strcmp(service, "boot") == 0) { + printk("boot "%s"\n", (char*)arg2pointer(pb->args[0])); + } else if (strcmp(service, "enter") == 0) { printk("enter()\n"); - } else if (strcmp(pb->service, "exit") == 0) { + } else if (strcmp(service, "exit") == 0) { printk("exit()\n"); - } else if (strcmp(pb->service, "test-method") == 0) { - printk("test-method(0x%08lx, "%s") = ", - pb->args[0], (char*)pb->args[1]); + } else if (strcmp(service, "test-method") == 0) { + printk("test-method(0x" FMT_argx ", "%s") = ", + pb->args[0], (char*)arg2pointer(pb->args[1])); } else { - printk("of_client_interface: %s ", pb->service ); + printk("of_client_interface: %s", service); for( i = 0; i < pb->nargs; i++ ) - printk("%lx ", pb->args[i] ); + printk(" %" PRIxARG, pb->args[i]); printk("\n"); } } @@ -157,71 +192,72 @@ static void dump_service(prom_args_t *pb) static void dump_return(prom_args_t *pb) { int i; - if (strcmp(pb->service, "test") == 0) { - printk(" %ld\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "peer") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "child") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "parent") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "instance-to-package") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "getproplen") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "getprop") == 0) { - printk("%ld\n", pb->args[pb->nargs]); - if ((long)pb->args[pb->nargs] != -1) - memdump((char*)pb->args[2], MIN(pb->args[3], pb->args[pb->nargs])); - } else if (strcmp(pb->service, "nextprop") == 0) { - printk("%ld\n", pb->args[pb->nargs]); - memdump((char*)pb->args[2], pb->args[pb->nargs]); - } else if (strcmp(pb->service, "setprop") == 0) { - printk("%ld\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "canon") == 0) { - printk("%ld\n", pb->args[pb->nargs]); - memdump((char*)pb->args[1], pb->args[pb->nargs]); - } else if (strcmp(pb->service, "finddevice") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "instance-to-path") == 0) { - printk("%ld\n", pb->args[pb->nargs]); - memdump((char*)pb->args[1], pb->args[pb->nargs]); - } else if (strcmp(pb->service, "package-to-path") == 0) { - printk("%ld\n", pb->args[pb->nargs]); - memdump((char*)pb->args[1], pb->args[pb->nargs]); - } else if (strcmp(pb->service, "open") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "close") == 0) { + const char *service = get_service(pb); + if (strcmp(service, "test") == 0) { + printk(FMT_arg "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "peer") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "child") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "parent") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "instance-to-package") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "getproplen") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "getprop") == 0) { + printk(FMT_arg "\n", pb->args[pb->nargs]); + if ((prom_arg_t)pb->args[pb->nargs] != -1) + memdump((char*)arg2pointer(pb->args[2]), MIN(pb->args[3], pb->args[pb->nargs])); + } else if (strcmp(service, "nextprop") == 0) { + printk(FMT_arg "\n", pb->args[pb->nargs]); + memdump((char*)arg2pointer(pb->args[2]), pb->args[pb->nargs]); + } else if (strcmp(service, "setprop") == 0) { + printk(FMT_arg "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "canon") == 0) { + printk(FMT_arg "\n", pb->args[pb->nargs]); + memdump((char*)arg2pointer(pb->args[1]), pb->args[pb->nargs]); + } else if (strcmp(service, "finddevice") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "instance-to-path") == 0) { + printk(FMT_arg "\n", pb->args[pb->nargs]); + memdump((char*)arg2pointer(pb->args[1]), pb->args[pb->nargs]); + } else if (strcmp(service, "package-to-path") == 0) { + printk(FMT_arg "\n", pb->args[pb->nargs]); + memdump((char*)arg2pointer(pb->args[1]), pb->args[pb->nargs]); + } else if (strcmp(service, "open") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "close") == 0) { /* do nothing */ - } else if (strcmp(pb->service, "read") == 0) { + } else if (strcmp(service, "read") == 0) { #ifdef DUMP_IO - printk("%ld\n", pb->args[pb->nargs]); - memdump((char*)pb->args[1], pb->args[pb->nargs]); + printk(FMT_arg "\n", pb->args[pb->nargs]); + memdump((char*)arg2pointer(pb->args[1]), pb->args[pb->nargs]); #endif - } else if (strcmp(pb->service, "write") == 0) { + } else if (strcmp(service, "write") == 0) { #ifdef DUMP_IO - printk("%ld\n", pb->args[pb->nargs]); + printk(FMT_arg "\n", pb->args[pb->nargs]); #endif - } else if (strcmp(pb->service, "seek") == 0) { + } else if (strcmp(service, "seek") == 0) { #ifdef DUMP_IO - printk("%ld\n", pb->args[pb->nargs]); + printk(FMT_arg "\n", pb->args[pb->nargs]); #endif - } else if (strcmp(pb->service, "claim") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); - } else if (strcmp(pb->service, "release") == 0) { + } else if (strcmp(service, "claim") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); + } else if (strcmp(service, "release") == 0) { /* do nothing */ - } else if (strcmp(pb->service, "boot") == 0) { + } else if (strcmp(service, "boot") == 0) { /* do nothing */ - } else if (strcmp(pb->service, "enter") == 0) { + } else if (strcmp(service, "enter") == 0) { /* do nothing */ - } else if (strcmp(pb->service, "exit") == 0) { + } else if (strcmp(service, "exit") == 0) { /* do nothing */ - } else if (strcmp(pb->service, "test-method") == 0) { - printk("0x%08lx\n", pb->args[pb->nargs]); + } else if (strcmp(service, "test-method") == 0) { + printk("0x" FMT_argx "\n", pb->args[pb->nargs]); } else { printk("of_client_interface return:"); for (i = 0; i < pb->nret; i++) { - printk(" %lx", pb->args[pb->nargs + i]); + printk(" %" PRIxARG, pb->args[pb->nargs + i]); } printk("\n"); } @@ -233,17 +269,18 @@ static int handle_calls( prom_args_t *pb ) { int i, dstacksave = dstackcnt; - long val; + prom_uarg_t val;
#ifdef DEBUG_CIF - printk("%s %s ([%ld] -- [%ld])\n", pb->service, (char *)pb->args[0], - pb->nargs, pb->nret); + printk("%s %s ([" FMT_arg "] -- [" FMT_arg "])\n", get_service(pb), + (char *)arg2pointer(pb->args[0]), + pb->nargs, pb->nret); #endif
for( i=pb->nargs-1; i>=0; i-- ) PUSH( pb->args[i] );
- push_str( pb->service ); + push_str(get_service(pb)); fword("client-call-iface");
/* Drop the return code from client-call-iface (status is handled by the @@ -260,17 +297,18 @@ handle_calls( prom_args_t *pb ) }
#ifdef DEBUG_CIF - /* useful for debug but not necessarily an error */ - if( i != pb->nret || dstackcnt != dstacksave ) { - printk("%s '%s': possible argument error (%ld--%ld) got %d\n", - pb->service, (char*)pb->args[0], pb->nargs-2, pb->nret, i ); - } - - printk("handle_calls return: "); - for (i = 0; i < pb->nret; i++) { - printk("%lx ", pb->args[pb->nargs + i]); - } - printk("\n"); + /* useful for debug but not necessarily an error */ + if (i != pb->nret || dstackcnt != dstacksave) { + printk("%s '%s': possible argument error (" FMT_arg "--" FMT_arg ") got %d\n", + get_service(pb), (char*)arg2pointer(pb->args[0]), + pb->nargs - 2, pb->nret, i); + } + + printk("handle_calls return:"); + for (i = 0; i < pb->nret; i++) { + printk(" %" PRIxARG, pb->args[pb->nargs + i]); + } + printk("\n"); #endif
dstackcnt = dstacksave; @@ -292,21 +330,21 @@ of_client_interface( int *params ) #endif
/* call-method exceptions are special */ - if( !strcmp("call-method", pb->service) || !strcmp("interpret", pb->service) ) + if (!strcmp("call-method", get_service(pb)) || !strcmp("interpret", get_service(pb))) return handle_calls( pb );
dstacksave = dstackcnt; for( i=pb->nargs-1; i>=0; i-- ) PUSH( pb->args[i] );
- push_str( pb->service ); + push_str(get_service(pb)); fword("client-iface");
if( (val=POP()) ) { dstackcnt = dstacksave; if( val == -1 ) - printk("Unimplemented service %s ([%ld] -- [%ld])\n", - pb->service, pb->nargs, pb->nret ); + printk("Unimplemented service %s ([" FMT_arg "] -- [" FMT_arg "])\n", + get_service(pb), pb->nargs, pb->nret ); #ifdef DEBUG_CIF else printk("ERROR!\n"); @@ -320,7 +358,7 @@ of_client_interface( int *params ) if( dstackcnt != dstacksave ) { #ifdef DEBUG_CIF printk("service %s: possible argument error (%d %d)\n", - pb->service, i, dstackcnt - dstacksave ); + get_service(pb), i, dstackcnt - dstacksave ); #endif /* Some clients request less parameters than the CIF method returns, e.g. getprop with OpenSolaris. Hence we drop any