Bladeren bron

update syscalls with off_t arguments to handle argument alignment, if needed

the arm syscall abi requires 64-bit arguments to be aligned on an even
register boundary. these new macros facilitate meeting the abi
requirement without imposing significant ugliness on the code.
Rich Felker 13 jaren geleden
bovenliggende
commit
0b6eb2dfb2

+ 2 - 1
arch/arm/bits/syscall.h

@@ -1,6 +1,7 @@
-#define __SYSCALL_LL(x) \
+#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))
 
 long (__syscall)(long, ...);
 

+ 2 - 1
arch/i386/bits/syscall.h

@@ -1,6 +1,7 @@
-#define __SYSCALL_LL(x) \
+#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) __SYSCALL_LL_E((x))
 
 static inline long __syscall0(long __n)
 {

+ 2 - 1
arch/x86_64/bits/syscall.h

@@ -1,4 +1,5 @@
-#define __SYSCALL_LL(x) (x)
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
 
 static inline long __syscall0(long __n)
 {

+ 2 - 2
src/fcntl/posix_fadvise.c

@@ -3,6 +3,6 @@
 
 int posix_fadvise(int fd, off_t base, off_t len, int advice)
 {
-	return -__syscall(SYS_fadvise, fd, __SYSCALL_LL(base),
-		__SYSCALL_LL(len), advice);
+	return -(__syscall)(SYS_fadvise, fd, __SYSCALL_LL_O(base),
+		__SYSCALL_LL_E(len), advice);
 }

+ 2 - 2
src/fcntl/posix_fallocate.c

@@ -3,6 +3,6 @@
 
 int posix_fallocate(int fd, off_t base, off_t len)
 {
-	return -__syscall(SYS_fallocate, fd, __SYSCALL_LL(base),
-		__SYSCALL_LL(len));
+	return -__syscall(SYS_fallocate, fd, __SYSCALL_LL_O(base),
+		__SYSCALL_LL_E(len));
 }

+ 1 - 1
src/unistd/ftruncate.c

@@ -4,7 +4,7 @@
 
 int ftruncate(int fd, off_t length)
 {
-	return syscall(SYS_ftruncate, fd, __SYSCALL_LL(length));
+	return syscall(SYS_ftruncate, fd, __SYSCALL_LL_O(length));
 }
 
 LFS64(ftruncate);

+ 1 - 1
src/unistd/pread.c

@@ -4,7 +4,7 @@
 
 ssize_t pread(int fd, void *buf, size_t size, off_t ofs)
 {
-	return syscall_cp(SYS_pread, fd, buf, size, __SYSCALL_LL(ofs));
+	return syscall_cp(SYS_pread, fd, buf, size, __SYSCALL_LL_O(ofs));
 }
 
 LFS64(pread);

+ 1 - 1
src/unistd/pwrite.c

@@ -4,7 +4,7 @@
 
 ssize_t pwrite(int fd, const void *buf, size_t size, off_t ofs)
 {
-	return syscall_cp(SYS_pwrite, fd, buf, size, __SYSCALL_LL(ofs));
+	return syscall_cp(SYS_pwrite, fd, buf, size, __SYSCALL_LL_O(ofs));
 }
 
 LFS64(pwrite);

+ 1 - 1
src/unistd/truncate.c

@@ -4,7 +4,7 @@
 
 int truncate(const char *path, off_t length)
 {
-	return syscall(SYS_truncate, path, __SYSCALL_LL(length));
+	return syscall(SYS_truncate, path, __SYSCALL_LL_O(length));
 }
 
 LFS64(truncate);