diff options
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r-- | libc/sysdeps/linux/arm/Makefile | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/arm/brk.c | 47 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/Makefile | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/sbrk.c (renamed from libc/sysdeps/linux/i386/sbrk.c) | 24 | ||||
-rw-r--r-- | libc/sysdeps/linux/i386/Makefile | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/i386/brk.c | 6 |
6 files changed, 65 insertions, 18 deletions
diff --git a/libc/sysdeps/linux/arm/Makefile b/libc/sysdeps/linux/arm/Makefile index 539e4d692..9e826aa48 100644 --- a/libc/sysdeps/linux/arm/Makefile +++ b/libc/sysdeps/linux/arm/Makefile @@ -33,7 +33,7 @@ CRT0_OBJ=crt0.o SSRC=longjmp.S setjmp.S vfork.S SOBJS=$(patsubst %.S,%.o, $(SSRC)) -CSRC=inout_bwl.c +CSRC=inout_bwl.c brk.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(SOBJS) $(MOBJ) $(COBJS) diff --git a/libc/sysdeps/linux/arm/brk.c b/libc/sysdeps/linux/arm/brk.c new file mode 100644 index 000000000..0262aa110 --- /dev/null +++ b/libc/sysdeps/linux/arm/brk.c @@ -0,0 +1,47 @@ +/* brk system call for Linux/ARM. + Copyright (C) 1995, 1996 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> + +/* This must be initialized data because commons can't have aliases. */ +void *___brk_addr = 0; + +int brk (void *addr) +{ + void *newbrk; + + asm ("mov a1, %1\n" /* save the argment in r0 */ + "swi %2\n" /* do the system call */ + "mov %0, a1;" /* keep the return value */ + : "=r"(newbrk) + : "r"(addr), "i" (__NR_brk) + : "a1"); + + ___brk_addr = newbrk; + + if (newbrk < addr) + { + __set_errno (ENOMEM); + return -1; + } + + return 0; +} diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile index e7d92573b..bd097452a 100644 --- a/libc/sysdeps/linux/common/Makefile +++ b/libc/sysdeps/linux/common/Makefile @@ -27,7 +27,7 @@ include $(TOPDIR)Rules.mak CSRC= waitpid.c kernel_version.c statfix.c getdnnm.c gethstnm.c \ mkfifo.c setegid.c wait.c errno.c getpagesize.c seteuid.c \ wait3.c setpgrp.c getdtablesize.c create_module.c ptrace.c \ - cmsg_nxthdr.c open64.c statfix64.c statfs64.c + cmsg_nxthdr.c open64.c statfix64.c statfs64.c sbrk.c COBJS=$(patsubst %.c,%.o, $(CSRC)) MSRC=syscalls.c diff --git a/libc/sysdeps/linux/i386/sbrk.c b/libc/sysdeps/linux/common/sbrk.c index a3b1c07b5..028370e99 100644 --- a/libc/sysdeps/linux/i386/sbrk.c +++ b/libc/sysdeps/linux/common/sbrk.c @@ -20,26 +20,28 @@ #include <errno.h> /* Defined in brk.c. */ -extern void *___brk_addr; +extern void *__curbrk; extern int brk (void *addr); + /* 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) { - void *oldbrk; + void *oldbrk; - if (___brk_addr == NULL) - if (brk (0) < 0) /* Initialize the break. */ - return (void *) -1; + if (__curbrk == NULL) + if (brk (0) < 0) /* Initialize the break. */ + return (void *) -1; - if (increment == 0) - return ___brk_addr; + if (increment == 0) + return __curbrk; - oldbrk = ___brk_addr; - if (brk (oldbrk + increment) < 0) - return (void *) -1; + oldbrk = __curbrk; + if (brk (oldbrk + increment) < 0) + return (void *) -1; - return oldbrk; + return oldbrk; } + diff --git a/libc/sysdeps/linux/i386/Makefile b/libc/sysdeps/linux/i386/Makefile index 6178c662c..a54685726 100644 --- a/libc/sysdeps/linux/i386/Makefile +++ b/libc/sysdeps/linux/i386/Makefile @@ -42,7 +42,7 @@ ifeq ($(UNIFIED_SYSCALL),true) endif SOBJS=$(patsubst %.S,%.o, $(SSRC)) -CSRC=brk.c sbrk.c longjmp.c #jmp-unwind.c +CSRC=brk.c longjmp.c #jmp-unwind.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(SOBJS) $(COBJS) diff --git a/libc/sysdeps/linux/i386/brk.c b/libc/sysdeps/linux/i386/brk.c index 9ae565631..7575ebcf0 100644 --- a/libc/sysdeps/linux/i386/brk.c +++ b/libc/sysdeps/linux/i386/brk.c @@ -21,16 +21,14 @@ #include <unistd.h> #include <sys/syscall.h> -#ifndef __ptrvalue -#define __ptrvalue -#endif /* This must be initialized data because commons can't have aliases. */ void *___brk_addr = 0; + int brk (void *addr) { - void *newbrk, *scratch; + 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. */ |