From: Alan Cox Date: Tue, 18 Oct 2016 21:58:57 +0000 (+0100) Subject: 68000: syscall path debug X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=e079a60640e796dff2e459d568c00be89cbf7630;p=FUZIX.git 68000: syscall path debug --- diff --git a/Kernel/kernel-68000.def b/Kernel/kernel-68000.def new file mode 100644 index 00000000..f3c00c19 --- /dev/null +++ b/Kernel/kernel-68000.def @@ -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 diff --git a/Kernel/lowlevel-68000.S b/Kernel/lowlevel-68000.S index 52f07df7..98471ca1 100644 --- a/Kernel/lowlevel-68000.S +++ b/Kernel/lowlevel-68000.S @@ -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 ;