lkml.org 
[lkml]   [2004]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] PPC64 Use correct buffer size in RTAS call
Firmware expects the size of the buffer that you hand it when you ask
it for information about a hardware error to be of a very specific
size, but different versions of firmware appearently expect different
sizes; using the wrong size results in a painful, hard-to-debug crash
in firmware. Benh provided a patch for this some months ago, but
appreantly missed this code path. This patch sets up the log buffer
size dynamically; it also fixes a bug with the return code not being
handled correctly.

Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>

diff -urN akpm-19aug/arch/ppc64/kernel/rtas.c akpm/arch/ppc64/kernel/rtas.c
--- akpm-19aug/arch/ppc64/kernel/rtas.c 2004-08-19 15:20:22.000000000 +1000
+++ akpm/arch/ppc64/kernel/rtas.c 2004-08-20 20:23:15.666626040 +1000
@@ -22,7 +22,6 @@
#include <asm/rtas.h>
#include <asm/semaphore.h>
#include <asm/machdep.h>
-#include <asm/paca.h>
#include <asm/page.h>
#include <asm/param.h>
#include <asm/system.h>
@@ -73,7 +72,6 @@
return tokp ? *tokp : RTAS_UNKNOWN_SERVICE;
}

-
/** Return a copy of the detailed error text associated with the
* most recent failed call to rtas. Because the error text
* might go stale if there are any other intervening rtas calls,
@@ -84,28 +82,32 @@
__fetch_rtas_last_error(void)
{
struct rtas_args err_args, save_args;
+ u32 bufsz;
+
+ bufsz = rtas_token ("rtas-error-log-max");
+ if ((bufsz == RTAS_UNKNOWN_SERVICE) ||
+ (bufsz > RTAS_ERROR_LOG_MAX)) {
+ printk (KERN_WARNING "RTAS: bad log buffer size %d\n", bufsz);
+ bufsz = RTAS_ERROR_LOG_MAX;
+ }

err_args.token = rtas_token("rtas-last-error");
err_args.nargs = 2;
err_args.nret = 1;
- err_args.rets = (rtas_arg_t *)&(err_args.args[2]);

err_args.args[0] = (rtas_arg_t)__pa(rtas_err_buf);
- err_args.args[1] = RTAS_ERROR_LOG_MAX;
+ err_args.args[1] = bufsz;
err_args.args[2] = 0;

save_args = rtas.args;
rtas.args = err_args;

- PPCDBG(PPCDBG_RTAS, "\tentering rtas with 0x%lx\n",
- __pa(&err_args));
enter_rtas(__pa(&rtas.args));
- PPCDBG(PPCDBG_RTAS, "\treturned from rtas ...\n");

err_args = rtas.args;
rtas.args = save_args;

- return err_args.rets[0];
+ return err_args.args[2];
}

int rtas_call(int token, int nargs, int nret, int *outputs, ...)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 14:05    [W:0.021 / U:0.032 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site