[OpenBIOS] [PATCH v2 1/2] libopenbios: Adapt CIF handling for ppc64
Andreas Färber
andreas.faerber at web.de
Sun Dec 19 01:05:51 CET 2010
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.
v2:
* Move format strings to arch-specific headers.
* Always declare 'service' as prom_uarg_t for consistency.
This keeps arch-specific code out.
* Let arg2pointer() return const char* to avoid casts. Suggested by Blue.
* Use zero-padded hexadecimal format string for unknown services.
Cc: Blue Swirl <blauwirbel at gmail.com>
Signed-off-by: Andreas Färber <andreas.faerber at web.de>
---
include/arch/amd64/types.h | 10 ++
include/arch/ia64/types.h | 10 ++
include/arch/ppc/types.h | 14 ++
include/arch/sparc32/types.h | 14 ++
include/arch/sparc64/types.h | 14 ++
include/arch/x86/types.h | 10 ++
libopenbios/client.c | 279 ++++++++++++++++++++++--------------------
7 files changed, 219 insertions(+), 132 deletions(-)
diff --git a/include/arch/amd64/types.h b/include/arch/amd64/types.h
index 44d2182..7b4f587 100644
--- a/include/arch/amd64/types.h
+++ b/include/arch/amd64/types.h
@@ -31,6 +31,16 @@ typedef __uint128_t ducell;
#define FMT_ucellx "%016llx"
+typedef int64_t prom_arg_t;
+typedef uint64_t prom_uarg_t;
+
+#define PRIdPROMARG PRId64
+#define PRIuPROMARG PRIu64
+#define PRIxPROMARG PRIx64
+#define FMT_prom_arg "%" PRIdPROMARG
+#define FMT_prom_uarg "%" PRIuPROMARG
+#define FMT_prom_uargx "%016" PRIxPROMARG
+
#define FMT_elf "%#x"
#define bitspercell (sizeof(cell)<<3)
diff --git a/include/arch/ia64/types.h b/include/arch/ia64/types.h
index 3bd2edb..ce5bbb1 100644
--- a/include/arch/ia64/types.h
+++ b/include/arch/ia64/types.h
@@ -30,6 +30,16 @@ typedef uint64_t ucell;
typedef __int128_t dcell;
typedef __uint128_t ducell;
+typedef int64_t prom_arg_t;
+typedef uint64_t prom_uarg_t;
+
+#define PRIdPROMARG PRId64
+#define PRIuPROMARG PRIu64
+#define PRIxPROMARG PRIx64
+#define FMT_prom_arg "%" PRIdPROMARG
+#define FMT_prom_uarg "%" PRIuPROMARG
+#define FMT_prom_uargx "%016" PRIxPROMARG
+
#define bitspercell (sizeof(cell)<<3)
#define bitsperdcell (sizeof(dcell)<<3)
diff --git a/include/arch/ppc/types.h b/include/arch/ppc/types.h
index ed9100c..b596428 100644
--- a/include/arch/ppc/types.h
+++ b/include/arch/ppc/types.h
@@ -26,7 +26,11 @@ typedef int int32_t;
typedef long long int64_t;
typedef long intptr_t;
+#define PRId32 "d"
+#define PRIu32 "u"
#define PRIx32 "x"
+#define PRId64 "lld"
+#define PRIu64 "llu"
#define PRIx64 "llx"
#endif
@@ -54,6 +58,16 @@ typedef uint64_t ducell;
#define FMT_ucellx "%08x"
#define FMT_ucellX "%08X"
+typedef int32_t prom_arg_t;
+typedef uint32_t prom_uarg_t;
+
+#define PRIdPROMARG PRId32
+#define PRIuPROMARG PRIu32
+#define PRIxPROMARG PRIx32
+#define FMT_prom_arg "%" PRIdPROMARG
+#define FMT_prom_uarg "%" PRIuPROMARG
+#define FMT_prom_uargx "%08" PRIxPROMARG
+
#define FMT_elf "%#x"
#define FMT_sizet "%lx"
#define FMT_aout_ehdr "%lx"
diff --git a/include/arch/sparc32/types.h b/include/arch/sparc32/types.h
index 444d648..e3a96ff 100644
--- a/include/arch/sparc32/types.h
+++ b/include/arch/sparc32/types.h
@@ -26,7 +26,11 @@ typedef int int32_t;
typedef long long int64_t;
typedef long intptr_t;
+#define PRId32 "d"
+#define PRIu32 "u"
#define PRIx32 "x"
+#define PRId64 "lld"
+#define PRIu64 "llu"
#define PRIx64 "llx"
#endif
@@ -51,6 +55,16 @@ typedef unsigned long long ducell;
#define FMT_ucellx "%08x"
#define FMT_ucellX "%08X"
+typedef int32_t prom_arg_t;
+typedef uint32_t prom_uarg_t;
+
+#define PRIdPROMARG PRId32
+#define PRIuPROMARG PRIu32
+#define PRIxPROMARG PRIx32
+#define FMT_prom_arg "%" PRIdPROMARG
+#define FMT_prom_uarg "%" PRIuPROMARG
+#define FMT_prom_uargx "%08" PRIxPROMARG
+
#define FMT_elf "%#x"
#define FMT_sizet "%lx"
#define FMT_aout_ehdr "%lx"
diff --git a/include/arch/sparc64/types.h b/include/arch/sparc64/types.h
index 14d0e41..d5a3fca 100644
--- a/include/arch/sparc64/types.h
+++ b/include/arch/sparc64/types.h
@@ -26,7 +26,11 @@ typedef int int32_t;
typedef long long int64_t;
typedef long intptr_t;
+#define PRId32 "d"
+#define PRIu32 "u"
#define PRIx32 "x"
+#define PRId64 "lld"
+#define PRIu64 "llu"
#define PRIx64 "llx"
#endif
@@ -47,6 +51,16 @@ typedef unsigned long long ucell;
#define FMT_ucellx "%016llx"
#define FMT_ucellX "%016llX"
+typedef int64_t prom_arg_t;
+typedef uint64_t prom_uarg_t;
+
+#define PRIdPROMARG PRId64
+#define PRIuPROMARG PRIu64
+#define PRIxPROMARG PRIx64
+#define FMT_prom_arg "%" PRIdPROMARG
+#define FMT_prom_uarg "%" PRIuPROMARG
+#define FMT_prom_uargx "%016" PRIxPROMARG
+
#define FMT_elf "%#llx"
#define FMT_sizet "%lx"
#define FMT_aout_ehdr "%x"
diff --git a/include/arch/x86/types.h b/include/arch/x86/types.h
index 3b1b331..f533397 100644
--- a/include/arch/x86/types.h
+++ b/include/arch/x86/types.h
@@ -35,6 +35,16 @@ typedef uint64_t ducell;
#define FMT_ucellx "%08x"
#define FMT_ucellX "%08X"
+typedef int32_t prom_arg_t;
+typedef uint32_t prom_uarg_t;
+
+#define PRIdPROMARG PRId32
+#define PRIuPROMARG PRIu32
+#define PRIxPROMARG PRIx32
+#define FMT_prom_arg "%" PRIdPROMARG
+#define FMT_prom_uarg "%" PRIuPROMARG
+#define FMT_prom_uargx "%08" PRIxPROMARG
+
#define FMT_elf "%#x"
#define bitspercell (sizeof(cell)<<3)
diff --git a/libopenbios/client.c b/libopenbios/client.c
index d8a9fdf..ad9ccdc 100644
--- a/libopenbios/client.c
+++ b/libopenbios/client.c
@@ -32,11 +32,23 @@
#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;
+ prom_uarg_t service;
+ prom_arg_t nargs;
+ prom_arg_t nret;
+ prom_uarg_t args[PROM_MAX_ARGS];
+} __attribute__((packed)) prom_args_t;
+
+static inline const char *
+arg2pointer(prom_uarg_t value)
+{
+ return (char*)(uintptr_t)value;
+}
+
+static inline const char *
+get_service(prom_args_t *pb)
+{
+ return arg2pointer(pb->service);
+}
#ifdef DEBUG_CIF
static void memdump(const char *mem, unsigned long size)
@@ -73,83 +85,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\") = ", arg2pointer(pb->args[0]));
+ } else if (strcmp(service, "peer") == 0) {
+ printk("peer(0x" FMT_prom_uargx ") = ", pb->args[0]);
+ } else if (strcmp(service, "child") == 0) {
+ printk("child(0x" FMT_prom_uargx ") = ", pb->args[0]);
+ } else if (strcmp(service, "parent") == 0) {
+ printk("parent(0x" FMT_prom_uargx ") = ", pb->args[0]);
+ } else if (strcmp(service, "instance-to-package") == 0) {
+ printk("instance-to-package(0x" FMT_prom_uargx ") = ", pb->args[0]);
+ } else if (strcmp(service, "getproplen") == 0) {
+ printk("getproplen(0x" FMT_prom_uargx ", \"%s\") = ",
+ pb->args[0], arg2pointer(pb->args[1]));
+ } else if (strcmp(service, "getprop") == 0) {
+ printk("getprop(0x" FMT_prom_uargx ", \"%s\", 0x" FMT_prom_uargx ", " FMT_prom_arg ") = ",
+ pb->args[0], 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_prom_uargx ", \"%s\", 0x" FMT_prom_uargx ") = ",
+ pb->args[0], arg2pointer(pb->args[1]), pb->args[2]);
+ } else if (strcmp(service, "setprop") == 0) {
+ printk("setprop(0x" FMT_prom_uargx ", \"%s\", 0x" FMT_prom_uargx ", " FMT_prom_arg ")\n",
+ pb->args[0], arg2pointer(pb->args[1]),
pb->args[2], pb->args[3]);
- memdump((char*)pb->args[2], pb->args[3]);
+ memdump(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_prom_uargx ", " FMT_prom_arg ")\n",
+ arg2pointer(pb->args[0]), pb->args[1], pb->args[2]);
+ } else if (strcmp(service, "finddevice") == 0) {
+ printk("finddevice(\"%s\") = ", arg2pointer(pb->args[0]));
+ } else if (strcmp(service, "instance-to-path") == 0) {
+ printk("instance-to-path(0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_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_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_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\") = ", arg2pointer(pb->args[0]));
+ } else if (strcmp(service, "close") == 0) {
+ printk("close(0x" FMT_prom_uargx ")\n", pb->args[0]);
+ } else if (strcmp(service, "read") == 0) {
#ifdef DUMP_IO
- printk("read(0x%08lx, 0x%08lx, %ld) = ",
+ printk("read(0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_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_prom_uargx ", 0x" FMT_prom_uargx ", " FMT_prom_arg ")\n",
pb->args[0], pb->args[1], pb->args[2]);
- memdump((char*)pb->args[1], pb->args[2]);
+ memdump(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_prom_uargx ", 0x" FMT_prom_uargx ", 0x" FMT_prom_uargx ") = ",
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_prom_uargx ", " FMT_prom_arg ", " FMT_prom_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_prom_uargx ", " FMT_prom_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", 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_prom_uargx ", \"%s\") = ",
+ pb->args[0], 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(" " FMT_prom_uargx, pb->args[i]);
printk("\n");
}
}
@@ -157,71 +170,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_prom_arg "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "peer") == 0) {
+ printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "child") == 0) {
+ printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "parent") == 0) {
+ printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "instance-to-package") == 0) {
+ printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "getproplen") == 0) {
+ printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "getprop") == 0) {
+ printk(FMT_prom_arg "\n", pb->args[pb->nargs]);
+ if ((prom_arg_t)pb->args[pb->nargs] != -1)
+ memdump(arg2pointer(pb->args[2]), MIN(pb->args[3], pb->args[pb->nargs]));
+ } else if (strcmp(service, "nextprop") == 0) {
+ printk(FMT_prom_arg "\n", pb->args[pb->nargs]);
+ memdump(arg2pointer(pb->args[2]), pb->args[pb->nargs]);
+ } else if (strcmp(service, "setprop") == 0) {
+ printk(FMT_prom_arg "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "canon") == 0) {
+ printk(FMT_prom_arg "\n", pb->args[pb->nargs]);
+ memdump(arg2pointer(pb->args[1]), pb->args[pb->nargs]);
+ } else if (strcmp(service, "finddevice") == 0) {
+ printk("0x" FMT_prom_uargx "\n", pb->args[pb->nargs]);
+ } else if (strcmp(service, "instance-to-path") == 0) {
+ printk(FMT_prom_arg "\n", pb->args[pb->nargs]);
+ memdump(arg2pointer(pb->args[1]), pb->args[pb->nargs]);
+ } else if (strcmp(service, "package-to-path") == 0) {
+ printk(FMT_prom_arg "\n", pb->args[pb->nargs]);
+ memdump(arg2pointer(pb->args[1]), pb->args[pb->nargs]);
+ } else if (strcmp(service, "open") == 0) {
+ printk("0x" FMT_prom_uargx "\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_prom_arg "\n", pb->args[pb->nargs]);
+ memdump(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_prom_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_prom_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_prom_uargx "\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_prom_uargx "\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(" " FMT_prom_uargx, pb->args[pb->nargs + i]);
}
printk("\n");
}
@@ -233,17 +247,17 @@ 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_prom_arg "] -- [" FMT_prom_arg "])\n",
+ get_service(pb), 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 +274,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_prom_arg "--" FMT_prom_arg ") got %d\n",
+ get_service(pb), arg2pointer(pb->args[0]),
+ pb->nargs - 2, pb->nret, i);
+ }
+
+ printk("handle_calls return:");
+ for (i = 0; i < pb->nret; i++) {
+ printk(" " FMT_prom_uargx, pb->args[pb->nargs + i]);
+ }
+ printk("\n");
#endif
dstackcnt = dstacksave;
@@ -292,21 +307,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_prom_arg "] -- [" FMT_prom_arg "])\n",
+ get_service(pb), pb->nargs, pb->nret );
#ifdef DEBUG_CIF
else
printk("ERROR!\n");
@@ -320,7 +335,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
--
1.7.3
More information about the OpenBIOS
mailing list