68000: syscall path debug
authorAlan Cox <alan@linux.intel.com>
Tue, 18 Oct 2016 21:58:57 +0000 (22:58 +0100)
committerAlan Cox <alan@linux.intel.com>
Tue, 18 Oct 2016 21:58:57 +0000 (22:58 +0100)
Kernel/kernel-68000.def [new file with mode: 0644]
Kernel/lowlevel-68000.S

diff --git a/Kernel/kernel-68000.def b/Kernel/kernel-68000.def
new file mode 100644 (file)
index 0000000..f3c00c1
--- /dev/null
@@ -0,0 +1,68 @@
+/* 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
index 52f07df..98471ca 100644 (file)
@@ -414,15 +414,21 @@ irqrestore:
                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
@@ -466,22 +472,31 @@ misctrap: move.w #SIGILL,-(sp)
                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)
@@ -570,6 +585,7 @@ sig_user:   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
 
 ;