2 * SCLP ASCII access driver
4 * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
6 * This work is licensed under the terms of the GNU GPL, version 2 or (at
7 * your option) any later version. See the COPYING file in the top-level
15 long write(int fd
, const void *str
, size_t len
);
17 static char _sccb
[PAGE_SIZE
] __attribute__((__aligned__(4096)));
19 const unsigned char ebc2asc
[256] =
20 /* 0123456789abcdef0123456789abcdef */
21 "................................" /* 1F */
22 "................................" /* 3F */
23 " ...........<(+|&.........!$*);." /* 5F first.chr.here.is.real.space */
24 "-/.........,%_>?.........`:#@'=\""/* 7F */
25 ".abcdefghi.......jklmnopqr......" /* 9F */
26 "..stuvwxyz......................" /* BF */
27 ".ABCDEFGHI.......JKLMNOPQR......" /* DF */
28 "..STUVWXYZ......0123456789......";/* FF */
30 /* Perform service call. Return 0 on success, non-zero otherwise. */
31 static int sclp_service_call(unsigned int command
, void *sccb
)
36 " .insn rre,0xb2200000,%1,%2\n" /* servc %1,%2 */
39 : "=&d" (cc
) : "d" (command
), "a" (__pa(sccb
))
49 static void sclp_set_write_mask(void)
51 WriteEventMask
*sccb
= (void *)_sccb
;
53 sccb
->h
.length
= sizeof(WriteEventMask
);
54 sccb
->mask_length
= sizeof(unsigned int);
55 sccb
->receive_mask
= SCLP_EVENT_MASK_MSG_ASCII
;
56 sccb
->cp_receive_mask
= SCLP_EVENT_MASK_MSG_ASCII
;
57 sccb
->send_mask
= SCLP_EVENT_MASK_MSG_ASCII
;
58 sccb
->cp_send_mask
= SCLP_EVENT_MASK_MSG_ASCII
;
60 sclp_service_call(SCLP_CMD_WRITE_EVENT_MASK
, sccb
);
65 sclp_set_write_mask();
68 static int _strlen(const char *str
)
71 for (i
= 0; *str
; i
++)
76 long write(int fd
, const void *str
, size_t len
)
78 WriteEventData
*sccb
= (void *)_sccb
;
80 if (fd
!= 1 && fd
!= 2) {
84 sccb
->h
.length
= sizeof(WriteEventData
) + len
;
85 sccb
->h
.function_code
= SCLP_FC_NORMAL_WRITE
;
86 sccb
->ebh
.length
= sizeof(EventBufferHeader
) + len
;
87 sccb
->ebh
.type
= SCLP_EVENT_ASCII_CONSOLE_DATA
;
89 memcpy(sccb
->data
, str
, len
);
91 sclp_service_call(SCLP_CMD_WRITE_EVENT_DATA
, sccb
);
96 void sclp_print(const char *str
)
98 write(1, str
, _strlen(str
));
101 void sclp_get_loadparm_ascii(char *loadparm
)
104 ReadInfo
*sccb
= (void *)_sccb
;
106 memset((char *)_sccb
, 0, sizeof(ReadInfo
));
107 sccb
->h
.length
= sizeof(ReadInfo
);
108 if (!sclp_service_call(SCLP_CMDW_READ_SCP_INFO
, sccb
)) {
109 ebcdic_to_ascii((char *) sccb
->loadparm
, loadparm
, 8);