diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-10-03 09:12:28 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-10-03 09:12:28 +0000 |
commit | b78d55926e729a670cb0b8225c22bb92b02f214b (patch) | |
tree | 6050526f541a6c8951bd89cc43ab5c1835f16e7d /libc/sysdeps/linux | |
parent | 29444b89ffa55645bc1846dbacf56c70e8bb04ed (diff) |
Cleanup brk/sbrk
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r-- | libc/sysdeps/linux/i386/Makefile | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/i386/__init_brk.c | 33 | ||||
-rw-r--r-- | libc/sysdeps/linux/i386/brk.c | 60 | ||||
-rw-r--r-- | libc/sysdeps/linux/i386/sbrk.c | 65 |
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; } |