Commit 30c2df51173ea4e4755ad52be7f2914f01e32404

Authored by Martin Schwidefsky
1 parent fca894edd7

[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>

Showing 2 changed files with 60 additions and 84 deletions Side-by-side Diff

drivers/s390/char/sclp.h
... ... @@ -186,5 +186,27 @@
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__ */
drivers/s390/char/sclp_tty.c
... ... @@ -408,118 +408,72 @@
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;
449   -}
  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);
450 448  
451   -static inline void
452   -sclp_eval_selfdeftextmsg(struct gds_subvector *start,
453   - struct gds_subvector *end)
454   -{
455   - struct gds_subvector *subvec;
456   -
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 449 }
467 450  
468   -static inline void
469   -sclp_eval_textcmd(struct gds_subvector *start,
470   - struct gds_subvector *end)
  451 +static inline void sclp_eval_cpmsu(struct gds_vector *v)
471 452 {
472   - struct gds_subvector *subvec;
  453 + void *end;
473 454  
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   - }
  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);
484 459 }
485 460  
486   -static inline void
487   -sclp_eval_cpmsu(struct gds_vector *start, struct gds_vector *end)
488   -{
489   - struct gds_vector *vec;
490 461  
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   - }
500   -}
501   -
502   -
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