68000: Switch syscall API to pass in registers
authorAlan Cox <alan@linux.intel.com>
Fri, 4 Nov 2016 18:28:17 +0000 (18:28 +0000)
committerAlan Cox <alan@linux.intel.com>
Fri, 4 Nov 2016 18:28:17 +0000 (18:28 +0000)
We don't want to do user/kernel translations and verification of the user
stack on syscall entry as we can avoid it.

74 files changed:
Library/libs/fuzix68000/syscall__accept.S
Library/libs/fuzix68000/syscall__exit.S
Library/libs/fuzix68000/syscall__fork.S
Library/libs/fuzix68000/syscall__fstat.S
Library/libs/fuzix68000/syscall__getdirent.S
Library/libs/fuzix68000/syscall__getfsys.S
Library/libs/fuzix68000/syscall__getsockaddrs.S
Library/libs/fuzix68000/syscall__lseek.S
Library/libs/fuzix68000/syscall__pause.S
Library/libs/fuzix68000/syscall__profil.S
Library/libs/fuzix68000/syscall__recvfrom.S
Library/libs/fuzix68000/syscall__select.S
Library/libs/fuzix68000/syscall__sendto.S
Library/libs/fuzix68000/syscall__shutdown.S
Library/libs/fuzix68000/syscall__sigdisp.S
Library/libs/fuzix68000/syscall__stat.S
Library/libs/fuzix68000/syscall__stime.S
Library/libs/fuzix68000/syscall__time.S
Library/libs/fuzix68000/syscall__uname.S
Library/libs/fuzix68000/syscall_access.S
Library/libs/fuzix68000/syscall_acct.S
Library/libs/fuzix68000/syscall_alarm.S
Library/libs/fuzix68000/syscall_bind.S
Library/libs/fuzix68000/syscall_brk.S
Library/libs/fuzix68000/syscall_chdir.S
Library/libs/fuzix68000/syscall_chmod.S
Library/libs/fuzix68000/syscall_chown.S
Library/libs/fuzix68000/syscall_chroot.S
Library/libs/fuzix68000/syscall_close.S
Library/libs/fuzix68000/syscall_connect.S
Library/libs/fuzix68000/syscall_dup.S
Library/libs/fuzix68000/syscall_dup2.S
Library/libs/fuzix68000/syscall_execve.S
Library/libs/fuzix68000/syscall_fchdir.S
Library/libs/fuzix68000/syscall_fchmod.S
Library/libs/fuzix68000/syscall_fchown.S
Library/libs/fuzix68000/syscall_fcntl.S
Library/libs/fuzix68000/syscall_flock.S
Library/libs/fuzix68000/syscall_getgroups.S
Library/libs/fuzix68000/syscall_getrlimit.S
Library/libs/fuzix68000/syscall_getsid.S
Library/libs/fuzix68000/syscall_ioctl.S
Library/libs/fuzix68000/syscall_kill.S
Library/libs/fuzix68000/syscall_link.S
Library/libs/fuzix68000/syscall_listen.S
Library/libs/fuzix68000/syscall_memalloc.S
Library/libs/fuzix68000/syscall_memfree.S
Library/libs/fuzix68000/syscall_mkdir.S
Library/libs/fuzix68000/syscall_mknod.S
Library/libs/fuzix68000/syscall_mount.S
Library/libs/fuzix68000/syscall_nice.S
Library/libs/fuzix68000/syscall_open.S
Library/libs/fuzix68000/syscall_pipe.S
Library/libs/fuzix68000/syscall_read.S
Library/libs/fuzix68000/syscall_rename.S
Library/libs/fuzix68000/syscall_rmdir.S
Library/libs/fuzix68000/syscall_sbrk.S
Library/libs/fuzix68000/syscall_setgid.S
Library/libs/fuzix68000/syscall_setgroups.S
Library/libs/fuzix68000/syscall_setpgid.S
Library/libs/fuzix68000/syscall_setrlimit.S
Library/libs/fuzix68000/syscall_setsid.S
Library/libs/fuzix68000/syscall_setuid.S
Library/libs/fuzix68000/syscall_signal.S
Library/libs/fuzix68000/syscall_socket.S
Library/libs/fuzix68000/syscall_times.S
Library/libs/fuzix68000/syscall_uadmin.S
Library/libs/fuzix68000/syscall_umask.S
Library/libs/fuzix68000/syscall_umount.S
Library/libs/fuzix68000/syscall_unlink.S
Library/libs/fuzix68000/syscall_utime.S
Library/libs/fuzix68000/syscall_waitpid.S
Library/libs/fuzix68000/syscall_write.S
Library/tools/syscall_68000.c

index b564c5c..988ac8d 100644 (file)
@@ -4,6 +4,7 @@
 
 _accept:
 .mri 1
+       move.l 4(sp),d1
        move.w #94,d0
        trap #14
        ext.l d1
index cce32fc..0f6bb04 100644 (file)
@@ -4,6 +4,7 @@
 
 _exit:
 .mri 1
+       move.l 4(sp),d1
        move.w #0,d0
        trap #14
        ext.l d1
index d22f64e..1a856bd 100644 (file)
@@ -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
index fc0210b..40fbc4d 100644 (file)
@@ -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
index b6bc3b6..b29ecc0 100644 (file)
@@ -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
index 1796d85..b41652c 100644 (file)
@@ -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
index 1c8a546..bab81d2 100644 (file)
@@ -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
index 0cd6e5a..2f44fbf 100644 (file)
@@ -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
index 1d5cd0c..b6a3320 100644 (file)
@@ -4,6 +4,7 @@
 
 _pause:
 .mri 1
+       move.l 4(sp),d1
        move.w #37,d0
        trap #14
        ext.l d1
index b4ff5c0..f6216bc 100644 (file)
@@ -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
index 57cafc4..110cc9a 100644 (file)
@@ -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
index bd4bdce..5d3131a 100644 (file)
@@ -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
index 9b8c99d..4588b24 100644 (file)
@@ -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
index e7f39e5..0b52a7b 100644 (file)
@@ -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
index e18b809..6929542 100644 (file)
@@ -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
index 51f20e2..02b57d9 100644 (file)
@@ -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
index cc33dae..9f14f9e 100644 (file)
@@ -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
index 64da197..28b74cf 100644 (file)
@@ -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
index e8d4e5c..899f7fe 100644 (file)
@@ -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
index 45e7e70..8bc1ff2 100644 (file)
@@ -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
index fffc7ca..4e44669 100644 (file)
@@ -4,6 +4,7 @@
 
 acct:
 .mri 1
+       move.l 4(sp),d1
        move.w #63,d0
        trap #14
        ext.l d1
index 9a358ef..07f853a 100644 (file)
@@ -4,6 +4,7 @@
 
 alarm:
 .mri 1
+       move.l 4(sp),d1
        move.w #38,d0
        trap #14
        ext.l d1
index eef7e93..170d09f 100644 (file)
@@ -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
index 82f757f..7217720 100644 (file)
@@ -4,6 +4,7 @@
 
 brk:
 .mri 1
+       move.l 4(sp),d1
        move.w #30,d0
        trap #14
        ext.l d1
index 96809fe..ce7e950 100644 (file)
@@ -4,6 +4,7 @@
 
 chdir:
 .mri 1
+       move.l 4(sp),d1
        move.w #10,d0
        trap #14
        ext.l d1
index d772623..ef45d3f 100644 (file)
@@ -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
index 435f1eb..44028c5 100644 (file)
@@ -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
index df193c6..ee4405a 100644 (file)
@@ -4,6 +4,7 @@
 
 chroot:
 .mri 1
+       move.l 4(sp),d1
        move.w #46,d0
        trap #14
        ext.l d1
index f57199a..ea1b702 100644 (file)
@@ -4,6 +4,7 @@
 
 close:
 .mri 1
+       move.l 4(sp),d1
        move.w #2,d0
        trap #14
        ext.l d1
index 9875d6a..57aee91 100644 (file)
@@ -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
index 4c1beb7..b3b4749 100644 (file)
@@ -4,6 +4,7 @@
 
 dup:
 .mri 1
+       move.l 4(sp),d1
        move.w #17,d0
        trap #14
        ext.l d1
index f4f938d..0bbd398 100644 (file)
@@ -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
index c5117e9..f2f4c7a 100644 (file)
@@ -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
index 59fed0d..4349b8a 100644 (file)
@@ -4,6 +4,7 @@
 
 fchdir:
 .mri 1
+       move.l 4(sp),d1
        move.w #48,d0
        trap #14
        ext.l d1
index b830508..50870e8 100644 (file)
@@ -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
index 48ff2f8..52423dc 100644 (file)
@@ -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
index 5d27862..7c1e819 100644 (file)
@@ -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
index 923da3c..2e3ad72 100644 (file)
@@ -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
index 0d144e4..09fde88 100644 (file)
@@ -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
index 915b4a6..0d25108 100644 (file)
@@ -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
index c1f4339..233b6d9 100644 (file)
@@ -4,6 +4,7 @@
 
 getsid:
 .mri 1
+       move.l 4(sp),d1
        move.w #79,d0
        trap #14
        ext.l d1
index a6661c5..5c59353 100644 (file)
@@ -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
index bfa2d72..404c8c9 100644 (file)
@@ -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
index cf623bc..47a574d 100644 (file)
@@ -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
index a69830e..1e7ba74 100644 (file)
@@ -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
index 0f530a3..1b31b75 100644 (file)
@@ -4,6 +4,7 @@
 
 memalloc:
 .mri 1
+       move.l 4(sp),d1
        move.w #64,d0
        trap #14
        ext.l d1
index a73d6c0..f83f9a6 100644 (file)
@@ -4,6 +4,7 @@
 
 memfree:
 .mri 1
+       move.l 4(sp),d1
        move.w #65,d0
        trap #14
        ext.l d1
index 2f2351f..c883528 100644 (file)
@@ -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
index 2fb1610..d18e3ad 100644 (file)
@@ -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
index d4d1963..5e8cd1b 100644 (file)
@@ -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
index aa58f5c..e38340f 100644 (file)
@@ -4,6 +4,7 @@
 
 nice:
 .mri 1
+       move.l 4(sp),d1
        move.w #58,d0
        trap #14
        ext.l d1
index 5de91bb..f9f5bb3 100644 (file)
@@ -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
index 380bebf..36270c5 100644 (file)
@@ -4,6 +4,7 @@
 
 pipe:
 .mri 1
+       move.l 4(sp),d1
        move.w #40,d0
        trap #14
        ext.l d1
index f4c97db..a81badd 100644 (file)
@@ -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
index d0e25e8..124cfab 100644 (file)
@@ -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
index 26f2da9..f1636fe 100644 (file)
@@ -4,6 +4,7 @@
 
 rmdir:
 .mri 1
+       move.l 4(sp),d1
        move.w #52,d0
        trap #14
        ext.l d1
index 7644400..36b052d 100644 (file)
@@ -4,6 +4,7 @@
 
 sbrk:
 .mri 1
+       move.l 4(sp),d1
        move.w #31,d0
        trap #14
        ext.l d1
index c34e5a4..bf19625 100644 (file)
@@ -4,6 +4,7 @@
 
 setgid:
 .mri 1
+       move.l 4(sp),d1
        move.w #26,d0
        trap #14
        ext.l d1
index 52b2ad9..35f1c44 100644 (file)
@@ -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
index 0e34209..9b9dd27 100644 (file)
@@ -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
index 1a2be73..7c48aa8 100644 (file)
@@ -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
index 67049f6..1f1f4cc 100644 (file)
@@ -4,6 +4,7 @@
 
 setsid:
 .mri 1
+       move.l 4(sp),d1
        move.w #78,d0
        trap #14
        ext.l d1
index 0f87f19..07fd25a 100644 (file)
@@ -4,6 +4,7 @@
 
 setuid:
 .mri 1
+       move.l 4(sp),d1
        move.w #25,d0
        trap #14
        ext.l d1
index 9a66090..39386ce 100644 (file)
@@ -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
index cf582df..a7d6db0 100644 (file)
@@ -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
index a949a35..920d061 100644 (file)
@@ -4,6 +4,7 @@
 
 times:
 .mri 1
+       move.l 4(sp),d1
        move.w #42,d0
        trap #14
        ext.l d1
index 151cfa2..7ac28a6 100644 (file)
@@ -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
index 0554835..7b64d5a 100644 (file)
@@ -4,6 +4,7 @@
 
 umask:
 .mri 1
+       move.l 4(sp),d1
        move.w #21,d0
        trap #14
        ext.l d1
index 5b21746..eef8848 100644 (file)
@@ -4,6 +4,7 @@
 
 umount:
 .mri 1
+       move.l 4(sp),d1
        move.w #34,d0
        trap #14
        ext.l d1
index b6ccc9f..2089236 100644 (file)
@@ -4,6 +4,7 @@
 
 unlink:
 .mri 1
+       move.l 4(sp),d1
        move.w #6,d0
        trap #14
        ext.l d1
index d13e662..6c3e380 100644 (file)
@@ -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
index ea9b487..7a49958 100644 (file)
@@ -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
index eb252f1..5fc0317 100644 (file)
@@ -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
index 877e040..2bbb4bd 100644 (file)
@@ -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);
 }