> On 16 Sep 2020, at 10:28, Jan Kiszka <jan.kis...@siemens.com> wrote: > > On 16.09.20 09:12, Oliver Schwartz wrote: >> SMC calls may modify registers x0 to x3. To make sure the compiler doesn't >> assume input registers to be constant, also mark these registers as output >> when used as input. >> Signed-off-by: Oliver Schwartz <oliver.schwa...@gmx.de> >> --- >> hypervisor/arch/arm64/include/asm/smc.h | 6 +++--- >> 1 file changed, 3 insertions(+), 3 deletions(-) >> diff --git a/hypervisor/arch/arm64/include/asm/smc.h >> b/hypervisor/arch/arm64/include/asm/smc.h >> index 1a5d5c8..e7b6723 100644 >> --- a/hypervisor/arch/arm64/include/asm/smc.h >> +++ b/hypervisor/arch/arm64/include/asm/smc.h >> @@ -28,7 +28,7 @@ static inline long smc_arg1(unsigned long id, unsigned >> long par1) >> register unsigned long __par1 asm("r1") = par1; >> asm volatile ("smc #0\n\t" >> - : "=r" (__id) >> + : "=r" (__id), "=r"(__par1) >> : "r"(__id), "r"(__par1) >> : "memory", "x2", "x3"); >> @@ -43,7 +43,7 @@ static inline long smc_arg2(unsigned long id, unsigned >> long par1, >> register unsigned long __par2 asm("r2") = par2; >> asm volatile ("smc #0\n\t" >> - : "=r" (__id) >> + : "=r" (__id), "=r"(__par1), "=r"(__par2) >> : "r"(__id), "r"(__par1), "r"(__par2) >> : "memory", "x3"); >> @@ -62,7 +62,7 @@ static inline long smc_arg5(unsigned long id, unsigned >> long par1, >> register unsigned long __par5 asm("r5") = par5; >> asm volatile ("smc #0\n\t" >> - : "=r" (__id) >> + : "=r" (__id), "=r"(__par1), "=r"(__par2), "=r"(__par3) >> : "r"(__id), "r"(__par1), "r"(__par2), "r"(__par3), >> "r"(__par4), "r"(__par5) >> : "memory"); > > Good catch! We likely have the same issue with our hypercall interface > (jailhouse_hypercall.h). > > We should probably look carefully again at how Linux expresses these > constraints: linux/include/linux/arm-smccc.h. That appears to me like we need > "+r" for input/output registers and "=&r" for those that are just input but > might be clobbered on return.
I must admit that I don’t fully understand the “Constraint Modifier Characters” chapter in the gcc documentation. Please feel free to modify the patch as needed. The 32 bit implementation for smc and hypercall also need a fix. Oliver -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to jailhouse-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/jailhouse-dev/C2B8E562-224D-4B4A-904E-23DA8DE3DFED%40gmx.de.