On 8/14/19 7:46 AM, Michael Ellerman wrote: > Claudio Carvalho <cclaudio@xxxxxxxxxxxxx> writes: >> diff --git a/arch/powerpc/kernel/ucall.S b/arch/powerpc/kernel/ucall.S >> new file mode 100644 >> index 000000000000..de9133e45d21 >> --- /dev/null >> +++ b/arch/powerpc/kernel/ucall.S >> @@ -0,0 +1,20 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +/* >> + * Generic code to perform an ultravisor call. >> + * >> + * Copyright 2019, IBM Corporation. >> + * >> + */ >> +#include <asm/ppc_asm.h> >> +#include <asm/export.h> >> + >> +_GLOBAL(ucall_norets) >> +EXPORT_SYMBOL_GPL(ucall_norets) >> + mfcr r0 >> + stw r0,8(r1) >> + >> + sc 2 /* Invoke the ultravisor */ >> + >> + lwz r0,8(r1) >> + mtcrf 0xff,r0 >> + blr /* Return r3 = status */ > Paulus points that we shouldn't need to save CR here. Our caller will > have already saved it if it needed to, and we don't use CR in this > function so we don't need to save it. Dropped the CR save/restore in the next patchset version: _GLOBAL(ucall_norets) EXPORT_SYMBOL_GPL(ucall_norets) sc 2 /* Invoke the ultravisor */ blr /* Return r3 = status */ Thanks, Claudio > > That's assuming the Ultravisor follows the hcall ABI in which CR2-4 are > non-volatile (PAPR § 14.5.3). > > I know plpar_hcall_norets() does save CR, but it shouldn't need to, that > seems to be historical. aka. no one knows why it does it but it always > has. > > cheers >