Bug#304426: [mips/mipsel] Incomplete clobber spec for syscalls
Package: glibc
Version: 2.3.2.ds1-20
Severity: important
Tags: patch
Glibc for mips/mipsel has currently an incomplete list of clobbered
registers for syscalls. This apparently caused no problem so far,
at least when compiling with gcc-3.3, but I observed in similiar code
breakage when using gcc-3.4.
The appended patch adds "memory" and argument registers to that list
and uses for brk the standard inline syscall implementation, which
fixes the incomplete clobber list there as well.
Thiemo
#! /bin/sh -e
# All lines beginning with `# DP:' are a description of the patch.
# DP: Description: Expect syscalls to clobber argument registers and memory
# DP: Author: Thiemo Seufer <ths@debian.org>
# DP: Date: 2005-04-12
if [ $# -ne 2 ]; then
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
fi
case "$1" in
-patch) patch -d "$2" -f --no-backup-if-mismatch -p2 < $0;;
-unpatch) patch -d "$2" -f --no-backup-if-mismatch -R -p2 < $0;;
*)
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
esac
exit 0
# append the patch here and adjust the -p? flag in the patch calls.
diff -upr build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/brk.c build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/brk.c
--- build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/brk.c 2001-07-07 21:21:35.000000000 +0200
+++ build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/brk.c 2005-02-28 17:38:15.000000000 +0100
@@ -33,16 +33,7 @@ __brk (void *addr)
{
void *newbrk;
- {
- register long int res __asm__ ("$2");
-
- asm ("move\t$4,%2\n\t"
- "syscall" /* Perform the system call. */
- : "=r" (res)
- : "0" (SYS_ify (brk)), "r" (addr)
- : "$4", "$7");
- newbrk = (void *) res;
- }
+ newbrk = (void *) INLINE_SYSCALL (brk, 1, addr);
__curbrk = newbrk;
if (newbrk < addr)
diff -upr build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
--- build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h 2005-02-28 23:42:22.000000000 +0100
+++ build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h 2005-02-28 17:33:56.000000000 +0100
@@ -275,7 +275,7 @@
_sys_result; \
})
-#define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
+#define __SYSCALL_CLOBBERS "memory", "$3", "$4", "$5", "$6", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
#endif /* __ASSEMBLER__ */
diff -upr build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
--- build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h 2005-02-28 23:42:22.000000000 +0100
+++ build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h 2005-02-28 17:28:21.000000000 +0100
@@ -256,7 +256,7 @@
_sys_result; \
})
-#define __SYSCALL_CLOBBERS "$1", "$3", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
+#define __SYSCALL_CLOBBERS "memory", "$3", "$4", "$5", "$6", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
#endif /* untested */
#endif /* __ASSEMBLER__ */
diff -upr build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
--- build-tree.orig/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h 2005-02-28 23:42:22.000000000 +0100
+++ build-tree/glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h 2005-02-28 17:29:49.000000000 +0100
@@ -256,7 +256,7 @@
_sys_result; \
})
-#define __SYSCALL_CLOBBERS "$1", "$3", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
+#define __SYSCALL_CLOBBERS "memory", "$3", "$4", "$5", "$6", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25"
#endif /* untested */
#endif /* __ASSEMBLER__ */
Reply to: