From 9535cbf18c6b4415dc35c220ca4cca15eba5dc1b Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Thu, 23 Mar 2006 03:16:41 +0000 Subject: Richard Sandiford writes: This patch fixes a miscompilation of mmap() for Coldfire with gcc 4.x. The problem was that the syscall was being invoked before any part of the argument structure (buffer[]) had been initialised. The outcome of gcc PR 19341 is that volatile asms don't implicitly use or clobber memory, and that "memory" must be explicitly listed in the clobber list: http://gcc.gnu.org/PR19341 All syscalls can potentially use or clobber memory, so this patch adds a "memory" clobber to all the m68k syscall wrappers that I could find. --- libc/sysdeps/linux/m68k/bits/syscalls.h | 14 +++++++------- libc/sysdeps/linux/m68k/syscall.c | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'libc/sysdeps/linux/m68k') diff --git a/libc/sysdeps/linux/m68k/bits/syscalls.h b/libc/sysdeps/linux/m68k/bits/syscalls.h index 284112e31..3e3303897 100644 --- a/libc/sysdeps/linux/m68k/bits/syscalls.h +++ b/libc/sysdeps/linux/m68k/bits/syscalls.h @@ -67,7 +67,7 @@ type name(void) \ "movel %%d0, %0" \ : "=g" (__res) \ : "i" (__NR_##name) \ - : "cc", "%d0"); \ + : "memory", "cc", "%d0"); \ __syscall_return(type, __res); \ } @@ -83,7 +83,7 @@ type name(atype a) \ : "=g" (__res) \ : "i" (__NR_##name), \ "g" ((long)a) \ - : "cc", "%d0", "%d1"); \ + : "memory", "cc", "%d0", "%d1"); \ __syscall_return(type, __res); \ } @@ -101,7 +101,7 @@ type name(atype a, btype b) \ : "i" (__NR_##name), \ "a" ((long)a), \ "g" ((long)b) \ - : "cc", "%d0", "%d1", "%d2"); \ + : "memory", "cc", "%d0", "%d1", "%d2"); \ __syscall_return(type, __res); \ } @@ -121,7 +121,7 @@ type name(atype a, btype b, ctype c) \ "a" ((long)a), \ "a" ((long)b), \ "g" ((long)c) \ - : "cc", "%d0", "%d1", "%d2", "%d3"); \ + : "memory", "cc", "%d0", "%d1", "%d2", "%d3"); \ __syscall_return(type, __res); \ } @@ -143,7 +143,7 @@ type name(atype a, btype b, ctype c, dtype d) \ "a" ((long)b), \ "a" ((long)c), \ "g" ((long)d) \ - : "cc", "%d0", "%d1", "%d2", "%d3", \ + : "memory", "cc", "%d0", "%d1", "%d2", "%d3", \ "%d4"); \ __syscall_return(type, __res); \ } @@ -168,7 +168,7 @@ type name(atype a, btype b, ctype c, dtype d, etype e) \ "a" ((long)c), \ "a" ((long)d), \ "g" ((long)e) \ - : "cc", "%d0", "%d1", "%d2", "%d3", \ + : "memory", "cc", "%d0", "%d1", "%d2", "%d3", \ "%d4", "%d5"); \ __syscall_return(type, __res); \ } @@ -195,7 +195,7 @@ type name(atype a, btype b, ctype c, dtype d, etype e, ftype f) \ "a" ((long)d), \ "g" ((long)e), \ "g" ((long)f) \ - : "cc", "%d0", "%d1", "%d2", "%d3", \ + : "memory", "cc", "%d0", "%d1", "%d2", "%d3", \ "%d4", "%d5", "%a0"); \ __syscall_return(type, __res); \ } diff --git a/libc/sysdeps/linux/m68k/syscall.c b/libc/sysdeps/linux/m68k/syscall.c index f35702a48..5b13ea695 100644 --- a/libc/sysdeps/linux/m68k/syscall.c +++ b/libc/sysdeps/linux/m68k/syscall.c @@ -41,6 +41,7 @@ long syscall(long sysnum, long a, long b, long c, long d, long e, long f) : "g" (sysnum), "g" ((long)a), "g" ((long)b), "g" ((long)c), "g" ((long)d), "g" ((long)e), "g" ((long)f) - : "cc", "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%a0"); + : "memory", "cc", "%d0", "%d1", "%d2", "%d3", + "%d4", "%d5", "%a0"); __syscall_return(long,__res); } -- cgit v1.2.3