summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2006-03-23 03:16:41 +0000
committerMike Frysinger <vapier@gentoo.org>2006-03-23 03:16:41 +0000
commit9535cbf18c6b4415dc35c220ca4cca15eba5dc1b (patch)
tree4429a2f527eb9ab5ccffcf23257a4e2bd54e56cb /libc
parentd126b4a3fbf7e423206712145b4a4efdc0c5b1c1 (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.
Diffstat (limited to 'libc')
-rw-r--r--libc/sysdeps/linux/m68k/bits/syscalls.h14
-rw-r--r--libc/sysdeps/linux/m68k/syscall.c3
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);
}