Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1613893

Re: [PATCH] serial: Do not treat the IIR register as a bitfield

From Olliver Schinagl <o.schinagl@ultimaker.com>
Newsgroups linux.kernel
Subject Re: [PATCH] serial: Do not treat the IIR register as a bitfield
Date 2017-03-31 13:30 +0200
Message-ID <tr2UG-3Xe-41@gated-at.bofh.it> (permalink)
References <tqqPn-2sY-3@gated-at.bofh.it> <tqBB7-23k-1@gated-at.bofh.it> <tqC4a-2hn-21@gated-at.bofh.it> <tqJ5D-7vN-5@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Hey Ted,

On 30-03-17 16:11, Theodore Ts'o wrote:
> While you're fixing this, there's a bug in samples/vfio-mdev/mtty.c:
>
> 		u8 ier = mdev_state->s[index].uart_reg[UART_IER];
> 		*buf = 0;
>
> 		mutex_lock(&mdev_state->rxtx_lock);
> 		/* Interrupt priority 1: Parity, overrun, framing or break */
> 		if ((ier & UART_IER_RLSI) && mdev_state->s[index].overrun)
> 			*buf |= UART_IIR_RLSI;
>
> 		/* Interrupt priority 2: Fifo trigger level reached */
> 		if ((ier & UART_IER_RDI) &&
> 		    (mdev_state->s[index].rxtx.count ==
> 		      mdev_state->s[index].intr_trigger_level))
> 			*buf |= UART_IIR_RDI;
>
> 		/* Interrupt priotiry 3: transmitter holding register empty */
> 		if ((ier & UART_IER_THRI) &&
> 		    (mdev_state->s[index].rxtx.head ==
> 				mdev_state->s[index].rxtx.tail))
> 			*buf |= UART_IIR_THRI;
>
> 		/* Interrupt priotiry 4: Modem status: CTS, DSR, RI or DCD  */
> 		if ((ier & UART_IER_MSI) &&
> 		    (mdev_state->s[index].uart_reg[UART_MCR] &
> 				 (UART_MCR_RTS | UART_MCR_DTR)))
> 			*buf |= UART_IIR_MSI;
>
> 		/* bit0: 0=> interrupt pending, 1=> no interrupt is pending */
> 		if (*buf == 0)
> 			*buf = UART_IIR_NO_INT;
>
> It's treating the UART_IIR_* fields as a bitmask which is bad enough,
> but in the "Interrupt priority 4" case, UART_IIR_MSI is zero, so
> "*buf |= UART_IIR_MSI" is a no-op.   And in the case where the modem
> status interrupt is the only thing set, *buf will be 0, and UART_IIR_NO_INT
> gets set erroneously.
>
> So this is another example of the bug of trying to treat the
> UART_IIR_* fields as a bitmask....
>
> Yes, it's only sample code, but best fix it now before it gets copied
> elsewhere and metastisizes.   :-)

Yeah, I notice that a lot of the code I modified in this patch was 
either copy pasted or 'inspired by'. So having bad examples around is 
really bad as you state!

Additionally the friendly build bot reminded me there are other 
subsystems that do this as well, so I'll update the patch to get those 
too and this one too.

Olliver

>
> 							- Ted
> 							
>

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH] serial: Do not treat the IIR register as a bitfield Olliver Schinagl <oliver@schinagl.nl> - 2017-03-29 20:50 +0200
  Re: [PATCH] serial: Do not treat the IIR register as a bitfield Vignesh R <vigneshr@ti.com> - 2017-03-30 08:20 +0200
    Re: [PATCH] serial: Do not treat the IIR register as a bitfield Olliver Schinagl <oliver@schinagl.nl> - 2017-03-30 08:50 +0200
      Re: [PATCH] serial: Do not treat the IIR register as a bitfield Vignesh R <vigneshr@ti.com> - 2017-03-30 10:10 +0200
        Re: [PATCH] serial: Do not treat the IIR register as a bitfield Olliver Schinagl <oliver@schinagl.nl> - 2017-03-30 17:50 +0200
      Re: [PATCH] serial: Do not treat the IIR register as a bitfield Theodore Ts'o <tytso@mit.edu> - 2017-03-30 16:20 +0200
        Re: [PATCH] serial: Do not treat the IIR register as a bitfield Olliver Schinagl <o.schinagl@ultimaker.com> - 2017-03-31 13:30 +0200
  Re: [PATCH] serial: Do not treat the IIR register as a bitfield Andy Shevchenko <andriy.shevchenko@linux.intel.com> - 2017-03-30 12:10 +0200
    Re: [PATCH] serial: Do not treat the IIR register as a bitfield Olliver Schinagl <o.schinagl@ultimaker.com> - 2017-03-31 16:00 +0200
      Re: [PATCH] serial: Do not treat the IIR register as a bitfield Andy Shevchenko <andy.shevchenko@gmail.com> - 2017-03-31 16:50 +0200
  Re: [PATCH] serial: Do not treat the IIR register as a bitfield kbuild test robot <lkp@intel.com> - 2017-03-30 14:20 +0200

csiph-web