Browse Source

add brk for m68k

NOTE: on uClinux-2.[45] kernels, brk works but is limited to slack space in
      the memory allocated to the process.
David McCullough 23 years ago
parent
commit
2e9500a6c9
2 changed files with 31 additions and 1 deletions
  1. 1 1
      libc/sysdeps/linux/m68k/Makefile
  2. 30 0
      libc/sysdeps/linux/m68k/brk.c

+ 1 - 1
libc/sysdeps/linux/m68k/Makefile

@@ -33,7 +33,7 @@ CRT0_OBJ = crt0.o crt1.o
 SSRC= __longjmp.S bsd-_setjmp.S bsd-setjmp.S clone.S setjmp.S vfork.S
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 
-CSRC=ptrace.c
+CSRC=ptrace.c brk.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 OBJS=$(SOBJS) $(MOBJ) $(COBJS)

+ 30 - 0
libc/sysdeps/linux/m68k/brk.c

@@ -0,0 +1,30 @@
+/* consider this code LGPL - davidm */
+
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+/* This must be initialized data because commons can't have aliases.  */
+void * ___brk_addr = 0;
+
+int brk (void *addr)
+{
+    void *newbrk;
+
+	__asm__ volatile ("movel %2,%/d1\n\t"
+			  "moveq %1,%/d0\n\t"
+			  "trap  #0\n\t"
+			  "movel %/d0,%0"
+		:"=g" (newbrk)
+		:"i" (__NR_brk),"g" (addr) : "%d0", "%d1");
+
+    ___brk_addr = newbrk;
+
+    if (newbrk < addr)
+    {
+	__set_errno (ENOMEM);
+	return -1;
+    }
+
+    return 0;
+}