[PATCH] 2.6 ppc64 RTAS: use dynamic buffer size

Linas Vepstas linas at austin.ibm.com
Fri Aug 20 06:46:03 EST 2004


Hi,

This simple patch was discussed on the mailing lists in mid July,
but the current bkbits tree doesn't yet have this.   Please forward
upstream.

Firmware expects error log sizes 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


-------------- next part --------------

--- 1.38/arch/ppc64/kernel/rtas.c   Wed Jul 14 15:27:37 2004
+++ edited/arch/ppc64/kernel/rtas.c Mon Jul 23 14:12:23 2004
@@ -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, ...)




More information about the Linuxppc64-dev mailing list