diff options
author | Hendrik Brueckner <brueckner@linux.vnet.ibm.com> | 2017-12-04 04:56:45 -0500 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2017-12-05 09:02:41 -0500 |
commit | 466698e654e8931945301ea999feb6bd4bfaf849 (patch) | |
tree | 8cb41d1ca11de90b460984e8142e30a3903938a5 | |
parent | c895f6f703ad7dd2f99e751d9884b0aa5d0eea25 (diff) |
s390/bpf: correct broken uapi for BPF_PROG_TYPE_PERF_EVENT program type
To mitigate and correct the broken uapi for the BPF_PROG_TYPE_PERF_EVENT
program type, introduce a user_pt_regs structure (similar to arm64) that
exports parts from the beginnig of the pt_regs structure.
The export must start with the beginning of the pt_regs structure because
to correctly calculate BPF prologues for perf (regs_query_register_offset()).
For BPF_PROG_TYPE_PERF_EVENT program types, the BPF program is then passed
a user_pt_regs structure.
Note: Depending on future changes to the s390 pt_regs structure, consider
the user_pt_regs structure to be stable for a particular kernel version
only. (Of course, s390 tries to ensure keep it stable as much as possible.)
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Reviewed-and-tested-by: Thomas Richter <tmricht@linux.vnet.ibm.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r-- | arch/s390/include/asm/perf_event.h | 1 | ||||
-rw-r--r-- | arch/s390/include/asm/ptrace.h | 11 | ||||
-rw-r--r-- | arch/s390/include/uapi/asm/bpf_perf_event.h | 9 | ||||
-rw-r--r-- | arch/s390/include/uapi/asm/ptrace.h | 11 |
4 files changed, 29 insertions, 3 deletions
diff --git a/arch/s390/include/asm/perf_event.h b/arch/s390/include/asm/perf_event.h index d6c9d1e0dc2d..b9c0e361748b 100644 --- a/arch/s390/include/asm/perf_event.h +++ b/arch/s390/include/asm/perf_event.h | |||
@@ -40,6 +40,7 @@ struct pt_regs; | |||
40 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); | 40 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); |
41 | extern unsigned long perf_misc_flags(struct pt_regs *regs); | 41 | extern unsigned long perf_misc_flags(struct pt_regs *regs); |
42 | #define perf_misc_flags(regs) perf_misc_flags(regs) | 42 | #define perf_misc_flags(regs) perf_misc_flags(regs) |
43 | #define perf_arch_bpf_user_pt_regs(regs) ®s->user_regs | ||
43 | 44 | ||
44 | /* Perf pt_regs extension for sample-data-entry indicators */ | 45 | /* Perf pt_regs extension for sample-data-entry indicators */ |
45 | struct perf_sf_sde_regs { | 46 | struct perf_sf_sde_regs { |
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h index a3788dafc0e1..6f70d81c40f2 100644 --- a/arch/s390/include/asm/ptrace.h +++ b/arch/s390/include/asm/ptrace.h | |||
@@ -74,9 +74,14 @@ enum { | |||
74 | */ | 74 | */ |
75 | struct pt_regs | 75 | struct pt_regs |
76 | { | 76 | { |
77 | unsigned long args[1]; | 77 | union { |
78 | psw_t psw; | 78 | user_pt_regs user_regs; |
79 | unsigned long gprs[NUM_GPRS]; | 79 | struct { |
80 | unsigned long args[1]; | ||
81 | psw_t psw; | ||
82 | unsigned long gprs[NUM_GPRS]; | ||
83 | }; | ||
84 | }; | ||
80 | unsigned long orig_gpr2; | 85 | unsigned long orig_gpr2; |
81 | unsigned int int_code; | 86 | unsigned int int_code; |
82 | unsigned int int_parm; | 87 | unsigned int int_parm; |
diff --git a/arch/s390/include/uapi/asm/bpf_perf_event.h b/arch/s390/include/uapi/asm/bpf_perf_event.h new file mode 100644 index 000000000000..cefe7c7cd4f6 --- /dev/null +++ b/arch/s390/include/uapi/asm/bpf_perf_event.h | |||
@@ -0,0 +1,9 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | ||
2 | #ifndef _UAPI__ASM_BPF_PERF_EVENT_H__ | ||
3 | #define _UAPI__ASM_BPF_PERF_EVENT_H__ | ||
4 | |||
5 | #include <asm/ptrace.h> | ||
6 | |||
7 | typedef user_pt_regs bpf_user_pt_regs_t; | ||
8 | |||
9 | #endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */ | ||
diff --git a/arch/s390/include/uapi/asm/ptrace.h b/arch/s390/include/uapi/asm/ptrace.h index 0d23c8ff2900..70f7cb2e5e50 100644 --- a/arch/s390/include/uapi/asm/ptrace.h +++ b/arch/s390/include/uapi/asm/ptrace.h | |||
@@ -291,6 +291,17 @@ typedef struct | |||
291 | } s390_regs; | 291 | } s390_regs; |
292 | 292 | ||
293 | /* | 293 | /* |
294 | * The user_pt_regs structure exports the beginning of | ||
295 | * the in-kernel pt_regs structure to user space. | ||
296 | */ | ||
297 | typedef struct | ||
298 | { | ||
299 | unsigned long args[1]; | ||
300 | psw_t psw; | ||
301 | unsigned long gprs[NUM_GPRS]; | ||
302 | } user_pt_regs; | ||
303 | |||
304 | /* | ||
294 | * Now for the user space program event recording (trace) definitions. | 305 | * Now for the user space program event recording (trace) definitions. |
295 | * The following structures are used only for the ptrace interface, don't | 306 | * The following structures are used only for the ptrace interface, don't |
296 | * touch or even look at it if you don't want to modify the user-space | 307 | * touch or even look at it if you don't want to modify the user-space |