[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: