From e9e69bd628e4495c975bb82dc3aabc536ae97329 Mon Sep 17 00:00:00 2001 From: David McCullough Date: Mon, 29 Jan 2001 15:02:05 +0000 Subject: 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. --- libc/sysdeps/linux/m68k/Makefile | 2 +- libc/sysdeps/linux/m68k/bits/setjmp.h | 11 ++++++++++ libc/sysdeps/linux/m68k/bits/types.h | 10 ++++----- libc/sysdeps/linux/m68k/bits/vfork.h | 14 ++++++++---- libc/sysdeps/linux/m68k/crt0.S | 40 ++++++++++++++--------------------- 5 files changed, 43 insertions(+), 34 deletions(-) (limited to 'libc') 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 */ -- cgit v1.2.3