__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