On 09.08.21 10:01, Philippe Gerum wrote: > > Philippe Gerum <r...@xenomai.org> writes: > >> Jan Kiszka <jan.kis...@siemens.com> writes: >> >>> Hi all, >>> >>> the failing y2038 testcase we see in CI [1] is caused by another problem >>> of our syscall wrappers, this time on arm64: >>> >>> /* Timeout is never read by the kernel, so NULL should be OK */ >>> ret = XENOMAI_SYSCALL5(sc_nr, mq, msg, strlen(msg), 0, NULL); >>> 235c: b940dfe0 ldr w0, [sp, #220] >>> 2360: 32040000 orr w0, w0, #0x10000000 >>> 2364: 2a0003e8 mov w8, w0 >>> --> w8 holds the syscall number >>> 2368: b980d3e0 ldrsw x0, [sp, #208] >>> 236c: 910043e0 add x0, sp, #0x10 >>> 2370: aa0003e1 mov x1, x0 >>> 2374: 910043e0 add x0, sp, #0x10 >>> 2378: 94000000 bl 0 <strlen> >>> 2378: R_AARCH64_CALL26 strlen >>> --> w8 is clobbered >>> 237c: aa0003e2 mov x2, x0 >>> 2380: d2800003 mov x3, #0x0 // >>> #0 >>> 2384: d2800004 mov x4, #0x0 // >>> #0 >>> 2388: d4000001 svc #0x0 >>> >>> The problem is that w8/r8 is the "Indirect result location register", >>> thus can be overwritten when calling a function - and that's what strlen >>> does. >>> >>> What are we missing in our syscall black magic to prevent this? Or this >>> this the final call to move the wrapper into am out-of-line function? >>> >> >> The same way ARM syscalls are passed in r7 (EABI) which might >> unfortunately be used and clobbered by gcc as a temp register, x8 >> carries the syscall number per the aarch64 ABI used by the kernel, and >> it looks like we now have the very same issue than we just had with ARM. >> >> I believe the syscall wrappers should move to their own out-of-line >> routine (libevl just does that, the impact on performance is not >> observable, and we are immune to that kind of issue). > > This said, it looks like w8 is not in the clobber list of these macros, > so adding it might fix the issue at hand since the compiler does not > otherwise complain about using it (unlike in the 32bit case). >
You mean the CLOBBER_REGS thing that arm does, but not arm64? Jan -- Siemens AG, T RDA IOT Corporate Competence Center Embedded Linux