[Skiboot] [PATCH] Fix booting & OPAL call return values with DEBUG=1
Andrew Donnellan
andrew.donnellan at au1.ibm.com
Wed Dec 6 17:00:58 AEDT 2017
On 06/12/17 16:56, Stewart Smith wrote:
> On a debug build, _mcount would trash r3 and opal_exit_check
> would not restore it, leaving OPAL calls returning garbage.
>
> this fix simply preserves the return value and doesn't let
> the compiler get fancy on us. We effectively just get an
> extra `mr` instruction to restore r3.
>
> Fixes: 9c565ee6bca4b665d9d1120bfff5e88ee80615bc
> Reported-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> Reported-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
> Suggested-by: Nicholas Piggin <npiggin at gmail.com>
> Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>
Thanks!
Reviewed-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
Tested-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
> ---
> core/opal.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/core/opal.c b/core/opal.c
> index 193dc89805de..d33d527c7dec 100644
> --- a/core/opal.c
> +++ b/core/opal.c
> @@ -171,9 +171,9 @@ again:
> return OPAL_SUCCESS;
> }
>
> -void opal_exit_check(int64_t retval, struct stack_frame *eframe);
> +int64_t opal_exit_check(int64_t retval, struct stack_frame *eframe);
>
> -void opal_exit_check(int64_t retval, struct stack_frame *eframe)
> +int64_t opal_exit_check(int64_t retval, struct stack_frame *eframe)
> {
> struct cpu_thread *cpu = this_cpu();
> uint64_t token = eframe->gpr[0];
> @@ -185,6 +185,7 @@ void opal_exit_check(int64_t retval, struct stack_frame *eframe)
> sync(); /* release barrier vs quiescing */
> cpu->in_opal_call--;
> }
> + return retval;
> }
>
> int64_t opal_quiesce(uint32_t quiesce_type, int32_t cpu_target)
>
--
Andrew Donnellan OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com IBM Australia Limited
More information about the Skiboot
mailing list