summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/m68k/Makefile2
-rw-r--r--libc/sysdeps/linux/m68k/bits/setjmp.h11
-rw-r--r--libc/sysdeps/linux/m68k/bits/types.h10
-rw-r--r--libc/sysdeps/linux/m68k/bits/vfork.h14
-rw-r--r--libc/sysdeps/linux/m68k/crt0.S40
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 */