summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-10-03 09:12:28 +0000
committerEric Andersen <andersen@codepoet.org>2001-10-03 09:12:28 +0000
commitb78d55926e729a670cb0b8225c22bb92b02f214b (patch)
tree6050526f541a6c8951bd89cc43ab5c1835f16e7d
parent29444b89ffa55645bc1846dbacf56c70e8bb04ed (diff)
Cleanup brk/sbrk
-rw-r--r--libc/sysdeps/linux/i386/Makefile2
-rw-r--r--libc/sysdeps/linux/i386/__init_brk.c33
-rw-r--r--libc/sysdeps/linux/i386/brk.c60
-rw-r--r--libc/sysdeps/linux/i386/sbrk.c65
4 files changed, 77 insertions, 83 deletions
diff --git a/libc/sysdeps/linux/i386/Makefile b/libc/sysdeps/linux/i386/Makefile
index 3cdadbd32..6dd7c5f26 100644
--- a/libc/sysdeps/linux/i386/Makefile
+++ b/libc/sysdeps/linux/i386/Makefile
@@ -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
index 4d9746342..000000000
--- a/libc/sysdeps/linux/i386/__init_brk.c
+++ /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;
-}
diff --git a/libc/sysdeps/linux/i386/brk.c b/libc/sysdeps/linux/i386/brk.c
index 9e06d0acc..eca0e8326 100644
--- a/libc/sysdeps/linux/i386/brk.c
+++ b/libc/sysdeps/linux/i386/brk.c
@@ -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;
}
diff --git a/libc/sysdeps/linux/i386/sbrk.c b/libc/sysdeps/linux/i386/sbrk.c
index 39db14945..a3b1c07b5 100644
--- a/libc/sysdeps/linux/i386/sbrk.c
+++ b/libc/sysdeps/linux/i386/sbrk.c
@@ -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;
}