OSDN Git Service

Cleanup brk/sbrk
authorEric Andersen <andersen@codepoet.org>
Wed, 3 Oct 2001 09:12:28 +0000 (09:12 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 3 Oct 2001 09:12:28 +0000 (09:12 -0000)
libc/sysdeps/linux/i386/Makefile
libc/sysdeps/linux/i386/__init_brk.c [deleted file]
libc/sysdeps/linux/i386/brk.c
libc/sysdeps/linux/i386/sbrk.c

index 3cdadbd..6dd7c5f 100644 (file)
@@ -41,7 +41,7 @@ ifeq ($(UNIFIED_SYSCALL),true)
 endif
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 
-CSRC=__init_brk.c brk.c sbrk.c longjmp.c #jmp-unwind.c
+CSRC=brk.c sbrk.c longjmp.c #jmp-unwind.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 OBJS=$(SOBJS) $(COBJS)
diff --git a/libc/sysdeps/linux/i386/__init_brk.c b/libc/sysdeps/linux/i386/__init_brk.c
deleted file mode 100644 (file)
index 4d97463..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* From libc-5.3.12 */
-
-#include <unistd.h>
-#include <sys/syscall.h>
-#include <errno.h>
-
-void * ___brk_addr = 0;
-
-int
-__init_brk ()
-{
-    if (___brk_addr == 0)
-    {
-#if defined(__PIC__) || defined (__pic__)
-       __asm__ volatile ("pushl %%ebx\n\t"
-                         "movl $0,%%ebx\n\t"
-                         "int $0x80\n\t"
-                         "popl %%ebx"
-               :"=a" (___brk_addr)
-               :"0" (__NR_brk));
-#else
-       __asm__ volatile ("int $0x80"
-               :"=a" (___brk_addr)
-               :"0" (__NR_brk),"b" (0));
-#endif
-       if (___brk_addr == 0)
-       {
-         __set_errno(ENOMEM);
-         return -1;
-       }
-    }
-    return 0;
-}
index 9e06d0a..eca0e83 100644 (file)
@@ -1,32 +1,48 @@
-/* From libc-5.3.12 */
+/* brk system call for Linux/i386.
+   Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
 #include <unistd.h>
 #include <sys/syscall.h>
-#include <errno.h>
 
-extern void * ___brk_addr;
 
-extern int __init_brk ();
+/* This must be initialized data because commons can't have aliases.  */
+void *___brk_addr = 0;
 
-int brk(void * end_data_seg)
+int brk (void *addr)
 {
-    if (__init_brk () == 0)
+    void *__unbounded newbrk, *__unbounded scratch;
+
+    asm ("movl %%ebx, %1\n"    /* Save %ebx in scratch register.  */
+           "movl %3, %%ebx\n"  /* Put ADDR in %ebx to be syscall arg.  */
+           "int $0x80 # %2\n"  /* Perform the system call.  */
+           "movl %1, %%ebx\n"  /* Restore %ebx from scratch register.  */
+           : "=a" (newbrk), "=r" (scratch)
+           : "0" (__NR_brk), "g" (__ptrvalue (addr)));
+
+    ___brk_addr = newbrk;
+
+    if (newbrk < addr)
     {
-#if defined(__PIC__) || defined (__pic__)
-       __asm__ volatile ("pushl %%ebx\n\t"
-                         "movl %%ecx,%%ebx\n\t"
-                         "int $0x80\n\t"
-                         "popl %%ebx"
-               :"=a" (___brk_addr)
-               :"0" (__NR_brk),"c" (end_data_seg));
-#else
-       __asm__ volatile ("int $0x80"
-               :"=a" (___brk_addr)
-               :"0" (__NR_brk),"b" (end_data_seg));
-#endif
-       if (___brk_addr == end_data_seg)
-               return 0;
-       __set_errno(ENOMEM);
+       __set_errno (ENOMEM);
+       return -1;
     }
-    return -1;
+
+    return 0;
 }
index 39db149..a3b1c07 100644 (file)
@@ -1,34 +1,45 @@
-/* From libc-5.3.12 */
+/* Copyright (C) 1991, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 #include <unistd.h>
-#include <sys/syscall.h>
 #include <errno.h>
 
-extern void * ___brk_addr;
-
-extern int __init_brk (void);
+/* Defined in brk.c.  */
+extern void *___brk_addr;
+extern int brk (void *addr);
 
-void *sbrk(intptr_t increment)
+/* Extend the process's data space by INCREMENT.
+   If INCREMENT is negative, shrink data space by - INCREMENT.
+   Return start of new space allocated, or -1 for errors.  */
+void * sbrk (intptr_t increment)
 {
-    if (__init_brk () == 0)
-    {
-       void * tmp = ___brk_addr+increment;
-#if defined(__PIC__) || defined (__pic__)
-       __asm__ volatile ("pushl %%ebx\n\t"
-                         "movl %%ecx,%%ebx\n\t"
-                          "int $0x80\n\t"
-                          "popl %%ebx"
-               :"=a" (___brk_addr)
-               :"0" (__NR_brk),"c" (tmp));
-#else
-       __asm__ volatile ("int $0x80"
-               :"=a" (___brk_addr)
-               :"0" (__NR_brk),"b" (tmp));
-#endif
-       if (___brk_addr == tmp)
-               return tmp-increment;
-       __set_errno(ENOMEM);
-       return ((void *) -1);
-    }
-    return ((void *) -1);
+  void *oldbrk;
+
+  if (___brk_addr == NULL)
+    if (brk (0) < 0)           /* Initialize the break.  */
+      return (void *) -1;
+
+  if (increment == 0)
+    return ___brk_addr;
+
+  oldbrk = ___brk_addr;
+  if (brk (oldbrk + increment) < 0)
+    return (void *) -1;
+
+  return oldbrk;
 }