2005-04-21 16:53:53 +02:00
|
|
|
/* tty.h - Terminals */
|
|
|
|
|
|
|
|
#include <timers.h>
|
2005-09-30 15:01:34 +02:00
|
|
|
|
|
|
|
#undef lock
|
|
|
|
#undef unlock
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2006-06-20 11:02:54 +02:00
|
|
|
#define TTY_REVIVE 6767
|
|
|
|
|
2005-08-05 15:50:58 +02:00
|
|
|
/* First minor numbers for the various classes of TTY devices. */
|
2005-09-11 19:09:11 +02:00
|
|
|
#define CONS_MINOR 0
|
|
|
|
#define LOG_MINOR 15
|
|
|
|
#define RS232_MINOR 16
|
2005-11-09 16:45:48 +01:00
|
|
|
#define KBD_MINOR 127
|
|
|
|
#define KBDAUX_MINOR 126
|
|
|
|
#define VIDEO_MINOR 125
|
2005-09-11 19:09:11 +02:00
|
|
|
#define TTYPX_MINOR 128
|
|
|
|
#define PTYPX_MINOR 192
|
2005-08-05 15:50:58 +02:00
|
|
|
|
2005-08-03 13:53:36 +02:00
|
|
|
#define LINEWRAP 1 /* console.c - wrap lines at column 80 */
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
#define TTY_IN_BYTES 256 /* tty input queue size */
|
|
|
|
#define TAB_SIZE 8 /* distance between tab stops */
|
|
|
|
#define TAB_MASK 7 /* mask to compute a tab stop position */
|
|
|
|
|
|
|
|
#define ESC '\33' /* escape */
|
|
|
|
|
|
|
|
#define O_NOCTTY 00400 /* from <fcntl.h>, or cc will choke */
|
|
|
|
#define O_NONBLOCK 04000
|
|
|
|
|
|
|
|
struct tty;
|
2012-03-24 16:16:34 +01:00
|
|
|
typedef int(*devfun_t) (struct tty *tp, int try_only);
|
|
|
|
typedef void(*devfunarg_t) (struct tty *tp, int c);
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
typedef struct tty {
|
|
|
|
int tty_events; /* set when TTY should inspect this line */
|
|
|
|
int tty_index; /* index into TTY table */
|
2005-08-05 15:50:58 +02:00
|
|
|
int tty_minor; /* device minor number */
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* Input queue. Typed characters are stored here until read by a program. */
|
|
|
|
u16_t *tty_inhead; /* pointer to place where next char goes */
|
|
|
|
u16_t *tty_intail; /* pointer to next char to be given to prog */
|
|
|
|
int tty_incount; /* # chars in the input queue */
|
|
|
|
int tty_eotct; /* number of "line breaks" in input queue */
|
|
|
|
devfun_t tty_devread; /* routine to read from low level buffers */
|
|
|
|
devfun_t tty_icancel; /* cancel any device input */
|
|
|
|
int tty_min; /* minimum requested #chars in input queue */
|
|
|
|
timer_t tty_tmr; /* the timer for this tty */
|
|
|
|
|
|
|
|
/* Output section. */
|
|
|
|
devfun_t tty_devwrite; /* routine to start actual device output */
|
|
|
|
devfunarg_t tty_echo; /* routine to echo characters input */
|
|
|
|
devfun_t tty_ocancel; /* cancel any ongoing device output */
|
|
|
|
devfun_t tty_break; /* let the device send a break */
|
|
|
|
|
|
|
|
/* Terminal parameters and status. */
|
|
|
|
int tty_position; /* current position on the screen for echoing */
|
|
|
|
char tty_reprint; /* 1 when echoed input messed up, else 0 */
|
|
|
|
char tty_escaped; /* 1 when LNEXT (^V) just seen, else 0 */
|
|
|
|
char tty_inhibited; /* 1 when STOP (^S) just seen (stops output) */
|
Server/driver protocols: no longer allow third-party copies.
Before safecopies, the IO_ENDPT and DL_ENDPT message fields were needed
to know which actual process to copy data from/to, as that process may
not always be the caller. Now that we have full safecopy support, these
fields have become useless for that purpose: the owner of the grant is
*always* the caller. Allowing the caller to supply another endpoint is
in fact dangerous, because the callee may then end up using a grant
from a third party. One could call this a variant of the confused
deputy problem.
From now on, safecopy calls should always use the caller's endpoint as
grant owner. This fully obsoletes the DL_ENDPT field in the
inet/ethernet protocol. IO_ENDPT has other uses besides identifying the
grant owner though. This patch renames IO_ENDPT to USER_ENDPT, not only
because that is a more fitting name (it should never be used for I/O
after all), but also in order to intentionally break any old system
source code outside the base system. If this patch breaks your code,
fixing it is fairly simple:
- DL_ENDPT should be replaced with m_source;
- IO_ENDPT should be replaced with m_source when used for safecopies;
- IO_ENDPT should be replaced with USER_ENDPT for any other use, e.g.
when setting REP_ENDPT, matching requests in CANCEL calls, getting
DEV_SELECT flags, and retrieving of the real user process's endpoint
in DEV_OPEN.
The changes in this patch are binary backward compatible.
2011-04-11 19:35:05 +02:00
|
|
|
endpoint_t tty_pgrp; /* endpoint of controlling process */
|
2005-04-21 16:53:53 +02:00
|
|
|
char tty_openct; /* count of number of opens of this tty */
|
|
|
|
|
|
|
|
/* Information about incomplete I/O requests is stored here. */
|
2006-05-19 14:19:37 +02:00
|
|
|
int tty_inrepcode; /* reply code, TASK_REPLY or REVIVE */
|
2005-07-27 16:32:16 +02:00
|
|
|
char tty_inrevived; /* set to 1 if revive callback is pending */
|
Server/driver protocols: no longer allow third-party copies.
Before safecopies, the IO_ENDPT and DL_ENDPT message fields were needed
to know which actual process to copy data from/to, as that process may
not always be the caller. Now that we have full safecopy support, these
fields have become useless for that purpose: the owner of the grant is
*always* the caller. Allowing the caller to supply another endpoint is
in fact dangerous, because the callee may then end up using a grant
from a third party. One could call this a variant of the confused
deputy problem.
From now on, safecopy calls should always use the caller's endpoint as
grant owner. This fully obsoletes the DL_ENDPT field in the
inet/ethernet protocol. IO_ENDPT has other uses besides identifying the
grant owner though. This patch renames IO_ENDPT to USER_ENDPT, not only
because that is a more fitting name (it should never be used for I/O
after all), but also in order to intentionally break any old system
source code outside the base system. If this patch breaks your code,
fixing it is fairly simple:
- DL_ENDPT should be replaced with m_source;
- IO_ENDPT should be replaced with m_source when used for safecopies;
- IO_ENDPT should be replaced with USER_ENDPT for any other use, e.g.
when setting REP_ENDPT, matching requests in CANCEL calls, getting
DEV_SELECT flags, and retrieving of the real user process's endpoint
in DEV_OPEN.
The changes in this patch are binary backward compatible.
2011-04-11 19:35:05 +02:00
|
|
|
endpoint_t tty_incaller; /* process that made the call (usually VFS) */
|
|
|
|
endpoint_t tty_inproc; /* process that wants to read from tty */
|
2011-03-25 11:43:24 +01:00
|
|
|
cp_grant_id_t tty_ingrant; /* grant where data is to go */
|
|
|
|
vir_bytes tty_inoffset; /* offset into grant */
|
2005-04-21 16:53:53 +02:00
|
|
|
int tty_inleft; /* how many chars are still needed */
|
|
|
|
int tty_incum; /* # chars input so far */
|
2006-03-03 11:21:45 +01:00
|
|
|
int tty_outrepcode; /* reply code, TASK_REPLY or REVIVE */
|
|
|
|
int tty_outrevived; /* set to 1 if revive callback is pending */
|
Server/driver protocols: no longer allow third-party copies.
Before safecopies, the IO_ENDPT and DL_ENDPT message fields were needed
to know which actual process to copy data from/to, as that process may
not always be the caller. Now that we have full safecopy support, these
fields have become useless for that purpose: the owner of the grant is
*always* the caller. Allowing the caller to supply another endpoint is
in fact dangerous, because the callee may then end up using a grant
from a third party. One could call this a variant of the confused
deputy problem.
From now on, safecopy calls should always use the caller's endpoint as
grant owner. This fully obsoletes the DL_ENDPT field in the
inet/ethernet protocol. IO_ENDPT has other uses besides identifying the
grant owner though. This patch renames IO_ENDPT to USER_ENDPT, not only
because that is a more fitting name (it should never be used for I/O
after all), but also in order to intentionally break any old system
source code outside the base system. If this patch breaks your code,
fixing it is fairly simple:
- DL_ENDPT should be replaced with m_source;
- IO_ENDPT should be replaced with m_source when used for safecopies;
- IO_ENDPT should be replaced with USER_ENDPT for any other use, e.g.
when setting REP_ENDPT, matching requests in CANCEL calls, getting
DEV_SELECT flags, and retrieving of the real user process's endpoint
in DEV_OPEN.
The changes in this patch are binary backward compatible.
2011-04-11 19:35:05 +02:00
|
|
|
endpoint_t tty_outcaller; /* process that made the call (usually VFS) */
|
|
|
|
endpoint_t tty_outproc; /* process that wants to write to tty */
|
2011-03-25 11:43:24 +01:00
|
|
|
cp_grant_id_t tty_outgrant; /* grant where data comes from */
|
|
|
|
vir_bytes tty_outoffset; /* offset into grant */
|
2005-04-21 16:53:53 +02:00
|
|
|
int tty_outleft; /* # chars yet to be output */
|
|
|
|
int tty_outcum; /* # chars output so far */
|
Server/driver protocols: no longer allow third-party copies.
Before safecopies, the IO_ENDPT and DL_ENDPT message fields were needed
to know which actual process to copy data from/to, as that process may
not always be the caller. Now that we have full safecopy support, these
fields have become useless for that purpose: the owner of the grant is
*always* the caller. Allowing the caller to supply another endpoint is
in fact dangerous, because the callee may then end up using a grant
from a third party. One could call this a variant of the confused
deputy problem.
From now on, safecopy calls should always use the caller's endpoint as
grant owner. This fully obsoletes the DL_ENDPT field in the
inet/ethernet protocol. IO_ENDPT has other uses besides identifying the
grant owner though. This patch renames IO_ENDPT to USER_ENDPT, not only
because that is a more fitting name (it should never be used for I/O
after all), but also in order to intentionally break any old system
source code outside the base system. If this patch breaks your code,
fixing it is fairly simple:
- DL_ENDPT should be replaced with m_source;
- IO_ENDPT should be replaced with m_source when used for safecopies;
- IO_ENDPT should be replaced with USER_ENDPT for any other use, e.g.
when setting REP_ENDPT, matching requests in CANCEL calls, getting
DEV_SELECT flags, and retrieving of the real user process's endpoint
in DEV_OPEN.
The changes in this patch are binary backward compatible.
2011-04-11 19:35:05 +02:00
|
|
|
endpoint_t tty_iocaller; /* process that made the call (usually VFS) */
|
2006-06-20 11:02:54 +02:00
|
|
|
int tty_iorevived; /* set to 1 if revive callback is pending */
|
Server/driver protocols: no longer allow third-party copies.
Before safecopies, the IO_ENDPT and DL_ENDPT message fields were needed
to know which actual process to copy data from/to, as that process may
not always be the caller. Now that we have full safecopy support, these
fields have become useless for that purpose: the owner of the grant is
*always* the caller. Allowing the caller to supply another endpoint is
in fact dangerous, because the callee may then end up using a grant
from a third party. One could call this a variant of the confused
deputy problem.
From now on, safecopy calls should always use the caller's endpoint as
grant owner. This fully obsoletes the DL_ENDPT field in the
inet/ethernet protocol. IO_ENDPT has other uses besides identifying the
grant owner though. This patch renames IO_ENDPT to USER_ENDPT, not only
because that is a more fitting name (it should never be used for I/O
after all), but also in order to intentionally break any old system
source code outside the base system. If this patch breaks your code,
fixing it is fairly simple:
- DL_ENDPT should be replaced with m_source;
- IO_ENDPT should be replaced with m_source when used for safecopies;
- IO_ENDPT should be replaced with USER_ENDPT for any other use, e.g.
when setting REP_ENDPT, matching requests in CANCEL calls, getting
DEV_SELECT flags, and retrieving of the real user process's endpoint
in DEV_OPEN.
The changes in this patch are binary backward compatible.
2011-04-11 19:35:05 +02:00
|
|
|
endpoint_t tty_ioproc; /* process that wants to do an ioctl */
|
2006-06-20 11:02:54 +02:00
|
|
|
int tty_iostatus; /* result */
|
2005-04-21 16:53:53 +02:00
|
|
|
int tty_ioreq; /* ioctl request code */
|
2011-03-25 11:43:24 +01:00
|
|
|
cp_grant_id_t tty_iogrant; /* virtual address of ioctl buffer or grant */
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2005-06-17 15:37:41 +02:00
|
|
|
/* select() data */
|
|
|
|
int tty_select_ops; /* which operations are interesting */
|
Server/driver protocols: no longer allow third-party copies.
Before safecopies, the IO_ENDPT and DL_ENDPT message fields were needed
to know which actual process to copy data from/to, as that process may
not always be the caller. Now that we have full safecopy support, these
fields have become useless for that purpose: the owner of the grant is
*always* the caller. Allowing the caller to supply another endpoint is
in fact dangerous, because the callee may then end up using a grant
from a third party. One could call this a variant of the confused
deputy problem.
From now on, safecopy calls should always use the caller's endpoint as
grant owner. This fully obsoletes the DL_ENDPT field in the
inet/ethernet protocol. IO_ENDPT has other uses besides identifying the
grant owner though. This patch renames IO_ENDPT to USER_ENDPT, not only
because that is a more fitting name (it should never be used for I/O
after all), but also in order to intentionally break any old system
source code outside the base system. If this patch breaks your code,
fixing it is fairly simple:
- DL_ENDPT should be replaced with m_source;
- IO_ENDPT should be replaced with m_source when used for safecopies;
- IO_ENDPT should be replaced with USER_ENDPT for any other use, e.g.
when setting REP_ENDPT, matching requests in CANCEL calls, getting
DEV_SELECT flags, and retrieving of the real user process's endpoint
in DEV_OPEN.
The changes in this patch are binary backward compatible.
2011-04-11 19:35:05 +02:00
|
|
|
endpoint_t tty_select_proc; /* which process wants notification */
|
2005-06-17 15:37:41 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* Miscellaneous. */
|
|
|
|
devfun_t tty_ioctl; /* set line speed, etc. at the device level */
|
|
|
|
devfun_t tty_close; /* tell the device that the tty is closed */
|
|
|
|
void *tty_priv; /* pointer to per device private data */
|
|
|
|
struct termios tty_termios; /* terminal attributes */
|
|
|
|
struct winsize tty_winsize; /* window size (#lines and #columns) */
|
|
|
|
|
|
|
|
u16_t tty_inbuf[TTY_IN_BYTES];/* tty input buffer */
|
2005-06-17 15:37:41 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
} tty_t;
|
|
|
|
|
|
|
|
/* Memory allocated in tty.c, so extern here. */
|
|
|
|
extern tty_t tty_table[NR_CONS+NR_RS_LINES+NR_PTYS];
|
|
|
|
extern int ccurrent; /* currently visible console */
|
2008-12-08 17:40:29 +01:00
|
|
|
extern u32_t system_hz; /* system clock frequency */
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2005-07-29 17:22:58 +02:00
|
|
|
extern unsigned long kbd_irq_set;
|
|
|
|
extern unsigned long rs_irq_set;
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* Values for the fields. */
|
|
|
|
#define NOT_ESCAPED 0 /* previous character is not LNEXT (^V) */
|
|
|
|
#define ESCAPED 1 /* previous character was LNEXT (^V) */
|
|
|
|
#define RUNNING 0 /* no STOP (^S) has been typed to stop output */
|
|
|
|
#define STOPPED 1 /* STOP (^S) has been typed to stop output */
|
|
|
|
|
|
|
|
/* Fields and flags on characters in the input queue. */
|
|
|
|
#define IN_CHAR 0x00FF /* low 8 bits are the character itself */
|
|
|
|
#define IN_LEN 0x0F00 /* length of char if it has been echoed */
|
|
|
|
#define IN_LSHIFT 8 /* length = (c & IN_LEN) >> IN_LSHIFT */
|
|
|
|
#define IN_EOT 0x1000 /* char is a line break (^D, LF) */
|
|
|
|
#define IN_EOF 0x2000 /* char is EOF (^D), do not return to user */
|
|
|
|
#define IN_ESC 0x4000 /* escaped by LNEXT (^V), no interpretation */
|
|
|
|
|
|
|
|
/* Times and timeouts. */
|
|
|
|
#define force_timeout() ((void) (0))
|
|
|
|
|
|
|
|
/* Number of elements and limit of a buffer. */
|
|
|
|
#define buflen(buf) (sizeof(buf) / sizeof((buf)[0]))
|
|
|
|
#define bufend(buf) ((buf) + buflen(buf))
|
|
|
|
|
|
|
|
/* Memory allocated in tty.c, so extern here. */
|
2005-04-29 17:36:43 +02:00
|
|
|
extern struct machine machine; /* machine information (a.o.: pc_at, ega) */
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2005-09-30 15:01:34 +02:00
|
|
|
/* The tty outputs diagnostic messages in a circular buffer. */
|
|
|
|
extern struct kmessages kmess;
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* Function prototypes for TTY driver. */
|
|
|
|
/* tty.c */
|
2012-03-24 16:16:34 +01:00
|
|
|
void handle_events(struct tty *tp);
|
|
|
|
void sigchar(struct tty *tp, int sig, int mayflush);
|
|
|
|
void tty_task(void);
|
|
|
|
int in_process(struct tty *tp, char *buf, int count, int scode);
|
|
|
|
void out_process(struct tty *tp, char *bstart, char *bpos, char *bend,
|
|
|
|
int *icount, int *ocount);
|
|
|
|
void tty_wakeup(clock_t now);
|
2006-06-20 11:02:54 +02:00
|
|
|
#define tty_reply(c, r, p, s) tty_reply_f(__FILE__, __LINE__, (c), (r), (p), (s))
|
2012-03-24 16:16:34 +01:00
|
|
|
void tty_reply_f(char *f, int l, int code, int replyee, int proc_nr, int
|
|
|
|
status);
|
|
|
|
int select_try(struct tty *tp, int ops);
|
|
|
|
int select_retry(struct tty *tp);
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* rs232.c */
|
2012-03-24 16:16:34 +01:00
|
|
|
void rs_init(struct tty *tp);
|
|
|
|
void rs_interrupt(message *m);
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
#if (CHIP == INTEL)
|
|
|
|
/* console.c */
|
2012-03-24 16:16:34 +01:00
|
|
|
void kputc(int c);
|
|
|
|
void cons_stop(void);
|
|
|
|
void do_new_kmess(void);
|
|
|
|
void scr_init(struct tty *tp);
|
|
|
|
void toggle_scroll(void);
|
|
|
|
int con_loadfont(message *m);
|
|
|
|
void select_console(int cons_line);
|
|
|
|
void beep_x( unsigned freq, clock_t dur);
|
|
|
|
void do_video(message *m);
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* keyboard.c */
|
2012-03-24 16:16:34 +01:00
|
|
|
void kb_init(struct tty *tp);
|
|
|
|
void kb_init_once(void);
|
|
|
|
int kbd_loadmap(message *m);
|
|
|
|
void do_fkey_ctl(message *m);
|
|
|
|
void kbd_interrupt(message *m);
|
|
|
|
void do_kbd(message *m);
|
|
|
|
void do_kb_inject(message *m);
|
|
|
|
void do_kbdaux(message *m);
|
|
|
|
int kbd_status(message *m_ptr);
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* pty.c */
|
2012-03-24 16:16:34 +01:00
|
|
|
void do_pty(struct tty *tp, message *m_ptr);
|
|
|
|
void pty_init(struct tty *tp);
|
|
|
|
void select_retry_pty(struct tty *tp);
|
|
|
|
int pty_status(message *m_ptr);
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
#endif /* (CHIP == INTEL) */
|
|
|
|
|