add m68k port
authorRich Felker <dalias@aerifal.cx>
Thu, 14 Jun 2018 18:26:30 +0000 (14:26 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 19 Jun 2018 17:24:05 +0000 (13:24 -0400)
three ABIs are supported: the default with 68881 80-bit fpu format and
results returned in floating point registers, softfloat-only with the
same format, and coldfire fpu with IEEE single/double only. only the
first is tested at all, and only under qemu which has fpu emulation
bugs.

basic functionality smoke tests have been performed for the most
common arch-specific breakage via libc-test and qemu user-level
emulation. some sysvipc failures remain, but are shared with other big
endian archs and will be fixed separately.

27 files changed:
arch/m68k/atomic_arch.h [new file with mode: 0644]
arch/m68k/bits/alltypes.h.in [new file with mode: 0644]
arch/m68k/bits/endian.h [new file with mode: 0644]
arch/m68k/bits/fcntl.h [new file with mode: 0644]
arch/m68k/bits/fenv.h [new file with mode: 0644]
arch/m68k/bits/float.h [new file with mode: 0644]
arch/m68k/bits/limits.h [new file with mode: 0644]
arch/m68k/bits/posix.h [new file with mode: 0644]
arch/m68k/bits/setjmp.h [new file with mode: 0644]
arch/m68k/bits/signal.h [new file with mode: 0644]
arch/m68k/bits/stat.h [new file with mode: 0644]
arch/m68k/bits/stdint.h [new file with mode: 0644]
arch/m68k/bits/syscall.h.in [new file with mode: 0644]
arch/m68k/crt_arch.h [new file with mode: 0644]
arch/m68k/pthread_arch.h [new file with mode: 0644]
arch/m68k/reloc.h [new file with mode: 0644]
arch/m68k/syscall_arch.h [new file with mode: 0644]
configure
src/fenv/m68k/fenv.c [new file with mode: 0644]
src/internal/m68k/syscall.s [new file with mode: 0644]
src/ldso/m68k/dlsym.s [new file with mode: 0644]
src/setjmp/m68k/longjmp.s [new file with mode: 0644]
src/setjmp/m68k/setjmp.s [new file with mode: 0644]
src/signal/m68k/sigsetjmp.s [new file with mode: 0644]
src/thread/m68k/__m68k_read_tp.s [new file with mode: 0644]
src/thread/m68k/clone.s [new file with mode: 0644]
src/thread/m68k/syscall_cp.s [new file with mode: 0644]

diff --git a/arch/m68k/atomic_arch.h b/arch/m68k/atomic_arch.h
new file mode 100644 (file)
index 0000000..b369649
--- /dev/null
@@ -0,0 +1,8 @@
+#define a_cas a_cas
+static inline int a_cas(volatile int *p, int t, int s)
+{
+       __asm__ __volatile__ (
+               "cas.l %0, %2, (%1)"
+               : "+d"(t) : "a"(p), "d"(s) : "memory", "cc");
+       return t;
+}
diff --git a/arch/m68k/bits/alltypes.h.in b/arch/m68k/bits/alltypes.h.in
new file mode 100644 (file)
index 0000000..a4a8141
--- /dev/null
@@ -0,0 +1,31 @@
+#define _Addr int
+#define _Int64 long long
+#define _Reg int
+
+TYPEDEF __builtin_va_list va_list;
+TYPEDEF __builtin_va_list __isoc_va_list;
+
+#ifndef __cplusplus
+TYPEDEF long wchar_t;
+#endif
+
+#if __mcffpu__
+TYPEDEF float float_t;
+TYPEDEF double double_t;
+#else
+TYPEDEF long double float_t;
+TYPEDEF long double double_t;
+#endif
+
+TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
+
+TYPEDEF long time_t;
+TYPEDEF long suseconds_t;
+
+TYPEDEF struct { union { int __i[9]; volatile int __vi[9]; unsigned __s[9]; } __u; } pthread_attr_t;
+TYPEDEF struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t;
+TYPEDEF struct { union { int __i[6]; volatile int __vi[6]; volatile void *volatile __p[6]; } __u; } mtx_t;
+TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } pthread_cond_t;
+TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[12]; } __u; } cnd_t;
+TYPEDEF struct { union { int __i[8]; volatile int __vi[8]; void *__p[8]; } __u; } pthread_rwlock_t;
+TYPEDEF struct { union { int __i[5]; volatile int __vi[5]; void *__p[5]; } __u; } pthread_barrier_t;
diff --git a/arch/m68k/bits/endian.h b/arch/m68k/bits/endian.h
new file mode 100644 (file)
index 0000000..ef074b7
--- /dev/null
@@ -0,0 +1 @@
+#define __BYTE_ORDER __BIG_ENDIAN
diff --git a/arch/m68k/bits/fcntl.h b/arch/m68k/bits/fcntl.h
new file mode 100644 (file)
index 0000000..f1c8400
--- /dev/null
@@ -0,0 +1,40 @@
+#define O_CREAT        0100
+#define O_EXCL         0200
+#define O_NOCTTY       0400
+#define O_TRUNC       01000
+#define O_APPEND      02000
+#define O_NONBLOCK    04000
+#define O_DSYNC      010000
+#define O_SYNC     04010000
+#define O_RSYNC    04010000
+#define O_DIRECTORY  040000
+#define O_NOFOLLOW  0100000
+#define O_CLOEXEC  02000000
+
+#define O_ASYNC      020000
+#define O_DIRECT    0200000
+#define O_LARGEFILE 0400000
+#define O_NOATIME  01000000
+#define O_PATH    010000000
+#define O_TMPFILE 020200000
+#define O_NDELAY O_NONBLOCK
+
+#define F_DUPFD  0
+#define F_GETFD  1
+#define F_SETFD  2
+#define F_GETFL  3
+#define F_SETFL  4
+
+#define F_SETOWN 8
+#define F_GETOWN 9
+#define F_SETSIG 10
+#define F_GETSIG 11
+
+#define F_GETLK 12
+#define F_SETLK 13
+#define F_SETLKW 14
+
+#define F_SETOWN_EX 15
+#define F_GETOWN_EX 16
+
+#define F_GETOWNER_UIDS 17
diff --git a/arch/m68k/bits/fenv.h b/arch/m68k/bits/fenv.h
new file mode 100644 (file)
index 0000000..c90a4a5
--- /dev/null
@@ -0,0 +1,29 @@
+#if __HAVE_68881__ || __mcffpu__
+
+#define FE_INEXACT    8
+#define FE_DIVBYZERO  16
+#define FE_UNDERFLOW  32
+#define FE_OVERFLOW   64
+#define FE_INVALID    128
+
+#define FE_ALL_EXCEPT 0xf8
+
+#define FE_TONEAREST  0
+#define FE_TOWARDZERO 16
+#define FE_DOWNWARD   32
+#define FE_UPWARD     48
+
+#else
+
+#define FE_ALL_EXCEPT 0
+#define FE_TONEAREST  0
+
+#endif
+
+typedef unsigned fexcept_t;
+
+typedef struct {
+       unsigned __control_register, __status_register, __instruction_address;
+} fenv_t;
+
+#define FE_DFL_ENV      ((const fenv_t *) -1)
diff --git a/arch/m68k/bits/float.h b/arch/m68k/bits/float.h
new file mode 100644 (file)
index 0000000..fd02a13
--- /dev/null
@@ -0,0 +1,39 @@
+#if !__mcffpu__
+
+#define FLT_EVAL_METHOD 2
+
+#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
+#define LDBL_MIN     3.3621031431120935063e-4932L
+#define LDBL_MAX     1.1897314953572317650e+4932L
+#define LDBL_EPSILON 1.0842021724855044340e-19L
+
+#define LDBL_MANT_DIG 64
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 18
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 21
+
+#else
+
+#define FLT_EVAL_METHOD 0
+
+#define LDBL_TRUE_MIN 4.94065645841246544177e-324L
+#define LDBL_MIN 2.22507385850720138309e-308L
+#define LDBL_MAX 1.79769313486231570815e+308L
+#define LDBL_EPSILON 2.22044604925031308085e-16L
+
+#define LDBL_MANT_DIG 53
+#define LDBL_MIN_EXP (-1021)
+#define LDBL_MAX_EXP 1024
+
+#define LDBL_DIG 15
+#define LDBL_MIN_10_EXP (-307)
+#define LDBL_MAX_10_EXP 308
+
+#define DECIMAL_DIG 17
+
+#endif
diff --git a/arch/m68k/bits/limits.h b/arch/m68k/bits/limits.h
new file mode 100644 (file)
index 0000000..fbc6d23
--- /dev/null
@@ -0,0 +1,7 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define LONG_BIT 32
+#endif
+
+#define LONG_MAX  0x7fffffffL
+#define LLONG_MAX  0x7fffffffffffffffLL
diff --git a/arch/m68k/bits/posix.h b/arch/m68k/bits/posix.h
new file mode 100644 (file)
index 0000000..30a3871
--- /dev/null
@@ -0,0 +1,2 @@
+#define _POSIX_V6_ILP32_OFFBIG  1
+#define _POSIX_V7_ILP32_OFFBIG  1
diff --git a/arch/m68k/bits/setjmp.h b/arch/m68k/bits/setjmp.h
new file mode 100644 (file)
index 0000000..5e091fb
--- /dev/null
@@ -0,0 +1 @@
+typedef unsigned long __jmp_buf[39];
diff --git a/arch/m68k/bits/signal.h b/arch/m68k/bits/signal.h
new file mode 100644 (file)
index 0000000..2c369ca
--- /dev/null
@@ -0,0 +1,140 @@
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
+#ifdef _GNU_SOURCE
+enum { R_D0 = 0 };
+#define R_D0 R_D0
+enum { R_D1 = 1 };
+#define R_D1 R_D1
+enum { R_D2 = 2 };
+#define R_D2 R_D2
+enum { R_D3 = 3 };
+#define R_D3 R_D3
+enum { R_D4 = 4 };
+#define R_D4 R_D4
+enum { R_D5 = 5 };
+#define R_D5 R_D5
+enum { R_D6 = 6 };
+#define R_D6 R_D6
+enum { R_D7 = 7 };
+#define R_D7 R_D7
+enum { R_A0 = 8 };
+#define R_A0 R_A0
+enum { R_A1 = 9 };
+#define R_A1 R_A1
+enum { R_A2 = 10 };
+#define R_A2 R_A2
+enum { R_A3 = 11 };
+#define R_A3 R_A3
+enum { R_A4 = 12 };
+#define R_A4 R_A4
+enum { R_A5 = 13 };
+#define R_A5 R_A5
+enum { R_A6 = 14 };
+#define R_A6 R_A6
+enum { R_A7 = 15 };
+#define R_A7 R_A7
+enum { R_SP = 15 };
+#define R_SP R_SP
+enum { R_PC = 16 };
+#define R_PC R_PC
+enum { R_PS = 17 };
+#define R_PS R_PS
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+struct sigcontext {
+       unsigned long sc_mask, sc_usp, sc_d0, sc_d1, sc_a0, sc_a1;
+       unsigned short sc_sr;
+       unsigned long sc_pc;
+       unsigned short sc_formatvec;
+       unsigned long sc_fpregs[6], sc_fpcntl[3];
+       unsigned char sc_fpstate[216];
+};
+
+typedef int greg_t, gregset_t[18];
+typedef struct {
+       int f_pcr, f_psr, f_fpiaddr, f_fpregs[8][3];
+} fpregset_t;
+
+typedef struct {
+       int version;
+       gregset_t gregs;
+       fpregset_t fpregs;
+} mcontext_t;
+#else
+typedef struct {
+       int __version;
+       int __gregs[18];
+       int __fpregs[27];
+} mcontext_t;
+#endif
+
+struct sigaltstack {
+       void *ss_sp;
+       int ss_flags;
+       size_t ss_size;
+};
+
+typedef struct __ucontext {
+       unsigned long uc_flags;
+       struct __ucontext *uc_link;
+       stack_t uc_stack;
+       mcontext_t uc_mcontext;
+       long __reserved[80];
+       sigset_t uc_sigmask;
+} ucontext_t;
+
+#define SA_NOCLDSTOP  1
+#define SA_NOCLDWAIT  2
+#define SA_SIGINFO    4
+#define SA_ONSTACK    0x08000000
+#define SA_RESTART    0x10000000
+#define SA_NODEFER    0x40000000
+#define SA_RESETHAND  0x80000000
+#define SA_RESTORER   0x04000000
+
+#endif
+
+#define SIGHUP    1
+#define SIGINT    2
+#define SIGQUIT   3
+#define SIGILL    4
+#define SIGTRAP   5
+#define SIGABRT   6
+#define SIGIOT    SIGABRT
+#define SIGBUS    7
+#define SIGFPE    8
+#define SIGKILL   9
+#define SIGUSR1   10
+#define SIGSEGV   11
+#define SIGUSR2   12
+#define SIGPIPE   13
+#define SIGALRM   14
+#define SIGTERM   15
+#define SIGSTKFLT 16
+#define SIGCHLD   17
+#define SIGCONT   18
+#define SIGSTOP   19
+#define SIGTSTP   20
+#define SIGTTIN   21
+#define SIGTTOU   22
+#define SIGURG    23
+#define SIGXCPU   24
+#define SIGXFSZ   25
+#define SIGVTALRM 26
+#define SIGPROF   27
+#define SIGWINCH  28
+#define SIGIO     29
+#define SIGPOLL   29
+#define SIGPWR    30
+#define SIGSYS    31
+#define SIGUNUSED SIGSYS
+
+#define _NSIG 65
diff --git a/arch/m68k/bits/stat.h b/arch/m68k/bits/stat.h
new file mode 100644 (file)
index 0000000..0f7b66a
--- /dev/null
@@ -0,0 +1,21 @@
+/* copied from kernel definition, but with padding replaced
+ * by the corresponding correctly-sized userspace types. */
+
+struct stat {
+       dev_t st_dev;
+       short __st_dev_padding;
+       long __st_ino_truncated;
+       mode_t st_mode;
+       nlink_t st_nlink;
+       uid_t st_uid;
+       gid_t st_gid;
+       dev_t st_rdev;
+       short __st_rdev_padding;
+       off_t st_size;
+       blksize_t st_blksize;
+       blkcnt_t st_blocks;
+       struct timespec st_atim;
+       struct timespec st_mtim;
+       struct timespec st_ctim;
+       ino_t st_ino;
+};
diff --git a/arch/m68k/bits/stdint.h b/arch/m68k/bits/stdint.h
new file mode 100644 (file)
index 0000000..d1b2712
--- /dev/null
@@ -0,0 +1,20 @@
+typedef int32_t int_fast16_t;
+typedef int32_t int_fast32_t;
+typedef uint32_t uint_fast16_t;
+typedef uint32_t uint_fast32_t;
+
+#define INT_FAST16_MIN  INT32_MIN
+#define INT_FAST32_MIN  INT32_MIN
+
+#define INT_FAST16_MAX  INT32_MAX
+#define INT_FAST32_MAX  INT32_MAX
+
+#define UINT_FAST16_MAX UINT32_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+
+#define INTPTR_MIN      INT32_MIN
+#define INTPTR_MAX      INT32_MAX
+#define UINTPTR_MAX     UINT32_MAX
+#define PTRDIFF_MIN     INT32_MIN
+#define PTRDIFF_MAX     INT32_MAX
+#define SIZE_MAX        UINT32_MAX
diff --git a/arch/m68k/bits/syscall.h.in b/arch/m68k/bits/syscall.h.in
new file mode 100644 (file)
index 0000000..89cf114
--- /dev/null
@@ -0,0 +1,361 @@
+#define __NR_restart_syscall     0
+#define __NR_exit                1
+#define __NR_fork                2
+#define __NR_read                3
+#define __NR_write               4
+#define __NR_open                5
+#define __NR_close               6
+#define __NR_waitpid             7
+#define __NR_creat               8
+#define __NR_link                9
+#define __NR_unlink             10
+#define __NR_execve             11
+#define __NR_chdir              12
+#define __NR_time               13
+#define __NR_mknod              14
+#define __NR_chmod              15
+#define __NR_chown              16
+#define __NR_oldstat            18
+#define __NR_lseek              19
+#define __NR_getpid             20
+#define __NR_mount              21
+#define __NR_umount             22
+#define __NR_setuid             23
+#define __NR_getuid             24
+#define __NR_stime              25
+#define __NR_ptrace             26
+#define __NR_alarm              27
+#define __NR_oldfstat           28
+#define __NR_pause              29
+#define __NR_utime              30
+#define __NR_access             33
+#define __NR_nice               34
+#define __NR_sync               36
+#define __NR_kill               37
+#define __NR_rename             38
+#define __NR_mkdir              39
+#define __NR_rmdir              40
+#define __NR_dup                41
+#define __NR_pipe               42
+#define __NR_times              43
+#define __NR_brk                45
+#define __NR_setgid             46
+#define __NR_getgid             47
+#define __NR_signal             48
+#define __NR_geteuid            49
+#define __NR_getegid            50
+#define __NR_acct               51
+#define __NR_umount2            52
+#define __NR_ioctl              54
+#define __NR_fcntl              55
+#define __NR_setpgid            57
+#define __NR_umask              60
+#define __NR_chroot             61
+#define __NR_ustat              62
+#define __NR_dup2               63
+#define __NR_getppid            64
+#define __NR_getpgrp            65
+#define __NR_setsid             66
+#define __NR_sigaction          67
+#define __NR_sgetmask           68
+#define __NR_ssetmask           69
+#define __NR_setreuid           70
+#define __NR_setregid           71
+#define __NR_sigsuspend                 72
+#define __NR_sigpending                 73
+#define __NR_sethostname        74
+#define __NR_setrlimit          75
+#define __NR_getrlimit          76
+#define __NR_getrusage          77
+#define __NR_gettimeofday       78
+#define __NR_settimeofday       79
+#define __NR_getgroups          80
+#define __NR_setgroups          81
+#define __NR_select             82
+#define __NR_symlink            83
+#define __NR_oldlstat           84
+#define __NR_readlink           85
+#define __NR_uselib             86
+#define __NR_swapon             87
+#define __NR_reboot             88
+#define __NR_readdir            89
+#define __NR_mmap               90
+#define __NR_munmap             91
+#define __NR_truncate           92
+#define __NR_ftruncate          93
+#define __NR_fchmod             94
+#define __NR_fchown             95
+#define __NR_getpriority        96
+#define __NR_setpriority        97
+#define __NR_statfs             99
+#define __NR_fstatfs           100
+#define __NR_socketcall                102
+#define __NR_syslog            103
+#define __NR_setitimer         104
+#define __NR_getitimer         105
+#define __NR_stat              106
+#define __NR_lstat             107
+#define __NR_fstat             108
+#define __NR_vhangup           111
+#define __NR_wait4             114
+#define __NR_swapoff           115
+#define __NR_sysinfo           116
+#define __NR_ipc               117
+#define __NR_fsync             118
+#define __NR_sigreturn         119
+#define __NR_clone             120
+#define __NR_setdomainname     121
+#define __NR_uname             122
+#define __NR_cacheflush                123
+#define __NR_adjtimex          124
+#define __NR_mprotect          125
+#define __NR_sigprocmask       126
+#define __NR_create_module     127
+#define __NR_init_module       128
+#define __NR_delete_module     129
+#define __NR_get_kernel_syms   130
+#define __NR_quotactl          131
+#define __NR_getpgid           132
+#define __NR_fchdir            133
+#define __NR_bdflush           134
+#define __NR_sysfs             135
+#define __NR_personality       136
+#define __NR_setfsuid          138
+#define __NR_setfsgid          139
+#define __NR__llseek           140
+#define __NR_getdents          141
+#define __NR__newselect                142
+#define __NR_flock             143
+#define __NR_msync             144
+#define __NR_readv             145
+#define __NR_writev            146
+#define __NR_getsid            147
+#define __NR_fdatasync         148
+#define __NR__sysctl           149
+#define __NR_mlock             150
+#define __NR_munlock           151
+#define __NR_mlockall          152
+#define __NR_munlockall                153
+#define __NR_sched_setparam            154
+#define __NR_sched_getparam            155
+#define __NR_sched_setscheduler                156
+#define __NR_sched_getscheduler                157
+#define __NR_sched_yield               158
+#define __NR_sched_get_priority_max    159
+#define __NR_sched_get_priority_min    160
+#define __NR_sched_rr_get_interval     161
+#define __NR_nanosleep         162
+#define __NR_mremap            163
+#define __NR_setresuid         164
+#define __NR_getresuid         165
+#define __NR_getpagesize       166
+#define __NR_query_module      167
+#define __NR_poll              168
+#define __NR_nfsservctl                169
+#define __NR_setresgid         170
+#define __NR_getresgid         171
+#define __NR_prctl             172
+#define __NR_rt_sigreturn      173
+#define __NR_rt_sigaction      174
+#define __NR_rt_sigprocmask    175
+#define __NR_rt_sigpending     176
+#define __NR_rt_sigtimedwait   177
+#define __NR_rt_sigqueueinfo   178
+#define __NR_rt_sigsuspend     179
+#define __NR_pread64           180
+#define __NR_pwrite64          181
+#define __NR_lchown            182
+#define __NR_getcwd            183
+#define __NR_capget            184
+#define __NR_capset            185
+#define __NR_sigaltstack       186
+#define __NR_sendfile          187
+#define __NR_getpmsg           188
+#define __NR_putpmsg           189
+#define __NR_vfork             190
+#define __NR_ugetrlimit                191
+#define __NR_mmap2             192
+#define __NR_truncate64                193
+#define __NR_ftruncate64       194
+#define __NR_stat64            195
+#define __NR_lstat64           196
+#define __NR_fstat64           197
+#define __NR_chown32           198
+#define __NR_getuid32          199
+#define __NR_getgid32          200
+#define __NR_geteuid32         201
+#define __NR_getegid32         202
+#define __NR_setreuid32                203
+#define __NR_setregid32                204
+#define __NR_getgroups32       205
+#define __NR_setgroups32       206
+#define __NR_fchown32          207
+#define __NR_setresuid32       208
+#define __NR_getresuid32       209
+#define __NR_setresgid32       210
+#define __NR_getresgid32       211
+#define __NR_lchown32          212
+#define __NR_setuid32          213
+#define __NR_setgid32          214
+#define __NR_setfsuid32                215
+#define __NR_setfsgid32                216
+#define __NR_pivot_root                217
+#define __NR_getdents64                220
+#define __NR_gettid            221
+#define __NR_tkill             222
+#define __NR_setxattr          223
+#define __NR_lsetxattr         224
+#define __NR_fsetxattr         225
+#define __NR_getxattr          226
+#define __NR_lgetxattr         227
+#define __NR_fgetxattr         228
+#define __NR_listxattr         229
+#define __NR_llistxattr                230
+#define __NR_flistxattr                231
+#define __NR_removexattr       232
+#define __NR_lremovexattr      233
+#define __NR_fremovexattr      234
+#define __NR_futex             235
+#define __NR_sendfile64                236
+#define __NR_mincore           237
+#define __NR_madvise           238
+#define __NR_fcntl64           239
+#define __NR_readahead         240
+#define __NR_io_setup          241
+#define __NR_io_destroy                242
+#define __NR_io_getevents      243
+#define __NR_io_submit         244
+#define __NR_io_cancel         245
+#define __NR_fadvise64         246
+#define __NR_exit_group                247
+#define __NR_lookup_dcookie    248
+#define __NR_epoll_create      249
+#define __NR_epoll_ctl         250
+#define __NR_epoll_wait                251
+#define __NR_remap_file_pages  252
+#define __NR_set_tid_address   253
+#define __NR_timer_create      254
+#define __NR_timer_settime     255
+#define __NR_timer_gettime     256
+#define __NR_timer_getoverrun  257
+#define __NR_timer_delete      258
+#define __NR_clock_settime     259
+#define __NR_clock_gettime     260
+#define __NR_clock_getres      261
+#define __NR_clock_nanosleep   262
+#define __NR_statfs64          263
+#define __NR_fstatfs64         264
+#define __NR_tgkill            265
+#define __NR_utimes            266
+#define __NR_fadvise64_64      267
+#define __NR_mbind             268
+#define __NR_get_mempolicy     269
+#define __NR_set_mempolicy     270
+#define __NR_mq_open           271
+#define __NR_mq_unlink         272
+#define __NR_mq_timedsend      273
+#define __NR_mq_timedreceive   274
+#define __NR_mq_notify         275
+#define __NR_mq_getsetattr     276
+#define __NR_waitid            277
+#define __NR_add_key           279
+#define __NR_request_key       280
+#define __NR_keyctl            281
+#define __NR_ioprio_set                282
+#define __NR_ioprio_get                283
+#define __NR_inotify_init      284
+#define __NR_inotify_add_watch 285
+#define __NR_inotify_rm_watch  286
+#define __NR_migrate_pages     287
+#define __NR_openat            288
+#define __NR_mkdirat           289
+#define __NR_mknodat           290
+#define __NR_fchownat          291
+#define __NR_futimesat         292
+#define __NR_fstatat64         293
+#define __NR_unlinkat          294
+#define __NR_renameat          295
+#define __NR_linkat            296
+#define __NR_symlinkat         297
+#define __NR_readlinkat                298
+#define __NR_fchmodat          299
+#define __NR_faccessat         300
+#define __NR_pselect6          301
+#define __NR_ppoll             302
+#define __NR_unshare           303
+#define __NR_set_robust_list   304
+#define __NR_get_robust_list   305
+#define __NR_splice            306
+#define __NR_sync_file_range   307
+#define __NR_tee               308
+#define __NR_vmsplice          309
+#define __NR_move_pages                310
+#define __NR_sched_setaffinity 311
+#define __NR_sched_getaffinity 312
+#define __NR_kexec_load                313
+#define __NR_getcpu            314
+#define __NR_epoll_pwait       315
+#define __NR_utimensat         316
+#define __NR_signalfd          317
+#define __NR_timerfd_create    318
+#define __NR_eventfd           319
+#define __NR_fallocate         320
+#define __NR_timerfd_settime   321
+#define __NR_timerfd_gettime   322
+#define __NR_signalfd4         323
+#define __NR_eventfd2          324
+#define __NR_epoll_create1     325
+#define __NR_dup3              326
+#define __NR_pipe2             327
+#define __NR_inotify_init1     328
+#define __NR_preadv            329
+#define __NR_pwritev           330
+#define __NR_rt_tgsigqueueinfo 331
+#define __NR_perf_event_open   332
+#define __NR_get_thread_area   333
+#define __NR_set_thread_area   334
+#define __NR_atomic_cmpxchg_32 335
+#define __NR_atomic_barrier    336
+#define __NR_fanotify_init     337
+#define __NR_fanotify_mark     338
+#define __NR_prlimit64         339
+#define __NR_name_to_handle_at 340
+#define __NR_open_by_handle_at 341
+#define __NR_clock_adjtime     342
+#define __NR_syncfs            343
+#define __NR_setns             344
+#define __NR_process_vm_readv  345
+#define __NR_process_vm_writev 346
+#define __NR_kcmp              347
+#define __NR_finit_module      348
+#define __NR_sched_setattr     349
+#define __NR_sched_getattr     350
+#define __NR_renameat2         351
+#define __NR_getrandom         352
+#define __NR_memfd_create      353
+#define __NR_bpf               354
+#define __NR_execveat          355
+#define __NR_socket            356
+#define __NR_socketpair                357
+#define __NR_bind              358
+#define __NR_connect           359
+#define __NR_listen            360
+#define __NR_accept4           361
+#define __NR_getsockopt                362
+#define __NR_setsockopt                363
+#define __NR_getsockname       364
+#define __NR_getpeername       365
+#define __NR_sendto            366
+#define __NR_sendmsg           367
+#define __NR_recvfrom          368
+#define __NR_recvmsg           369
+#define __NR_shutdown          370
+#define __NR_recvmmsg          371
+#define __NR_sendmmsg          372
+#define __NR_userfaultfd       373
+#define __NR_membarrier                374
+#define __NR_mlock2            375
+#define __NR_copy_file_range   376
+#define __NR_preadv2           377
+#define __NR_pwritev2          378
+#define __NR_statx             379
diff --git a/arch/m68k/crt_arch.h b/arch/m68k/crt_arch.h
new file mode 100644 (file)
index 0000000..48a42f2
--- /dev/null
@@ -0,0 +1,14 @@
+__asm__(
+".text\n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+".global " START "\n"
+START ":\n"
+"      suba.l %fp,%fp \n"
+"      movea.l %sp,%a0 \n"
+"      lea _DYNAMIC-.-8,%a1 \n"
+"      pea (%pc,%a1) \n"
+"      pea (%a0) \n"
+"      lea " START "_c-.-8,%a1 \n"
+"      jsr (%pc,%a1) \n"
+);
diff --git a/arch/m68k/pthread_arch.h b/arch/m68k/pthread_arch.h
new file mode 100644 (file)
index 0000000..02d5b8a
--- /dev/null
@@ -0,0 +1,13 @@
+static inline struct pthread *__pthread_self()
+{
+       uintptr_t tp = __syscall(SYS_get_thread_area);
+       return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
+}
+
+#define TLS_ABOVE_TP
+#define GAP_ABOVE_TP 0
+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
+
+#define DTP_OFFSET 0x8000
+
+#define MC_PC gregs[R_PC]
diff --git a/arch/m68k/reloc.h b/arch/m68k/reloc.h
new file mode 100644 (file)
index 0000000..f920b39
--- /dev/null
@@ -0,0 +1,30 @@
+#if __HAVE_68881__
+#define FP_SUFFIX ""
+#elif __mcffpu__
+#define FP_SUFFIX "-fp64"
+#else
+#define FP_SUFFIX "-sf"
+#endif
+
+#define LDSO_ARCH "m68k" FP_SUFFIX
+
+#define TPOFF_K (-0x7000)
+
+#define REL_SYMBOLIC    R_68K_32
+#define REL_OFFSET      R_68K_PC32
+#define REL_GOT         R_68K_GLOB_DAT
+#define REL_PLT         R_68K_JMP_SLOT
+#define REL_RELATIVE    R_68K_RELATIVE
+#define REL_COPY        R_68K_COPY
+#define REL_DTPMOD      R_68K_TLS_DTPMOD32
+#define REL_DTPOFF      R_68K_TLS_DTPREL32
+#define REL_TPOFF       R_68K_TLS_TPREL32
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+       "move.l %1,%%sp ; jmp (%0)" : : "r"(pc), "r"(sp) : "memory" )
+
+#define GETFUNCSYM(fp, sym, got) __asm__ ( \
+       ".hidden " #sym "\n" \
+       "lea " #sym "-.-8,%0 \n" \
+       "lea (%%pc,%0),%0 \n" \
+       : "=a"(*fp) : : "memory" )
diff --git a/arch/m68k/syscall_arch.h b/arch/m68k/syscall_arch.h
new file mode 100644 (file)
index 0000000..53a4256
--- /dev/null
@@ -0,0 +1,90 @@
+#define __SYSCALL_LL_E(x) \
+((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
+((union { long long ll; long l[2]; }){ .ll = x }).l[1]
+#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
+
+static __inline long __syscall0(long n)
+{
+       register unsigned long d0 __asm__("d0") = n;
+       __asm__ __volatile__ ("trap #0" : "+r"(d0)
+               :
+               : "memory");
+       return d0;
+}
+
+static inline long __syscall1(long n, long a)
+{
+       register unsigned long d0 __asm__("d0") = n;
+       register unsigned long d1 __asm__("d1") = a;
+       __asm__ __volatile__ ("trap #0" : "+r"(d0)
+               : "r"(d1)
+               : "memory");
+       return d0;
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+       register unsigned long d0 __asm__("d0") = n;
+       register unsigned long d1 __asm__("d1") = a;
+       register unsigned long d2 __asm__("d2") = b;
+       __asm__ __volatile__ ("trap #0" : "+r"(d0)
+               : "r"(d1), "r"(d2)
+               : "memory");
+       return d0;
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+       register unsigned long d0 __asm__("d0") = n;
+       register unsigned long d1 __asm__("d1") = a;
+       register unsigned long d2 __asm__("d2") = b;
+       register unsigned long d3 __asm__("d3") = c;
+       __asm__ __volatile__ ("trap #0" : "+r"(d0)
+               : "r"(d1), "r"(d2), "r"(d3)
+               : "memory");
+       return d0;
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+       register unsigned long d0 __asm__("d0") = n;
+       register unsigned long d1 __asm__("d1") = a;
+       register unsigned long d2 __asm__("d2") = b;
+       register unsigned long d3 __asm__("d3") = c;
+       register unsigned long d4 __asm__("d4") = d;
+       __asm__ __volatile__ ("trap #0" : "+r"(d0)
+               : "r"(d1), "r"(d2), "r"(d3), "r"(d4)
+               : "memory");
+       return d0;
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+       register unsigned long d0 __asm__("d0") = n;
+       register unsigned long d1 __asm__("d1") = a;
+       register unsigned long d2 __asm__("d2") = b;
+       register unsigned long d3 __asm__("d3") = c;
+       register unsigned long d4 __asm__("d4") = d;
+       register unsigned long d5 __asm__("d5") = e;
+       __asm__ __volatile__ ("trap #0" : "+r"(d0)
+               : "r"(d1), "r"(d2), "r"(d3), "r"(d4), "r"(d5)
+               : "memory");
+       return d0;
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+       register unsigned long d0 __asm__("d0") = n;
+       register unsigned long d1 __asm__("d1") = a;
+       register unsigned long d2 __asm__("d2") = b;
+       register unsigned long d3 __asm__("d3") = c;
+       register unsigned long d4 __asm__("d4") = d;
+       register unsigned long d5 __asm__("d5") = e;
+       register unsigned long a0 __asm__("a0") = f;
+       __asm__ __volatile__ ("trap #0" : "+r"(d0)
+               : "r"(d1), "r"(d2), "r"(d3), "r"(d4), "r"(d5), "r"(a0)
+               : "memory");
+       return d0;
+}
+
+#define SYSCALL_USE_SOCKETCALL
index 09a0c43659948a4df8df151638722304ca4094e7..f940af9acc9c22146a6ca34e9cb4fa34e3e077ec 100755 (executable)
--- a/configure
+++ b/configure
@@ -320,6 +320,7 @@ i?86*) ARCH=i386 ;;
 x86_64-x32*|x32*|x86_64*x32) ARCH=x32 ;;
 x86_64-nt64*) ARCH=nt64 ;;
 x86_64*) ARCH=x86_64 ;;
+m68k*) ARCH=m68k ;;
 mips64*|mipsisa64*) ARCH=mips64 ;;
 mips*) ARCH=mips ;;
 microblaze*) ARCH=microblaze ;;
@@ -641,6 +642,13 @@ if test "$ARCH" = "aarch64" ; then
 trycppif __AARCH64EB__ "$t" && SUBARCH=${SUBARCH}_be
 fi
 
+if test "$ARCH" = "m68k" ; then
+if trycppif "__HAVE_68881__" ; then : ;
+elif trycppif "__mcffpu__" ; then SUBARCH="-fp64"
+else SUBARCH="-sf"
+fi
+fi
+
 if test "$ARCH" = "mips" ; then
 trycppif "__mips_isa_rev >= 6" "$t" && SUBARCH=${SUBARCH}r6
 trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el
diff --git a/src/fenv/m68k/fenv.c b/src/fenv/m68k/fenv.c
new file mode 100644 (file)
index 0000000..e60949d
--- /dev/null
@@ -0,0 +1,84 @@
+#include <fenv.h>
+
+#if __HAVE_68881__ || __mcffpu__
+
+static unsigned getsr()
+{
+       unsigned v;
+       __asm__ __volatile__ ("fmove.l %%fpsr,%0" : "=dm"(v));
+       return v;
+}
+
+static void setsr(unsigned v)
+{
+       __asm__ __volatile__ ("fmove.l %0,%%fpsr" : : "dm"(v));
+}
+
+static unsigned getcr()
+{
+       unsigned v;
+       __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm"(v));
+       return v;
+}
+
+static void setcr(unsigned v)
+{
+       __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm"(v));
+}
+
+int feclearexcept(int mask)
+{
+       if (mask & ~FE_ALL_EXCEPT) return -1;
+       setsr(getsr() & ~mask);
+       return 0;
+}
+
+int feraiseexcept(int mask)
+{
+       if (mask & ~FE_ALL_EXCEPT) return -1;
+       setsr(getsr() | mask);
+       return 0;
+}
+
+int fetestexcept(int mask)
+{
+       return getsr() & mask;
+}
+
+int fegetround(void)
+{
+       return getcr() & FE_UPWARD;
+}
+
+int __fesetround(int r)
+{
+       setcr((getcr() & ~FE_UPWARD) | r);
+       return 0;
+}
+
+int fegetenv(fenv_t *envp)
+{
+       envp->__control_register = getcr();
+       envp->__status_register = getsr();
+       __asm__ __volatile__ ("fmove.l %%fpiar,%0"
+               : "=dm"(envp->__instruction_address));
+       return 0;
+}
+
+int fesetenv(const fenv_t *envp)
+{
+       static const fenv_t default_env = { 0 };
+       if (envp == FE_DFL_ENV)
+               envp = &default_env;
+       setcr(envp->__control_register);
+       setsr(envp->__status_register);
+       __asm__ __volatile__ ("fmove.l %0,%%fpiar"
+               : : "dm"(envp->__instruction_address));
+       return 0;
+}
+
+#else
+
+#include "../fenv.c"
+
+#endif
diff --git a/src/internal/m68k/syscall.s b/src/internal/m68k/syscall.s
new file mode 100644 (file)
index 0000000..9972a34
--- /dev/null
@@ -0,0 +1,9 @@
+.global __syscall
+.hidden __syscall
+.type __syscall,%function
+__syscall:
+       movem.l %d2-%d5,-(%sp)
+       movem.l 20(%sp),%d0-%d5/%a0
+       trap #0
+       movem.l (%sp)+,%d2-%d5
+       rts
diff --git a/src/ldso/m68k/dlsym.s b/src/ldso/m68k/dlsym.s
new file mode 100644 (file)
index 0000000..5209ae1
--- /dev/null
@@ -0,0 +1,12 @@
+.text
+.global dlsym
+.hidden __dlsym
+.type dlsym,@function
+dlsym:
+       move.l (%sp),-(%sp)
+       move.l 12(%sp),-(%sp)
+       move.l 12(%sp),-(%sp)
+       lea __dlsym-.-8,%a1
+       jsr (%pc,%a1)
+       add.l #12,%sp
+       rts
diff --git a/src/setjmp/m68k/longjmp.s b/src/setjmp/m68k/longjmp.s
new file mode 100644 (file)
index 0000000..cdb05fb
--- /dev/null
@@ -0,0 +1,14 @@
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+       movea.l 4(%sp),%a0
+       move.l 8(%sp),%d0
+       bne 1f
+       move.l #1,%d0
+1:     movem.l (%a0),%d2-%d7/%a2-%a7
+       fmovem.x 52(%a0),%fp2-%fp7
+       move.l 48(%a0),(%sp)
+       rts
diff --git a/src/setjmp/m68k/setjmp.s b/src/setjmp/m68k/setjmp.s
new file mode 100644 (file)
index 0000000..15e549b
--- /dev/null
@@ -0,0 +1,18 @@
+.global ___setjmp
+.hidden ___setjmp
+.global __setjmp
+.global _setjmp
+.global setjmp
+.type __setjmp,@function
+.type _setjmp,@function
+.type setjmp,@function
+___setjmp:
+__setjmp:
+_setjmp:
+setjmp:
+       movea.l 4(%sp),%a0
+       movem.l %d2-%d7/%a2-%a7,(%a0)
+       move.l (%sp),48(%a0)
+       fmovem.x %fp2-%fp7,52(%a0)
+       clr.l %d0
+       rts
diff --git a/src/signal/m68k/sigsetjmp.s b/src/signal/m68k/sigsetjmp.s
new file mode 100644 (file)
index 0000000..09bfa64
--- /dev/null
@@ -0,0 +1,29 @@
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+       move.l 8(%sp),%d0
+       beq 1f
+
+       movea.l 4(%sp),%a1
+       move.l (%sp)+,156(%a1)
+       move.l %a2,156+4+8(%a1)
+       movea.l %a1,%a2
+
+.hidden ___setjmp
+       lea ___setjmp-.-8,%a1
+       jsr (%pc,%a1)
+
+       move.l 156(%a2),-(%sp)
+       move.l %a2,4(%sp)
+       move.l %d0,8(%sp)
+       movea.l 156+4+8(%a2),%a2
+
+.hidden __sigsetjmp_tail
+       lea __sigsetjmp_tail-.-8,%a1
+       jmp (%pc,%a1)
+
+1:     lea ___setjmp-.-8,%a1
+       jmp (%pc,%a1)
diff --git a/src/thread/m68k/__m68k_read_tp.s b/src/thread/m68k/__m68k_read_tp.s
new file mode 100644 (file)
index 0000000..86886da
--- /dev/null
@@ -0,0 +1,8 @@
+.text
+.global __m68k_read_tp
+.type   __m68k_read_tp,@function
+__m68k_read_tp:
+       move.l #333,%d0
+       trap #0
+       move.l %d0,%a0
+       rts
diff --git a/src/thread/m68k/clone.s b/src/thread/m68k/clone.s
new file mode 100644 (file)
index 0000000..5b61b6f
--- /dev/null
@@ -0,0 +1,24 @@
+.text
+.global __clone
+.type   __clone,@function
+__clone:
+       movem.l %d2-%d5,-(%sp)
+       move.l #120,%d0
+       move.l 28(%sp),%d1
+       move.l 24(%sp),%d2
+       and.l #-16,%d2
+       move.l 36(%sp),%d3
+       move.l 44(%sp),%d4
+       move.l 40(%sp),%d5
+       move.l 20(%sp),%a0
+       move.l 32(%sp),%a1
+       trap #0
+       tst.l %d0
+       beq 1f
+       movem.l (%sp)+,%d2-%d5
+       rts
+1:     move.l %a1,-(%sp)
+       jsr (%a0)
+       move.l #1,%d0
+       trap #0
+       clr.b 0
diff --git a/src/thread/m68k/syscall_cp.s b/src/thread/m68k/syscall_cp.s
new file mode 100644 (file)
index 0000000..5628a89
--- /dev/null
@@ -0,0 +1,26 @@
+.text
+.global __cp_begin
+.hidden __cp_begin
+.global __cp_end
+.hidden __cp_end
+.global __cp_cancel
+.hidden __cp_cancel
+.hidden __cancel
+.global __syscall_cp_asm
+.hidden __syscall_cp_asm
+.type   __syscall_cp_asm,@function
+__syscall_cp_asm:
+       movem.l %d2-%d5,-(%sp)
+       movea.l 20(%sp),%a0
+__cp_begin:
+       move.l (%a0),%d0
+       bne __cp_cancel
+       movem.l 24(%sp),%d0-%d5/%a0
+       trap #0
+__cp_end:
+       movem.l (%sp)+,%d2-%d5
+       rts
+__cp_cancel:
+       movem.l (%sp)+,%d2-%d5
+       move.l __cancel-.-8,%a1
+       jmp (%pc,%a1)