fix passing of 64-bit syscall arguments on microblaze
authorRich Felker <dalias@aerifal.cx>
Sun, 5 May 2019 14:52:41 +0000 (10:52 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 5 May 2019 14:52:41 +0000 (10:52 -0400)
this has been wrong since the beginning of the microblaze port: the
syscall ABI for microblaze does not align 64-bit arguments on even
register boundaries. commit 788d5e24ca19c6291cebd8d1ad5b5ed6abf42665
exposed the problem by introducing references to a nonexistent
__syscall7. the ABI is not documented well anywhere, but I was able to
confirm against both strace source and glibc source that microblaze is
not using the alignment.

per the syscall(2) man page, posix_fadvise, ftruncate, pread, pwrite,
readahead, sync_file_range, and truncate were all affected and either
did not work at all, or only worked by chance, e.g. when the affected
argument slots were all zero.

arch/microblaze/syscall_arch.h

index 942aaa2da77286ca73c45740743c11e34eddf4d7..169013f80e4eea1e0f1adfde0516562d673fae80 100644 (file)
@@ -1,7 +1,7 @@
 #define __SYSCALL_LL_E(x) \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
-#define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
+#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
 
 static __inline long __syscall0(long n)
 {