Browse Source

Add sbrk and friends
Fix bug in setjmp (jmpbuf changed size)

David McCullough 23 years ago
parent
commit
36b818352e

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

@@ -35,7 +35,7 @@ CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
 SSRC=setjmp.S bsd-setjmp.S bsd-_setjmp.S __longjmp.S vfork.S
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 
-CSRC=_mmap.c longjmp.c pipe.c
+CSRC=_mmap.c longjmp.c pipe.c __init_brk.c brk.c sbrk.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 OBJS=$(SOBJS) $(MOBJ) $(COBJS)

+ 25 - 0
libc/sysdeps/linux/sh/__init_brk.c

@@ -0,0 +1,25 @@
+/* From libc-5.3.12 */
+
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+void * ___brk_addr = 0;
+
+#define __NR__brk __NR_brk
+_syscall1(void *, _brk, void *, ptr);
+
+int
+__init_brk ()
+{
+    if (___brk_addr == 0)
+    {
+		___brk_addr = _brk(0);
+		if (___brk_addr == 0)
+		{
+		  __set_errno(ENOMEM);
+		  return -1;
+		}
+    }
+    return 0;
+}

+ 22 - 0
libc/sysdeps/linux/sh/brk.c

@@ -0,0 +1,22 @@
+/* From libc-5.3.12 */
+
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+extern void * ___brk_addr;
+
+extern int __init_brk ();
+extern void *_brk(void *ptr);
+
+int brk(void * end_data_seg)
+{
+    if (__init_brk () == 0)
+    {
+		___brk_addr = _brk(end_data_seg);
+		if (___brk_addr == end_data_seg)
+			return 0;
+		__set_errno(ENOMEM);
+    }
+    return -1;
+}

+ 25 - 0
libc/sysdeps/linux/sh/sbrk.c

@@ -0,0 +1,25 @@
+/* From libc-5.3.12 */
+
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+extern void * ___brk_addr;
+
+extern int __init_brk (void);
+extern void *_brk(void *ptr);
+
+void *
+sbrk(intptr_t increment)
+{
+    if (__init_brk () == 0)
+    {
+		void * tmp = ___brk_addr+increment;
+		___brk_addr = _brk(tmp);
+		if (___brk_addr == tmp)
+			return tmp-increment;
+		__set_errno(ENOMEM);
+		return ((void *) -1);
+    }
+    return ((void *) -1);
+}

+ 1 - 1
libc/sysdeps/linux/sh/setjmp.S

@@ -30,7 +30,7 @@ ENTRY (__sigsetjmp)
 __sigsetjmp:
 */
 	/* Save registers */
-	add	#(JB_SIZE), r4
+	add	#(JB_SIZE-5*4), r4 /* this code doesn't do FP yet */
 	stc.l	gbr, @-r4
 	sts.l	pr, @-r4
 	mov.l	r15, @-r4