diff options
author | Mike Frysinger <vapier@gentoo.org> | 2006-03-23 03:16:41 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2006-03-23 03:16:41 +0000 |
commit | 9535cbf18c6b4415dc35c220ca4cca15eba5dc1b (patch) | |
tree | 4429a2f527eb9ab5ccffcf23257a4e2bd54e56cb | |
parent | d126b4a3fbf7e423206712145b4a4efdc0c5b1c1 (diff) |
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.
-rw-r--r-- | libc/sysdeps/linux/m68k/bits/syscalls.h | 14 | ||||
-rw-r--r-- | libc/sysdeps/linux/m68k/syscall.c | 3 |
2 files changed, 9 insertions, 8 deletions
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); } |