xref: /kvm-unit-tests/lib/s390x/sclp-console.c (revision 8ead801e5a97ba47b7c1691e56867061b94bd57b)
17ed7df23SJanosch Frank /*
27ed7df23SJanosch Frank  * SCLP ASCII access driver
37ed7df23SJanosch Frank  *
47ed7df23SJanosch Frank  * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
57ed7df23SJanosch Frank  *
67ed7df23SJanosch Frank  * This work is licensed under the terms of the GNU GPL, version 2 or (at
77ed7df23SJanosch Frank  * your option) any later version. See the COPYING file in the top-level
87ed7df23SJanosch Frank  * directory.
97ed7df23SJanosch Frank  */
107ed7df23SJanosch Frank 
117ed7df23SJanosch Frank #include <libcflat.h>
127ed7df23SJanosch Frank #include <string.h>
137ed7df23SJanosch Frank #include <asm/page.h>
147ed7df23SJanosch Frank #include "sclp.h"
157ed7df23SJanosch Frank 
167ed7df23SJanosch Frank static void sclp_set_write_mask(void)
177ed7df23SJanosch Frank {
187ed7df23SJanosch Frank 	WriteEventMask *sccb = (void *)_sccb;
197ed7df23SJanosch Frank 
20*8ead801eSJanosch Frank 	sclp_mark_busy();
217ed7df23SJanosch Frank 	sccb->h.length = sizeof(WriteEventMask);
227ed7df23SJanosch Frank 	sccb->mask_length = sizeof(unsigned int);
237ed7df23SJanosch Frank 	sccb->receive_mask = SCLP_EVENT_MASK_MSG_ASCII;
247ed7df23SJanosch Frank 	sccb->cp_receive_mask = SCLP_EVENT_MASK_MSG_ASCII;
257ed7df23SJanosch Frank 	sccb->send_mask = SCLP_EVENT_MASK_MSG_ASCII;
267ed7df23SJanosch Frank 	sccb->cp_send_mask = SCLP_EVENT_MASK_MSG_ASCII;
277ed7df23SJanosch Frank 
287ed7df23SJanosch Frank 	sclp_service_call(SCLP_CMD_WRITE_EVENT_MASK, sccb);
297ed7df23SJanosch Frank }
307ed7df23SJanosch Frank 
317ed7df23SJanosch Frank void sclp_console_setup(void)
327ed7df23SJanosch Frank {
337ed7df23SJanosch Frank 	sclp_set_write_mask();
347ed7df23SJanosch Frank }
357ed7df23SJanosch Frank 
367ed7df23SJanosch Frank void sclp_print(const char *str)
377ed7df23SJanosch Frank {
387ed7df23SJanosch Frank 	int len = strlen(str);
397ed7df23SJanosch Frank 	WriteEventData *sccb = (void *)_sccb;
407ed7df23SJanosch Frank 
41*8ead801eSJanosch Frank 	sclp_mark_busy();
427ed7df23SJanosch Frank 	sccb->h.length = sizeof(WriteEventData) + len;
437ed7df23SJanosch Frank 	sccb->h.function_code = SCLP_FC_NORMAL_WRITE;
447ed7df23SJanosch Frank 	sccb->ebh.length = sizeof(EventBufferHeader) + len;
457ed7df23SJanosch Frank 	sccb->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
467ed7df23SJanosch Frank 	sccb->ebh.flags = 0;
477ed7df23SJanosch Frank 	memcpy(sccb->data, str, len);
487ed7df23SJanosch Frank 
497ed7df23SJanosch Frank 	sclp_service_call(SCLP_CMD_WRITE_EVENT_DATA, sccb);
507ed7df23SJanosch Frank }
51