static void pconsstart(struct tty *tp) { struct clist *cl; int s, len; uint8_t buf[OFBURSTLEN]; s = spltty(); if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) { splx(s); return; } tp->t_state |= TS_BUSY; splx(s); cl = &tp->t_outq; len = q_to_b(cl, buf, OFBURSTLEN); prom_putstr(buf, len); s = spltty(); tp->t_state &= ~TS_BUSY; if (ttypull(tp)) { tp->t_state |= TS_TIMEOUT; callout_schedule(&tp->t_rstrt_ch, 1); } splx(s); }
void prom_printk(const char *fmt, ...) { va_list args; va_start(args, fmt); vsnprintf(pbuffer, 4096, fmt, args); va_end(args); prom_putstr(pbuffer); }
/* * promcnputc: * * Remap char before passing off to prom. * * Prom only takes 32 bit addresses. Copy char somewhere prom can * find it. This routine will stop working after pmap_rid_of_console * is called in alpha_init. This is due to the hard coded address * of the console area. */ void promcnputc(dev_t dev, int c) { prom_return_t ret; unsigned char *to = (unsigned char *)0x20000000; prom_enter(); *to = c; do { ret.bits = prom_putstr(alpha_console, to, 1); } while ((ret.u.retval & 1) == 0); prom_leave(); }
/* * Put text on the screen using the PROM monitor. * This can take a while, so to avoid missing * interrupts, this is called at splsoftclock. */ static void kd_putfb(struct tty *tp) { char buf[PUT_WSIZE]; struct clist *cl = &tp->t_outq; char *p, *end; int len; while ((len = q_to_b(cl, buf, PUT_WSIZE-1)) > 0) { /* PROM will barf if high bits are set. */ p = buf; end = buf + len; while (p < end) *p++ &= 0x7f; /* Now let the PROM print it. */ prom_putstr(buf, len); } }