]> Zhao Yanbai Git Server - minix.git/commitdiff
Forward debug output that originates within TTY first to the log device.
authorPhilip Homburg <philip@cs.vu.nl>
Fri, 30 Sep 2005 13:01:34 +0000 (13:01 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Fri, 30 Sep 2005 13:01:34 +0000 (13:01 +0000)
drivers/tty/console.c
drivers/tty/tty.c
drivers/tty/tty.h

index 1f6496a6ecf1bfa9f5c7c979b6f8dca9633d19b1..0a752870d9cd7088eceafad4508b736144660159 100644 (file)
@@ -118,7 +118,7 @@ struct sequence {
 FORWARD _PROTOTYPE( int cons_write, (struct tty *tp, int try)          );
 FORWARD _PROTOTYPE( void cons_echo, (tty_t *tp, 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 do_escape, (console_t *cons, int c)           );
 FORWARD _PROTOTYPE( void flush, (console_t *cons)                      );
@@ -876,7 +876,21 @@ tty_t *tp;
 PUBLIC void kputc(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;
       r=prev_next;                             /* start at previous old */ 
       while (bytes > 0) {                      
-          putk( kmess.km_buf[(r%KMESS_BUF_SIZE)] );
+          cons_putk( kmess.km_buf[(r%KMESS_BUF_SIZE)] );
           bytes --;
           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
@@ -948,26 +962,43 @@ message *m_ptr;                   /* pointer to request message */
                result = EFAULT;
                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;
   send(m_ptr->m_source, m_ptr);
 }
 
 /*===========================================================================*
- *                             putk                                         *
+ *                             do_get_kmess                                 *
+ *===========================================================================*/
+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 putk(c)
+PRIVATE void cons_putk(c)
 int c;                         /* character to print */
 {
-/* This procedure is used by the version of printf() that is linked with
- * 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.
+/* This procedure is used to print a character on the console.
  */
   if (c != 0) {
-       if (c == '\n') putk('\r');
+       if (c == '\n') cons_putk('\r');
        out_char(&cons_table[0], (int) c);
   } else {
        flush(&cons_table[0]);
index bf9fc56b26162ab5930fbb596ed2a58ebffca2c3..ea3cdb9a108ff43c31624f4978a3ae3cba03e2f8 100644 (file)
@@ -101,6 +101,8 @@ unsigned long rs_irq_set = 0;
 #define do_pty(tp, mp) ((void) 0)
 #endif
 
+struct kmessages kmess;
+
 FORWARD _PROTOTYPE( void tty_timed_out, (timer_t *tp)                  );
 FORWARD _PROTOTYPE( void expire_timers, (void)                         );
 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 */
   unsigned line;
-  int s;
+  int r, s;
   char *types[] = {"task","driver","server", "user"};
   register struct proc *rp;
   register tty_t *tp;
@@ -186,7 +188,9 @@ PUBLIC void main(void)
        }
 
        /* 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. 
         *  - 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 */
                do_diagnostics(&tty_mess);
                continue;
+       case GET_KMESS:
+               do_get_kmess(&tty_mess);
+               continue;
        case FKEY_CONTROL:              /* (un)register a fkey observer */
                do_fkey_ctl(&tty_mess);
                continue;
@@ -270,8 +277,11 @@ PUBLIC void main(void)
        if (tp == NULL || ! tty_active(tp)) {
                printf("Warning, TTY got illegal request %d from %d\n",
                        tty_mess.m_type, tty_mess.m_source);
-               tty_reply(TASK_REPLY, tty_mess.m_source,
+               if (tty_mess.m_source != LOG_PROC_NR)
+               {
+                       tty_reply(TASK_REPLY, tty_mess.m_source,
                                                tty_mess.PROC_NR, ENXIO);
+               }
                continue;
        }
 
index f26ca22b27568273f9c6af5eea8965d5299f01c7..298ffbc2ff8db363b5ce75b33c1fd62aa5ff258d 100644 (file)
@@ -1,6 +1,11 @@
 /*     tty.h - Terminals       */
 
 #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. */
 #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. */
 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. */
 /* tty.c */
 _PROTOTYPE( void handle_events, (struct tty *tp)                       );
@@ -149,6 +157,7 @@ _PROTOTYPE( void kputc, (int c)                                             );
 _PROTOTYPE( void cons_stop, (void)                                     );
 _PROTOTYPE( void do_new_kmess, (message *m)                            );
 _PROTOTYPE( void do_diagnostics, (message *m)                          );
+_PROTOTYPE( void do_get_kmess, (message *m)                            );
 _PROTOTYPE( void scr_init, (struct tty *tp)                            );
 _PROTOTYPE( void toggle_scroll, (void)                                 );
 _PROTOTYPE( int con_loadfont, (message *m)                             );