From: Jorrit Herder Date: Fri, 27 May 2005 13:57:00 +0000 (+0000) Subject: Created ECHO system call for testing purposes. X-Git-Tag: v3.1.0~809 X-Git-Url: http://zhaoyanbai.com/repos/tz-link.htm?a=commitdiff_plain;h=8d9c0886cd5bbcc3b39cb5ea0932643777a25ee9;p=minix.git Created ECHO system call for testing purposes. Furthermore, a quick way to get one's own process number. --- diff --git a/drivers/tty/tty.c b/drivers/tty/tty.c index 7c74fe5fb..9968e0dff 100644 --- a/drivers/tty/tty.c +++ b/drivers/tty/tty.c @@ -60,7 +60,6 @@ #include #include #include -#include #if (CHIP == INTEL) #include #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); diff --git a/include/minix/com.h b/include/minix/com.h index 628f3642d..6121c516d 100755 --- a/include/minix/com.h +++ b/include/minix/com.h @@ -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' */ diff --git a/include/minix/ipc.h b/include/minix/ipc.h index 02349fce1..aa6558c08 100644 --- a/include/minix/ipc.h +++ b/include/minix/ipc.h @@ -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) ); diff --git a/kernel/Makefile b/kernel/Makefile index dc42bbcd6..8212b972a 100755 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -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 index 000000000..cc223457e --- /dev/null +++ b/kernel/ipc.h @@ -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 */ + diff --git a/kernel/proc.c b/kernel/proc.c index 2abe067cd..8f0051d6b 100755 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -29,6 +29,7 @@ #include #include #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 */ } diff --git a/lib/i386/rts/_ipc.s b/lib/i386/rts/_ipc.s index b82fe0c4b..ffdb4f395 100755 --- a/lib/i386/rts/_ipc.s +++ b/lib/i386/rts/_ipc.s @@ -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 +