#include <sys/tty.h>
#include <sys/proc.h>
#include <sys/uio.h>
-#include <dev/ppc/cons.h>
+#include <machine/cons.h>
-struct tty cons;
-struct tty *constty; /* current console device */
+struct tty *constty; /* current console device */
+
+/*
+ * The km driver supplied the default console device for the systems
+ * (usually a raw frame buffer driver, but potentially a serial driver).
+ */
+extern struct tty *km_tty[1];
+
+static dev_t
+cndev(void)
+{
+ if (constty)
+ return constty->t_dev;
+ else
+ return km_tty[0]->t_dev;
+}
/*ARGSUSED*/
int
consopen(__unused dev_t dev, int flag, int devtype, struct proc *pp)
{
- dev_t device;
- boolean_t funnel_state;
- int error;
-
- funnel_state = thread_funnel_set(kernel_flock, TRUE);
-
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
- error = (*cdevsw[major(device)].d_open)(device, flag, devtype, pp);
- thread_funnel_set(kernel_flock, funnel_state);
-
- return(error);
+ dev = cndev();
+ return ((*cdevsw[major(dev)].d_open)(dev, flag, devtype, pp));
}
+
/*ARGSUSED*/
int
consclose(__unused dev_t dev, int flag, int mode, struct proc *pp)
{
- dev_t device;
- boolean_t funnel_state;
- int error;
-
- funnel_state = thread_funnel_set(kernel_flock, TRUE);
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
- error = (*cdevsw[major(device)].d_close)(device, flag, mode, pp);
- thread_funnel_set(kernel_flock, funnel_state);
-
- return(error);
-
-
+ dev = cndev();
+ return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, pp));
}
+
/*ARGSUSED*/
int
consread(__unused dev_t dev, struct uio *uio, int ioflag)
{
- dev_t device;
- boolean_t funnel_state;
- int error;
-
- funnel_state = thread_funnel_set(kernel_flock, TRUE);
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
- error = (*cdevsw[major(device)].d_read)(device, uio, ioflag);
- thread_funnel_set(kernel_flock, funnel_state);
-
- return(error);
+ dev = cndev();
+ return ((*cdevsw[major(dev)].d_read)(dev, uio, ioflag));
}
+
/*ARGSUSED*/
int
conswrite(__unused dev_t dev, struct uio *uio, int ioflag)
{
- dev_t device;
- boolean_t funnel_state;
- int error;
-
- funnel_state = thread_funnel_set(kernel_flock, TRUE);
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
- error = (*cdevsw[major(device)].d_write)(device, uio, ioflag);
- thread_funnel_set(kernel_flock, funnel_state);
-
- return(error);
+ dev = cndev();
+ return ((*cdevsw[major(dev)].d_write)(dev, uio, ioflag));
}
+
/*ARGSUSED*/
int
consioctl(__unused dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
{
- dev_t device;
- boolean_t funnel_state;
- int error;
-
- funnel_state = thread_funnel_set(kernel_flock, TRUE);
-
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
+ dev = cndev();
+#if 0
/*
* Superuser can always use this to wrest control of console
* output from the "virtual" console.
+ *
+ * XXX Unfortunately, this code doesn't do what the author thougt
+ * XXX it did; use of the console device, a TIOCCONS would always
+ * XXX disassociate the console from a virtual terminal and send
+ * XXX it back to the fake tty.
*/
- if ((unsigned int)cmd == TIOCCONS && constty) {
- error = proc_suser(p);
- if (error) {
- goto out;
+ if ((unsigned) cmd == TIOCCONS && constty) {
+ int error = proc_suser(p);
+ if (!error) {
+ constty = NULL;
}
- constty = NULL;
- error = 0;
- goto out;
+ return(error);
}
- error = (*cdevsw[major(device)].d_ioctl)(device, cmd, addr, flag, p);
-out:
- thread_funnel_set(kernel_flock, funnel_state);
+#endif /* 0 */
- return(error);
+ return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, addr, flag, p));
}
+
/*ARGSUSED*/
/* called with funnel held */
int
consselect(__unused dev_t dev, int flag, void *wql, struct proc *p)
{
- dev_t device;
-
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
- return ((*cdevsw[major(device)].d_select)(device, flag, wql, p));
-}
-
-int
-cons_getc(__unused dev_t dev)
-{
- dev_t device;
- boolean_t funnel_state;
- int error;
-
- funnel_state = thread_funnel_set(kernel_flock, TRUE);
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
- error = (*cdevsw[major(device)].d_getc)(device);
- thread_funnel_set(kernel_flock, funnel_state);
-
- return(error);
+ dev = cndev();
+ return ((*cdevsw[major(dev)].d_select)(dev, flag, wql, p));
}
-
-int
-cons_putc(__unused dev_t dev, char c)
-{
- dev_t device;
- boolean_t funnel_state;
- int error;
-
- funnel_state = thread_funnel_set(kernel_flock, TRUE);
- if (constty)
- device = constty->t_dev;
- else
- device = cons.t_dev;
- error = (*cdevsw[major(device)].d_putc)(device, c);
- thread_funnel_set(kernel_flock, funnel_state);
-
- return(error);
-}
-
-/*
- * Write message to console; create an alert panel if no text-type window
- * currently exists. Caller must call alert_done() when finished.
- * The height and width arguments are not used; they are provided for
- * compatibility with the 68k version of alert().
- */
-int
-alert(
- __unused int width,
- __unused int height,
- __unused const char *title,
- const char *msg,
- int p1,
- int p2,
- int p3,
- int p4,
- int p5,
- int p6,
- int p7,
- int p8)
-{
- char smsg[200];
-
- snprintf(smsg, sizeof(smsg), msg, p1, p2, p3, p4, p5, p6, p7, p8);
-#if FIXME /* [ */
- /* DoAlert(title, smsg); */
-#else
- printf("%s\n",smsg);
-#endif /* FIXME ] */
-
- return 0;
-}
-
-int
-alert_done(void)
-{
- /* DoRestore(); */
- return 0;
-}
-