Skip to content

Commit

Permalink
s390-ccw: print carriage return with new lines
Browse files Browse the repository at this point in the history
The sclp console in the s390 bios writes raw data,
leading console emulators (such as virsh console) to
treat a new line ('\n') as just a new line instead
of as a Unix line feed. Because of this, output
appears in a "stair case" pattern.

Let's print \r\n on every occurrence of a new line
in the string passed to write to amend this issue.

This is in sync with the guest Linux code in
drivers/s390/char/sclp_vt220.c which also does a line feed
conversion in the console part of the driver.

This fixes the s390-ccw and s390-netboot output like
$ virsh start test --console
Domain test started
Connected to domain test
Escape character is ^]
Network boot starting...
                          Using MAC address: 02:01:02:03:04:05
                                                                Requesting information via DHCP:  010

Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
Message-Id: <1509120893-28054-1-git-send-email-walling@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
  • Loading branch information
Collin L. Walling authored and borntraeger committed Oct 30, 2017
1 parent 0280b3e commit 7618c0a
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions pc-bios/s390-ccw/sclp.c
Expand Up @@ -76,17 +76,35 @@ static int _strlen(const char *str)
long write(int fd, const void *str, size_t len)
{
WriteEventData *sccb = (void *)_sccb;
const char *p = str;
size_t data_len = 0;
size_t i;

if (fd != 1 && fd != 2) {
return -EIO;
}

sccb->h.length = sizeof(WriteEventData) + len;
for (i = 0; i < len; i++) {
if ((data_len + 1) >= SCCB_DATA_LEN) {
/* We would overflow the sccb buffer, abort early */
len = i;
break;
}

if (*p == '\n') {
/* Terminal emulators might need \r\n, so generate it */
sccb->data[data_len++] = '\r';
}

sccb->data[data_len++] = *p;
p++;
}

sccb->h.length = sizeof(WriteEventData) + data_len;
sccb->h.function_code = SCLP_FC_NORMAL_WRITE;
sccb->ebh.length = sizeof(EventBufferHeader) + len;
sccb->ebh.length = sizeof(EventBufferHeader) + data_len;
sccb->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
sccb->ebh.flags = 0;
memcpy(sccb->data, str, len);

sclp_service_call(SCLP_CMD_WRITE_EVENT_DATA, sccb);

Expand Down

0 comments on commit 7618c0a

Please sign in to comment.