diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/sysdeps/linux/m68k/Makefile | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/setjmp.h | 11 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/types.h | 10 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/vfork.h | 14 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/crt0.S | 40 | 
5 files changed, 43 insertions, 34 deletions
diff --git a/libc/sysdeps/linux/m68k/Makefile b/libc/sysdeps/linux/m68k/Makefile index 9f2e5da50..3dccba6ee 100644 --- a/libc/sysdeps/linux/m68k/Makefile +++ b/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) diff --git a/libc/sysdeps/linux/m68k/bits/setjmp.h b/libc/sysdeps/linux/m68k/bits/setjmp.h index aa376a092..31a241380 100644 --- a/libc/sysdeps/linux/m68k/bits/setjmp.h +++ b/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)) + diff --git a/libc/sysdeps/linux/m68k/bits/types.h b/libc/sysdeps/linux/m68k/bits/types.h index fc7917b59..682f912bd 100644 --- a/libc/sysdeps/linux/m68k/bits/types.h +++ b/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.  */ diff --git a/libc/sysdeps/linux/m68k/bits/vfork.h b/libc/sysdeps/linux/m68k/bits/vfork.h index 0b6ffa2c0..ceb9af8a6 100644 --- a/libc/sysdeps/linux/m68k/bits/vfork.h +++ b/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;						\ diff --git a/libc/sysdeps/linux/m68k/crt0.S b/libc/sysdeps/linux/m68k/crt0.S index 1c64ea960..c2e8a6c60 100644 --- a/libc/sysdeps/linux/m68k/crt0.S +++ b/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 */  | 
