Created ECHO system call for testing purposes.
Furthermore, a quick way to get one's own process number.
This commit is contained in:
		
							parent
							
								
									07d582872f
								
							
						
					
					
						commit
						8d9c0886cd
					
				@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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' */
 | 
			
		||||
 | 
			
		||||
@ -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)			);
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								kernel/ipc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								kernel/ipc.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
 | 
			
		||||
@ -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 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user