Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.15 572 lines 15 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * SCLP line mode terminal driver. 4 * 5 * S390 version 6 * Copyright IBM Corp. 1999 7 * Author(s): Martin Peschke <mpeschke@de.ibm.com> 8 * Martin Schwidefsky <schwidefsky@de.ibm.com> 9 */ 10 11#include <linux/kmod.h> 12#include <linux/tty.h> 13#include <linux/tty_driver.h> 14#include <linux/tty_flip.h> 15#include <linux/err.h> 16#include <linux/init.h> 17#include <linux/interrupt.h> 18#include <linux/gfp.h> 19#include <linux/uaccess.h> 20 21#include "ctrlchar.h" 22#include "sclp.h" 23#include "sclp_rw.h" 24#include "sclp_tty.h" 25 26/* 27 * size of a buffer that collects single characters coming in 28 * via sclp_tty_put_char() 29 */ 30#define SCLP_TTY_BUF_SIZE 512 31 32/* 33 * There is exactly one SCLP terminal, so we can keep things simple 34 * and allocate all variables statically. 35 */ 36 37/* Lock to guard over changes to global variables. */ 38static spinlock_t sclp_tty_lock; 39/* List of free pages that can be used for console output buffering. */ 40static struct list_head sclp_tty_pages; 41/* List of full struct sclp_buffer structures ready for output. */ 42static struct list_head sclp_tty_outqueue; 43/* Counter how many buffers are emitted. */ 44static int sclp_tty_buffer_count; 45/* Pointer to current console buffer. */ 46static struct sclp_buffer *sclp_ttybuf; 47/* Timer for delayed output of console messages. */ 48static struct timer_list sclp_tty_timer; 49 50static struct tty_port sclp_port; 51static unsigned char sclp_tty_chars[SCLP_TTY_BUF_SIZE]; 52static unsigned short int sclp_tty_chars_count; 53 54struct tty_driver *sclp_tty_driver; 55 56static int sclp_tty_tolower; 57static int sclp_tty_columns = 80; 58 59#define SPACES_PER_TAB 8 60#define CASE_DELIMITER 0x6c /* to separate upper and lower case (% in EBCDIC) */ 61 62/* This routine is called whenever we try to open a SCLP terminal. */ 63static int 64sclp_tty_open(struct tty_struct *tty, struct file *filp) 65{ 66 tty_port_tty_set(&sclp_port, tty); 67 tty->driver_data = NULL; 68 sclp_port.low_latency = 0; 69 return 0; 70} 71 72/* This routine is called when the SCLP terminal is closed. */ 73static void 74sclp_tty_close(struct tty_struct *tty, struct file *filp) 75{ 76 if (tty->count > 1) 77 return; 78 tty_port_tty_set(&sclp_port, NULL); 79} 80 81/* 82 * This routine returns the numbers of characters the tty driver 83 * will accept for queuing to be written. This number is subject 84 * to change as output buffers get emptied, or if the output flow 85 * control is acted. This is not an exact number because not every 86 * character needs the same space in the sccb. The worst case is 87 * a string of newlines. Every newline creates a new message which 88 * needs 82 bytes. 89 */ 90static int 91sclp_tty_write_room (struct tty_struct *tty) 92{ 93 unsigned long flags; 94 struct list_head *l; 95 int count; 96 97 spin_lock_irqsave(&sclp_tty_lock, flags); 98 count = 0; 99 if (sclp_ttybuf != NULL) 100 count = sclp_buffer_space(sclp_ttybuf) / sizeof(struct msg_buf); 101 list_for_each(l, &sclp_tty_pages) 102 count += NR_EMPTY_MSG_PER_SCCB; 103 spin_unlock_irqrestore(&sclp_tty_lock, flags); 104 return count; 105} 106 107static void 108sclp_ttybuf_callback(struct sclp_buffer *buffer, int rc) 109{ 110 unsigned long flags; 111 void *page; 112 113 do { 114 page = sclp_unmake_buffer(buffer); 115 spin_lock_irqsave(&sclp_tty_lock, flags); 116 /* Remove buffer from outqueue */ 117 list_del(&buffer->list); 118 sclp_tty_buffer_count--; 119 list_add_tail((struct list_head *) page, &sclp_tty_pages); 120 /* Check if there is a pending buffer on the out queue. */ 121 buffer = NULL; 122 if (!list_empty(&sclp_tty_outqueue)) 123 buffer = list_entry(sclp_tty_outqueue.next, 124 struct sclp_buffer, list); 125 spin_unlock_irqrestore(&sclp_tty_lock, flags); 126 } while (buffer && sclp_emit_buffer(buffer, sclp_ttybuf_callback)); 127 128 tty_port_tty_wakeup(&sclp_port); 129} 130 131static inline void 132__sclp_ttybuf_emit(struct sclp_buffer *buffer) 133{ 134 unsigned long flags; 135 int count; 136 int rc; 137 138 spin_lock_irqsave(&sclp_tty_lock, flags); 139 list_add_tail(&buffer->list, &sclp_tty_outqueue); 140 count = sclp_tty_buffer_count++; 141 spin_unlock_irqrestore(&sclp_tty_lock, flags); 142 if (count) 143 return; 144 rc = sclp_emit_buffer(buffer, sclp_ttybuf_callback); 145 if (rc) 146 sclp_ttybuf_callback(buffer, rc); 147} 148 149/* 150 * When this routine is called from the timer then we flush the 151 * temporary write buffer. 152 */ 153static void 154sclp_tty_timeout(struct timer_list *unused) 155{ 156 unsigned long flags; 157 struct sclp_buffer *buf; 158 159 spin_lock_irqsave(&sclp_tty_lock, flags); 160 buf = sclp_ttybuf; 161 sclp_ttybuf = NULL; 162 spin_unlock_irqrestore(&sclp_tty_lock, flags); 163 164 if (buf != NULL) { 165 __sclp_ttybuf_emit(buf); 166 } 167} 168 169/* 170 * Write a string to the sclp tty. 171 */ 172static int sclp_tty_write_string(const unsigned char *str, int count, int may_fail) 173{ 174 unsigned long flags; 175 void *page; 176 int written; 177 int overall_written; 178 struct sclp_buffer *buf; 179 180 if (count <= 0) 181 return 0; 182 overall_written = 0; 183 spin_lock_irqsave(&sclp_tty_lock, flags); 184 do { 185 /* Create a sclp output buffer if none exists yet */ 186 if (sclp_ttybuf == NULL) { 187 while (list_empty(&sclp_tty_pages)) { 188 spin_unlock_irqrestore(&sclp_tty_lock, flags); 189 if (may_fail) 190 goto out; 191 else 192 sclp_sync_wait(); 193 spin_lock_irqsave(&sclp_tty_lock, flags); 194 } 195 page = sclp_tty_pages.next; 196 list_del((struct list_head *) page); 197 sclp_ttybuf = sclp_make_buffer(page, sclp_tty_columns, 198 SPACES_PER_TAB); 199 } 200 /* try to write the string to the current output buffer */ 201 written = sclp_write(sclp_ttybuf, str, count); 202 overall_written += written; 203 if (written == count) 204 break; 205 /* 206 * Not all characters could be written to the current 207 * output buffer. Emit the buffer, create a new buffer 208 * and then output the rest of the string. 209 */ 210 buf = sclp_ttybuf; 211 sclp_ttybuf = NULL; 212 spin_unlock_irqrestore(&sclp_tty_lock, flags); 213 __sclp_ttybuf_emit(buf); 214 spin_lock_irqsave(&sclp_tty_lock, flags); 215 str += written; 216 count -= written; 217 } while (count > 0); 218 /* Setup timer to output current console buffer after 1/10 second */ 219 if (sclp_ttybuf && sclp_chars_in_buffer(sclp_ttybuf) && 220 !timer_pending(&sclp_tty_timer)) { 221 mod_timer(&sclp_tty_timer, jiffies + HZ / 10); 222 } 223 spin_unlock_irqrestore(&sclp_tty_lock, flags); 224out: 225 return overall_written; 226} 227 228/* 229 * This routine is called by the kernel to write a series of characters to the 230 * tty device. The characters may come from user space or kernel space. This 231 * routine will return the number of characters actually accepted for writing. 232 */ 233static int 234sclp_tty_write(struct tty_struct *tty, const unsigned char *buf, int count) 235{ 236 if (sclp_tty_chars_count > 0) { 237 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count, 0); 238 sclp_tty_chars_count = 0; 239 } 240 return sclp_tty_write_string(buf, count, 1); 241} 242 243/* 244 * This routine is called by the kernel to write a single character to the tty 245 * device. If the kernel uses this routine, it must call the flush_chars() 246 * routine (if defined) when it is done stuffing characters into the driver. 247 * 248 * Characters provided to sclp_tty_put_char() are buffered by the SCLP driver. 249 * If the given character is a '\n' the contents of the SCLP write buffer 250 * - including previous characters from sclp_tty_put_char() and strings from 251 * sclp_write() without final '\n' - will be written. 252 */ 253static int 254sclp_tty_put_char(struct tty_struct *tty, unsigned char ch) 255{ 256 sclp_tty_chars[sclp_tty_chars_count++] = ch; 257 if (ch == '\n' || sclp_tty_chars_count >= SCLP_TTY_BUF_SIZE) { 258 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count, 0); 259 sclp_tty_chars_count = 0; 260 } 261 return 1; 262} 263 264/* 265 * This routine is called by the kernel after it has written a series of 266 * characters to the tty device using put_char(). 267 */ 268static void 269sclp_tty_flush_chars(struct tty_struct *tty) 270{ 271 if (sclp_tty_chars_count > 0) { 272 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count, 0); 273 sclp_tty_chars_count = 0; 274 } 275} 276 277/* 278 * This routine returns the number of characters in the write buffer of the 279 * SCLP driver. The provided number includes all characters that are stored 280 * in the SCCB (will be written next time the SCLP is not busy) as well as 281 * characters in the write buffer (will not be written as long as there is a 282 * final line feed missing). 283 */ 284static int 285sclp_tty_chars_in_buffer(struct tty_struct *tty) 286{ 287 unsigned long flags; 288 struct list_head *l; 289 struct sclp_buffer *t; 290 int count; 291 292 spin_lock_irqsave(&sclp_tty_lock, flags); 293 count = 0; 294 if (sclp_ttybuf != NULL) 295 count = sclp_chars_in_buffer(sclp_ttybuf); 296 list_for_each(l, &sclp_tty_outqueue) { 297 t = list_entry(l, struct sclp_buffer, list); 298 count += sclp_chars_in_buffer(t); 299 } 300 spin_unlock_irqrestore(&sclp_tty_lock, flags); 301 return count; 302} 303 304/* 305 * removes all content from buffers of low level driver 306 */ 307static void 308sclp_tty_flush_buffer(struct tty_struct *tty) 309{ 310 if (sclp_tty_chars_count > 0) { 311 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count, 0); 312 sclp_tty_chars_count = 0; 313 } 314} 315 316/* 317 * push input to tty 318 */ 319static void 320sclp_tty_input(unsigned char* buf, unsigned int count) 321{ 322 struct tty_struct *tty = tty_port_tty_get(&sclp_port); 323 unsigned int cchar; 324 325 /* 326 * If this tty driver is currently closed 327 * then throw the received input away. 328 */ 329 if (tty == NULL) 330 return; 331 cchar = ctrlchar_handle(buf, count, tty); 332 switch (cchar & CTRLCHAR_MASK) { 333 case CTRLCHAR_SYSRQ: 334 break; 335 case CTRLCHAR_CTRL: 336 tty_insert_flip_char(&sclp_port, cchar, TTY_NORMAL); 337 tty_flip_buffer_push(&sclp_port); 338 break; 339 case CTRLCHAR_NONE: 340 /* send (normal) input to line discipline */ 341 if (count < 2 || 342 (strncmp((const char *) buf + count - 2, "^n", 2) && 343 strncmp((const char *) buf + count - 2, "\252n", 2))) { 344 /* add the auto \n */ 345 tty_insert_flip_string(&sclp_port, buf, count); 346 tty_insert_flip_char(&sclp_port, '\n', TTY_NORMAL); 347 } else 348 tty_insert_flip_string(&sclp_port, buf, count - 2); 349 tty_flip_buffer_push(&sclp_port); 350 break; 351 } 352 tty_kref_put(tty); 353} 354 355/* 356 * get a EBCDIC string in upper/lower case, 357 * find out characters in lower/upper case separated by a special character, 358 * modifiy original string, 359 * returns length of resulting string 360 */ 361static int sclp_switch_cases(unsigned char *buf, int count) 362{ 363 unsigned char *ip, *op; 364 int toggle; 365 366 /* initially changing case is off */ 367 toggle = 0; 368 ip = op = buf; 369 while (count-- > 0) { 370 /* compare with special character */ 371 if (*ip == CASE_DELIMITER) { 372 /* followed by another special character? */ 373 if (count && ip[1] == CASE_DELIMITER) { 374 /* 375 * ... then put a single copy of the special 376 * character to the output string 377 */ 378 *op++ = *ip++; 379 count--; 380 } else 381 /* 382 * ... special character follower by a normal 383 * character toggles the case change behaviour 384 */ 385 toggle = ~toggle; 386 /* skip special character */ 387 ip++; 388 } else 389 /* not the special character */ 390 if (toggle) 391 /* but case switching is on */ 392 if (sclp_tty_tolower) 393 /* switch to uppercase */ 394 *op++ = _ebc_toupper[(int) *ip++]; 395 else 396 /* switch to lowercase */ 397 *op++ = _ebc_tolower[(int) *ip++]; 398 else 399 /* no case switching, copy the character */ 400 *op++ = *ip++; 401 } 402 /* return length of reformatted string. */ 403 return op - buf; 404} 405 406static void sclp_get_input(struct gds_subvector *sv) 407{ 408 unsigned char *str; 409 int count; 410 411 str = (unsigned char *) (sv + 1); 412 count = sv->length - sizeof(*sv); 413 if (sclp_tty_tolower) 414 EBC_TOLOWER(str, count); 415 count = sclp_switch_cases(str, count); 416 /* convert EBCDIC to ASCII (modify original input in SCCB) */ 417 sclp_ebcasc_str(str, count); 418 419 /* transfer input to high level driver */ 420 sclp_tty_input(str, count); 421} 422 423static inline void sclp_eval_selfdeftextmsg(struct gds_subvector *sv) 424{ 425 void *end; 426 427 end = (void *) sv + sv->length; 428 for (sv = sv + 1; (void *) sv < end; sv = (void *) sv + sv->length) 429 if (sv->key == 0x30) 430 sclp_get_input(sv); 431} 432 433static inline void sclp_eval_textcmd(struct gds_vector *v) 434{ 435 struct gds_subvector *sv; 436 void *end; 437 438 end = (void *) v + v->length; 439 for (sv = (struct gds_subvector *) (v + 1); 440 (void *) sv < end; sv = (void *) sv + sv->length) 441 if (sv->key == GDS_KEY_SELFDEFTEXTMSG) 442 sclp_eval_selfdeftextmsg(sv); 443 444} 445 446static inline void sclp_eval_cpmsu(struct gds_vector *v) 447{ 448 void *end; 449 450 end = (void *) v + v->length; 451 for (v = v + 1; (void *) v < end; v = (void *) v + v->length) 452 if (v->gds_id == GDS_ID_TEXTCMD) 453 sclp_eval_textcmd(v); 454} 455 456 457static inline void sclp_eval_mdsmu(struct gds_vector *v) 458{ 459 v = sclp_find_gds_vector(v + 1, (void *) v + v->length, GDS_ID_CPMSU); 460 if (v) 461 sclp_eval_cpmsu(v); 462} 463 464static void sclp_tty_receiver(struct evbuf_header *evbuf) 465{ 466 struct gds_vector *v; 467 468 v = sclp_find_gds_vector(evbuf + 1, (void *) evbuf + evbuf->length, 469 GDS_ID_MDSMU); 470 if (v) 471 sclp_eval_mdsmu(v); 472} 473 474static void 475sclp_tty_state_change(struct sclp_register *reg) 476{ 477} 478 479static struct sclp_register sclp_input_event = 480{ 481 .receive_mask = EVTYP_OPCMD_MASK | EVTYP_PMSGCMD_MASK, 482 .state_change_fn = sclp_tty_state_change, 483 .receiver_fn = sclp_tty_receiver 484}; 485 486static const struct tty_operations sclp_ops = { 487 .open = sclp_tty_open, 488 .close = sclp_tty_close, 489 .write = sclp_tty_write, 490 .put_char = sclp_tty_put_char, 491 .flush_chars = sclp_tty_flush_chars, 492 .write_room = sclp_tty_write_room, 493 .chars_in_buffer = sclp_tty_chars_in_buffer, 494 .flush_buffer = sclp_tty_flush_buffer, 495}; 496 497static int __init 498sclp_tty_init(void) 499{ 500 struct tty_driver *driver; 501 void *page; 502 int i; 503 int rc; 504 505 if (!CONSOLE_IS_SCLP) 506 return 0; 507 driver = alloc_tty_driver(1); 508 if (!driver) 509 return -ENOMEM; 510 511 rc = sclp_rw_init(); 512 if (rc) { 513 put_tty_driver(driver); 514 return rc; 515 } 516 /* Allocate pages for output buffering */ 517 INIT_LIST_HEAD(&sclp_tty_pages); 518 for (i = 0; i < MAX_KMEM_PAGES; i++) { 519 page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA); 520 if (page == NULL) { 521 put_tty_driver(driver); 522 return -ENOMEM; 523 } 524 list_add_tail((struct list_head *) page, &sclp_tty_pages); 525 } 526 INIT_LIST_HEAD(&sclp_tty_outqueue); 527 spin_lock_init(&sclp_tty_lock); 528 timer_setup(&sclp_tty_timer, sclp_tty_timeout, 0); 529 sclp_ttybuf = NULL; 530 sclp_tty_buffer_count = 0; 531 if (MACHINE_IS_VM) { 532 /* 533 * save 4 characters for the CPU number 534 * written at start of each line by VM/CP 535 */ 536 sclp_tty_columns = 76; 537 /* case input lines to lowercase */ 538 sclp_tty_tolower = 1; 539 } 540 sclp_tty_chars_count = 0; 541 542 rc = sclp_register(&sclp_input_event); 543 if (rc) { 544 put_tty_driver(driver); 545 return rc; 546 } 547 548 tty_port_init(&sclp_port); 549 550 driver->driver_name = "sclp_line"; 551 driver->name = "sclp_line"; 552 driver->major = TTY_MAJOR; 553 driver->minor_start = 64; 554 driver->type = TTY_DRIVER_TYPE_SYSTEM; 555 driver->subtype = SYSTEM_TYPE_TTY; 556 driver->init_termios = tty_std_termios; 557 driver->init_termios.c_iflag = IGNBRK | IGNPAR; 558 driver->init_termios.c_oflag = ONLCR; 559 driver->init_termios.c_lflag = ISIG | ECHO; 560 driver->flags = TTY_DRIVER_REAL_RAW; 561 tty_set_operations(driver, &sclp_ops); 562 tty_port_link_device(&sclp_port, driver, 0); 563 rc = tty_register_driver(driver); 564 if (rc) { 565 put_tty_driver(driver); 566 tty_port_destroy(&sclp_port); 567 return rc; 568 } 569 sclp_tty_driver = driver; 570 return 0; 571} 572device_initcall(sclp_tty_init);