Forward debug output that originates within TTY first to the log device.
This commit is contained in:
parent
72c0158393
commit
9f8f2484dd
3 changed files with 66 additions and 16 deletions
|
@ -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);
|
||||||
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);
|
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…
Reference in a new issue