Re: [kvm-unit-tests PATCH v4 08/13] s390x: Add linemode console

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10.01.19 13:34, Janosch Frank wrote:
> On 10.01.19 13:23, David Hildenbrand wrote:
>> On 03.01.19 11:08, Janosch Frank wrote:
>>> z/VM isn't fond of vt220, so we need line mode when running under z/VM.
>>>
>>> Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx>
>>> ---
>>>  lib/s390x/sclp-console.c | 178 ++++++++++++++++++++++++++++++++++++++++++-----
>>>  lib/s390x/sclp.h         |  67 ++++++++++++++++++
>>>  2 files changed, 228 insertions(+), 17 deletions(-)
>>>
>>> diff --git a/lib/s390x/sclp-console.c b/lib/s390x/sclp-console.c
>>> index a5ef45f..6b30fab 100644
>>> --- a/lib/s390x/sclp-console.c
>>> +++ b/lib/s390x/sclp-console.c
>>> @@ -11,21 +11,167 @@
>>>  #include <libcflat.h>
>>>  #include <string.h>
>>>  #include <asm/page.h>
>>> +#include <asm/arch_def.h>
>>> +#include <asm/io.h>
>>>  #include "sclp.h"
>>>  
> [...]
>>> +
>>> +static void sclp_print_ascii(const char *str)
>>> +{
>>> +	int len = strlen(str);
>>> +	WriteEventData *sccb = (void *)_sccb;
>>> +
>>> +	sclp_mark_busy();
>>> +	memset(sccb, 0, sizeof(*sccb));
>>> +	sccb->h.length = sizeof(WriteEventData) + len;
>>> +	sccb->h.function_code = SCLP_FC_NORMAL_WRITE;
>>> +	sccb->ebh.length = sizeof(EventBufferHeader) + len;
>>> +	sccb->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
>>> +	memcpy(sccb->data, str, len);
>>
>> Soooo ... what would happen when printing more than 4000 + something
>> characters? (same applies to lm below)
> 
> I wouldn't advise on that, because you'll overwrite memory and sclp
> might have a length limit. But that wasn't a problem before, was it?
> 
> Do you plan on printing the memory in one go? :-)

Won't say it won't happen when somebody debugs/develops tests and gets
strange side effects from printing. Wonder if we should simply cut it
off to the supported size.

(And yes, this is already in existing code)

>>
>>> +		mto->length = count;
>>> +		mto->type = 4;
>>> +		mto->line_type_flags = LNTPFLGS_ENDTEXT;
>>> +		ptr += count;
>>> +	} while (offset < len && ptr + sizeof(*mto) <= end);
>>> +	len = ptr - (unsigned char *) sccb;
>>> +	sccb->header.length = len - offsetof(struct write_sccb, header);
>>> +	msg = &sccb->msg;
>>> +	msg->header.type = EVTYP_MSG;
>>> +	msg->header.length = len - offsetof(struct write_sccb, msg.header);
>>> +	mdb = &msg->mdb;
>>> +	mdb->header.type = 1;
>>> +	mdb->header.tag = 0xD4C4C240;
>>> +	mdb->header.revision_code = 1;
>>> +	mdb->header.length = len - offsetof(struct write_sccb, msg.mdb.header);
>>> +	go = &mdb->go;
>>> +	go->length = sizeof(*go);
>>> +	go->type = 1;
>>> +	sclp_service_call(SCLP_CMD_WRITE_EVENT_DATA, sccb);
>>> +}
>>> +
>>> +/*
>>> + * SCLP needs to be initialized by setting a send and receive mask,
>>> + * indicating which messages the control program (we) want(s) to
>>> + * send/receive.
>>> + */
>>>  static void sclp_set_write_mask(void)
>>>  {
>>>  	WriteEventMask *sccb = (void *)_sccb;
>>>  
>>>  	sclp_mark_busy();
>>> +	memset(_sccb, 0, sizeof(*sccb));
>>>  	sccb->h.length = sizeof(WriteEventMask);
>>> -	sccb->mask_length = sizeof(unsigned int);
>>> -	sccb->receive_mask = SCLP_EVENT_MASK_MSG_ASCII;
>>> -	sccb->cp_receive_mask = SCLP_EVENT_MASK_MSG_ASCII;
>>> -	sccb->send_mask = SCLP_EVENT_MASK_MSG_ASCII;
>>> -	sccb->cp_send_mask = SCLP_EVENT_MASK_MSG_ASCII;
>>> +	sccb->h.function_code = 0;
>>
>> Already 0'ed out.
> 
> Yes, this one is here to make absolutely clear which function we execute.

Wondering if this should be SCLP_FC_NORMAL_WRITE, too?

> 
>>
>>> +	sccb->mask_length = sizeof(sccb_mask_t);
>>> +
>>> +	/* For now we don't process sclp input. */
>>> +	sccb->cp_receive_mask = 0;
>>
>> dito
> 
> Same
> If you want, I'll add a comment instead.

Whatever you prefer, I guess a comment is enough.


-- 

Thanks,

David / dhildenb



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux