int dcons_ischar(struct dcons_softc *dc) { u_int32_t ptr, pos, gen, next_gen; struct dcons_ch *ch; ch = &dc->i; ptr = ntohl(*ch->ptr); gen = ptr >> DCONS_GEN_SHIFT; pos = ptr & DCONS_POS_MASK; if (gen == ch->gen && pos == ch->pos) return (0); next_gen = DCONS_NEXT_GEN(ch->gen); /* XXX sanity check */ if ((gen != ch->gen && gen != next_gen) || (gen == ch->gen && pos < ch->pos)) { /* generation skipped !! */ /* XXX discard */ ch->gen = gen; ch->pos = pos; return (0); } return (1); }
int dcons_checkc(struct dcons_softc *dc) { unsigned char c; u_int32_t ptr, pos, gen, next_gen; struct dcons_ch *ch; ch = &dc->i; ptr = ntohl(*ch->ptr); gen = ptr >> DCONS_GEN_SHIFT; pos = ptr & DCONS_POS_MASK; if (gen == ch->gen && pos == ch->pos) return (-1); next_gen = DCONS_NEXT_GEN(ch->gen); /* XXX sanity check */ if ((gen != ch->gen && gen != next_gen) || (gen == ch->gen && pos < ch->pos)) { /* generation skipped !! */ /* XXX discard */ ch->gen = gen; ch->pos = pos; return (-1); } c = ch->buf[ch->pos]; ch->pos ++; if (ch->pos >= ch->size) { ch->gen = next_gen; ch->pos = 0; } return (c); }
static int dcons_checkc(struct dcons_softc *dc) { unsigned char c; u_int32_t ptr, pos, gen, next_gen; struct dcons_ch *ch; ch = &dc->i; if (dcons_dma_tag != NULL) bus_dmamap_sync(dcons_dma_tag, dcons_dma_map, BUS_DMASYNC_POSTREAD); ptr = ntohl(*ch->ptr); gen = ptr >> DCONS_GEN_SHIFT; pos = ptr & DCONS_POS_MASK; if (gen == ch->gen && pos == ch->pos) return (-1); next_gen = DCONS_NEXT_GEN(ch->gen); /* XXX sanity check */ if ((gen != ch->gen && gen != next_gen) || (gen == ch->gen && pos < ch->pos)) { /* generation skipped !! */ /* XXX discard */ ch->gen = gen; ch->pos = pos; return (-1); } c = ch->buf[ch->pos]; ch->pos ++; if (ch->pos >= ch->size) { ch->gen = next_gen; ch->pos = 0; } #if DDB && ALT_BREAK_TO_DEBUGGER switch (dc->brk_state) { case STATE1: if (c == KEY_TILDE) dc->brk_state = STATE2; else dc->brk_state = STATE0; break; case STATE2: dc->brk_state = STATE0; if (c == KEY_CTRLB) { #if DCONS_FORCE_GDB if (dc->flags & DC_GDB) boothowto |= RB_GDB; #endif breakpoint(); } } if (c == KEY_CR) dc->brk_state = STATE1; #endif return (c); }
void dcons_putc(struct dcons_softc *dc, int c) { struct dcons_ch *ch; ch = &dc->o; ch->buf[ch->pos] = c; ch->pos ++; if (ch->pos >= ch->size) { ch->gen = DCONS_NEXT_GEN(ch->gen); ch->pos = 0; } *ch->ptr = DCONS_MAKE_PTR(ch); }
static void dcons_putc(struct dcons_softc *dc, int c) { struct dcons_ch *ch; ch = &dc->o; ch->buf[ch->pos] = c; ch->pos ++; if (ch->pos >= ch->size) { ch->gen = DCONS_NEXT_GEN(ch->gen); ch->pos = 0; } *ch->ptr = DCONS_MAKE_PTR(ch); if (dcons_dma_tag != NULL) bus_dmamap_sync(dcons_dma_tag, dcons_dma_map, BUS_DMASYNC_PREWRITE); }