diff options
47 files changed, 668 insertions, 79 deletions
diff --git a/arch/alpha/include/uapi/asm/Kbuild b/arch/alpha/include/uapi/asm/Kbuild index b15bf6bc0e94..14a2e9af97e9 100644 --- a/arch/alpha/include/uapi/asm/Kbuild +++ b/arch/alpha/include/uapi/asm/Kbuild | |||
| @@ -1,2 +1,4 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | |||
| 4 | generic-y += bpf_perf_event.h | ||
diff --git a/arch/arc/include/uapi/asm/Kbuild b/arch/arc/include/uapi/asm/Kbuild index fa6d0ff4ff89..170b5db64afe 100644 --- a/arch/arc/include/uapi/asm/Kbuild +++ b/arch/arc/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
diff --git a/arch/arm/include/uapi/asm/Kbuild b/arch/arm/include/uapi/asm/Kbuild index 4d53de308ee0..4d1cc1847edf 100644 --- a/arch/arm/include/uapi/asm/Kbuild +++ b/arch/arm/include/uapi/asm/Kbuild | |||
| @@ -7,6 +7,7 @@ generated-y += unistd-oabi.h | |||
| 7 | generated-y += unistd-eabi.h | 7 | generated-y += unistd-eabi.h |
| 8 | 8 | ||
| 9 | generic-y += bitsperlong.h | 9 | generic-y += bitsperlong.h |
| 10 | generic-y += bpf_perf_event.h | ||
| 10 | generic-y += errno.h | 11 | generic-y += errno.h |
| 11 | generic-y += ioctl.h | 12 | generic-y += ioctl.h |
| 12 | generic-y += ipcbuf.h | 13 | generic-y += ipcbuf.h |
diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h index 8d5cbec17d80..f9ccc36d3dc3 100644 --- a/arch/arm64/include/asm/perf_event.h +++ b/arch/arm64/include/asm/perf_event.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #define __ASM_PERF_EVENT_H | 18 | #define __ASM_PERF_EVENT_H |
| 19 | 19 | ||
| 20 | #include <asm/stack_pointer.h> | 20 | #include <asm/stack_pointer.h> |
| 21 | #include <asm/ptrace.h> | ||
| 21 | 22 | ||
| 22 | #define ARMV8_PMU_MAX_COUNTERS 32 | 23 | #define ARMV8_PMU_MAX_COUNTERS 32 |
| 23 | #define ARMV8_PMU_COUNTER_MASK (ARMV8_PMU_MAX_COUNTERS - 1) | 24 | #define ARMV8_PMU_COUNTER_MASK (ARMV8_PMU_MAX_COUNTERS - 1) |
| @@ -79,6 +80,7 @@ struct pt_regs; | |||
| 79 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); | 80 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); |
| 80 | extern unsigned long perf_misc_flags(struct pt_regs *regs); | 81 | extern unsigned long perf_misc_flags(struct pt_regs *regs); |
| 81 | #define perf_misc_flags(regs) perf_misc_flags(regs) | 82 | #define perf_misc_flags(regs) perf_misc_flags(regs) |
| 83 | #define perf_arch_bpf_user_pt_regs(regs) ®s->user_regs | ||
| 82 | #endif | 84 | #endif |
| 83 | 85 | ||
| 84 | #define perf_arch_fetch_caller_regs(regs, __ip) { \ | 86 | #define perf_arch_fetch_caller_regs(regs, __ip) { \ |
diff --git a/arch/arm64/include/uapi/asm/bpf_perf_event.h b/arch/arm64/include/uapi/asm/bpf_perf_event.h new file mode 100644 index 000000000000..b551b741653d --- /dev/null +++ b/arch/arm64/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 struct user_pt_regs bpf_user_pt_regs_t; | ||
| 8 | |||
| 9 | #endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */ | ||
diff --git a/arch/blackfin/include/uapi/asm/Kbuild b/arch/blackfin/include/uapi/asm/Kbuild index aa624b4ab655..2240b38c2915 100644 --- a/arch/blackfin/include/uapi/asm/Kbuild +++ b/arch/blackfin/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += ioctl.h | 8 | generic-y += ioctl.h |
| 8 | generic-y += ipcbuf.h | 9 | generic-y += ipcbuf.h |
diff --git a/arch/c6x/include/uapi/asm/Kbuild b/arch/c6x/include/uapi/asm/Kbuild index 67ee896a76a7..26644e15d854 100644 --- a/arch/c6x/include/uapi/asm/Kbuild +++ b/arch/c6x/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
diff --git a/arch/cris/include/uapi/asm/Kbuild b/arch/cris/include/uapi/asm/Kbuild index 3687b54bb18e..3470c6e9c7b9 100644 --- a/arch/cris/include/uapi/asm/Kbuild +++ b/arch/cris/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
diff --git a/arch/frv/include/uapi/asm/Kbuild b/arch/frv/include/uapi/asm/Kbuild index b15bf6bc0e94..14a2e9af97e9 100644 --- a/arch/frv/include/uapi/asm/Kbuild +++ b/arch/frv/include/uapi/asm/Kbuild | |||
| @@ -1,2 +1,4 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | |||
| 4 | generic-y += bpf_perf_event.h | ||
diff --git a/arch/h8300/include/uapi/asm/Kbuild b/arch/h8300/include/uapi/asm/Kbuild index 187aed820e71..2f65f78792cb 100644 --- a/arch/h8300/include/uapi/asm/Kbuild +++ b/arch/h8300/include/uapi/asm/Kbuild | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bpf_perf_event.h | ||
| 5 | generic-y += errno.h | 6 | generic-y += errno.h |
| 6 | generic-y += fcntl.h | 7 | generic-y += fcntl.h |
| 7 | generic-y += ioctl.h | 8 | generic-y += ioctl.h |
diff --git a/arch/hexagon/include/uapi/asm/Kbuild b/arch/hexagon/include/uapi/asm/Kbuild index cb5df3aad3a8..41a176dbb53e 100644 --- a/arch/hexagon/include/uapi/asm/Kbuild +++ b/arch/hexagon/include/uapi/asm/Kbuild | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bpf_perf_event.h | ||
| 5 | generic-y += errno.h | 6 | generic-y += errno.h |
| 6 | generic-y += fcntl.h | 7 | generic-y += fcntl.h |
| 7 | generic-y += ioctl.h | 8 | generic-y += ioctl.h |
diff --git a/arch/ia64/include/uapi/asm/Kbuild b/arch/ia64/include/uapi/asm/Kbuild index 13a97aa2285f..f5c6967a93bb 100644 --- a/arch/ia64/include/uapi/asm/Kbuild +++ b/arch/ia64/include/uapi/asm/Kbuild | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += kvm_para.h | 5 | generic-y += kvm_para.h |
diff --git a/arch/m32r/include/uapi/asm/Kbuild b/arch/m32r/include/uapi/asm/Kbuild index 1c44d3b3eba0..451bf6071c6e 100644 --- a/arch/m32r/include/uapi/asm/Kbuild +++ b/arch/m32r/include/uapi/asm/Kbuild | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += kvm_para.h | 5 | generic-y += kvm_para.h |
| 5 | generic-y += siginfo.h | 6 | generic-y += siginfo.h |
diff --git a/arch/m68k/include/uapi/asm/Kbuild b/arch/m68k/include/uapi/asm/Kbuild index 3717b64a620d..c2e26a44c482 100644 --- a/arch/m68k/include/uapi/asm/Kbuild +++ b/arch/m68k/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += ioctl.h | 8 | generic-y += ioctl.h |
| 8 | generic-y += ipcbuf.h | 9 | generic-y += ipcbuf.h |
diff --git a/arch/metag/include/uapi/asm/Kbuild b/arch/metag/include/uapi/asm/Kbuild index 6ac763d9a3e3..f9eaf07d29f8 100644 --- a/arch/metag/include/uapi/asm/Kbuild +++ b/arch/metag/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
diff --git a/arch/microblaze/include/uapi/asm/Kbuild b/arch/microblaze/include/uapi/asm/Kbuild index 06609ca36115..2c6a6bffea32 100644 --- a/arch/microblaze/include/uapi/asm/Kbuild +++ b/arch/microblaze/include/uapi/asm/Kbuild | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bitsperlong.h | 4 | generic-y += bitsperlong.h |
| 5 | generic-y += bpf_perf_event.h | ||
| 5 | generic-y += errno.h | 6 | generic-y += errno.h |
| 6 | generic-y += fcntl.h | 7 | generic-y += fcntl.h |
| 7 | generic-y += ioctl.h | 8 | generic-y += ioctl.h |
diff --git a/arch/mips/include/uapi/asm/Kbuild b/arch/mips/include/uapi/asm/Kbuild index a0266feba9e6..7a4becd8963a 100644 --- a/arch/mips/include/uapi/asm/Kbuild +++ b/arch/mips/include/uapi/asm/Kbuild | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += ipcbuf.h | 5 | generic-y += ipcbuf.h |
diff --git a/arch/mn10300/include/uapi/asm/Kbuild b/arch/mn10300/include/uapi/asm/Kbuild index c94ee54210bc..81271d3af47c 100644 --- a/arch/mn10300/include/uapi/asm/Kbuild +++ b/arch/mn10300/include/uapi/asm/Kbuild | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += siginfo.h | 5 | generic-y += siginfo.h |
diff --git a/arch/nios2/include/uapi/asm/Kbuild b/arch/nios2/include/uapi/asm/Kbuild index ffca24da7647..13a3d77b4d7b 100644 --- a/arch/nios2/include/uapi/asm/Kbuild +++ b/arch/nios2/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
diff --git a/arch/openrisc/include/uapi/asm/Kbuild b/arch/openrisc/include/uapi/asm/Kbuild index 62286dbeb904..130c16ccba0a 100644 --- a/arch/openrisc/include/uapi/asm/Kbuild +++ b/arch/openrisc/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
diff --git a/arch/parisc/include/uapi/asm/Kbuild b/arch/parisc/include/uapi/asm/Kbuild index 196d2a4efb31..286ef5a5904b 100644 --- a/arch/parisc/include/uapi/asm/Kbuild +++ b/arch/parisc/include/uapi/asm/Kbuild | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bpf_perf_event.h | ||
| 5 | generic-y += kvm_para.h | 6 | generic-y += kvm_para.h |
| 6 | generic-y += param.h | 7 | generic-y += param.h |
| 7 | generic-y += poll.h | 8 | generic-y += poll.h |
diff --git a/arch/powerpc/include/uapi/asm/Kbuild b/arch/powerpc/include/uapi/asm/Kbuild index 0d960ef78a9a..1a6ed5919ffd 100644 --- a/arch/powerpc/include/uapi/asm/Kbuild +++ b/arch/powerpc/include/uapi/asm/Kbuild | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += param.h | 5 | generic-y += param.h |
| 5 | generic-y += poll.h | 6 | generic-y += poll.h |
| 6 | generic-y += resource.h | 7 | generic-y += resource.h |
diff --git a/arch/riscv/include/uapi/asm/Kbuild b/arch/riscv/include/uapi/asm/Kbuild index 5ded96b06352..7e91f4850475 100644 --- a/arch/riscv/include/uapi/asm/Kbuild +++ b/arch/riscv/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += setup.h | 4 | generic-y += setup.h |
| 5 | generic-y += unistd.h | 5 | generic-y += unistd.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
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..543dd70e12c8 100644 --- a/arch/s390/include/uapi/asm/ptrace.h +++ b/arch/s390/include/uapi/asm/ptrace.h | |||
| @@ -162,7 +162,7 @@ | |||
| 162 | #define GPR_SIZE 8 | 162 | #define GPR_SIZE 8 |
| 163 | #define CR_SIZE 8 | 163 | #define CR_SIZE 8 |
| 164 | 164 | ||
| 165 | #define STACK_FRAME_OVERHEAD 160 /* size of minimum stack frame */ | 165 | #define STACK_FRAME_OVERHEAD 160 /* size of minimum stack frame */ |
| 166 | 166 | ||
| 167 | #endif /* __s390x__ */ | 167 | #endif /* __s390x__ */ |
| 168 | 168 | ||
| @@ -179,17 +179,16 @@ | |||
| 179 | #define ACR_SIZE 4 | 179 | #define ACR_SIZE 4 |
| 180 | 180 | ||
| 181 | 181 | ||
| 182 | #define PTRACE_OLDSETOPTIONS 21 | 182 | #define PTRACE_OLDSETOPTIONS 21 |
| 183 | 183 | ||
| 184 | #ifndef __ASSEMBLY__ | 184 | #ifndef __ASSEMBLY__ |
| 185 | #include <linux/stddef.h> | 185 | #include <linux/stddef.h> |
| 186 | #include <linux/types.h> | 186 | #include <linux/types.h> |
| 187 | 187 | ||
| 188 | typedef union | 188 | typedef union { |
| 189 | { | 189 | float f; |
| 190 | float f; | 190 | double d; |
| 191 | double d; | 191 | __u64 ui; |
| 192 | __u64 ui; | ||
| 193 | struct | 192 | struct |
| 194 | { | 193 | { |
| 195 | __u32 hi; | 194 | __u32 hi; |
| @@ -197,23 +196,21 @@ typedef union | |||
| 197 | } fp; | 196 | } fp; |
| 198 | } freg_t; | 197 | } freg_t; |
| 199 | 198 | ||
| 200 | typedef struct | 199 | typedef struct { |
| 201 | { | 200 | __u32 fpc; |
| 202 | __u32 fpc; | ||
| 203 | __u32 pad; | 201 | __u32 pad; |
| 204 | freg_t fprs[NUM_FPRS]; | 202 | freg_t fprs[NUM_FPRS]; |
| 205 | } s390_fp_regs; | 203 | } s390_fp_regs; |
| 206 | 204 | ||
| 207 | #define FPC_EXCEPTION_MASK 0xF8000000 | 205 | #define FPC_EXCEPTION_MASK 0xF8000000 |
| 208 | #define FPC_FLAGS_MASK 0x00F80000 | 206 | #define FPC_FLAGS_MASK 0x00F80000 |
| 209 | #define FPC_DXC_MASK 0x0000FF00 | 207 | #define FPC_DXC_MASK 0x0000FF00 |
| 210 | #define FPC_RM_MASK 0x00000003 | 208 | #define FPC_RM_MASK 0x00000003 |
| 211 | 209 | ||
| 212 | /* this typedef defines how a Program Status Word looks like */ | 210 | /* this typedef defines how a Program Status Word looks like */ |
| 213 | typedef struct | 211 | typedef struct { |
| 214 | { | 212 | unsigned long mask; |
| 215 | unsigned long mask; | 213 | unsigned long addr; |
| 216 | unsigned long addr; | ||
| 217 | } __attribute__ ((aligned(8))) psw_t; | 214 | } __attribute__ ((aligned(8))) psw_t; |
| 218 | 215 | ||
| 219 | #ifndef __s390x__ | 216 | #ifndef __s390x__ |
| @@ -282,8 +279,7 @@ typedef struct | |||
| 282 | /* | 279 | /* |
| 283 | * The s390_regs structure is used to define the elf_gregset_t. | 280 | * The s390_regs structure is used to define the elf_gregset_t. |
| 284 | */ | 281 | */ |
| 285 | typedef struct | 282 | typedef struct { |
| 286 | { | ||
| 287 | psw_t psw; | 283 | psw_t psw; |
| 288 | unsigned long gprs[NUM_GPRS]; | 284 | unsigned long gprs[NUM_GPRS]; |
| 289 | unsigned int acrs[NUM_ACRS]; | 285 | unsigned int acrs[NUM_ACRS]; |
| @@ -291,24 +287,32 @@ typedef struct | |||
| 291 | } s390_regs; | 287 | } s390_regs; |
| 292 | 288 | ||
| 293 | /* | 289 | /* |
| 290 | * The user_pt_regs structure exports the beginning of | ||
| 291 | * the in-kernel pt_regs structure to user space. | ||
| 292 | */ | ||
| 293 | typedef struct { | ||
| 294 | unsigned long args[1]; | ||
| 295 | psw_t psw; | ||
| 296 | unsigned long gprs[NUM_GPRS]; | ||
| 297 | } user_pt_regs; | ||
| 298 | |||
| 299 | /* | ||
| 294 | * Now for the user space program event recording (trace) definitions. | 300 | * Now for the user space program event recording (trace) definitions. |
| 295 | * The following structures are used only for the ptrace interface, don't | 301 | * 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 | 302 | * touch or even look at it if you don't want to modify the user-space |
| 297 | * ptrace interface. In particular stay away from it for in-kernel PER. | 303 | * ptrace interface. In particular stay away from it for in-kernel PER. |
| 298 | */ | 304 | */ |
| 299 | typedef struct | 305 | typedef struct { |
| 300 | { | ||
| 301 | unsigned long cr[NUM_CR_WORDS]; | 306 | unsigned long cr[NUM_CR_WORDS]; |
| 302 | } per_cr_words; | 307 | } per_cr_words; |
| 303 | 308 | ||
| 304 | #define PER_EM_MASK 0xE8000000UL | 309 | #define PER_EM_MASK 0xE8000000UL |
| 305 | 310 | ||
| 306 | typedef struct | 311 | typedef struct { |
| 307 | { | ||
| 308 | #ifdef __s390x__ | 312 | #ifdef __s390x__ |
| 309 | unsigned : 32; | 313 | unsigned : 32; |
| 310 | #endif /* __s390x__ */ | 314 | #endif /* __s390x__ */ |
| 311 | unsigned em_branching : 1; | 315 | unsigned em_branching : 1; |
| 312 | unsigned em_instruction_fetch : 1; | 316 | unsigned em_instruction_fetch : 1; |
| 313 | /* | 317 | /* |
| 314 | * Switching on storage alteration automatically fixes | 318 | * Switching on storage alteration automatically fixes |
| @@ -317,44 +321,41 @@ typedef struct | |||
| 317 | unsigned em_storage_alteration : 1; | 321 | unsigned em_storage_alteration : 1; |
| 318 | unsigned em_gpr_alt_unused : 1; | 322 | unsigned em_gpr_alt_unused : 1; |
| 319 | unsigned em_store_real_address : 1; | 323 | unsigned em_store_real_address : 1; |
| 320 | unsigned : 3; | 324 | unsigned : 3; |
| 321 | unsigned branch_addr_ctl : 1; | 325 | unsigned branch_addr_ctl : 1; |
| 322 | unsigned : 1; | 326 | unsigned : 1; |
| 323 | unsigned storage_alt_space_ctl : 1; | 327 | unsigned storage_alt_space_ctl : 1; |
| 324 | unsigned : 21; | 328 | unsigned : 21; |
| 325 | unsigned long starting_addr; | 329 | unsigned long starting_addr; |
| 326 | unsigned long ending_addr; | 330 | unsigned long ending_addr; |
| 327 | } per_cr_bits; | 331 | } per_cr_bits; |
| 328 | 332 | ||
| 329 | typedef struct | 333 | typedef struct { |
| 330 | { | ||
| 331 | unsigned short perc_atmid; | 334 | unsigned short perc_atmid; |
| 332 | unsigned long address; | 335 | unsigned long address; |
| 333 | unsigned char access_id; | 336 | unsigned char access_id; |
| 334 | } per_lowcore_words; | 337 | } per_lowcore_words; |
| 335 | 338 | ||
| 336 | typedef struct | 339 | typedef struct { |
| 337 | { | 340 | unsigned perc_branching : 1; |
| 338 | unsigned perc_branching : 1; | ||
| 339 | unsigned perc_instruction_fetch : 1; | 341 | unsigned perc_instruction_fetch : 1; |
| 340 | unsigned perc_storage_alteration : 1; | 342 | unsigned perc_storage_alteration : 1; |
| 341 | unsigned perc_gpr_alt_unused : 1; | 343 | unsigned perc_gpr_alt_unused : 1; |
| 342 | unsigned perc_store_real_address : 1; | 344 | unsigned perc_store_real_address : 1; |
| 343 | unsigned : 3; | 345 | unsigned : 3; |
| 344 | unsigned atmid_psw_bit_31 : 1; | 346 | unsigned atmid_psw_bit_31 : 1; |
| 345 | unsigned atmid_validity_bit : 1; | 347 | unsigned atmid_validity_bit : 1; |
| 346 | unsigned atmid_psw_bit_32 : 1; | 348 | unsigned atmid_psw_bit_32 : 1; |
| 347 | unsigned atmid_psw_bit_5 : 1; | 349 | unsigned atmid_psw_bit_5 : 1; |
| 348 | unsigned atmid_psw_bit_16 : 1; | 350 | unsigned atmid_psw_bit_16 : 1; |
| 349 | unsigned atmid_psw_bit_17 : 1; | 351 | unsigned atmid_psw_bit_17 : 1; |
| 350 | unsigned si : 2; | 352 | unsigned si : 2; |
| 351 | unsigned long address; | 353 | unsigned long address; |
| 352 | unsigned : 4; | 354 | unsigned : 4; |
| 353 | unsigned access_id : 4; | 355 | unsigned access_id : 4; |
| 354 | } per_lowcore_bits; | 356 | } per_lowcore_bits; |
| 355 | 357 | ||
| 356 | typedef struct | 358 | typedef struct { |
| 357 | { | ||
| 358 | union { | 359 | union { |
| 359 | per_cr_words words; | 360 | per_cr_words words; |
| 360 | per_cr_bits bits; | 361 | per_cr_bits bits; |
| @@ -364,9 +365,9 @@ typedef struct | |||
| 364 | * the kernel always sets them to zero. To enable single | 365 | * the kernel always sets them to zero. To enable single |
| 365 | * stepping use ptrace(PTRACE_SINGLESTEP) instead. | 366 | * stepping use ptrace(PTRACE_SINGLESTEP) instead. |
| 366 | */ | 367 | */ |
| 367 | unsigned single_step : 1; | 368 | unsigned single_step : 1; |
| 368 | unsigned instruction_fetch : 1; | 369 | unsigned instruction_fetch : 1; |
| 369 | unsigned : 30; | 370 | unsigned : 30; |
| 370 | /* | 371 | /* |
| 371 | * These addresses are copied into cr10 & cr11 if single | 372 | * These addresses are copied into cr10 & cr11 if single |
| 372 | * stepping is switched off | 373 | * stepping is switched off |
| @@ -376,11 +377,10 @@ typedef struct | |||
| 376 | union { | 377 | union { |
| 377 | per_lowcore_words words; | 378 | per_lowcore_words words; |
| 378 | per_lowcore_bits bits; | 379 | per_lowcore_bits bits; |
| 379 | } lowcore; | 380 | } lowcore; |
| 380 | } per_struct; | 381 | } per_struct; |
| 381 | 382 | ||
| 382 | typedef struct | 383 | typedef struct { |
| 383 | { | ||
| 384 | unsigned int len; | 384 | unsigned int len; |
| 385 | unsigned long kernel_addr; | 385 | unsigned long kernel_addr; |
| 386 | unsigned long process_addr; | 386 | unsigned long process_addr; |
| @@ -390,12 +390,12 @@ typedef struct | |||
| 390 | * S/390 specific non posix ptrace requests. I chose unusual values so | 390 | * S/390 specific non posix ptrace requests. I chose unusual values so |
| 391 | * they are unlikely to clash with future ptrace definitions. | 391 | * they are unlikely to clash with future ptrace definitions. |
| 392 | */ | 392 | */ |
| 393 | #define PTRACE_PEEKUSR_AREA 0x5000 | 393 | #define PTRACE_PEEKUSR_AREA 0x5000 |
| 394 | #define PTRACE_POKEUSR_AREA 0x5001 | 394 | #define PTRACE_POKEUSR_AREA 0x5001 |
| 395 | #define PTRACE_PEEKTEXT_AREA 0x5002 | 395 | #define PTRACE_PEEKTEXT_AREA 0x5002 |
| 396 | #define PTRACE_PEEKDATA_AREA 0x5003 | 396 | #define PTRACE_PEEKDATA_AREA 0x5003 |
| 397 | #define PTRACE_POKETEXT_AREA 0x5004 | 397 | #define PTRACE_POKETEXT_AREA 0x5004 |
| 398 | #define PTRACE_POKEDATA_AREA 0x5005 | 398 | #define PTRACE_POKEDATA_AREA 0x5005 |
| 399 | #define PTRACE_GET_LAST_BREAK 0x5006 | 399 | #define PTRACE_GET_LAST_BREAK 0x5006 |
| 400 | #define PTRACE_PEEK_SYSTEM_CALL 0x5007 | 400 | #define PTRACE_PEEK_SYSTEM_CALL 0x5007 |
| 401 | #define PTRACE_POKE_SYSTEM_CALL 0x5008 | 401 | #define PTRACE_POKE_SYSTEM_CALL 0x5008 |
| @@ -413,21 +413,19 @@ typedef struct | |||
| 413 | * PT_PROT definition is loosely based on hppa bsd definition in | 413 | * PT_PROT definition is loosely based on hppa bsd definition in |
| 414 | * gdb/hppab-nat.c | 414 | * gdb/hppab-nat.c |
| 415 | */ | 415 | */ |
| 416 | #define PTRACE_PROT 21 | 416 | #define PTRACE_PROT 21 |
| 417 | 417 | ||
| 418 | typedef enum | 418 | typedef enum { |
| 419 | { | ||
| 420 | ptprot_set_access_watchpoint, | 419 | ptprot_set_access_watchpoint, |
| 421 | ptprot_set_write_watchpoint, | 420 | ptprot_set_write_watchpoint, |
| 422 | ptprot_disable_watchpoint | 421 | ptprot_disable_watchpoint |
| 423 | } ptprot_flags; | 422 | } ptprot_flags; |
| 424 | 423 | ||
| 425 | typedef struct | 424 | typedef struct { |
| 426 | { | ||
| 427 | unsigned long lowaddr; | 425 | unsigned long lowaddr; |
| 428 | unsigned long hiaddr; | 426 | unsigned long hiaddr; |
| 429 | ptprot_flags prot; | 427 | ptprot_flags prot; |
| 430 | } ptprot_area; | 428 | } ptprot_area; |
| 431 | 429 | ||
| 432 | /* Sequence of bytes for breakpoint illegal instruction. */ | 430 | /* Sequence of bytes for breakpoint illegal instruction. */ |
| 433 | #define S390_BREAKPOINT {0x0,0x1} | 431 | #define S390_BREAKPOINT {0x0,0x1} |
| @@ -439,8 +437,7 @@ typedef struct | |||
| 439 | * The user_regs_struct defines the way the user registers are | 437 | * The user_regs_struct defines the way the user registers are |
| 440 | * store on the stack for signal handling. | 438 | * store on the stack for signal handling. |
| 441 | */ | 439 | */ |
| 442 | struct user_regs_struct | 440 | struct user_regs_struct { |
| 443 | { | ||
| 444 | psw_t psw; | 441 | psw_t psw; |
| 445 | unsigned long gprs[NUM_GPRS]; | 442 | unsigned long gprs[NUM_GPRS]; |
| 446 | unsigned int acrs[NUM_ACRS]; | 443 | unsigned int acrs[NUM_ACRS]; |
diff --git a/arch/score/include/uapi/asm/Kbuild b/arch/score/include/uapi/asm/Kbuild index c94ee54210bc..81271d3af47c 100644 --- a/arch/score/include/uapi/asm/Kbuild +++ b/arch/score/include/uapi/asm/Kbuild | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += siginfo.h | 5 | generic-y += siginfo.h |
diff --git a/arch/sh/include/uapi/asm/Kbuild b/arch/sh/include/uapi/asm/Kbuild index e28531333efa..ba4d39cb321d 100644 --- a/arch/sh/include/uapi/asm/Kbuild +++ b/arch/sh/include/uapi/asm/Kbuild | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bitsperlong.h | 4 | generic-y += bitsperlong.h |
| 5 | generic-y += bpf_perf_event.h | ||
| 5 | generic-y += errno.h | 6 | generic-y += errno.h |
| 6 | generic-y += fcntl.h | 7 | generic-y += fcntl.h |
| 7 | generic-y += ioctl.h | 8 | generic-y += ioctl.h |
diff --git a/arch/sparc/include/uapi/asm/Kbuild b/arch/sparc/include/uapi/asm/Kbuild index 2178c78c7c1a..4680ba246b55 100644 --- a/arch/sparc/include/uapi/asm/Kbuild +++ b/arch/sparc/include/uapi/asm/Kbuild | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += types.h | 5 | generic-y += types.h |
diff --git a/arch/tile/include/uapi/asm/Kbuild b/arch/tile/include/uapi/asm/Kbuild index 5711de0a1b5e..cc439612bcd5 100644 --- a/arch/tile/include/uapi/asm/Kbuild +++ b/arch/tile/include/uapi/asm/Kbuild | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generic-y += errno.h | 5 | generic-y += errno.h |
| 5 | generic-y += fcntl.h | 6 | generic-y += fcntl.h |
| 6 | generic-y += ioctl.h | 7 | generic-y += ioctl.h |
diff --git a/arch/unicore32/include/uapi/asm/Kbuild b/arch/unicore32/include/uapi/asm/Kbuild index 759a71411169..8611ef980554 100644 --- a/arch/unicore32/include/uapi/asm/Kbuild +++ b/arch/unicore32/include/uapi/asm/Kbuild | |||
| @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm | |||
| 3 | 3 | ||
| 4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
| 5 | generic-y += bitsperlong.h | 5 | generic-y += bitsperlong.h |
| 6 | generic-y += bpf_perf_event.h | ||
| 6 | generic-y += errno.h | 7 | generic-y += errno.h |
| 7 | generic-y += fcntl.h | 8 | generic-y += fcntl.h |
| 8 | generic-y += ioctl.h | 9 | generic-y += ioctl.h |
diff --git a/arch/x86/include/uapi/asm/Kbuild b/arch/x86/include/uapi/asm/Kbuild index da1489cb64dc..1e901e421f2d 100644 --- a/arch/x86/include/uapi/asm/Kbuild +++ b/arch/x86/include/uapi/asm/Kbuild | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 4 | generated-y += unistd_32.h | 5 | generated-y += unistd_32.h |
| 5 | generated-y += unistd_64.h | 6 | generated-y += unistd_64.h |
| 6 | generated-y += unistd_x32.h | 7 | generated-y += unistd_x32.h |
diff --git a/arch/xtensa/include/uapi/asm/Kbuild b/arch/xtensa/include/uapi/asm/Kbuild index a5bcdfb890f1..837d4dd76785 100644 --- a/arch/xtensa/include/uapi/asm/Kbuild +++ b/arch/xtensa/include/uapi/asm/Kbuild | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bitsperlong.h | 4 | generic-y += bitsperlong.h |
| 5 | generic-y += bpf_perf_event.h | ||
| 5 | generic-y += errno.h | 6 | generic-y += errno.h |
| 6 | generic-y += fcntl.h | 7 | generic-y += fcntl.h |
| 7 | generic-y += ioctl.h | 8 | generic-y += ioctl.h |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 2c9c87d8a0c1..7546822a1d74 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #define _LINUX_PERF_EVENT_H | 15 | #define _LINUX_PERF_EVENT_H |
| 16 | 16 | ||
| 17 | #include <uapi/linux/perf_event.h> | 17 | #include <uapi/linux/perf_event.h> |
| 18 | #include <uapi/linux/bpf_perf_event.h> | ||
| 18 | 19 | ||
| 19 | /* | 20 | /* |
| 20 | * Kernel-internal data types and definitions: | 21 | * Kernel-internal data types and definitions: |
| @@ -787,7 +788,7 @@ struct perf_output_handle { | |||
| 787 | }; | 788 | }; |
| 788 | 789 | ||
| 789 | struct bpf_perf_event_data_kern { | 790 | struct bpf_perf_event_data_kern { |
| 790 | struct pt_regs *regs; | 791 | bpf_user_pt_regs_t *regs; |
| 791 | struct perf_sample_data *data; | 792 | struct perf_sample_data *data; |
| 792 | struct perf_event *event; | 793 | struct perf_event *event; |
| 793 | }; | 794 | }; |
| @@ -1177,6 +1178,9 @@ extern void perf_bp_event(struct perf_event *event, void *data); | |||
| 1177 | (user_mode(regs) ? PERF_RECORD_MISC_USER : PERF_RECORD_MISC_KERNEL) | 1178 | (user_mode(regs) ? PERF_RECORD_MISC_USER : PERF_RECORD_MISC_KERNEL) |
| 1178 | # define perf_instruction_pointer(regs) instruction_pointer(regs) | 1179 | # define perf_instruction_pointer(regs) instruction_pointer(regs) |
| 1179 | #endif | 1180 | #endif |
| 1181 | #ifndef perf_arch_bpf_user_pt_regs | ||
| 1182 | # define perf_arch_bpf_user_pt_regs(regs) regs | ||
| 1183 | #endif | ||
| 1180 | 1184 | ||
| 1181 | static inline bool has_branch_stack(struct perf_event *event) | 1185 | static inline bool has_branch_stack(struct perf_event *event) |
| 1182 | { | 1186 | { |
diff --git a/include/uapi/asm-generic/bpf_perf_event.h b/include/uapi/asm-generic/bpf_perf_event.h new file mode 100644 index 000000000000..53815d2cd047 --- /dev/null +++ b/include/uapi/asm-generic/bpf_perf_event.h | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | #ifndef _UAPI__ASM_GENERIC_BPF_PERF_EVENT_H__ | ||
| 2 | #define _UAPI__ASM_GENERIC_BPF_PERF_EVENT_H__ | ||
| 3 | |||
| 4 | #include <linux/ptrace.h> | ||
| 5 | |||
| 6 | /* Export kernel pt_regs structure */ | ||
| 7 | typedef struct pt_regs bpf_user_pt_regs_t; | ||
| 8 | |||
| 9 | #endif /* _UAPI__ASM_GENERIC_BPF_PERF_EVENT_H__ */ | ||
diff --git a/include/uapi/linux/bpf_perf_event.h b/include/uapi/linux/bpf_perf_event.h index af549d4ecf1b..8f95303f9d80 100644 --- a/include/uapi/linux/bpf_perf_event.h +++ b/include/uapi/linux/bpf_perf_event.h | |||
| @@ -8,11 +8,10 @@ | |||
| 8 | #ifndef _UAPI__LINUX_BPF_PERF_EVENT_H__ | 8 | #ifndef _UAPI__LINUX_BPF_PERF_EVENT_H__ |
| 9 | #define _UAPI__LINUX_BPF_PERF_EVENT_H__ | 9 | #define _UAPI__LINUX_BPF_PERF_EVENT_H__ |
| 10 | 10 | ||
| 11 | #include <linux/types.h> | 11 | #include <asm/bpf_perf_event.h> |
| 12 | #include <linux/ptrace.h> | ||
| 13 | 12 | ||
| 14 | struct bpf_perf_event_data { | 13 | struct bpf_perf_event_data { |
| 15 | struct pt_regs regs; | 14 | bpf_user_pt_regs_t regs; |
| 16 | __u64 sample_period; | 15 | __u64 sample_period; |
| 17 | }; | 16 | }; |
| 18 | 17 | ||
diff --git a/kernel/events/core.c b/kernel/events/core.c index 16beab4767e1..ba957b9812b3 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -7987,11 +7987,11 @@ static void bpf_overflow_handler(struct perf_event *event, | |||
| 7987 | { | 7987 | { |
| 7988 | struct bpf_perf_event_data_kern ctx = { | 7988 | struct bpf_perf_event_data_kern ctx = { |
| 7989 | .data = data, | 7989 | .data = data, |
| 7990 | .regs = regs, | ||
| 7991 | .event = event, | 7990 | .event = event, |
| 7992 | }; | 7991 | }; |
| 7993 | int ret = 0; | 7992 | int ret = 0; |
| 7994 | 7993 | ||
| 7994 | ctx.regs = perf_arch_bpf_user_pt_regs(regs); | ||
| 7995 | preempt_disable(); | 7995 | preempt_disable(); |
| 7996 | if (unlikely(__this_cpu_inc_return(bpf_prog_active) != 1)) | 7996 | if (unlikely(__this_cpu_inc_return(bpf_prog_active) != 1)) |
| 7997 | goto out; | 7997 | goto out; |
diff --git a/tools/arch/arm64/include/uapi/asm/bpf_perf_event.h b/tools/arch/arm64/include/uapi/asm/bpf_perf_event.h new file mode 100644 index 000000000000..b551b741653d --- /dev/null +++ b/tools/arch/arm64/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 struct user_pt_regs bpf_user_pt_regs_t; | ||
| 8 | |||
| 9 | #endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */ | ||
diff --git a/tools/arch/s390/include/uapi/asm/bpf_perf_event.h b/tools/arch/s390/include/uapi/asm/bpf_perf_event.h new file mode 100644 index 000000000000..cefe7c7cd4f6 --- /dev/null +++ b/tools/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/tools/arch/s390/include/uapi/asm/ptrace.h b/tools/arch/s390/include/uapi/asm/ptrace.h new file mode 100644 index 000000000000..543dd70e12c8 --- /dev/null +++ b/tools/arch/s390/include/uapi/asm/ptrace.h | |||
| @@ -0,0 +1,457 @@ | |||
| 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | ||
| 2 | /* | ||
| 3 | * S390 version | ||
| 4 | * Copyright IBM Corp. 1999, 2000 | ||
| 5 | * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef _UAPI_S390_PTRACE_H | ||
| 9 | #define _UAPI_S390_PTRACE_H | ||
| 10 | |||
| 11 | /* | ||
| 12 | * Offsets in the user_regs_struct. They are used for the ptrace | ||
| 13 | * system call and in entry.S | ||
| 14 | */ | ||
| 15 | #ifndef __s390x__ | ||
| 16 | |||
| 17 | #define PT_PSWMASK 0x00 | ||
| 18 | #define PT_PSWADDR 0x04 | ||
| 19 | #define PT_GPR0 0x08 | ||
| 20 | #define PT_GPR1 0x0C | ||
| 21 | #define PT_GPR2 0x10 | ||
| 22 | #define PT_GPR3 0x14 | ||
| 23 | #define PT_GPR4 0x18 | ||
| 24 | #define PT_GPR5 0x1C | ||
| 25 | #define PT_GPR6 0x20 | ||
| 26 | #define PT_GPR7 0x24 | ||
| 27 | #define PT_GPR8 0x28 | ||
| 28 | #define PT_GPR9 0x2C | ||
| 29 | #define PT_GPR10 0x30 | ||
| 30 | #define PT_GPR11 0x34 | ||
| 31 | #define PT_GPR12 0x38 | ||
| 32 | #define PT_GPR13 0x3C | ||
| 33 | #define PT_GPR14 0x40 | ||
| 34 | #define PT_GPR15 0x44 | ||
| 35 | #define PT_ACR0 0x48 | ||
| 36 | #define PT_ACR1 0x4C | ||
| 37 | #define PT_ACR2 0x50 | ||
| 38 | #define PT_ACR3 0x54 | ||
| 39 | #define PT_ACR4 0x58 | ||
| 40 | #define PT_ACR5 0x5C | ||
| 41 | #define PT_ACR6 0x60 | ||
| 42 | #define PT_ACR7 0x64 | ||
| 43 | #define PT_ACR8 0x68 | ||
| 44 | #define PT_ACR9 0x6C | ||
| 45 | #define PT_ACR10 0x70 | ||
| 46 | #define PT_ACR11 0x74 | ||
| 47 | #define PT_ACR12 0x78 | ||
| 48 | #define PT_ACR13 0x7C | ||
| 49 | #define PT_ACR14 0x80 | ||
| 50 | #define PT_ACR15 0x84 | ||
| 51 | #define PT_ORIGGPR2 0x88 | ||
| 52 | #define PT_FPC 0x90 | ||
| 53 | /* | ||
| 54 | * A nasty fact of life that the ptrace api | ||
| 55 | * only supports passing of longs. | ||
| 56 | */ | ||
| 57 | #define PT_FPR0_HI 0x98 | ||
| 58 | #define PT_FPR0_LO 0x9C | ||
| 59 | #define PT_FPR1_HI 0xA0 | ||
| 60 | #define PT_FPR1_LO 0xA4 | ||
| 61 | #define PT_FPR2_HI 0xA8 | ||
| 62 | #define PT_FPR2_LO 0xAC | ||
| 63 | #define PT_FPR3_HI 0xB0 | ||
| 64 | #define PT_FPR3_LO 0xB4 | ||
| 65 | #define PT_FPR4_HI 0xB8 | ||
| 66 | #define PT_FPR4_LO 0xBC | ||
| 67 | #define PT_FPR5_HI 0xC0 | ||
| 68 | #define PT_FPR5_LO 0xC4 | ||
| 69 | #define PT_FPR6_HI 0xC8 | ||
| 70 | #define PT_FPR6_LO 0xCC | ||
| 71 | #define PT_FPR7_HI 0xD0 | ||
| 72 | #define PT_FPR7_LO 0xD4 | ||
| 73 | #define PT_FPR8_HI 0xD8 | ||
| 74 | #define PT_FPR8_LO 0XDC | ||
| 75 | #define PT_FPR9_HI 0xE0 | ||
| 76 | #define PT_FPR9_LO 0xE4 | ||
| 77 | #define PT_FPR10_HI 0xE8 | ||
| 78 | #define PT_FPR10_LO 0xEC | ||
| 79 | #define PT_FPR11_HI 0xF0 | ||
| 80 | #define PT_FPR11_LO 0xF4 | ||
| 81 | #define PT_FPR12_HI 0xF8 | ||
| 82 | #define PT_FPR12_LO 0xFC | ||
| 83 | #define PT_FPR13_HI 0x100 | ||
| 84 | #define PT_FPR13_LO 0x104 | ||
| 85 | #define PT_FPR14_HI 0x108 | ||
| 86 | #define PT_FPR14_LO 0x10C | ||
| 87 | #define PT_FPR15_HI 0x110 | ||
| 88 | #define PT_FPR15_LO 0x114 | ||
| 89 | #define PT_CR_9 0x118 | ||
| 90 | #define PT_CR_10 0x11C | ||
| 91 | #define PT_CR_11 0x120 | ||
| 92 | #define PT_IEEE_IP 0x13C | ||
| 93 | #define PT_LASTOFF PT_IEEE_IP | ||
| 94 | #define PT_ENDREGS 0x140-1 | ||
| 95 | |||
| 96 | #define GPR_SIZE 4 | ||
| 97 | #define CR_SIZE 4 | ||
| 98 | |||
| 99 | #define STACK_FRAME_OVERHEAD 96 /* size of minimum stack frame */ | ||
| 100 | |||
| 101 | #else /* __s390x__ */ | ||
| 102 | |||
| 103 | #define PT_PSWMASK 0x00 | ||
| 104 | #define PT_PSWADDR 0x08 | ||
| 105 | #define PT_GPR0 0x10 | ||
| 106 | #define PT_GPR1 0x18 | ||
| 107 | #define PT_GPR2 0x20 | ||
| 108 | #define PT_GPR3 0x28 | ||
| 109 | #define PT_GPR4 0x30 | ||
| 110 | #define PT_GPR5 0x38 | ||
| 111 | #define PT_GPR6 0x40 | ||
| 112 | #define PT_GPR7 0x48 | ||
| 113 | #define PT_GPR8 0x50 | ||
| 114 | #define PT_GPR9 0x58 | ||
| 115 | #define PT_GPR10 0x60 | ||
| 116 | #define PT_GPR11 0x68 | ||
| 117 | #define PT_GPR12 0x70 | ||
| 118 | #define PT_GPR13 0x78 | ||
| 119 | #define PT_GPR14 0x80 | ||
| 120 | #define PT_GPR15 0x88 | ||
| 121 | #define PT_ACR0 0x90 | ||
| 122 | #define PT_ACR1 0x94 | ||
| 123 | #define PT_ACR2 0x98 | ||
| 124 | #define PT_ACR3 0x9C | ||
| 125 | #define PT_ACR4 0xA0 | ||
| 126 | #define PT_ACR5 0xA4 | ||
| 127 | #define PT_ACR6 0xA8 | ||
| 128 | #define PT_ACR7 0xAC | ||
| 129 | #define PT_ACR8 0xB0 | ||
| 130 | #define PT_ACR9 0xB4 | ||
| 131 | #define PT_ACR10 0xB8 | ||
| 132 | #define PT_ACR11 0xBC | ||
| 133 | #define PT_ACR12 0xC0 | ||
| 134 | #define PT_ACR13 0xC4 | ||
| 135 | #define PT_ACR14 0xC8 | ||
| 136 | #define PT_ACR15 0xCC | ||
| 137 | #define PT_ORIGGPR2 0xD0 | ||
| 138 | #define PT_FPC 0xD8 | ||
| 139 | #define PT_FPR0 0xE0 | ||
| 140 | #define PT_FPR1 0xE8 | ||
| 141 | #define PT_FPR2 0xF0 | ||
| 142 | #define PT_FPR3 0xF8 | ||
| 143 | #define PT_FPR4 0x100 | ||
| 144 | #define PT_FPR5 0x108 | ||
| 145 | #define PT_FPR6 0x110 | ||
| 146 | #define PT_FPR7 0x118 | ||
| 147 | #define PT_FPR8 0x120 | ||
| 148 | #define PT_FPR9 0x128 | ||
| 149 | #define PT_FPR10 0x130 | ||
| 150 | #define PT_FPR11 0x138 | ||
| 151 | #define PT_FPR12 0x140 | ||
| 152 | #define PT_FPR13 0x148 | ||
| 153 | #define PT_FPR14 0x150 | ||
| 154 | #define PT_FPR15 0x158 | ||
| 155 | #define PT_CR_9 0x160 | ||
| 156 | #define PT_CR_10 0x168 | ||
| 157 | #define PT_CR_11 0x170 | ||
| 158 | #define PT_IEEE_IP 0x1A8 | ||
| 159 | #define PT_LASTOFF PT_IEEE_IP | ||
| 160 | #define PT_ENDREGS 0x1B0-1 | ||
| 161 | |||
| 162 | #define GPR_SIZE 8 | ||
| 163 | #define CR_SIZE 8 | ||
| 164 | |||
| 165 | #define STACK_FRAME_OVERHEAD 160 /* size of minimum stack frame */ | ||
| 166 | |||
| 167 | #endif /* __s390x__ */ | ||
| 168 | |||
| 169 | #define NUM_GPRS 16 | ||
| 170 | #define NUM_FPRS 16 | ||
| 171 | #define NUM_CRS 16 | ||
| 172 | #define NUM_ACRS 16 | ||
| 173 | |||
| 174 | #define NUM_CR_WORDS 3 | ||
| 175 | |||
| 176 | #define FPR_SIZE 8 | ||
| 177 | #define FPC_SIZE 4 | ||
| 178 | #define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */ | ||
| 179 | #define ACR_SIZE 4 | ||
| 180 | |||
| 181 | |||
| 182 | #define PTRACE_OLDSETOPTIONS 21 | ||
| 183 | |||
| 184 | #ifndef __ASSEMBLY__ | ||
| 185 | #include <linux/stddef.h> | ||
| 186 | #include <linux/types.h> | ||
| 187 | |||
| 188 | typedef union { | ||
| 189 | float f; | ||
| 190 | double d; | ||
| 191 | __u64 ui; | ||
| 192 | struct | ||
| 193 | { | ||
| 194 | __u32 hi; | ||
| 195 | __u32 lo; | ||
| 196 | } fp; | ||
| 197 | } freg_t; | ||
| 198 | |||
| 199 | typedef struct { | ||
| 200 | __u32 fpc; | ||
| 201 | __u32 pad; | ||
| 202 | freg_t fprs[NUM_FPRS]; | ||
| 203 | } s390_fp_regs; | ||
| 204 | |||
| 205 | #define FPC_EXCEPTION_MASK 0xF8000000 | ||
| 206 | #define FPC_FLAGS_MASK 0x00F80000 | ||
| 207 | #define FPC_DXC_MASK 0x0000FF00 | ||
| 208 | #define FPC_RM_MASK 0x00000003 | ||
| 209 | |||
| 210 | /* this typedef defines how a Program Status Word looks like */ | ||
| 211 | typedef struct { | ||
| 212 | unsigned long mask; | ||
| 213 | unsigned long addr; | ||
| 214 | } __attribute__ ((aligned(8))) psw_t; | ||
| 215 | |||
| 216 | #ifndef __s390x__ | ||
| 217 | |||
| 218 | #define PSW_MASK_PER 0x40000000UL | ||
| 219 | #define PSW_MASK_DAT 0x04000000UL | ||
| 220 | #define PSW_MASK_IO 0x02000000UL | ||
| 221 | #define PSW_MASK_EXT 0x01000000UL | ||
| 222 | #define PSW_MASK_KEY 0x00F00000UL | ||
| 223 | #define PSW_MASK_BASE 0x00080000UL /* always one */ | ||
| 224 | #define PSW_MASK_MCHECK 0x00040000UL | ||
| 225 | #define PSW_MASK_WAIT 0x00020000UL | ||
| 226 | #define PSW_MASK_PSTATE 0x00010000UL | ||
| 227 | #define PSW_MASK_ASC 0x0000C000UL | ||
| 228 | #define PSW_MASK_CC 0x00003000UL | ||
| 229 | #define PSW_MASK_PM 0x00000F00UL | ||
| 230 | #define PSW_MASK_RI 0x00000000UL | ||
| 231 | #define PSW_MASK_EA 0x00000000UL | ||
| 232 | #define PSW_MASK_BA 0x00000000UL | ||
| 233 | |||
| 234 | #define PSW_MASK_USER 0x0000FF00UL | ||
| 235 | |||
| 236 | #define PSW_ADDR_AMODE 0x80000000UL | ||
| 237 | #define PSW_ADDR_INSN 0x7FFFFFFFUL | ||
| 238 | |||
| 239 | #define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 20) | ||
| 240 | |||
| 241 | #define PSW_ASC_PRIMARY 0x00000000UL | ||
| 242 | #define PSW_ASC_ACCREG 0x00004000UL | ||
| 243 | #define PSW_ASC_SECONDARY 0x00008000UL | ||
| 244 | #define PSW_ASC_HOME 0x0000C000UL | ||
| 245 | |||
| 246 | #else /* __s390x__ */ | ||
| 247 | |||
| 248 | #define PSW_MASK_PER 0x4000000000000000UL | ||
| 249 | #define PSW_MASK_DAT 0x0400000000000000UL | ||
| 250 | #define PSW_MASK_IO 0x0200000000000000UL | ||
| 251 | #define PSW_MASK_EXT 0x0100000000000000UL | ||
| 252 | #define PSW_MASK_BASE 0x0000000000000000UL | ||
| 253 | #define PSW_MASK_KEY 0x00F0000000000000UL | ||
| 254 | #define PSW_MASK_MCHECK 0x0004000000000000UL | ||
| 255 | #define PSW_MASK_WAIT 0x0002000000000000UL | ||
| 256 | #define PSW_MASK_PSTATE 0x0001000000000000UL | ||
| 257 | #define PSW_MASK_ASC 0x0000C00000000000UL | ||
| 258 | #define PSW_MASK_CC 0x0000300000000000UL | ||
| 259 | #define PSW_MASK_PM 0x00000F0000000000UL | ||
| 260 | #define PSW_MASK_RI 0x0000008000000000UL | ||
| 261 | #define PSW_MASK_EA 0x0000000100000000UL | ||
| 262 | #define PSW_MASK_BA 0x0000000080000000UL | ||
| 263 | |||
| 264 | #define PSW_MASK_USER 0x0000FF0180000000UL | ||
| 265 | |||
| 266 | #define PSW_ADDR_AMODE 0x0000000000000000UL | ||
| 267 | #define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL | ||
| 268 | |||
| 269 | #define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 52) | ||
| 270 | |||
| 271 | #define PSW_ASC_PRIMARY 0x0000000000000000UL | ||
| 272 | #define PSW_ASC_ACCREG 0x0000400000000000UL | ||
| 273 | #define PSW_ASC_SECONDARY 0x0000800000000000UL | ||
| 274 | #define PSW_ASC_HOME 0x0000C00000000000UL | ||
| 275 | |||
| 276 | #endif /* __s390x__ */ | ||
| 277 | |||
| 278 | |||
| 279 | /* | ||
| 280 | * The s390_regs structure is used to define the elf_gregset_t. | ||
| 281 | */ | ||
| 282 | typedef struct { | ||
| 283 | psw_t psw; | ||
| 284 | unsigned long gprs[NUM_GPRS]; | ||
| 285 | unsigned int acrs[NUM_ACRS]; | ||
| 286 | unsigned long orig_gpr2; | ||
| 287 | } s390_regs; | ||
| 288 | |||
| 289 | /* | ||
| 290 | * The user_pt_regs structure exports the beginning of | ||
| 291 | * the in-kernel pt_regs structure to user space. | ||
| 292 | */ | ||
| 293 | typedef struct { | ||
| 294 | unsigned long args[1]; | ||
| 295 | psw_t psw; | ||
| 296 | unsigned long gprs[NUM_GPRS]; | ||
| 297 | } user_pt_regs; | ||
| 298 | |||
| 299 | /* | ||
| 300 | * Now for the user space program event recording (trace) definitions. | ||
| 301 | * The following structures are used only for the ptrace interface, don't | ||
| 302 | * touch or even look at it if you don't want to modify the user-space | ||
| 303 | * ptrace interface. In particular stay away from it for in-kernel PER. | ||
| 304 | */ | ||
| 305 | typedef struct { | ||
| 306 | unsigned long cr[NUM_CR_WORDS]; | ||
| 307 | } per_cr_words; | ||
| 308 | |||
| 309 | #define PER_EM_MASK 0xE8000000UL | ||
| 310 | |||
| 311 | typedef struct { | ||
| 312 | #ifdef __s390x__ | ||
| 313 | unsigned : 32; | ||
| 314 | #endif /* __s390x__ */ | ||
| 315 | unsigned em_branching : 1; | ||
| 316 | unsigned em_instruction_fetch : 1; | ||
| 317 | /* | ||
| 318 | * Switching on storage alteration automatically fixes | ||
| 319 | * the storage alteration event bit in the users std. | ||
| 320 | */ | ||
| 321 | unsigned em_storage_alteration : 1; | ||
| 322 | unsigned em_gpr_alt_unused : 1; | ||
| 323 | unsigned em_store_real_address : 1; | ||
| 324 | unsigned : 3; | ||
| 325 | unsigned branch_addr_ctl : 1; | ||
| 326 | unsigned : 1; | ||
| 327 | unsigned storage_alt_space_ctl : 1; | ||
| 328 | unsigned : 21; | ||
| 329 | unsigned long starting_addr; | ||
| 330 | unsigned long ending_addr; | ||
| 331 | } per_cr_bits; | ||
| 332 | |||
| 333 | typedef struct { | ||
| 334 | unsigned short perc_atmid; | ||
| 335 | unsigned long address; | ||
| 336 | unsigned char access_id; | ||
| 337 | } per_lowcore_words; | ||
| 338 | |||
| 339 | typedef struct { | ||
| 340 | unsigned perc_branching : 1; | ||
| 341 | unsigned perc_instruction_fetch : 1; | ||
| 342 | unsigned perc_storage_alteration : 1; | ||
| 343 | unsigned perc_gpr_alt_unused : 1; | ||
| 344 | unsigned perc_store_real_address : 1; | ||
| 345 | unsigned : 3; | ||
| 346 | unsigned atmid_psw_bit_31 : 1; | ||
| 347 | unsigned atmid_validity_bit : 1; | ||
| 348 | unsigned atmid_psw_bit_32 : 1; | ||
| 349 | unsigned atmid_psw_bit_5 : 1; | ||
| 350 | unsigned atmid_psw_bit_16 : 1; | ||
| 351 | unsigned atmid_psw_bit_17 : 1; | ||
| 352 | unsigned si : 2; | ||
| 353 | unsigned long address; | ||
| 354 | unsigned : 4; | ||
| 355 | unsigned access_id : 4; | ||
| 356 | } per_lowcore_bits; | ||
| 357 | |||
| 358 | typedef struct { | ||
| 359 | union { | ||
| 360 | per_cr_words words; | ||
| 361 | per_cr_bits bits; | ||
| 362 | } control_regs; | ||
| 363 | /* | ||
| 364 | * The single_step and instruction_fetch bits are obsolete, | ||
| 365 | * the kernel always sets them to zero. To enable single | ||
| 366 | * stepping use ptrace(PTRACE_SINGLESTEP) instead. | ||
| 367 | */ | ||
| 368 | unsigned single_step : 1; | ||
| 369 | unsigned instruction_fetch : 1; | ||
| 370 | unsigned : 30; | ||
| 371 | /* | ||
| 372 | * These addresses are copied into cr10 & cr11 if single | ||
| 373 | * stepping is switched off | ||
| 374 | */ | ||
| 375 | unsigned long starting_addr; | ||
| 376 | unsigned long ending_addr; | ||
| 377 | union { | ||
| 378 | per_lowcore_words words; | ||
| 379 | per_lowcore_bits bits; | ||
| 380 | } lowcore; | ||
| 381 | } per_struct; | ||
| 382 | |||
| 383 | typedef struct { | ||
| 384 | unsigned int len; | ||
| 385 | unsigned long kernel_addr; | ||
| 386 | unsigned long process_addr; | ||
| 387 | } ptrace_area; | ||
| 388 | |||
| 389 | /* | ||
| 390 | * S/390 specific non posix ptrace requests. I chose unusual values so | ||
| 391 | * they are unlikely to clash with future ptrace definitions. | ||
| 392 | */ | ||
| 393 | #define PTRACE_PEEKUSR_AREA 0x5000 | ||
| 394 | #define PTRACE_POKEUSR_AREA 0x5001 | ||
| 395 | #define PTRACE_PEEKTEXT_AREA 0x5002 | ||
| 396 | #define PTRACE_PEEKDATA_AREA 0x5003 | ||
| 397 | #define PTRACE_POKETEXT_AREA 0x5004 | ||
| 398 | #define PTRACE_POKEDATA_AREA 0x5005 | ||
| 399 | #define PTRACE_GET_LAST_BREAK 0x5006 | ||
| 400 | #define PTRACE_PEEK_SYSTEM_CALL 0x5007 | ||
| 401 | #define PTRACE_POKE_SYSTEM_CALL 0x5008 | ||
| 402 | #define PTRACE_ENABLE_TE 0x5009 | ||
| 403 | #define PTRACE_DISABLE_TE 0x5010 | ||
| 404 | #define PTRACE_TE_ABORT_RAND 0x5011 | ||
| 405 | |||
| 406 | /* | ||
| 407 | * The numbers chosen here are somewhat arbitrary but absolutely MUST | ||
| 408 | * not overlap with any of the number assigned in <linux/ptrace.h>. | ||
| 409 | */ | ||
| 410 | #define PTRACE_SINGLEBLOCK 12 /* resume execution until next branch */ | ||
| 411 | |||
| 412 | /* | ||
| 413 | * PT_PROT definition is loosely based on hppa bsd definition in | ||
| 414 | * gdb/hppab-nat.c | ||
| 415 | */ | ||
| 416 | #define PTRACE_PROT 21 | ||
| 417 | |||
| 418 | typedef enum { | ||
| 419 | ptprot_set_access_watchpoint, | ||
| 420 | ptprot_set_write_watchpoint, | ||
| 421 | ptprot_disable_watchpoint | ||
| 422 | } ptprot_flags; | ||
| 423 | |||
| 424 | typedef struct { | ||
| 425 | unsigned long lowaddr; | ||
| 426 | unsigned long hiaddr; | ||
| 427 | ptprot_flags prot; | ||
| 428 | } ptprot_area; | ||
| 429 | |||
| 430 | /* Sequence of bytes for breakpoint illegal instruction. */ | ||
| 431 | #define S390_BREAKPOINT {0x0,0x1} | ||
| 432 | #define S390_BREAKPOINT_U16 ((__u16)0x0001) | ||
| 433 | #define S390_SYSCALL_OPCODE ((__u16)0x0a00) | ||
| 434 | #define S390_SYSCALL_SIZE 2 | ||
| 435 | |||
| 436 | /* | ||
| 437 | * The user_regs_struct defines the way the user registers are | ||
| 438 | * store on the stack for signal handling. | ||
| 439 | */ | ||
| 440 | struct user_regs_struct { | ||
| 441 | psw_t psw; | ||
| 442 | unsigned long gprs[NUM_GPRS]; | ||
| 443 | unsigned int acrs[NUM_ACRS]; | ||
| 444 | unsigned long orig_gpr2; | ||
| 445 | s390_fp_regs fp_regs; | ||
| 446 | /* | ||
| 447 | * These per registers are in here so that gdb can modify them | ||
| 448 | * itself as there is no "official" ptrace interface for hardware | ||
| 449 | * watchpoints. This is the way intel does it. | ||
| 450 | */ | ||
| 451 | per_struct per_info; | ||
| 452 | unsigned long ieee_instruction_pointer; /* obsolete, always 0 */ | ||
| 453 | }; | ||
| 454 | |||
| 455 | #endif /* __ASSEMBLY__ */ | ||
| 456 | |||
| 457 | #endif /* _UAPI_S390_PTRACE_H */ | ||
diff --git a/tools/include/uapi/asm-generic/bpf_perf_event.h b/tools/include/uapi/asm-generic/bpf_perf_event.h new file mode 100644 index 000000000000..53815d2cd047 --- /dev/null +++ b/tools/include/uapi/asm-generic/bpf_perf_event.h | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | #ifndef _UAPI__ASM_GENERIC_BPF_PERF_EVENT_H__ | ||
| 2 | #define _UAPI__ASM_GENERIC_BPF_PERF_EVENT_H__ | ||
| 3 | |||
| 4 | #include <linux/ptrace.h> | ||
| 5 | |||
| 6 | /* Export kernel pt_regs structure */ | ||
| 7 | typedef struct pt_regs bpf_user_pt_regs_t; | ||
| 8 | |||
| 9 | #endif /* _UAPI__ASM_GENERIC_BPF_PERF_EVENT_H__ */ | ||
diff --git a/tools/include/uapi/linux/bpf_perf_event.h b/tools/include/uapi/linux/bpf_perf_event.h index 067427259820..8f95303f9d80 100644 --- a/tools/include/uapi/linux/bpf_perf_event.h +++ b/tools/include/uapi/linux/bpf_perf_event.h | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | ||
| 1 | /* Copyright (c) 2016 Facebook | 2 | /* Copyright (c) 2016 Facebook |
| 2 | * | 3 | * |
| 3 | * This program is free software; you can redistribute it and/or | 4 | * This program is free software; you can redistribute it and/or |
| @@ -7,11 +8,10 @@ | |||
| 7 | #ifndef _UAPI__LINUX_BPF_PERF_EVENT_H__ | 8 | #ifndef _UAPI__LINUX_BPF_PERF_EVENT_H__ |
| 8 | #define _UAPI__LINUX_BPF_PERF_EVENT_H__ | 9 | #define _UAPI__LINUX_BPF_PERF_EVENT_H__ |
| 9 | 10 | ||
| 10 | #include <linux/types.h> | 11 | #include <asm/bpf_perf_event.h> |
| 11 | #include <linux/ptrace.h> | ||
| 12 | 12 | ||
| 13 | struct bpf_perf_event_data { | 13 | struct bpf_perf_event_data { |
| 14 | struct pt_regs regs; | 14 | bpf_user_pt_regs_t regs; |
| 15 | __u64 sample_period; | 15 | __u64 sample_period; |
| 16 | }; | 16 | }; |
| 17 | 17 | ||
diff --git a/tools/perf/arch/s390/Makefile b/tools/perf/arch/s390/Makefile index 21322e0385b8..09ba923debe8 100644 --- a/tools/perf/arch/s390/Makefile +++ b/tools/perf/arch/s390/Makefile | |||
| @@ -2,3 +2,4 @@ ifndef NO_DWARF | |||
| 2 | PERF_HAVE_DWARF_REGS := 1 | 2 | PERF_HAVE_DWARF_REGS := 1 |
| 3 | endif | 3 | endif |
| 4 | HAVE_KVM_STAT_SUPPORT := 1 | 4 | HAVE_KVM_STAT_SUPPORT := 1 |
| 5 | PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1 | ||
diff --git a/tools/perf/arch/s390/util/dwarf-regs.c b/tools/perf/arch/s390/util/dwarf-regs.c index f47576ce13ea..a8ace5cc6301 100644 --- a/tools/perf/arch/s390/util/dwarf-regs.c +++ b/tools/perf/arch/s390/util/dwarf-regs.c | |||
| @@ -2,17 +2,43 @@ | |||
| 2 | /* | 2 | /* |
| 3 | * Mapping of DWARF debug register numbers into register names. | 3 | * Mapping of DWARF debug register numbers into register names. |
| 4 | * | 4 | * |
| 5 | * Copyright IBM Corp. 2010 | 5 | * Copyright IBM Corp. 2010, 2017 |
| 6 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>, | 6 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>, |
| 7 | * Hendrik Brueckner <brueckner@linux.vnet.ibm.com> | ||
| 7 | * | 8 | * |
| 8 | */ | 9 | */ |
| 9 | 10 | ||
| 11 | #include <errno.h> | ||
| 10 | #include <stddef.h> | 12 | #include <stddef.h> |
| 11 | #include <dwarf-regs.h> | 13 | #include <stdlib.h> |
| 12 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 15 | #include <asm/ptrace.h> | ||
| 16 | #include <string.h> | ||
| 17 | #include <dwarf-regs.h> | ||
| 13 | #include "dwarf-regs-table.h" | 18 | #include "dwarf-regs-table.h" |
| 14 | 19 | ||
| 15 | const char *get_arch_regstr(unsigned int n) | 20 | const char *get_arch_regstr(unsigned int n) |
| 16 | { | 21 | { |
| 17 | return (n >= ARRAY_SIZE(s390_dwarf_regs)) ? NULL : s390_dwarf_regs[n]; | 22 | return (n >= ARRAY_SIZE(s390_dwarf_regs)) ? NULL : s390_dwarf_regs[n]; |
| 18 | } | 23 | } |
| 24 | |||
| 25 | /* | ||
| 26 | * Convert the register name into an offset to struct pt_regs (kernel). | ||
| 27 | * This is required by the BPF prologue generator. The BPF | ||
| 28 | * program is called in the BPF overflow handler in the perf | ||
| 29 | * core. | ||
| 30 | */ | ||
| 31 | int regs_query_register_offset(const char *name) | ||
| 32 | { | ||
| 33 | unsigned long gpr; | ||
| 34 | |||
| 35 | if (!name || strncmp(name, "%r", 2)) | ||
| 36 | return -EINVAL; | ||
| 37 | |||
| 38 | errno = 0; | ||
| 39 | gpr = strtoul(name + 2, NULL, 10); | ||
| 40 | if (errno || gpr >= 16) | ||
| 41 | return -EINVAL; | ||
| 42 | |||
| 43 | return offsetof(user_pt_regs, gprs) + 8 * gpr; | ||
| 44 | } | ||
diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh index 77406d25e521..6db9d809fe97 100755 --- a/tools/perf/check-headers.sh +++ b/tools/perf/check-headers.sh | |||
| @@ -30,6 +30,7 @@ arch/x86/include/uapi/asm/vmx.h | |||
| 30 | arch/powerpc/include/uapi/asm/kvm.h | 30 | arch/powerpc/include/uapi/asm/kvm.h |
| 31 | arch/s390/include/uapi/asm/kvm.h | 31 | arch/s390/include/uapi/asm/kvm.h |
| 32 | arch/s390/include/uapi/asm/kvm_perf.h | 32 | arch/s390/include/uapi/asm/kvm_perf.h |
| 33 | arch/s390/include/uapi/asm/ptrace.h | ||
| 33 | arch/s390/include/uapi/asm/sie.h | 34 | arch/s390/include/uapi/asm/sie.h |
| 34 | arch/arm/include/uapi/asm/kvm.h | 35 | arch/arm/include/uapi/asm/kvm.h |
| 35 | arch/arm64/include/uapi/asm/kvm.h | 36 | arch/arm64/include/uapi/asm/kvm.h |
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 333a48655ee0..21a2d76b67dc 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile | |||
| @@ -1,7 +1,19 @@ | |||
| 1 | # SPDX-License-Identifier: GPL-2.0 | 1 | # SPDX-License-Identifier: GPL-2.0 |
| 2 | |||
| 3 | ifeq ($(srctree),) | ||
| 4 | srctree := $(patsubst %/,%,$(dir $(CURDIR))) | ||
| 5 | srctree := $(patsubst %/,%,$(dir $(srctree))) | ||
| 6 | srctree := $(patsubst %/,%,$(dir $(srctree))) | ||
| 7 | srctree := $(patsubst %/,%,$(dir $(srctree))) | ||
| 8 | endif | ||
| 9 | include $(srctree)/tools/scripts/Makefile.arch | ||
| 10 | |||
| 11 | $(call detected_var,SRCARCH) | ||
| 12 | |||
| 2 | LIBDIR := ../../../lib | 13 | LIBDIR := ../../../lib |
| 3 | BPFDIR := $(LIBDIR)/bpf | 14 | BPFDIR := $(LIBDIR)/bpf |
| 4 | APIDIR := ../../../include/uapi | 15 | APIDIR := ../../../include/uapi |
| 16 | ASMDIR:= ../../../arch/$(ARCH)/include/uapi | ||
| 5 | GENDIR := ../../../../include/generated | 17 | GENDIR := ../../../../include/generated |
| 6 | GENHDR := $(GENDIR)/autoconf.h | 18 | GENHDR := $(GENDIR)/autoconf.h |
| 7 | 19 | ||
| @@ -9,7 +21,7 @@ ifneq ($(wildcard $(GENHDR)),) | |||
| 9 | GENFLAGS := -DHAVE_GENHDR | 21 | GENFLAGS := -DHAVE_GENHDR |
| 10 | endif | 22 | endif |
| 11 | 23 | ||
| 12 | CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include | 24 | CFLAGS += -Wall -O2 -I$(APIDIR) -I$(ASMDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include |
| 13 | LDLIBS += -lcap -lelf | 25 | LDLIBS += -lcap -lelf |
| 14 | 26 | ||
| 15 | TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \ | 27 | TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \ |
