]> Zhao Yanbai Git Server - minix.git/commitdiff
Created ECHO system call for testing purposes.
authorJorrit Herder <jnherder@minix3.org>
Fri, 27 May 2005 13:57:00 +0000 (13:57 +0000)
committerJorrit Herder <jnherder@minix3.org>
Fri, 27 May 2005 13:57:00 +0000 (13:57 +0000)
Furthermore, a quick way to get one's own process number.

drivers/tty/tty.c
include/minix/com.h
include/minix/ipc.h
kernel/Makefile
kernel/ipc.h [new file with mode: 0644]
kernel/proc.c
lib/i386/rts/_ipc.s

index 7c74fe5fb9f8d5b8a422acfad763d1f281c489f2..9968e0dff2fd68f471814860faff1dee53211d0a 100644 (file)
@@ -60,7 +60,6 @@
 #include <sys/ioc_tty.h>
 #include <signal.h>
 #include <minix/callnr.h>
-#include <minix/com.h>
 #if (CHIP == INTEL)
 #include <minix/keymap.h>
 #endif
@@ -107,7 +106,7 @@ FORWARD _PROTOTYPE( void do_close, (tty_t *tp, message *m_ptr)              );
 FORWARD _PROTOTYPE( void do_read, (tty_t *tp, message *m_ptr)          );
 FORWARD _PROTOTYPE( void do_write, (tty_t *tp, message *m_ptr)         );
 FORWARD _PROTOTYPE( void in_transfer, (tty_t *tp)                      );
-FORWARD _PROTOTYPE( int echo, (tty_t *tp, int ch)                      );
+FORWARD _PROTOTYPE( int tty_echo, (tty_t *tp, int ch)                  );
 FORWARD _PROTOTYPE( void rawecho, (tty_t *tp, int ch)                  );
 FORWARD _PROTOTYPE( int back_over, (tty_t *tp)                         );
 FORWARD _PROTOTYPE( void reprint, (tty_t *tp)                          );
@@ -883,7 +882,7 @@ int count;                  /* number of input characters */
                if (ch == tp->tty_termios.c_cc[VERASE]) {
                        (void) back_over(tp);
                        if (!(tp->tty_termios.c_lflag & ECHOE)) {
-                               (void) echo(tp, ch);
+                               (void) tty_echo(tp, ch);
                        }
                        continue;
                }
@@ -892,7 +891,7 @@ int count;                  /* number of input characters */
                if (ch == tp->tty_termios.c_cc[VKILL]) {
                        while (back_over(tp)) {}
                        if (!(tp->tty_termios.c_lflag & ECHOE)) {
-                               (void) echo(tp, ch);
+                               (void) tty_echo(tp, ch);
                                if (tp->tty_termios.c_lflag & ECHOK)
                                        rawecho(tp, '\n');
                        }
@@ -938,7 +937,7 @@ int count;                  /* number of input characters */
                        sig = SIGINT;
                        if (ch == tp->tty_termios.c_cc[VQUIT]) sig = SIGQUIT;
                        sigchar(tp, sig);
-                       (void) echo(tp, ch);
+                       (void) tty_echo(tp, ch);
                        continue;
                }
        }
@@ -963,7 +962,7 @@ int count;                  /* number of input characters */
        }
 
        /* Perform the intricate function of echoing. */
-       if (tp->tty_termios.c_lflag & (ECHO|ECHONL)) ch = echo(tp, ch);
+       if (tp->tty_termios.c_lflag & (ECHO|ECHONL)) ch = tty_echo(tp, ch);
 
        /* Save the character in the input queue. */
        *tp->tty_inhead++ = ch;
@@ -982,7 +981,7 @@ int count;                  /* number of input characters */
 /*===========================================================================*
  *                             echo                                         *
  *===========================================================================*/
-PRIVATE int echo(tp, ch)
+PRIVATE int tty_echo(tp, ch)
 register tty_t *tp;            /* terminal on which to echo */
 register int ch;               /* pointer to character to echo */
 {
@@ -1111,14 +1110,14 @@ register tty_t *tp;             /* pointer to tty struct */
   if (count == tp->tty_incount) return;                /* no reason to reprint */
 
   /* Show REPRINT (^R) and move to a new line. */
-  (void) echo(tp, tp->tty_termios.c_cc[VREPRINT] | IN_ESC);
+  (void) tty_echo(tp, tp->tty_termios.c_cc[VREPRINT] | IN_ESC);
   rawecho(tp, '\r');
   rawecho(tp, '\n');
 
   /* Reprint from the last break onwards. */
   do {
        if (head == bufend(tp->tty_inbuf)) head = tp->tty_inbuf;
-       *head = echo(tp, *head);
+       *head = tty_echo(tp, *head);
        head++;
        count++;
   } while (count < tp->tty_incount);
index 628f3642d2cb691fe2be8e72c3d4c15e62992706..6121c516dd37362fc9250311d768ecef407bdcc6 100755 (executable)
@@ -1,23 +1,7 @@
 /*===========================================================================*
- *                 System calls and magic process numbers                   *
+ *                             Magic process numbers                        *
  *===========================================================================*/
 
-/* Masks and flags for system calls. */
-#define SYSCALL_FUNC   0x0F    /* mask for system call function */
-#define SYSCALL_FLAGS   0xF0    /* mask for system call flags */
-#define NON_BLOCKING    0x10   /* prevent blocking, return error */
-#define FRESH_ANSWER    0x20   /* ignore pending notifications as answer */
-                               /* default behaviour for SENDREC calls */
-
-/* System calls (numbers passed when trapping to the kernel) */
-#define SEND            1      /* function code for sending messages */
-#define RECEIVE                 2      /* function code for receiving messages */
-#define SENDREC                 3      /* function code for SEND + RECEIVE */
-#define NOTIFY          4      /* function code for notifications */
-#define NB_SEND        (SEND | NON_BLOCKING)     /* non-blocking SEND */
-#define NB_RECEIVE     (RECEIVE | NON_BLOCKING)  /* non-blocking RECEIVE */
-
-/* Magic, invalid process numbers. */
 #define ANY            0x7ace  /* used to indicate 'any process' */
 #define NONE           0x6ace  /* used to indicate 'no process at all' */
 #define SELF           0x8ace  /* used to indicate 'own process' */
index 02349fce133e6ec115654d7740bf8b20cea30d13..aa6558c08b511f530573763df7f0eddf4911d251 100644 (file)
@@ -91,6 +91,7 @@ typedef struct {
  *==========================================================================*/ 
 
 /* Hide names to avoid name space pollution. */
+#define echo           _echo
 #define sendrec                _sendrec
 #define receive                _receive
 #define send           _send
@@ -98,6 +99,7 @@ typedef struct {
 #define nb_receive     _nb_receive
 #define nb_send                _nb_send
 
+_PROTOTYPE( int echo, (message *m_ptr)                                 );
 _PROTOTYPE( int sendrec, (int src_dest, message *m_ptr)                        );
 _PROTOTYPE( int receive, (int src, message *m_ptr)                     );
 _PROTOTYPE( int send, (int dest, message *m_ptr)                       );
index dc42bbcd6460acf186276fa141ff37b1346ae12e..8212b972a2c8f0da589ef28a6e0523ad558a2c58 100755 (executable)
@@ -103,6 +103,7 @@ proc.o:     $a
 proc.o:        $h/callnr.h
 proc.o:        $h/com.h
 proc.o:        proc.h
+proc.o:        ipc.h
 proc.o:        sendmask.h
 
 protect.o:     $a
diff --git a/kernel/ipc.h b/kernel/ipc.h
new file mode 100644 (file)
index 0000000..cc22345
--- /dev/null
@@ -0,0 +1,14 @@
+/* Masks and flags for system calls. */
+#define SYSCALL_FUNC   0x0F    /* mask for system call function */
+#define SYSCALL_FLAGS   0xF0    /* mask for system call flags */
+#define NON_BLOCKING    0x10   /* prevent blocking, return error */
+#define FRESH_ANSWER    0x20   /* ignore pending notifications as answer */
+                               /* (default behaviour for SENDREC calls) */
+
+/* System calls (numbers passed when trapping to the kernel) */
+#define ECHO            0      /* function code for echoing messages */
+#define SEND            1      /* function code for sending messages */
+#define RECEIVE                 2      /* function code for receiving messages */
+#define SENDREC                 3      /* function code for SEND + RECEIVE */
+#define NOTIFY          4      /* function code for notifications */
+
index 2abe067cdea5e6c94e1012737bd6c196219a1db5..8f0051d6b2f11e6a2b2d6b5b115e4c194d952bf8 100755 (executable)
@@ -29,6 +29,7 @@
 #include <minix/callnr.h>
 #include <minix/com.h>
 #include "proc.h"
+#include "ipc.h"
 #include "sendmask.h"
 
 
@@ -99,7 +100,7 @@ message *m_ptr;                      /* pointer to message in the caller's space */
        return(ECALLDENIED);                    /* SENDREC was required */
   
   /* Verify that requested source and/ or destination is a valid process. */
-  if (! isoksrc_dst(src_dst)) 
+  if (! isoksrc_dst(src_dst) && function != ECHO
        return(EBADSRCDST);
 
   /* Check validity of message pointer. */
@@ -153,6 +154,11 @@ message *m_ptr;                    /* pointer to message in the caller's space */
   case NOTIFY:
       result = mini_notify(caller_ptr, src_dst, m_ptr);
       break;
+  case ECHO:
+      kprintf("Echo message from process %s\n", proc_nr(caller_ptr));
+      CopyMess(caller_ptr->p_nr, caller_ptr, m_ptr, caller_ptr, m_ptr);
+      result = OK;
+      break;
   default:
       result = EBADCALL;                       /* illegal system call */
   }
index b82fe0c4b90b495fa1f71e9ba23b7f5584aee74b..ffdb4f395bc1708781c5620aaf42cd7426b3caf4 100755 (executable)
@@ -1,30 +1,31 @@
 .sect .text; .sect .rom; .sect .data; .sect .bss
-.define __send, __nb_send, __receive, __nb_receive, __sendrec, __notify
+.define __echo, __send, __nb_send, __receive, __nb_receive, __sendrec, __notify
 
-! See ../h/com.h for C definitions
+! See src/kernel/ipc.h for C definitions
+ECHO = 0
 SEND = 1
 RECEIVE = 2
 BOTH = 3
 NOTIFY = 4
 NB_SEND = 1 + 16               ! SEND | 0xF0
 NB_RECEIVE = 2 + 16            ! RECEIVE | 0xF0
-SYSVEC = 33
+SYSVEC = 33                    ! trap to kernel 
 
-SRCDEST = 8
-MESSAGE = 12
+SRC_DST = 8                    ! source/ destination process 
+ECHO_MESS = 8                  ! doesn't have SRC_DST 
+MESSAGE = 12                   ! message pointer 
 
 !*========================================================================*
-!                           _send and _receive                            *
+!                           IPC assembly routines                        *
 !*========================================================================*
-! _send(), _nb_send(), _receive(), _nb_receive(), and _sendrec() all 
-! save ebp, but destroy eax and ecx.
-.define __send, __nb_send, __receive, __nb_receive, __sendrec, __notify
+! all message passing routines save ebp, but destroy eax and ecx.
+.define __echo, __send, __nb_send, __receive, __nb_receive, __sendrec, __notify
 .sect .text
 __send:
        push    ebp
        mov     ebp, esp
        push    ebx
-       mov     eax, SRCDEST(ebp)       ! eax = dest-src
+       mov     eax, SRC_DST(ebp)       ! eax = dest-src
        mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
        mov     ecx, SEND               ! _send(dest, ptr)
        int     SYSVEC                  ! trap to the kernel
@@ -36,7 +37,7 @@ __nb_send:
        push    ebp
        mov     ebp, esp
        push    ebx
-       mov     eax, SRCDEST(ebp)       ! eax = dest-src
+       mov     eax, SRC_DST(ebp)       ! eax = dest-src
        mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
        mov     ecx, NB_SEND            ! _nb_send(dest, ptr)
        int     SYSVEC                  ! trap to the kernel
@@ -48,7 +49,7 @@ __receive:
        push    ebp
        mov     ebp, esp
        push    ebx
-       mov     eax, SRCDEST(ebp)       ! eax = dest-src
+       mov     eax, SRC_DST(ebp)       ! eax = dest-src
        mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
        mov     ecx, RECEIVE            ! _receive(src, ptr)
        int     SYSVEC                  ! trap to the kernel
@@ -60,7 +61,7 @@ __nb_receive:
        push    ebp
        mov     ebp, esp
        push    ebx
-       mov     eax, SRCDEST(ebp)       ! eax = dest-src
+       mov     eax, SRC_DST(ebp)       ! eax = dest-src
        mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
        mov     ecx, NB_RECEIVE         ! _nb_receive(src, ptr)
        int     SYSVEC                  ! trap to the kernel
@@ -72,7 +73,7 @@ __sendrec:
        push    ebp
        mov     ebp, esp
        push    ebx
-       mov     eax, SRCDEST(ebp)       ! eax = dest-src
+       mov     eax, SRC_DST(ebp)       ! eax = dest-src
        mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
        mov     ecx, BOTH               ! _sendrec(srcdest, ptr)
        int     SYSVEC                  ! trap to the kernel
@@ -84,7 +85,7 @@ __notify:
        push    ebp
        mov     ebp, esp
        push    ebx
-       mov     eax, SRCDEST(ebp)       ! eax = dest-src
+       mov     eax, SRC_DST(ebp)       ! eax = dest-src
        mov     ebx, MESSAGE(ebp)       ! ebx = message pointer
        mov     ecx, NOTIFY             ! _notify(srcdest, ptr)
        int     SYSVEC                  ! trap to the kernel
@@ -92,3 +93,14 @@ __notify:
        pop     ebp
        ret
 
+__echo:
+       push    ebp
+       mov     ebp, esp
+       push    ebx
+       mov     ebx, ECHO_MESS(ebp)     ! ebx = message pointer
+       mov     ecx, ECHO               ! _echo(srcdest, ptr)
+       int     SYSVEC                  ! trap to the kernel
+       pop     ebx
+       pop     ebp
+       ret
+