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

[S390] sclp: event buffer dissection

Move gds vector/subvector find functions to the sclp header file.
Simplify event buffer dissection in sclp tty code.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

+61 -85
+22
drivers/s390/char/sclp.h
··· 186 186 (MACHINE_IS_VM) ? ASCEBC(str, nr) : ASCEBC_500(str, nr); 187 187 } 188 188 189 + static inline struct gds_vector * 190 + sclp_find_gds_vector(void *start, void *end, u16 id) 191 + { 192 + struct gds_vector *v; 193 + 194 + for (v = start; (void *) v < end; v = (void *) v + v->length) 195 + if (v->gds_id == id) 196 + return v; 197 + return NULL; 198 + } 199 + 200 + static inline struct gds_subvector * 201 + sclp_find_gds_subvector(void *start, void *end, u8 key) 202 + { 203 + struct gds_subvector *sv; 204 + 205 + for (sv = start; (void *) sv < end; sv = (void *) sv + sv->length) 206 + if (sv->key == key) 207 + return sv; 208 + return NULL; 209 + } 210 + 189 211 #endif /* __SCLP_H__ */
+39 -85
drivers/s390/char/sclp_tty.c
··· 408 408 return op - buf; 409 409 } 410 410 411 - static void 412 - sclp_get_input(unsigned char *start, unsigned char *end) 411 + static void sclp_get_input(struct gds_subvector *sv) 413 412 { 413 + unsigned char *str; 414 414 int count; 415 415 416 - count = end - start; 416 + str = (unsigned char *) (sv + 1); 417 + count = sv->length - sizeof(*sv); 417 418 if (sclp_tty_tolower) 418 - EBC_TOLOWER(start, count); 419 - count = sclp_switch_cases(start, count); 419 + EBC_TOLOWER(str, count); 420 + count = sclp_switch_cases(str, count); 420 421 /* convert EBCDIC to ASCII (modify original input in SCCB) */ 421 - sclp_ebcasc_str(start, count); 422 + sclp_ebcasc_str(str, count); 422 423 423 424 /* transfer input to high level driver */ 424 - sclp_tty_input(start, count); 425 + sclp_tty_input(str, count); 425 426 } 426 427 427 - static inline struct gds_vector * 428 - find_gds_vector(struct gds_vector *start, struct gds_vector *end, u16 id) 428 + static inline void sclp_eval_selfdeftextmsg(struct gds_subvector *sv) 429 429 { 430 - struct gds_vector *vec; 430 + void *end; 431 431 432 - for (vec = start; vec < end; vec = (void *) vec + vec->length) 433 - if (vec->gds_id == id) 434 - return vec; 435 - return NULL; 432 + end = (void *) sv + sv->length; 433 + for (sv = sv + 1; (void *) sv < end; sv = (void *) sv + sv->length) 434 + if (sv->key == 0x30) 435 + sclp_get_input(sv); 436 436 } 437 437 438 - static inline struct gds_subvector * 439 - find_gds_subvector(struct gds_subvector *start, 440 - struct gds_subvector *end, u8 key) 438 + static inline void sclp_eval_textcmd(struct gds_vector *v) 441 439 { 442 - struct gds_subvector *subvec; 440 + struct gds_subvector *sv; 441 + void *end; 443 442 444 - for (subvec = start; subvec < end; 445 - subvec = (void *) subvec + subvec->length) 446 - if (subvec->key == key) 447 - return subvec; 448 - return NULL; 443 + end = (void *) v + v->length; 444 + for (sv = (struct gds_subvector *) (v + 1); 445 + (void *) sv < end; sv = (void *) sv + sv->length) 446 + if (sv->key == GDS_KEY_SELFDEFTEXTMSG) 447 + sclp_eval_selfdeftextmsg(sv); 448 + 449 449 } 450 450 451 - static inline void 452 - sclp_eval_selfdeftextmsg(struct gds_subvector *start, 453 - struct gds_subvector *end) 451 + static inline void sclp_eval_cpmsu(struct gds_vector *v) 454 452 { 455 - struct gds_subvector *subvec; 453 + void *end; 456 454 457 - subvec = start; 458 - while (subvec < end) { 459 - subvec = find_gds_subvector(subvec, end, 0x30); 460 - if (!subvec) 461 - break; 462 - sclp_get_input((unsigned char *)(subvec + 1), 463 - (unsigned char *) subvec + subvec->length); 464 - subvec = (void *) subvec + subvec->length; 465 - } 466 - } 467 - 468 - static inline void 469 - sclp_eval_textcmd(struct gds_subvector *start, 470 - struct gds_subvector *end) 471 - { 472 - struct gds_subvector *subvec; 473 - 474 - subvec = start; 475 - while (subvec < end) { 476 - subvec = find_gds_subvector(subvec, end, 477 - GDS_KEY_SELFDEFTEXTMSG); 478 - if (!subvec) 479 - break; 480 - sclp_eval_selfdeftextmsg((struct gds_subvector *)(subvec + 1), 481 - (void *)subvec + subvec->length); 482 - subvec = (void *) subvec + subvec->length; 483 - } 484 - } 485 - 486 - static inline void 487 - sclp_eval_cpmsu(struct gds_vector *start, struct gds_vector *end) 488 - { 489 - struct gds_vector *vec; 490 - 491 - vec = start; 492 - while (vec < end) { 493 - vec = find_gds_vector(vec, end, GDS_ID_TEXTCMD); 494 - if (!vec) 495 - break; 496 - sclp_eval_textcmd((struct gds_subvector *)(vec + 1), 497 - (void *) vec + vec->length); 498 - vec = (void *) vec + vec->length; 499 - } 455 + end = (void *) v + v->length; 456 + for (v = v + 1; (void *) v < end; v = (void *) v + v->length) 457 + if (v->gds_id == GDS_ID_TEXTCMD) 458 + sclp_eval_textcmd(v); 500 459 } 501 460 502 461 503 - static inline void 504 - sclp_eval_mdsmu(struct gds_vector *start, void *end) 462 + static inline void sclp_eval_mdsmu(struct gds_vector *v) 505 463 { 506 - struct gds_vector *vec; 507 - 508 - vec = find_gds_vector(start, end, GDS_ID_CPMSU); 509 - if (vec) 510 - sclp_eval_cpmsu(vec + 1, (void *) vec + vec->length); 464 + v = sclp_find_gds_vector(v + 1, (void *) v + v->length, GDS_ID_CPMSU); 465 + if (v) 466 + sclp_eval_cpmsu(v); 511 467 } 512 468 513 - static void 514 - sclp_tty_receiver(struct evbuf_header *evbuf) 469 + static void sclp_tty_receiver(struct evbuf_header *evbuf) 515 470 { 516 - struct gds_vector *start, *end, *vec; 471 + struct gds_vector *v; 517 472 518 - start = (struct gds_vector *)(evbuf + 1); 519 - end = (void *) evbuf + evbuf->length; 520 - vec = find_gds_vector(start, end, GDS_ID_MDSMU); 521 - if (vec) 522 - sclp_eval_mdsmu(vec + 1, (void *) vec + vec->length); 473 + v = sclp_find_gds_vector(evbuf + 1, (void *) evbuf + evbuf->length, 474 + GDS_ID_MDSMU); 475 + if (v) 476 + sclp_eval_mdsmu(v); 523 477 } 524 478 525 479 static void