Message ID | 20210322142035.183915-1-msc@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | powerpc: Add missing registers to clobbers list for syscalls [BZ #27623] | expand |
On Mär 22 2021, Matheus Castanho via Libc-alpha wrote: > Some registers that can be clobbered by the kernel during a syscall are not > listed on the clobbers list in sysdeps/unix/sysv/linux/powerpc/sysdep.h. > > For syscalls using sc: > - XER is zeroed by the kernel on exit > > For syscalls using scv: > - XER is zeroed by the kernel on exit > - Different from the sc case, most CR fields can be clobbered (according to > the ELF ABI and the Linux kernel's syscall ABI for powerpc > (linux/Documentation/powerpc/syscall64-abi.rst) > > These are likely not causing issues today, but they should be added to the > clobbers list just in case things change on the kernel side in the future. What about INTERNAL_VSYSCALL_CALL_TYPE? Doesn't that clobber XER[CA] and CR1/5/6/7 like ordinary function calls? Andreas.
Andreas Schwab <schwab@linux-m68k.org> writes: > On Mär 22 2021, Matheus Castanho via Libc-alpha wrote: > >> Some registers that can be clobbered by the kernel during a syscall are not >> listed on the clobbers list in sysdeps/unix/sysv/linux/powerpc/sysdep.h. >> >> For syscalls using sc: >> - XER is zeroed by the kernel on exit >> >> For syscalls using scv: >> - XER is zeroed by the kernel on exit >> - Different from the sc case, most CR fields can be clobbered (according to >> the ELF ABI and the Linux kernel's syscall ABI for powerpc >> (linux/Documentation/powerpc/syscall64-abi.rst) >> >> These are likely not causing issues today, but they should be added to the >> clobbers list just in case things change on the kernel side in the future. > > What about INTERNAL_VSYSCALL_CALL_TYPE? Doesn't that clobber XER[CA] > and CR1/5/6/7 like ordinary function calls? > > Andreas. Yes, looks like they should be added to the clobbers list there too. I'll send a v2 shortly. -- Matheus Castanho
diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h index 6b99464e61..d15e80d610 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h @@ -86,7 +86,8 @@ "=&r" (r6), "=&r" (r7), "=&r" (r8) \ : ASM_INPUT_##nr \ : "r9", "r10", "r11", "r12", \ - "lr", "ctr", "memory"); \ + "cr0", "cr1", "cr5", "cr6", "cr7", \ + "xer", "lr", "ctr", "memory"); \ r3; \ }) @@ -101,7 +102,7 @@ "=&r" (r6), "=&r" (r7), "=&r" (r8) \ : ASM_INPUT_##nr \ : "r9", "r10", "r11", "r12", \ - "cr0", "ctr", "memory"); \ + "xer", "cr0", "ctr", "memory"); \ r0 & (1 << 28) ? -r3 : r3; \ })