W dniu 22.05.2018 o 15:07, Peter Maydell pisze: > On 22 May 2018 at 12:53, Markus Armbruster <arm...@redhat.com> wrote: >> Patryk Olszewski <pat...@fala.ehost.pl> writes: >> >>> Signed-off-by: Patryk Olszewski <pat...@fala.ehost.pl> >>> --- >>> chardev/char-serial.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/chardev/char-serial.c b/chardev/char-serial.c >>> index feb52e5..ae548d2 100644 >>> --- a/chardev/char-serial.c >>> +++ b/chardev/char-serial.c >>> @@ -139,7 +139,7 @@ static void tty_serial_init(int fd, int speed, >>> >>> tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP >>> | INLCR | IGNCR | ICRNL | IXON); >>> - tty.c_oflag |= OPOST; >>> + tty.c_oflag &= ~OPOST; >>> tty.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); >>> tty.c_cflag &= ~(CSIZE | PARENB | PARODD | CRTSCTS | CSTOPB); >>> switch (data_bits) { >> This change may well make sense, but your commit message needs to >> explain *why*. >> >> For what it's worth, POSIX documents OPOST as "Post-process output", and >> the Linux manual page as "Enable implementation-defined output >> processing." > We've set OPOST on our terminals since forever, right back to > commit 0824d6fc674 in 2003. Not setting it seems like the right thing, > though, since we're generally otherwise setting the thing up to be a > raw mode tty (and if we're connecting this to a guest then raw seems > like what we want). > > I wonder whether connecting, say, the HMP monitor to a 'serial' > chardev (a) works now (b) ends up with stair-step output after > this change (c) is something we care about... > > thanks > -- PMM > This patch is here to help fix years old bug of lf being replaced with crlf in serial, which is super problematic in binary transmissions, making communication with devices through serial from guest almost impossible.
Setting OPOST flag in c_oflag enables the output processing, in other words it makes any other flag set in c_oflag come into action. From my quick experiment on serial devices on Linux I found out that by default c_oflag has enabled ONLCR flag, which is the one responsible for the crlf conversion. Unsetting OPOST disables it. Bug reports related to that: https://bugs.launchpad.net/qemu/+bug/1772086 https://bugs.launchpad.net/qemu/+bug/1407813 https://bugs.launchpad.net/qemu/+bug/1715296 also https://lists.nongnu.org/archive/html/qemu-devel/2006-06/msg00196.html