From 3d5633692c9681fba8b8b1298889a22ba4afbad5 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Fri, 4 Nov 2016 18:28:17 +0000 Subject: [PATCH] 68000: Switch syscall API to pass in registers We don't want to do user/kernel translations and verification of the user stack on syscall entry as we can avoid it. --- Library/libs/fuzix68000/syscall__accept.S | 1 + Library/libs/fuzix68000/syscall__exit.S | 1 + Library/libs/fuzix68000/syscall__fork.S | 9 ++-- Library/libs/fuzix68000/syscall__fstat.S | 2 + Library/libs/fuzix68000/syscall__getdirent.S | 3 ++ Library/libs/fuzix68000/syscall__getfsys.S | 2 + .../libs/fuzix68000/syscall__getsockaddrs.S | 3 ++ Library/libs/fuzix68000/syscall__lseek.S | 3 ++ Library/libs/fuzix68000/syscall__pause.S | 1 + Library/libs/fuzix68000/syscall__profil.S | 6 +++ Library/libs/fuzix68000/syscall__recvfrom.S | 6 +++ Library/libs/fuzix68000/syscall__select.S | 2 + Library/libs/fuzix68000/syscall__sendto.S | 6 +++ Library/libs/fuzix68000/syscall__shutdown.S | 2 + Library/libs/fuzix68000/syscall__sigdisp.S | 2 + Library/libs/fuzix68000/syscall__stat.S | 2 + Library/libs/fuzix68000/syscall__stime.S | 2 + Library/libs/fuzix68000/syscall__time.S | 2 + Library/libs/fuzix68000/syscall__uname.S | 2 + Library/libs/fuzix68000/syscall_access.S | 2 + Library/libs/fuzix68000/syscall_acct.S | 1 + Library/libs/fuzix68000/syscall_alarm.S | 1 + Library/libs/fuzix68000/syscall_bind.S | 3 ++ Library/libs/fuzix68000/syscall_brk.S | 1 + Library/libs/fuzix68000/syscall_chdir.S | 1 + Library/libs/fuzix68000/syscall_chmod.S | 2 + Library/libs/fuzix68000/syscall_chown.S | 3 ++ Library/libs/fuzix68000/syscall_chroot.S | 1 + Library/libs/fuzix68000/syscall_close.S | 1 + Library/libs/fuzix68000/syscall_connect.S | 3 ++ Library/libs/fuzix68000/syscall_dup.S | 1 + Library/libs/fuzix68000/syscall_dup2.S | 2 + Library/libs/fuzix68000/syscall_execve.S | 3 ++ Library/libs/fuzix68000/syscall_fchdir.S | 1 + Library/libs/fuzix68000/syscall_fchmod.S | 2 + Library/libs/fuzix68000/syscall_fchown.S | 3 ++ Library/libs/fuzix68000/syscall_fcntl.S | 3 ++ Library/libs/fuzix68000/syscall_flock.S | 2 + Library/libs/fuzix68000/syscall_getgroups.S | 2 + Library/libs/fuzix68000/syscall_getrlimit.S | 2 + Library/libs/fuzix68000/syscall_getsid.S | 1 + Library/libs/fuzix68000/syscall_ioctl.S | 3 ++ Library/libs/fuzix68000/syscall_kill.S | 2 + Library/libs/fuzix68000/syscall_link.S | 2 + Library/libs/fuzix68000/syscall_listen.S | 2 + Library/libs/fuzix68000/syscall_memalloc.S | 1 + Library/libs/fuzix68000/syscall_memfree.S | 1 + Library/libs/fuzix68000/syscall_mkdir.S | 2 + Library/libs/fuzix68000/syscall_mknod.S | 3 ++ Library/libs/fuzix68000/syscall_mount.S | 3 ++ Library/libs/fuzix68000/syscall_nice.S | 1 + Library/libs/fuzix68000/syscall_open.S | 3 ++ Library/libs/fuzix68000/syscall_pipe.S | 1 + Library/libs/fuzix68000/syscall_read.S | 3 ++ Library/libs/fuzix68000/syscall_rename.S | 2 + Library/libs/fuzix68000/syscall_rmdir.S | 1 + Library/libs/fuzix68000/syscall_sbrk.S | 1 + Library/libs/fuzix68000/syscall_setgid.S | 1 + Library/libs/fuzix68000/syscall_setgroups.S | 2 + Library/libs/fuzix68000/syscall_setpgid.S | 2 + Library/libs/fuzix68000/syscall_setrlimit.S | 2 + Library/libs/fuzix68000/syscall_setsid.S | 1 + Library/libs/fuzix68000/syscall_setuid.S | 1 + Library/libs/fuzix68000/syscall_signal.S | 2 + Library/libs/fuzix68000/syscall_socket.S | 3 ++ Library/libs/fuzix68000/syscall_times.S | 1 + Library/libs/fuzix68000/syscall_uadmin.S | 3 ++ Library/libs/fuzix68000/syscall_umask.S | 1 + Library/libs/fuzix68000/syscall_umount.S | 1 + Library/libs/fuzix68000/syscall_unlink.S | 1 + Library/libs/fuzix68000/syscall_utime.S | 2 + Library/libs/fuzix68000/syscall_waitpid.S | 3 ++ Library/libs/fuzix68000/syscall_write.S | 3 ++ Library/tools/syscall_68000.c | 54 +++++++++++++------ 74 files changed, 189 insertions(+), 23 deletions(-) diff --git a/Library/libs/fuzix68000/syscall__accept.S b/Library/libs/fuzix68000/syscall__accept.S index b564c5c9..988ac8df 100644 --- a/Library/libs/fuzix68000/syscall__accept.S +++ b/Library/libs/fuzix68000/syscall__accept.S @@ -4,6 +4,7 @@ _accept: .mri 1 + move.l 4(sp),d1 move.w #94,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__exit.S b/Library/libs/fuzix68000/syscall__exit.S index cce32fc5..0f6bb041 100644 --- a/Library/libs/fuzix68000/syscall__exit.S +++ b/Library/libs/fuzix68000/syscall__exit.S @@ -4,6 +4,7 @@ _exit: .mri 1 + move.l 4(sp),d1 move.w #0,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__fork.S b/Library/libs/fuzix68000/syscall__fork.S index d22f64ec..1a856bdf 100644 --- a/Library/libs/fuzix68000/syscall__fork.S +++ b/Library/libs/fuzix68000/syscall__fork.S @@ -4,17 +4,14 @@ _fork: .mri 1 - move.l 4(sp),d1 - movem.l d0-d7/a2-a6,-(sp) + movem.l d2-d7/a2-a4/a6,-(sp) + move.l 44(sp),d1 move.w #32,d0 trap #14 + movem.l (sp)+,d2-d7/a2-a4/a6 ext.l d1 bne _error - addq #8,sp - movem.l (sp)+,d2-d7/a2-a6 rts _error: move.l d1,errno - addq #8,sp - movem.l (sp)+,d2-d7/a2-a6 rts diff --git a/Library/libs/fuzix68000/syscall__fstat.S b/Library/libs/fuzix68000/syscall__fstat.S index fc0210b7..40fbc4de 100644 --- a/Library/libs/fuzix68000/syscall__fstat.S +++ b/Library/libs/fuzix68000/syscall__fstat.S @@ -4,6 +4,8 @@ _fstat: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #16,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__getdirent.S b/Library/libs/fuzix68000/syscall__getdirent.S index b6bc3b6c..b29ecc04 100644 --- a/Library/libs/fuzix68000/syscall__getdirent.S +++ b/Library/libs/fuzix68000/syscall__getdirent.S @@ -4,6 +4,9 @@ _getdirent: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #24,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__getfsys.S b/Library/libs/fuzix68000/syscall__getfsys.S index 1796d857..b41652c6 100644 --- a/Library/libs/fuzix68000/syscall__getfsys.S +++ b/Library/libs/fuzix68000/syscall__getfsys.S @@ -4,6 +4,8 @@ _getfsys: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #22,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__getsockaddrs.S b/Library/libs/fuzix68000/syscall__getsockaddrs.S index 1c8a546d..bab81d23 100644 --- a/Library/libs/fuzix68000/syscall__getsockaddrs.S +++ b/Library/libs/fuzix68000/syscall__getsockaddrs.S @@ -4,6 +4,9 @@ _getsockaddrs: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #95,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__lseek.S b/Library/libs/fuzix68000/syscall__lseek.S index 0cd6e5a8..2f44fbfb 100644 --- a/Library/libs/fuzix68000/syscall__lseek.S +++ b/Library/libs/fuzix68000/syscall__lseek.S @@ -4,6 +4,9 @@ _lseek: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #9,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__pause.S b/Library/libs/fuzix68000/syscall__pause.S index 1d5cd0c7..b6a3320e 100644 --- a/Library/libs/fuzix68000/syscall__pause.S +++ b/Library/libs/fuzix68000/syscall__pause.S @@ -4,6 +4,7 @@ _pause: .mri 1 + move.l 4(sp),d1 move.w #37,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__profil.S b/Library/libs/fuzix68000/syscall__profil.S index b4ff5c0c..f6216bcb 100644 --- a/Library/libs/fuzix68000/syscall__profil.S +++ b/Library/libs/fuzix68000/syscall__profil.S @@ -4,8 +4,14 @@ _profil: .mri 1 + move.l a2,-(sp) + move.l 20(sp),a2 + move.l 16(sp),a1 + move.l 12(sp),a0 + move.l 8(sp),d1 move.w #56,d0 trap #14 + move.l (sp)+,a2 ext.l d1 bne _error rts diff --git a/Library/libs/fuzix68000/syscall__recvfrom.S b/Library/libs/fuzix68000/syscall__recvfrom.S index 57cafc4d..110cc9ac 100644 --- a/Library/libs/fuzix68000/syscall__recvfrom.S +++ b/Library/libs/fuzix68000/syscall__recvfrom.S @@ -4,8 +4,14 @@ _recvfrom: .mri 1 + move.l a2,-(sp) + move.l 20(sp),a2 + move.l 16(sp),a1 + move.l 12(sp),a0 + move.l 8(sp),d1 move.w #97,d0 trap #14 + move.l (sp)+,a2 ext.l d1 bne _error rts diff --git a/Library/libs/fuzix68000/syscall__select.S b/Library/libs/fuzix68000/syscall__select.S index bd4bdce1..5d3131ab 100644 --- a/Library/libs/fuzix68000/syscall__select.S +++ b/Library/libs/fuzix68000/syscall__select.S @@ -4,6 +4,8 @@ _select: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #72,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__sendto.S b/Library/libs/fuzix68000/syscall__sendto.S index 9b8c99d4..4588b240 100644 --- a/Library/libs/fuzix68000/syscall__sendto.S +++ b/Library/libs/fuzix68000/syscall__sendto.S @@ -4,8 +4,14 @@ _sendto: .mri 1 + move.l a2,-(sp) + move.l 20(sp),a2 + move.l 16(sp),a1 + move.l 12(sp),a0 + move.l 8(sp),d1 move.w #96,d0 trap #14 + move.l (sp)+,a2 ext.l d1 bne _error rts diff --git a/Library/libs/fuzix68000/syscall__shutdown.S b/Library/libs/fuzix68000/syscall__shutdown.S index e7f39e58..0b52a7bb 100644 --- a/Library/libs/fuzix68000/syscall__shutdown.S +++ b/Library/libs/fuzix68000/syscall__shutdown.S @@ -4,6 +4,8 @@ _shutdown: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #98,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__sigdisp.S b/Library/libs/fuzix68000/syscall__sigdisp.S index e18b8096..69295420 100644 --- a/Library/libs/fuzix68000/syscall__sigdisp.S +++ b/Library/libs/fuzix68000/syscall__sigdisp.S @@ -4,6 +4,8 @@ _sigdisp: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #59,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__stat.S b/Library/libs/fuzix68000/syscall__stat.S index 51f20e21..02b57d9d 100644 --- a/Library/libs/fuzix68000/syscall__stat.S +++ b/Library/libs/fuzix68000/syscall__stat.S @@ -4,6 +4,8 @@ _stat: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #15,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__stime.S b/Library/libs/fuzix68000/syscall__stime.S index cc33daed..9f14f9e0 100644 --- a/Library/libs/fuzix68000/syscall__stime.S +++ b/Library/libs/fuzix68000/syscall__stime.S @@ -4,6 +4,8 @@ _stime: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #28,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__time.S b/Library/libs/fuzix68000/syscall__time.S index 64da197e..28b74cf8 100644 --- a/Library/libs/fuzix68000/syscall__time.S +++ b/Library/libs/fuzix68000/syscall__time.S @@ -4,6 +4,8 @@ _time: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #27,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall__uname.S b/Library/libs/fuzix68000/syscall__uname.S index e8d4e5c4..899f7fe6 100644 --- a/Library/libs/fuzix68000/syscall__uname.S +++ b/Library/libs/fuzix68000/syscall__uname.S @@ -4,6 +4,8 @@ _uname: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #54,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_access.S b/Library/libs/fuzix68000/syscall_access.S index 45e7e70a..8bc1ff23 100644 --- a/Library/libs/fuzix68000/syscall_access.S +++ b/Library/libs/fuzix68000/syscall_access.S @@ -4,6 +4,8 @@ access: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #12,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_acct.S b/Library/libs/fuzix68000/syscall_acct.S index fffc7ca9..4e44669d 100644 --- a/Library/libs/fuzix68000/syscall_acct.S +++ b/Library/libs/fuzix68000/syscall_acct.S @@ -4,6 +4,7 @@ acct: .mri 1 + move.l 4(sp),d1 move.w #63,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_alarm.S b/Library/libs/fuzix68000/syscall_alarm.S index 9a358ef6..07f853a5 100644 --- a/Library/libs/fuzix68000/syscall_alarm.S +++ b/Library/libs/fuzix68000/syscall_alarm.S @@ -4,6 +4,7 @@ alarm: .mri 1 + move.l 4(sp),d1 move.w #38,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_bind.S b/Library/libs/fuzix68000/syscall_bind.S index eef7e931..170d09fb 100644 --- a/Library/libs/fuzix68000/syscall_bind.S +++ b/Library/libs/fuzix68000/syscall_bind.S @@ -4,6 +4,9 @@ bind: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #92,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_brk.S b/Library/libs/fuzix68000/syscall_brk.S index 82f757fa..7217720f 100644 --- a/Library/libs/fuzix68000/syscall_brk.S +++ b/Library/libs/fuzix68000/syscall_brk.S @@ -4,6 +4,7 @@ brk: .mri 1 + move.l 4(sp),d1 move.w #30,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_chdir.S b/Library/libs/fuzix68000/syscall_chdir.S index 96809fe7..ce7e9500 100644 --- a/Library/libs/fuzix68000/syscall_chdir.S +++ b/Library/libs/fuzix68000/syscall_chdir.S @@ -4,6 +4,7 @@ chdir: .mri 1 + move.l 4(sp),d1 move.w #10,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_chmod.S b/Library/libs/fuzix68000/syscall_chmod.S index d772623e..ef45d3f3 100644 --- a/Library/libs/fuzix68000/syscall_chmod.S +++ b/Library/libs/fuzix68000/syscall_chmod.S @@ -4,6 +4,8 @@ chmod: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #13,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_chown.S b/Library/libs/fuzix68000/syscall_chown.S index 435f1ebe..44028c51 100644 --- a/Library/libs/fuzix68000/syscall_chown.S +++ b/Library/libs/fuzix68000/syscall_chown.S @@ -4,6 +4,9 @@ chown: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #14,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_chroot.S b/Library/libs/fuzix68000/syscall_chroot.S index df193c69..ee4405a7 100644 --- a/Library/libs/fuzix68000/syscall_chroot.S +++ b/Library/libs/fuzix68000/syscall_chroot.S @@ -4,6 +4,7 @@ chroot: .mri 1 + move.l 4(sp),d1 move.w #46,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_close.S b/Library/libs/fuzix68000/syscall_close.S index f57199a9..ea1b702d 100644 --- a/Library/libs/fuzix68000/syscall_close.S +++ b/Library/libs/fuzix68000/syscall_close.S @@ -4,6 +4,7 @@ close: .mri 1 + move.l 4(sp),d1 move.w #2,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_connect.S b/Library/libs/fuzix68000/syscall_connect.S index 9875d6af..57aee910 100644 --- a/Library/libs/fuzix68000/syscall_connect.S +++ b/Library/libs/fuzix68000/syscall_connect.S @@ -4,6 +4,9 @@ connect: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #93,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_dup.S b/Library/libs/fuzix68000/syscall_dup.S index 4c1beb73..b3b47496 100644 --- a/Library/libs/fuzix68000/syscall_dup.S +++ b/Library/libs/fuzix68000/syscall_dup.S @@ -4,6 +4,7 @@ dup: .mri 1 + move.l 4(sp),d1 move.w #17,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_dup2.S b/Library/libs/fuzix68000/syscall_dup2.S index f4f938df..0bbd3982 100644 --- a/Library/libs/fuzix68000/syscall_dup2.S +++ b/Library/libs/fuzix68000/syscall_dup2.S @@ -4,6 +4,8 @@ dup2: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #36,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_execve.S b/Library/libs/fuzix68000/syscall_execve.S index c5117e97..f2f4c7a6 100644 --- a/Library/libs/fuzix68000/syscall_execve.S +++ b/Library/libs/fuzix68000/syscall_execve.S @@ -4,6 +4,9 @@ execve: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #23,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_fchdir.S b/Library/libs/fuzix68000/syscall_fchdir.S index 59fed0d7..4349b8a9 100644 --- a/Library/libs/fuzix68000/syscall_fchdir.S +++ b/Library/libs/fuzix68000/syscall_fchdir.S @@ -4,6 +4,7 @@ fchdir: .mri 1 + move.l 4(sp),d1 move.w #48,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_fchmod.S b/Library/libs/fuzix68000/syscall_fchmod.S index b8305089..50870e82 100644 --- a/Library/libs/fuzix68000/syscall_fchmod.S +++ b/Library/libs/fuzix68000/syscall_fchmod.S @@ -4,6 +4,8 @@ fchmod: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #49,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_fchown.S b/Library/libs/fuzix68000/syscall_fchown.S index 48ff2f88..52423dc1 100644 --- a/Library/libs/fuzix68000/syscall_fchown.S +++ b/Library/libs/fuzix68000/syscall_fchown.S @@ -4,6 +4,9 @@ fchown: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #50,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_fcntl.S b/Library/libs/fuzix68000/syscall_fcntl.S index 5d278623..7c1e8198 100644 --- a/Library/libs/fuzix68000/syscall_fcntl.S +++ b/Library/libs/fuzix68000/syscall_fcntl.S @@ -4,6 +4,9 @@ fcntl: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #47,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_flock.S b/Library/libs/fuzix68000/syscall_flock.S index 923da3c6..2e3ad728 100644 --- a/Library/libs/fuzix68000/syscall_flock.S +++ b/Library/libs/fuzix68000/syscall_flock.S @@ -4,6 +4,8 @@ flock: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #60,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_getgroups.S b/Library/libs/fuzix68000/syscall_getgroups.S index 0d144e48..09fde88e 100644 --- a/Library/libs/fuzix68000/syscall_getgroups.S +++ b/Library/libs/fuzix68000/syscall_getgroups.S @@ -4,6 +4,8 @@ getgroups: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #74,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_getrlimit.S b/Library/libs/fuzix68000/syscall_getrlimit.S index 915b4a6d..0d251082 100644 --- a/Library/libs/fuzix68000/syscall_getrlimit.S +++ b/Library/libs/fuzix68000/syscall_getrlimit.S @@ -4,6 +4,8 @@ getrlimit: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #75,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_getsid.S b/Library/libs/fuzix68000/syscall_getsid.S index c1f4339f..233b6d97 100644 --- a/Library/libs/fuzix68000/syscall_getsid.S +++ b/Library/libs/fuzix68000/syscall_getsid.S @@ -4,6 +4,7 @@ getsid: .mri 1 + move.l 4(sp),d1 move.w #79,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_ioctl.S b/Library/libs/fuzix68000/syscall_ioctl.S index a6661c5a..5c593537 100644 --- a/Library/libs/fuzix68000/syscall_ioctl.S +++ b/Library/libs/fuzix68000/syscall_ioctl.S @@ -4,6 +4,9 @@ ioctl: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #29,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_kill.S b/Library/libs/fuzix68000/syscall_kill.S index bfa2d721..404c8c91 100644 --- a/Library/libs/fuzix68000/syscall_kill.S +++ b/Library/libs/fuzix68000/syscall_kill.S @@ -4,6 +4,8 @@ kill: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #39,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_link.S b/Library/libs/fuzix68000/syscall_link.S index cf623bc3..47a574d9 100644 --- a/Library/libs/fuzix68000/syscall_link.S +++ b/Library/libs/fuzix68000/syscall_link.S @@ -4,6 +4,8 @@ link: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #5,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_listen.S b/Library/libs/fuzix68000/syscall_listen.S index a69830e9..1e7ba743 100644 --- a/Library/libs/fuzix68000/syscall_listen.S +++ b/Library/libs/fuzix68000/syscall_listen.S @@ -4,6 +4,8 @@ listen: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #91,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_memalloc.S b/Library/libs/fuzix68000/syscall_memalloc.S index 0f530a37..1b31b758 100644 --- a/Library/libs/fuzix68000/syscall_memalloc.S +++ b/Library/libs/fuzix68000/syscall_memalloc.S @@ -4,6 +4,7 @@ memalloc: .mri 1 + move.l 4(sp),d1 move.w #64,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_memfree.S b/Library/libs/fuzix68000/syscall_memfree.S index a73d6c0e..f83f9a65 100644 --- a/Library/libs/fuzix68000/syscall_memfree.S +++ b/Library/libs/fuzix68000/syscall_memfree.S @@ -4,6 +4,7 @@ memfree: .mri 1 + move.l 4(sp),d1 move.w #65,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_mkdir.S b/Library/libs/fuzix68000/syscall_mkdir.S index 2f2351fa..c883528e 100644 --- a/Library/libs/fuzix68000/syscall_mkdir.S +++ b/Library/libs/fuzix68000/syscall_mkdir.S @@ -4,6 +4,8 @@ mkdir: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #51,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_mknod.S b/Library/libs/fuzix68000/syscall_mknod.S index 2fb16103..d18e3ad3 100644 --- a/Library/libs/fuzix68000/syscall_mknod.S +++ b/Library/libs/fuzix68000/syscall_mknod.S @@ -4,6 +4,9 @@ mknod: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #4,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_mount.S b/Library/libs/fuzix68000/syscall_mount.S index d4d19633..5e8cd1b8 100644 --- a/Library/libs/fuzix68000/syscall_mount.S +++ b/Library/libs/fuzix68000/syscall_mount.S @@ -4,6 +4,9 @@ mount: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #33,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_nice.S b/Library/libs/fuzix68000/syscall_nice.S index aa58f5cb..e38340f6 100644 --- a/Library/libs/fuzix68000/syscall_nice.S +++ b/Library/libs/fuzix68000/syscall_nice.S @@ -4,6 +4,7 @@ nice: .mri 1 + move.l 4(sp),d1 move.w #58,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_open.S b/Library/libs/fuzix68000/syscall_open.S index 5de91bb1..f9f5bb36 100644 --- a/Library/libs/fuzix68000/syscall_open.S +++ b/Library/libs/fuzix68000/syscall_open.S @@ -4,6 +4,9 @@ open: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #1,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_pipe.S b/Library/libs/fuzix68000/syscall_pipe.S index 380bebf4..36270c56 100644 --- a/Library/libs/fuzix68000/syscall_pipe.S +++ b/Library/libs/fuzix68000/syscall_pipe.S @@ -4,6 +4,7 @@ pipe: .mri 1 + move.l 4(sp),d1 move.w #40,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_read.S b/Library/libs/fuzix68000/syscall_read.S index f4c97dbc..a81baddc 100644 --- a/Library/libs/fuzix68000/syscall_read.S +++ b/Library/libs/fuzix68000/syscall_read.S @@ -4,6 +4,9 @@ read: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #7,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_rename.S b/Library/libs/fuzix68000/syscall_rename.S index d0e25e85..124cfabf 100644 --- a/Library/libs/fuzix68000/syscall_rename.S +++ b/Library/libs/fuzix68000/syscall_rename.S @@ -4,6 +4,8 @@ rename: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #3,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_rmdir.S b/Library/libs/fuzix68000/syscall_rmdir.S index 26f2da92..f1636fed 100644 --- a/Library/libs/fuzix68000/syscall_rmdir.S +++ b/Library/libs/fuzix68000/syscall_rmdir.S @@ -4,6 +4,7 @@ rmdir: .mri 1 + move.l 4(sp),d1 move.w #52,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_sbrk.S b/Library/libs/fuzix68000/syscall_sbrk.S index 76444003..36b052d7 100644 --- a/Library/libs/fuzix68000/syscall_sbrk.S +++ b/Library/libs/fuzix68000/syscall_sbrk.S @@ -4,6 +4,7 @@ sbrk: .mri 1 + move.l 4(sp),d1 move.w #31,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_setgid.S b/Library/libs/fuzix68000/syscall_setgid.S index c34e5a47..bf19625d 100644 --- a/Library/libs/fuzix68000/syscall_setgid.S +++ b/Library/libs/fuzix68000/syscall_setgid.S @@ -4,6 +4,7 @@ setgid: .mri 1 + move.l 4(sp),d1 move.w #26,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_setgroups.S b/Library/libs/fuzix68000/syscall_setgroups.S index 52b2ad9f..35f1c444 100644 --- a/Library/libs/fuzix68000/syscall_setgroups.S +++ b/Library/libs/fuzix68000/syscall_setgroups.S @@ -4,6 +4,8 @@ setgroups: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #73,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_setpgid.S b/Library/libs/fuzix68000/syscall_setpgid.S index 0e342095..9b9dd278 100644 --- a/Library/libs/fuzix68000/syscall_setpgid.S +++ b/Library/libs/fuzix68000/syscall_setpgid.S @@ -4,6 +4,8 @@ setpgid: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #77,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_setrlimit.S b/Library/libs/fuzix68000/syscall_setrlimit.S index 1a2be738..7c48aa8a 100644 --- a/Library/libs/fuzix68000/syscall_setrlimit.S +++ b/Library/libs/fuzix68000/syscall_setrlimit.S @@ -4,6 +4,8 @@ setrlimit: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #76,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_setsid.S b/Library/libs/fuzix68000/syscall_setsid.S index 67049f63..1f1f4cce 100644 --- a/Library/libs/fuzix68000/syscall_setsid.S +++ b/Library/libs/fuzix68000/syscall_setsid.S @@ -4,6 +4,7 @@ setsid: .mri 1 + move.l 4(sp),d1 move.w #78,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_setuid.S b/Library/libs/fuzix68000/syscall_setuid.S index 0f87f19b..07fd25a6 100644 --- a/Library/libs/fuzix68000/syscall_setuid.S +++ b/Library/libs/fuzix68000/syscall_setuid.S @@ -4,6 +4,7 @@ setuid: .mri 1 + move.l 4(sp),d1 move.w #25,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_signal.S b/Library/libs/fuzix68000/syscall_signal.S index 9a660909..39386ce2 100644 --- a/Library/libs/fuzix68000/syscall_signal.S +++ b/Library/libs/fuzix68000/syscall_signal.S @@ -4,6 +4,8 @@ signal: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #35,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_socket.S b/Library/libs/fuzix68000/syscall_socket.S index cf582df5..a7d6db01 100644 --- a/Library/libs/fuzix68000/syscall_socket.S +++ b/Library/libs/fuzix68000/syscall_socket.S @@ -4,6 +4,9 @@ socket: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #90,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_times.S b/Library/libs/fuzix68000/syscall_times.S index a949a351..920d0615 100644 --- a/Library/libs/fuzix68000/syscall_times.S +++ b/Library/libs/fuzix68000/syscall_times.S @@ -4,6 +4,7 @@ times: .mri 1 + move.l 4(sp),d1 move.w #42,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_uadmin.S b/Library/libs/fuzix68000/syscall_uadmin.S index 151cfa2d..7ac28a65 100644 --- a/Library/libs/fuzix68000/syscall_uadmin.S +++ b/Library/libs/fuzix68000/syscall_uadmin.S @@ -4,6 +4,9 @@ uadmin: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #57,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_umask.S b/Library/libs/fuzix68000/syscall_umask.S index 0554835a..7b64d5ab 100644 --- a/Library/libs/fuzix68000/syscall_umask.S +++ b/Library/libs/fuzix68000/syscall_umask.S @@ -4,6 +4,7 @@ umask: .mri 1 + move.l 4(sp),d1 move.w #21,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_umount.S b/Library/libs/fuzix68000/syscall_umount.S index 5b217467..eef88486 100644 --- a/Library/libs/fuzix68000/syscall_umount.S +++ b/Library/libs/fuzix68000/syscall_umount.S @@ -4,6 +4,7 @@ umount: .mri 1 + move.l 4(sp),d1 move.w #34,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_unlink.S b/Library/libs/fuzix68000/syscall_unlink.S index b6ccc9f6..20892369 100644 --- a/Library/libs/fuzix68000/syscall_unlink.S +++ b/Library/libs/fuzix68000/syscall_unlink.S @@ -4,6 +4,7 @@ unlink: .mri 1 + move.l 4(sp),d1 move.w #6,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_utime.S b/Library/libs/fuzix68000/syscall_utime.S index d13e6626..6c3e380d 100644 --- a/Library/libs/fuzix68000/syscall_utime.S +++ b/Library/libs/fuzix68000/syscall_utime.S @@ -4,6 +4,8 @@ utime: .mri 1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #43,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_waitpid.S b/Library/libs/fuzix68000/syscall_waitpid.S index ea9b4877..7a499582 100644 --- a/Library/libs/fuzix68000/syscall_waitpid.S +++ b/Library/libs/fuzix68000/syscall_waitpid.S @@ -4,6 +4,9 @@ waitpid: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #55,d0 trap #14 ext.l d1 diff --git a/Library/libs/fuzix68000/syscall_write.S b/Library/libs/fuzix68000/syscall_write.S index eb252f1b..5fc03173 100644 --- a/Library/libs/fuzix68000/syscall_write.S +++ b/Library/libs/fuzix68000/syscall_write.S @@ -4,6 +4,9 @@ write: .mri 1 + move.l 12(sp),a1 + move.l 8(sp),a0 + move.l 4(sp),d1 move.w #8,d0 trap #14 ext.l d1 diff --git a/Library/tools/syscall_68000.c b/Library/tools/syscall_68000.c index 877e040c..2bbb4bd8 100644 --- a/Library/tools/syscall_68000.c +++ b/Library/tools/syscall_68000.c @@ -28,37 +28,57 @@ static void write_call(int n) * Note: this does mean if you want a register global you need to use a5 * or ensure you never take a signal in the fork() area - doable but ugly. */ - if (strcmp(syscall_name[n], "_fork") == 0) - saves = 1; - fprintf(fp, "\t.text\n\n" "\t.globl %1$s\n\n" "%1$s:\n", syscall_name[n]); fprintf(fp, ".mri 1\n"); - /* If saving we build a valid stack frame for the syscall below the saves - using d0/d1 - d0 is the non-existent return address, d1 is the argument */ - if (saves) - fprintf(fp, "\tmove.l 4(sp),d1\n" - "\tmovem.l d0-d7/a2-a6,-(sp)\n"); - fprintf(fp, "\tmove.w #%d,d0\n" - "\ttrap #14\n", n); + + if (strcmp(syscall_name[n], "_fork") == 0) { + /* Fork may trash everything except A5 in order to make our syscall + path much faster */ + fprintf(fp, "\tmovem.l d2-d7/a2-a4/a6,-(sp)\n"); + fprintf(fp, "\tmove.l 44(sp),d1\n"); /* _fork argument */ + saves = 1; + } else { + switch(syscall_args[n]) { + case 4: + fprintf(fp, "\tmove.l a2,-(sp)\n"); + fprintf(fp, "\tmove.l 20(sp),a2\n"); + fprintf(fp, "\tmove.l 16(sp),a1\n"); + fprintf(fp, "\tmove.l 12(sp),a0\n"); + fprintf(fp, "\tmove.l 8(sp),d1\n"); + break; + case VARARGS: /* We have no 4 argument varargs.. */ + case 3: + fprintf(fp, "\tmove.l 12(sp),a1\n"); + case 2: + fprintf(fp, "\tmove.l 8(sp),a0\n"); + case 1: + fprintf(fp, "\tmove.l 4(sp),d1\n"); + case 0: + break; + } + } + fprintf(fp, "\tmove.w #%d,d0\n", n); + fprintf(fp, "\ttrap #14\n"); + + if (syscall_args[n] == 4) + fprintf(fp, "\tmove.l (sp)+,a2\n"); + else if (saves == 1) + fprintf(fp, "\tmovem.l (sp)+,d2-d7/a2-a4/a6\n"); + /* ext is the same speed as tst so we might as well do the ext in case it is an error code. We have to ext the error because while we use shorts in kernel for such things and speed the standard says errno is integer */ + fprintf(fp, "\text.l d1\n" "\tbne _error\n"); - if (saves) - fprintf(fp, "\taddq #8,sp\n" - "\tmovem.l (sp)+,d2-d7/a2-a6\n"); - fprintf(fp, "\trts\n" "_error:\n" "\tmove.l d1,errno\n"); - if (saves) - fprintf(fp, "\taddq #8,sp\n" - "\tmovem.l (sp)+,d2-d7/a2-a6\n"); fprintf(fp, "\trts\n"); + fclose(fp); } -- 2.34.1