--- /dev/null
+/* Keep these in sync with struct u_data!! */
+
+#define U_DATA__U_PTAB 0
+#define U_DATA__U_PAGE 4
+#define U_DATA__U_PAGE2 6
+#define U_DATA__U_INSYS 8
+#define U_DATA__U_CALLNO 9
+#define U_DATA__U_SYSCALL_SP 10
+#define U_DATA__U_RETVAL 14
+#define U_DATA__U_ERROR 18
+#define U_DATA__U_SP 20
+#define U_DATA__U_ININTERRUPT 24
+#define U_DATA__U_CURSIG 25
+#define U_DATA__U_ARGN 26
+#define U_DATA__U_ARGN1 30
+#define U_DATA__U_ARGN2 34
+#define U_DATA__U_ARGN3 38
+#define U_DATA__U_ISP 42
+#define U_DATA__U_SIGVEC 46
+
+#define P_TAB__P_STATUS_OFFSET 0
+#define P_TAB__P_TTY_OFFSET 1
+#define P_TAB__P_PID_OFFSET 2
+#define P_TAB__P_PAGE_OFFSET 20
+#define P_TAB__P_UDATA_OFFSET 24
+
+#define P_RUNNING 1
+#define P_READY 2
+#define P_DEFER 3
+
+#define OS_BANK 0
+
+#define EAGAIN 11
+
+#define SIGHUP 1
+#define SIGINT 2
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+#define SIGIOT 6
+#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 SIGIO
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED 31
move.w d0,sr
rts
+;
+; Put the supervisor stack back as if we had nothing on it (we just
+; longjmp'd out of the syscall path really). Then we push an exception
+; frame, clear the registers and rte. We need to rte as we want to
+; switch modes as we switch address so that we don't fault if there
+; is memory protection.
+;
doexec:
- ;
- ; FIXME: we need to reset sp (we effectively longjmp
- ; in supervisor space), then push the values. If we
- ; don't then the supervisor stack will go awry
- ;
- move.l (sp)+,a0 ; throw the return address
+ move.l 4(sp),a1 ; go address
+ lea.l 1024(a5),a7 ; reset the supervisor stack
+
+ and.w #$F8FF,sr ; IRQ on
+ move.l a1,-(sp) ; return address
clr.w -(sp) ; set up the status register
- move.l U_DATA__U_ISP,a0
+ move.l U_DATA__U_ISP(a5),a0
move.l a0,usp ; set the user stack
moveq #0,d0 ; wipe the registers
move.l d0,d1
bra sig_or_die
trap15: move.w #SIGTRAP,-(sp) ; by convention
bra sig_or_die
-trap14: movem.l a2-a6/d2-d7,-(sp)
+
+ ; This path set wants optimising badly
+trap14: movem.l a0-a6/d2-d7,-(sp)
+ move.l udata_shadow,a5
+ move.b d0,U_DATA__U_CALLNO(a5)
+ move.l usp,a0
+ move.l a0,U_DATA__U_SYSCALL_SP(a5)
+ move.l 4(a0),U_DATA__U_ARGN(a5)
+ move.l 8(a0),U_DATA__U_ARGN1(a5)
+ move.l 12(a0),U_DATA__U_ARGN2(a5)
+ move.l 16(a0),U_DATA__U_ARGN3(a5)
move.b #1,d0
move.b d0,kernel_flag
; FIXME: EI per platform really
and.w #$F8FF,sr
- move.l udata_shadow,a5
bsr unix_syscall
; FIXME: signal handling in the C code or not ?
or.w #$0700,sr
- move.w U_DATA__U_ERROR,d1
+ move.w U_DATA__U_ERROR(a5),d1
bne sysc_err
- move.w U_DATA__U_RETVAL,d0
- movem.l (sp)+,a2-a6/d2-d7
+ move.l U_DATA__U_RETVAL(a5),d0
+ movem.l (sp)+,a0-a6/d2-d7
rte
-sysc_err: move.w #-1,d0
- movem.l (sp)+,a2-a6/d2-d7
+sysc_err: moveq #-1,d0
+ movem.l (sp)+,a0-a6/d2-d7
rte
spurious: movem.l a0-a6/d0-d7,-(sp)
adda #4,sp
; Do signal processing bit here if we return
movem.l (sp)+,a0-a6/d0-d7
+ adda #4,sp
rte
;