Forward debug output that originates within TTY first to the log device.
This commit is contained in:
		
							parent
							
								
									72c0158393
								
							
						
					
					
						commit
						9f8f2484dd
					
				@ -118,7 +118,7 @@ struct sequence {
 | 
				
			|||||||
FORWARD _PROTOTYPE( int cons_write, (struct tty *tp, int try)		);
 | 
					FORWARD _PROTOTYPE( int cons_write, (struct tty *tp, int try)		);
 | 
				
			||||||
FORWARD _PROTOTYPE( void cons_echo, (tty_t *tp, int c)			);
 | 
					FORWARD _PROTOTYPE( void cons_echo, (tty_t *tp, int c)			);
 | 
				
			||||||
FORWARD _PROTOTYPE( void out_char, (console_t *cons, int c)		);
 | 
					FORWARD _PROTOTYPE( void out_char, (console_t *cons, int c)		);
 | 
				
			||||||
FORWARD _PROTOTYPE( void putk, (int c)					);
 | 
					FORWARD _PROTOTYPE( void cons_putk, (int c)				);
 | 
				
			||||||
FORWARD _PROTOTYPE( void beep, (void)					);
 | 
					FORWARD _PROTOTYPE( void beep, (void)					);
 | 
				
			||||||
FORWARD _PROTOTYPE( void do_escape, (console_t *cons, int c)		);
 | 
					FORWARD _PROTOTYPE( void do_escape, (console_t *cons, int c)		);
 | 
				
			||||||
FORWARD _PROTOTYPE( void flush, (console_t *cons)			);
 | 
					FORWARD _PROTOTYPE( void flush, (console_t *cons)			);
 | 
				
			||||||
@ -876,7 +876,21 @@ tty_t *tp;
 | 
				
			|||||||
PUBLIC void kputc(c)
 | 
					PUBLIC void kputc(c)
 | 
				
			||||||
int c;
 | 
					int c;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	putk(c);
 | 
					#if 0
 | 
				
			||||||
 | 
						cons_putk(c);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					/* Accumulate a single character for a kernel message. Send a notification
 | 
				
			||||||
 | 
					 * the to output driver if an END_OF_KMESS is encountered. 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					  if (c != 0) {
 | 
				
			||||||
 | 
					      kmess.km_buf[kmess.km_next] = c;	/* put normal char in buffer */
 | 
				
			||||||
 | 
					      if (kmess.km_size < KMESS_BUF_SIZE)
 | 
				
			||||||
 | 
					          kmess.km_size += 1;		
 | 
				
			||||||
 | 
					      kmess.km_next = (kmess.km_next + 1) % KMESS_BUF_SIZE;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					      notify(LOG_PROC_NR);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*===========================================================================*
 | 
					/*===========================================================================*
 | 
				
			||||||
@ -915,11 +929,11 @@ message *m;
 | 
				
			|||||||
      bytes = ((kmess.km_next + KMESS_BUF_SIZE) - prev_next) % KMESS_BUF_SIZE;
 | 
					      bytes = ((kmess.km_next + KMESS_BUF_SIZE) - prev_next) % KMESS_BUF_SIZE;
 | 
				
			||||||
      r=prev_next;				/* start at previous old */ 
 | 
					      r=prev_next;				/* start at previous old */ 
 | 
				
			||||||
      while (bytes > 0) {			
 | 
					      while (bytes > 0) {			
 | 
				
			||||||
          putk( kmess.km_buf[(r%KMESS_BUF_SIZE)] );
 | 
					          cons_putk( kmess.km_buf[(r%KMESS_BUF_SIZE)] );
 | 
				
			||||||
          bytes --;
 | 
					          bytes --;
 | 
				
			||||||
          r ++;
 | 
					          r ++;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      putk(0);			/* terminate to flush output */
 | 
					      cons_putk(0);			/* terminate to flush output */
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Almost done, store 'next' so that we can determine what part of the
 | 
					  /* Almost done, store 'next' so that we can determine what part of the
 | 
				
			||||||
@ -948,26 +962,43 @@ message *m_ptr;			/* pointer to request message */
 | 
				
			|||||||
		result = EFAULT;
 | 
							result = EFAULT;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	putk(c);
 | 
						cons_putk(c);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  putk(0);			/* always terminate, even with EFAULT */
 | 
					  cons_putk(0);			/* always terminate, even with EFAULT */
 | 
				
			||||||
  m_ptr->m_type = result;
 | 
					  m_ptr->m_type = result;
 | 
				
			||||||
  send(m_ptr->m_source, m_ptr);
 | 
					  send(m_ptr->m_source, m_ptr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*===========================================================================*
 | 
					/*===========================================================================*
 | 
				
			||||||
 *				putk					     *
 | 
					 *				do_get_kmess				     *
 | 
				
			||||||
 *===========================================================================*/
 | 
					 *===========================================================================*/
 | 
				
			||||||
PRIVATE void putk(c)
 | 
					PUBLIC void do_get_kmess(m_ptr)
 | 
				
			||||||
 | 
					message *m_ptr;			/* pointer to request message */
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					/* Provide the log device with debug output */
 | 
				
			||||||
 | 
					  vir_bytes dst;
 | 
				
			||||||
 | 
					  int r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  dst = (vir_bytes) m_ptr->GETKM_PTR;
 | 
				
			||||||
 | 
					  r= OK;
 | 
				
			||||||
 | 
					  if (sys_vircopy(SELF, D, (vir_bytes)&kmess, m_ptr->m_source, D,
 | 
				
			||||||
 | 
						dst, sizeof(kmess)) != OK) {
 | 
				
			||||||
 | 
						r = EFAULT;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  m_ptr->m_type = r;
 | 
				
			||||||
 | 
					  send(m_ptr->m_source, m_ptr);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================*
 | 
				
			||||||
 | 
					 *				cons_putk				     *
 | 
				
			||||||
 | 
					 *===========================================================================*/
 | 
				
			||||||
 | 
					PRIVATE void cons_putk(c)
 | 
				
			||||||
int c;				/* character to print */
 | 
					int c;				/* character to print */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
/* This procedure is used by the version of printf() that is linked with
 | 
					/* This procedure is used to print a character on the console.
 | 
				
			||||||
 * the TTY driver.  The one in the library sends a message to FS, which is
 | 
					 | 
				
			||||||
 * not what is needed for printing within the TTY. This version just queues
 | 
					 | 
				
			||||||
 * the character and starts the output.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
  if (c != 0) {
 | 
					  if (c != 0) {
 | 
				
			||||||
	if (c == '\n') putk('\r');
 | 
						if (c == '\n') cons_putk('\r');
 | 
				
			||||||
	out_char(&cons_table[0], (int) c);
 | 
						out_char(&cons_table[0], (int) c);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
	flush(&cons_table[0]);
 | 
						flush(&cons_table[0]);
 | 
				
			||||||
 | 
				
			|||||||
@ -101,6 +101,8 @@ unsigned long rs_irq_set = 0;
 | 
				
			|||||||
#define do_pty(tp, mp)	((void) 0)
 | 
					#define do_pty(tp, mp)	((void) 0)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct kmessages kmess;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FORWARD _PROTOTYPE( void tty_timed_out, (timer_t *tp)			);
 | 
					FORWARD _PROTOTYPE( void tty_timed_out, (timer_t *tp)			);
 | 
				
			||||||
FORWARD _PROTOTYPE( void expire_timers, (void)				);
 | 
					FORWARD _PROTOTYPE( void expire_timers, (void)				);
 | 
				
			||||||
FORWARD _PROTOTYPE( void settimer, (tty_t *tty_ptr, int enable)		);
 | 
					FORWARD _PROTOTYPE( void settimer, (tty_t *tty_ptr, int enable)		);
 | 
				
			||||||
@ -160,7 +162,7 @@ PUBLIC void main(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  message tty_mess;		/* buffer for all incoming messages */
 | 
					  message tty_mess;		/* buffer for all incoming messages */
 | 
				
			||||||
  unsigned line;
 | 
					  unsigned line;
 | 
				
			||||||
  int s;
 | 
					  int r, s;
 | 
				
			||||||
  char *types[] = {"task","driver","server", "user"};
 | 
					  char *types[] = {"task","driver","server", "user"};
 | 
				
			||||||
  register struct proc *rp;
 | 
					  register struct proc *rp;
 | 
				
			||||||
  register tty_t *tp;
 | 
					  register tty_t *tp;
 | 
				
			||||||
@ -186,7 +188,9 @@ PUBLIC void main(void)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Get a request message. */
 | 
						/* Get a request message. */
 | 
				
			||||||
	receive(ANY, &tty_mess);
 | 
						r= receive(ANY, &tty_mess);
 | 
				
			||||||
 | 
						if (r != 0)
 | 
				
			||||||
 | 
							panic("TTY", "receive failed with %d", r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* First handle all kernel notification types that the TTY supports. 
 | 
						/* First handle all kernel notification types that the TTY supports. 
 | 
				
			||||||
	 *  - An alarm went off, expire all timers and handle the events. 
 | 
						 *  - An alarm went off, expire all timers and handle the events. 
 | 
				
			||||||
@ -232,6 +236,9 @@ PUBLIC void main(void)
 | 
				
			|||||||
	case DIAGNOSTICS: 		/* a server wants to print some */
 | 
						case DIAGNOSTICS: 		/* a server wants to print some */
 | 
				
			||||||
		do_diagnostics(&tty_mess);
 | 
							do_diagnostics(&tty_mess);
 | 
				
			||||||
		continue;
 | 
							continue;
 | 
				
			||||||
 | 
						case GET_KMESS:
 | 
				
			||||||
 | 
							do_get_kmess(&tty_mess);
 | 
				
			||||||
 | 
							continue;
 | 
				
			||||||
	case FKEY_CONTROL:		/* (un)register a fkey observer */
 | 
						case FKEY_CONTROL:		/* (un)register a fkey observer */
 | 
				
			||||||
		do_fkey_ctl(&tty_mess);
 | 
							do_fkey_ctl(&tty_mess);
 | 
				
			||||||
		continue;
 | 
							continue;
 | 
				
			||||||
@ -270,8 +277,11 @@ PUBLIC void main(void)
 | 
				
			|||||||
	if (tp == NULL || ! tty_active(tp)) {
 | 
						if (tp == NULL || ! tty_active(tp)) {
 | 
				
			||||||
		printf("Warning, TTY got illegal request %d from %d\n",
 | 
							printf("Warning, TTY got illegal request %d from %d\n",
 | 
				
			||||||
			tty_mess.m_type, tty_mess.m_source);
 | 
								tty_mess.m_type, tty_mess.m_source);
 | 
				
			||||||
 | 
							if (tty_mess.m_source != LOG_PROC_NR)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
			tty_reply(TASK_REPLY, tty_mess.m_source,
 | 
								tty_reply(TASK_REPLY, tty_mess.m_source,
 | 
				
			||||||
						tty_mess.PROC_NR, ENXIO);
 | 
											tty_mess.PROC_NR, ENXIO);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		continue;
 | 
							continue;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,11 @@
 | 
				
			|||||||
/*	tty.h - Terminals	*/
 | 
					/*	tty.h - Terminals	*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <timers.h>
 | 
					#include <timers.h>
 | 
				
			||||||
 | 
					#include "../../kernel/const.h"
 | 
				
			||||||
 | 
					#include "../../kernel/type.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef lock
 | 
				
			||||||
 | 
					#undef unlock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* First minor numbers for the various classes of TTY devices. */
 | 
					/* First minor numbers for the various classes of TTY devices. */
 | 
				
			||||||
#define CONS_MINOR	   0
 | 
					#define CONS_MINOR	   0
 | 
				
			||||||
@ -124,6 +129,9 @@ extern clock_t tty_next_timeout;	/* next TTY timeout */
 | 
				
			|||||||
/* Memory allocated in tty.c, so extern here. */
 | 
					/* Memory allocated in tty.c, so extern here. */
 | 
				
			||||||
extern struct machine machine;	/* machine information (a.o.: pc_at, ega) */
 | 
					extern struct machine machine;	/* machine information (a.o.: pc_at, ega) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The tty outputs diagnostic messages in a circular buffer. */
 | 
				
			||||||
 | 
					extern struct kmessages kmess;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Function prototypes for TTY driver. */
 | 
					/* Function prototypes for TTY driver. */
 | 
				
			||||||
/* tty.c */
 | 
					/* tty.c */
 | 
				
			||||||
_PROTOTYPE( void handle_events, (struct tty *tp)			);
 | 
					_PROTOTYPE( void handle_events, (struct tty *tp)			);
 | 
				
			||||||
@ -149,6 +157,7 @@ _PROTOTYPE( void kputc, (int c)						);
 | 
				
			|||||||
_PROTOTYPE( void cons_stop, (void)					);
 | 
					_PROTOTYPE( void cons_stop, (void)					);
 | 
				
			||||||
_PROTOTYPE( void do_new_kmess, (message *m)				);
 | 
					_PROTOTYPE( void do_new_kmess, (message *m)				);
 | 
				
			||||||
_PROTOTYPE( void do_diagnostics, (message *m)				);
 | 
					_PROTOTYPE( void do_diagnostics, (message *m)				);
 | 
				
			||||||
 | 
					_PROTOTYPE( void do_get_kmess, (message *m)				);
 | 
				
			||||||
_PROTOTYPE( void scr_init, (struct tty *tp)				);
 | 
					_PROTOTYPE( void scr_init, (struct tty *tp)				);
 | 
				
			||||||
_PROTOTYPE( void toggle_scroll, (void)					);
 | 
					_PROTOTYPE( void toggle_scroll, (void)					);
 | 
				
			||||||
_PROTOTYPE( int con_loadfont, (message *m)				);
 | 
					_PROTOTYPE( int con_loadfont, (message *m)				);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user