Просмотр исходного кода

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 лет назад
Родитель
Сommit
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 */