From 55497563115712ac1ec2c70713357a7489291037 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Mon, 21 Jan 2002 02:39:29 +0000 Subject: Make sbrk common, add arm/brk.c, cleanup leftover damage --- libc/sysdeps/linux/arm/Makefile | 2 +- libc/sysdeps/linux/arm/brk.c | 47 ++++++++++++++++++++++++++++++++++++++ libc/sysdeps/linux/common/Makefile | 2 +- libc/sysdeps/linux/common/sbrk.c | 47 ++++++++++++++++++++++++++++++++++++++ libc/sysdeps/linux/i386/Makefile | 2 +- libc/sysdeps/linux/i386/brk.c | 6 ++--- libc/sysdeps/linux/i386/sbrk.c | 45 ------------------------------------ 7 files changed, 99 insertions(+), 52 deletions(-) create mode 100644 libc/sysdeps/linux/arm/brk.c create mode 100644 libc/sysdeps/linux/common/sbrk.c delete mode 100644 libc/sysdeps/linux/i386/sbrk.c (limited to 'libc/sysdeps/linux') 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 +#include +#include + +/* 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/common/sbrk.c b/libc/sysdeps/linux/common/sbrk.c new file mode 100644 index 000000000..028370e99 --- /dev/null +++ b/libc/sysdeps/linux/common/sbrk.c @@ -0,0 +1,47 @@ +/* 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 +#include + +/* Defined in brk.c. */ +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; + + if (__curbrk == NULL) + if (brk (0) < 0) /* Initialize the break. */ + return (void *) -1; + + if (increment == 0) + return __curbrk; + + oldbrk = __curbrk; + if (brk (oldbrk + increment) < 0) + return (void *) -1; + + 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 #include -#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. */ diff --git a/libc/sysdeps/linux/i386/sbrk.c b/libc/sysdeps/linux/i386/sbrk.c deleted file mode 100644 index a3b1c07b5..000000000 --- a/libc/sysdeps/linux/i386/sbrk.c +++ /dev/null @@ -1,45 +0,0 @@ -/* 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 -#include - -/* Defined in brk.c. */ -extern void *___brk_addr; -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; - - 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; -} -- cgit v1.2.3