Procházet zdrojové kódy

Make sbrk common, add arm/brk.c, cleanup leftover damage

Eric Andersen před 22 roky
rodič
revize
5549756311

+ 1 - 1
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)

+ 47 - 0
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;
+}

+ 1 - 1
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

+ 13 - 11
libc/sysdeps/linux/i386/sbrk.c → 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;
 }
+

+ 1 - 1
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)

+ 2 - 4
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.  */