Browse Source

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.

Mike Frysinger 18 years ago
parent
commit
9535cbf18c
2 changed files with 9 additions and 8 deletions
  1. 7 7
      libc/sysdeps/linux/m68k/bits/syscalls.h
  2. 2 1
      libc/sysdeps/linux/m68k/syscall.c

+ 7 - 7
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); \
 }

+ 2 - 1
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);
 }