__fetch_rtas_last_error can use the same rtas_args as the caller used
for the failed rtas call. It can also use a higher-level helper to
assemble the rtas_args.

Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
 arch/powerpc/kernel/rtas.c | 30 +++++++++---------------------
 1 file changed, 9 insertions(+), 21 deletions(-)

diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 751a20669669..e047793cbb80 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -385,34 +385,22 @@ static int rtas_last_error_token;
  *  this routine must be called atomically with whatever produced
  *  the error (i.e. with rtas.lock still held from the previous call).
  */
-static char *__fetch_rtas_last_error(char *altbuf)
+static char *__fetch_rtas_last_error(struct rtas_args *args, char *altbuf)
 {
-       struct rtas_args err_args, save_args;
        u32 bufsz;
        char *buf = NULL;
+       int ret;
 
        if (rtas_last_error_token == -1)
                return NULL;
 
        bufsz = rtas_get_error_log_max();
 
-       err_args.token = cpu_to_be32(rtas_last_error_token);
-       err_args.nargs = cpu_to_be32(2);
-       err_args.nret = cpu_to_be32(1);
-       err_args.args[0] = cpu_to_be32(__pa(rtas_err_buf));
-       err_args.args[1] = cpu_to_be32(bufsz);
-       err_args.args[2] = 0;
-
-       save_args = rtas.args;
-       rtas.args = err_args;
-
-       do_enter_rtas(__pa(&rtas.args));
-
-       err_args = rtas.args;
-       rtas.args = save_args;
+       ret = raw_rtas_call(args, rtas_last_error_token, 2, 1, NULL,
+                               __pa(rtas_err_buf), bufsz);
 
        /* Log the error in the unlikely case that there was one. */
-       if (unlikely(err_args.args[2] == 0)) {
+       if (unlikely(ret == 0)) {
                if (altbuf) {
                        buf = altbuf;
                } else {
@@ -430,8 +418,8 @@ static char *__fetch_rtas_last_error(char *altbuf)
 #define get_errorlog_buffer()  kmalloc(RTAS_ERROR_LOG_MAX, GFP_KERNEL)
 
 #else /* CONFIG_RTAS_ERROR_LOGGING */
-#define __fetch_rtas_last_error(x)     NULL
-#define get_errorlog_buffer()          NULL
+#define __fetch_rtas_last_error(args, x)       NULL
+#define get_errorlog_buffer()                  NULL
 #endif
 
 static int notrace va_raw_rtas_call(struct rtas_args *args, int token,
@@ -503,7 +491,7 @@ int rtas_call(int token, int nargs, int nret, int *outputs, 
...)
        /* A -1 return code indicates that the last command couldn't
           be completed due to a hardware error. */
        if (ret == -1)
-               buff_copy = __fetch_rtas_last_error(NULL);
+               buff_copy = __fetch_rtas_last_error(rtas_args, NULL);
 
        unlock_rtas(s);
 
@@ -1247,7 +1235,7 @@ SYSCALL_DEFINE1(rtas, struct rtas_args __user *, uargs)
        /* A -1 return code indicates that the last command couldn't
           be completed due to a hardware error. */
        if (be32_to_cpu(args.rets[0]) == -1)
-               errbuf = __fetch_rtas_last_error(buff_copy);
+               errbuf = __fetch_rtas_last_error(&rtas.args, buff_copy);
 
        unlock_rtas(flags);
 
-- 
2.23.0

Reply via email to