Browse Source

uClibc working with 2.0.x and 2.4.x m68k uClinux kernels, the PIC
stuff in crt0.S may not be quite right yet.

David McCullough 25 years ago
parent
commit
e9e69bd628

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

@@ -33,7 +33,7 @@ CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
 SSRC=setjmp.S # longjmp.S _start.S clone.S
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 
-CSRC=#errno.c
+CSRC=ptrace.c #errno.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 OBJS=$(SOBJS) $(MOBJ) $(COBJS)

+ 11 - 0
libc/sysdeps/linux/m68k/bits/setjmp.h

@@ -44,3 +44,14 @@ typedef struct
    containing a local variable at ADDRESS.  */
 #define _JMPBUF_UNWINDS(jmpbuf, address) \
   ((void *) (address) < (void *) (jmpbuf)->__sp)
+
+/* Simple version of sigsetjmp and siglongjmp */
+
+#define __sigsetjmp(env, savesigs) ((env)->__mask_was_saved = (savesigs), \
+			sigprocmask(SIG_SETMASK, 0, &(env)->__saved_mask), \
+			setjmp(&(env)->__jmpbuf))
+
+#define siglongjmp(env, val) (((env)->__mask_was_saved ? \
+			sigprocmask(SIG_SETMASK, &(env)->__saved_mask, 0) : 0), \
+			longjmp(&(env)->__jmpbuf, val))
+

+ 5 - 5
libc/sysdeps/linux/m68k/bits/types.h

@@ -58,12 +58,12 @@ typedef unsigned long long int __uint64_t;
 #endif
 typedef __quad_t *__qaddr_t;
 
-typedef __u_quad_t __dev_t;		/* Type of device numbers.  */
-typedef __u_int __uid_t;		/* Type of user identifications.  */
-typedef __u_int __gid_t;		/* Type of group identifications.  */
+typedef __u_short __dev_t;		/* Type of device numbers.  */
+typedef __u_short __uid_t;		/* Type of user identifications.  */
+typedef __u_short __gid_t;		/* Type of group identifications.  */
 typedef __u_long __ino_t;		/* Type of file serial numbers.  */
-typedef __u_int __mode_t;		/* Type of file attribute bitmasks.  */
-typedef __u_int __nlink_t; 		/* Type of file link counts.  */
+typedef __u_short __mode_t;		/* Type of file attribute bitmasks.  */
+typedef __u_short __nlink_t; 		/* Type of file link counts.  */
 typedef long int __off_t;		/* Type of file sizes and offsets.  */
 typedef __quad_t __loff_t;		/* Type of file sizes and offsets.  */
 typedef int __pid_t;			/* Type of process identifications.  */

+ 10 - 4
libc/sysdeps/linux/m68k/bits/vfork.h

@@ -5,11 +5,17 @@
 
 extern int _clone __P ((int (*fn)(void *arg), void *child_stack, int flags, void *arg));
 
+#ifndef __NR_vfork
+#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
+#endif
+
 #define vfork() ({						\
-register unsigned long __res __asm__ ("%d0") = __NR_fork;	\
-__asm__ __volatile__ ("trap  #0"				\
-                      : "=g" (__res)				\
-                      : "0" (__res)				\
+unsigned long __res;	\
+__asm__ __volatile__ ("movel %1,%%d0;" \
+                      "trap  #0;" \
+					  "movel %%d0,%0"				\
+                      : "=d" (__res)				\
+                      : "0" (__NR_vfork)				\
                       : "%d0");					\
 if (__res >= (unsigned long)-4096) {				\
 	errno = -__res;						\

+ 16 - 24
libc/sysdeps/linux/m68k/crt0.S

@@ -17,10 +17,14 @@ License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
+/*
+ * NOTE: this file works for PIC and non-PIC code.  Be very careful how
+ * you modify it !
+ */
 	.global	_start
 	.global	__main
 	.global _end
-/*	.global __data_start */
+	.global _sdata
 
 	.bss
 	.global environ
@@ -32,30 +36,22 @@ _start:			/* renamed from __start */
 	nop
 	nop
 
-	movea.l %d5, %a5
-
-	lea	__bss_start(%a5), %a0
-	lea	end(%a5), %a1
- 
-	/* Copy 0 to %a0 until %a0 == %a1 */
-	/*
-	From my understanding of linux/fs/binfmt_flat.c for uClinux,
-	this is not necessary anymore.  The loader will clear out
-	the BSS for us. - jgraves@deltamobile.com
-
-L1:
-	movel   #0, %a0@+
-	cmpal   %a0, %a1
-	bhi     L1
-	*/
+	movea.l %d5, %a5	/* uClinux passes in data segment here */
 
 	move.l 8(%sp), %d5
-	move.l %d5, environ(%a5)
+
+	lea.l _sdata, %a1	/* set environ to point to the right place */
+	lea.l environ, %a0
+	sub.l %a1, %a0
+	move.l %d5, %a5@(%a0)
 	
-	bsr main
+	lea main-.-8, %a0	/* call main */
+	jsr %pc@(%a0)
 
 	move.l %d0,%sp@-
-	bsr	exit		/* Invoke exit() routine */
+
+	lea exit-.-8, %a0	/* call the exit routine */
+	jsr	%pc@(%a0)
 
 #ifdef NO_LIBGCC
 	/* If that didn't kill us, ... */
@@ -68,8 +64,4 @@ __main:
 	rts
 #else
 
-	.global	_cleanup
-_cleanup:
-	rts	/* nothing to clean up */
-
 #endif /* NO_LIBGCC */