- If our transmit queue is empty, turn off transmit interrupt.
- If our receive queue is full, turn off receive interrupt. */
-static void
-update_ier (void)
-{
- uint8_t ier = 0;
-
- ASSERT (intr_get_level () == INTR_OFF);
-
- if (!queue_empty (&xmit_queue))
- ier |= IER_XMIT;
- if (!queue_full (&recv_queue))
- ier |= IER_RECV;
- outb (IER_REG, ier);
-}
-
-static void
-serial_interrupt (struct intr_frame *f UNUSED)
-{
- /* As long as the hardware is ready to take a byte
- and we have a byte to give it,
- transmit a byte. */
- while ((inb (LSR_REG) & LSR_THRE) != 0 && !queue_empty (&xmit_queue))
- outb (THR_REG, queue_getc (&xmit_queue));
-
- /* As long as the hardware has a byte to give us
- and we have space in our buffer for a byte,
- receive a byte. */
- while ((inb (LSR_REG) & LSR_DR) != 0 && !queue_full (&recv_queue))
- queue_putc (&recv_queue, inb (RBR_REG));
-
- /* Update interrupt enable register based on queue status. */
- update_ier ();
-}
-\f
-static size_t next (size_t pos);
-static bool owned_by_current_thread (const struct queue *);
-static void wait (struct queue *q, struct thread **waiter);
-static void signal (struct queue *q, struct thread **waiter);
-
-static void
-queue_init (struct queue *q, const char *name)
-{
- lock_init (&q->lock, name);
- q->not_full = q->not_empty = NULL;
- q->head = q->tail = 0;
-}
-