diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-05-02 12:25:32 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-05-02 12:25:32 -0400 |
| commit | b28e4f08d43beca4ac8ba2f768f4aaa8b056c4cf (patch) | |
| tree | a80ab6bd7587948a028cc9c689339c4bfb57b7f2 | |
| parent | b7270cce7db770602510043b212992d839fd25a6 (diff) | |
| parent | 6e0de817594c61f3b392a9245deeb09609ec707d (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 fixes from Martin Schwidefsky:
"Two bug fixes, one to fix a potential information leak in the BPF jit
and common-io-layer fix for old firmware levels"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/bpf,jit: initialize A register if 1st insn is BPF_S_LDX_B_MSH
s390/chsc: fix SEI usage on old FW levels
| -rw-r--r-- | arch/s390/net/bpf_jit_comp.c | 1 | ||||
| -rw-r--r-- | drivers/s390/cio/chsc.c | 22 |
2 files changed, 17 insertions, 6 deletions
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 9c36dc398f90..452d3ebd9d0f 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
| @@ -276,7 +276,6 @@ static void bpf_jit_noleaks(struct bpf_jit *jit, struct sock_filter *filter) | |||
| 276 | case BPF_S_LD_W_IND: | 276 | case BPF_S_LD_W_IND: |
| 277 | case BPF_S_LD_H_IND: | 277 | case BPF_S_LD_H_IND: |
| 278 | case BPF_S_LD_B_IND: | 278 | case BPF_S_LD_B_IND: |
| 279 | case BPF_S_LDX_B_MSH: | ||
| 280 | case BPF_S_LD_IMM: | 279 | case BPF_S_LD_IMM: |
| 281 | case BPF_S_LD_MEM: | 280 | case BPF_S_LD_MEM: |
| 282 | case BPF_S_MISC_TXA: | 281 | case BPF_S_MISC_TXA: |
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 9f0ea6cb6922..e3bf885f4a6c 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
| @@ -541,18 +541,27 @@ static void chsc_process_sei_nt0(struct chsc_sei_nt0_area *sei_area) | |||
| 541 | 541 | ||
| 542 | static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) | 542 | static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) |
| 543 | { | 543 | { |
| 544 | do { | 544 | static int ntsm_unsupported; |
| 545 | |||
| 546 | while (true) { | ||
| 545 | memset(sei, 0, sizeof(*sei)); | 547 | memset(sei, 0, sizeof(*sei)); |
| 546 | sei->request.length = 0x0010; | 548 | sei->request.length = 0x0010; |
| 547 | sei->request.code = 0x000e; | 549 | sei->request.code = 0x000e; |
| 548 | sei->ntsm = ntsm; | 550 | if (!ntsm_unsupported) |
| 551 | sei->ntsm = ntsm; | ||
| 549 | 552 | ||
| 550 | if (chsc(sei)) | 553 | if (chsc(sei)) |
| 551 | break; | 554 | break; |
| 552 | 555 | ||
| 553 | if (sei->response.code != 0x0001) { | 556 | if (sei->response.code != 0x0001) { |
| 554 | CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n", | 557 | CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x, ntsm=%llx)\n", |
| 555 | sei->response.code); | 558 | sei->response.code, sei->ntsm); |
| 559 | |||
| 560 | if (sei->response.code == 3 && sei->ntsm) { | ||
| 561 | /* Fallback for old firmware. */ | ||
| 562 | ntsm_unsupported = 1; | ||
| 563 | continue; | ||
| 564 | } | ||
| 556 | break; | 565 | break; |
| 557 | } | 566 | } |
| 558 | 567 | ||
| @@ -568,7 +577,10 @@ static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) | |||
| 568 | CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); | 577 | CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); |
| 569 | break; | 578 | break; |
| 570 | } | 579 | } |
| 571 | } while (sei->u.nt0_area.flags & 0x80); | 580 | |
| 581 | if (!(sei->u.nt0_area.flags & 0x80)) | ||
| 582 | break; | ||
| 583 | } | ||
| 572 | } | 584 | } |
| 573 | 585 | ||
| 574 | /* | 586 | /* |
