diff options
| author | Rich Felker <dalias@aerifal.cx> | 2018-06-14 14:26:30 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2018-06-19 13:24:05 -0400 | 
| commit | f81e44a0d96c88e052e51982f9fdd6fe0a212b46 (patch) | |
| tree | e8a21317b5af5a2d09543ffcb0fbf1f0a668b63a | |
| parent | 18f02c42a2b5397e8541f4663eb6ca00c1a806dd (diff) | |
| download | musl-f81e44a0d96c88e052e51982f9fdd6fe0a212b46.tar.gz | |
add m68k port
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.
| -rw-r--r-- | arch/m68k/atomic_arch.h | 8 | ||||
| -rw-r--r-- | arch/m68k/bits/alltypes.h.in | 31 | ||||
| -rw-r--r-- | arch/m68k/bits/endian.h | 1 | ||||
| -rw-r--r-- | arch/m68k/bits/fcntl.h | 40 | ||||
| -rw-r--r-- | arch/m68k/bits/fenv.h | 29 | ||||
| -rw-r--r-- | arch/m68k/bits/float.h | 39 | ||||
| -rw-r--r-- | arch/m68k/bits/limits.h | 7 | ||||
| -rw-r--r-- | arch/m68k/bits/posix.h | 2 | ||||
| -rw-r--r-- | arch/m68k/bits/setjmp.h | 1 | ||||
| -rw-r--r-- | arch/m68k/bits/signal.h | 140 | ||||
| -rw-r--r-- | arch/m68k/bits/stat.h | 21 | ||||
| -rw-r--r-- | arch/m68k/bits/stdint.h | 20 | ||||
| -rw-r--r-- | arch/m68k/bits/syscall.h.in | 361 | ||||
| -rw-r--r-- | arch/m68k/crt_arch.h | 14 | ||||
| -rw-r--r-- | arch/m68k/pthread_arch.h | 13 | ||||
| -rw-r--r-- | arch/m68k/reloc.h | 30 | ||||
| -rw-r--r-- | arch/m68k/syscall_arch.h | 90 | ||||
| -rwxr-xr-x | configure | 8 | ||||
| -rw-r--r-- | src/fenv/m68k/fenv.c | 84 | ||||
| -rw-r--r-- | src/internal/m68k/syscall.s | 9 | ||||
| -rw-r--r-- | src/ldso/m68k/dlsym.s | 12 | ||||
| -rw-r--r-- | src/setjmp/m68k/longjmp.s | 14 | ||||
| -rw-r--r-- | src/setjmp/m68k/setjmp.s | 18 | ||||
| -rw-r--r-- | src/signal/m68k/sigsetjmp.s | 29 | ||||
| -rw-r--r-- | src/thread/m68k/__m68k_read_tp.s | 8 | ||||
| -rw-r--r-- | src/thread/m68k/clone.s | 24 | ||||
| -rw-r--r-- | src/thread/m68k/syscall_cp.s | 26 | 
27 files changed, 1079 insertions, 0 deletions
diff --git a/arch/m68k/atomic_arch.h b/arch/m68k/atomic_arch.h new file mode 100644 index 00000000..b369649a --- /dev/null +++ b/arch/m68k/atomic_arch.h @@ -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 index 00000000..a4a8141f --- /dev/null +++ b/arch/m68k/bits/alltypes.h.in @@ -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 index 00000000..ef074b77 --- /dev/null +++ b/arch/m68k/bits/endian.h @@ -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 index 00000000..f1c8400f --- /dev/null +++ b/arch/m68k/bits/fcntl.h @@ -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 index 00000000..c90a4a58 --- /dev/null +++ b/arch/m68k/bits/fenv.h @@ -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 index 00000000..fd02a132 --- /dev/null +++ b/arch/m68k/bits/float.h @@ -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 index 00000000..fbc6d238 --- /dev/null +++ b/arch/m68k/bits/limits.h @@ -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 index 00000000..30a38714 --- /dev/null +++ b/arch/m68k/bits/posix.h @@ -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 index 00000000..5e091fb4 --- /dev/null +++ b/arch/m68k/bits/setjmp.h @@ -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 index 00000000..2c369ca3 --- /dev/null +++ b/arch/m68k/bits/signal.h @@ -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 index 00000000..0f7b66a1 --- /dev/null +++ b/arch/m68k/bits/stat.h @@ -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 index 00000000..d1b27121 --- /dev/null +++ b/arch/m68k/bits/stdint.h @@ -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 index 00000000..89cf114c --- /dev/null +++ b/arch/m68k/bits/syscall.h.in @@ -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 index 00000000..48a42f29 --- /dev/null +++ b/arch/m68k/crt_arch.h @@ -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 index 00000000..02d5b8a0 --- /dev/null +++ b/arch/m68k/pthread_arch.h @@ -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 index 00000000..f920b39e --- /dev/null +++ b/arch/m68k/reloc.h @@ -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 index 00000000..53a4256f --- /dev/null +++ b/arch/m68k/syscall_arch.h @@ -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 @@ -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 index 00000000..e60949d1 --- /dev/null +++ b/src/fenv/m68k/fenv.c @@ -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 index 00000000..9972a34d --- /dev/null +++ b/src/internal/m68k/syscall.s @@ -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 index 00000000..5209ae1b --- /dev/null +++ b/src/ldso/m68k/dlsym.s @@ -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 index 00000000..cdb05fb5 --- /dev/null +++ b/src/setjmp/m68k/longjmp.s @@ -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 index 00000000..15e549b0 --- /dev/null +++ b/src/setjmp/m68k/setjmp.s @@ -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 index 00000000..09bfa646 --- /dev/null +++ b/src/signal/m68k/sigsetjmp.s @@ -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 index 00000000..86886da8 --- /dev/null +++ b/src/thread/m68k/__m68k_read_tp.s @@ -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 index 00000000..5b61b6fa --- /dev/null +++ b/src/thread/m68k/clone.s @@ -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 index 00000000..5628a896 --- /dev/null +++ b/src/thread/m68k/syscall_cp.s @@ -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)  | 
