Resguardo inicial

This commit is contained in:
lastdragon
2026-09-06 12:53:21 -06:00
parent 662efe3c2a
commit ad2088d178
94853 changed files with 43200404 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
perf-util-y += util/
@@ -0,0 +1,2 @@
# SPDX-License-Identifier: GPL-2.0-only
PERF_HAVE_JITDUMP := 1
@@ -0,0 +1,400 @@
# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
#
# System call table for s390
#
# Format:
# <nr> <abi> <syscall> <entry>
#
# <abi> is always common.
1 common exit sys_exit
2 common fork sys_fork
3 common read sys_read
4 common write sys_write
5 common open sys_open
6 common close sys_close
7 common restart_syscall sys_restart_syscall
8 common creat sys_creat
9 common link sys_link
10 common unlink sys_unlink
11 common execve sys_execve
12 common chdir sys_chdir
14 common mknod sys_mknod
15 common chmod sys_chmod
19 common lseek sys_lseek
20 common getpid sys_getpid
21 common mount sys_mount
22 common umount sys_oldumount
26 common ptrace sys_ptrace
27 common alarm sys_alarm
29 common pause sys_pause
30 common utime sys_utime
33 common access sys_access
34 common nice sys_nice
36 common sync sys_sync
37 common kill sys_kill
38 common rename sys_rename
39 common mkdir sys_mkdir
40 common rmdir sys_rmdir
41 common dup sys_dup
42 common pipe sys_pipe
43 common times sys_times
45 common brk sys_brk
48 common signal sys_signal
51 common acct sys_acct
52 common umount2 sys_umount
54 common ioctl sys_ioctl
55 common fcntl sys_fcntl
57 common setpgid sys_setpgid
60 common umask sys_umask
61 common chroot sys_chroot
62 common ustat sys_ustat
63 common dup2 sys_dup2
64 common getppid sys_getppid
65 common getpgrp sys_getpgrp
66 common setsid sys_setsid
67 common sigaction sys_sigaction
72 common sigsuspend sys_sigsuspend
73 common sigpending sys_sigpending
74 common sethostname sys_sethostname
75 common setrlimit sys_setrlimit
77 common getrusage sys_getrusage
78 common gettimeofday sys_gettimeofday
79 common settimeofday sys_settimeofday
83 common symlink sys_symlink
85 common readlink sys_readlink
86 common uselib sys_uselib
87 common swapon sys_swapon
88 common reboot sys_reboot
89 common readdir sys_ni_syscall
90 common mmap sys_old_mmap
91 common munmap sys_munmap
92 common truncate sys_truncate
93 common ftruncate sys_ftruncate
94 common fchmod sys_fchmod
96 common getpriority sys_getpriority
97 common setpriority sys_setpriority
99 common statfs sys_statfs
100 common fstatfs sys_fstatfs
102 common socketcall sys_socketcall
103 common syslog sys_syslog
104 common setitimer sys_setitimer
105 common getitimer sys_getitimer
106 common stat sys_newstat
107 common lstat sys_newlstat
108 common fstat sys_newfstat
110 common lookup_dcookie sys_ni_syscall
111 common vhangup sys_vhangup
112 common idle sys_ni_syscall
114 common wait4 sys_wait4
115 common swapoff sys_swapoff
116 common sysinfo sys_sysinfo
117 common ipc sys_s390_ipc
118 common fsync sys_fsync
119 common sigreturn sys_sigreturn
120 common clone sys_clone
121 common setdomainname sys_setdomainname
122 common uname sys_newuname
124 common adjtimex sys_adjtimex
125 common mprotect sys_mprotect
126 common sigprocmask sys_sigprocmask
127 common create_module sys_ni_syscall
128 common init_module sys_init_module
129 common delete_module sys_delete_module
130 common get_kernel_syms sys_ni_syscall
131 common quotactl sys_quotactl
132 common getpgid sys_getpgid
133 common fchdir sys_fchdir
134 common bdflush sys_ni_syscall
135 common sysfs sys_sysfs
136 common personality sys_s390_personality
137 common afs_syscall sys_ni_syscall
141 common getdents sys_getdents
142 common select sys_select
143 common flock sys_flock
144 common msync sys_msync
145 common readv sys_readv
146 common writev sys_writev
147 common getsid sys_getsid
148 common fdatasync sys_fdatasync
149 common _sysctl sys_ni_syscall
150 common mlock sys_mlock
151 common munlock sys_munlock
152 common mlockall sys_mlockall
153 common munlockall sys_munlockall
154 common sched_setparam sys_sched_setparam
155 common sched_getparam sys_sched_getparam
156 common sched_setscheduler sys_sched_setscheduler
157 common sched_getscheduler sys_sched_getscheduler
158 common sched_yield sys_sched_yield
159 common sched_get_priority_max sys_sched_get_priority_max
160 common sched_get_priority_min sys_sched_get_priority_min
161 common sched_rr_get_interval sys_sched_rr_get_interval
162 common nanosleep sys_nanosleep
163 common mremap sys_mremap
167 common query_module sys_ni_syscall
168 common poll sys_poll
169 common nfsservctl sys_ni_syscall
172 common prctl sys_prctl
173 common rt_sigreturn sys_rt_sigreturn
174 common rt_sigaction sys_rt_sigaction
175 common rt_sigprocmask sys_rt_sigprocmask
176 common rt_sigpending sys_rt_sigpending
177 common rt_sigtimedwait sys_rt_sigtimedwait
178 common rt_sigqueueinfo sys_rt_sigqueueinfo
179 common rt_sigsuspend sys_rt_sigsuspend
180 common pread64 sys_pread64
181 common pwrite64 sys_pwrite64
183 common getcwd sys_getcwd
184 common capget sys_capget
185 common capset sys_capset
186 common sigaltstack sys_sigaltstack
187 common sendfile sys_sendfile64
188 common getpmsg sys_ni_syscall
189 common putpmsg sys_ni_syscall
190 common vfork sys_vfork
191 common getrlimit sys_getrlimit
198 common lchown sys_lchown
199 common getuid sys_getuid
200 common getgid sys_getgid
201 common geteuid sys_geteuid
202 common getegid sys_getegid
203 common setreuid sys_setreuid
204 common setregid sys_setregid
205 common getgroups sys_getgroups
206 common setgroups sys_setgroups
207 common fchown sys_fchown
208 common setresuid sys_setresuid
209 common getresuid sys_getresuid
210 common setresgid sys_setresgid
211 common getresgid sys_getresgid
212 common chown sys_chown
213 common setuid sys_setuid
214 common setgid sys_setgid
215 common setfsuid sys_setfsuid
216 common setfsgid sys_setfsgid
217 common pivot_root sys_pivot_root
218 common mincore sys_mincore
219 common madvise sys_madvise
220 common getdents64 sys_getdents64
222 common readahead sys_readahead
224 common setxattr sys_setxattr
225 common lsetxattr sys_lsetxattr
226 common fsetxattr sys_fsetxattr
227 common getxattr sys_getxattr
228 common lgetxattr sys_lgetxattr
229 common fgetxattr sys_fgetxattr
230 common listxattr sys_listxattr
231 common llistxattr sys_llistxattr
232 common flistxattr sys_flistxattr
233 common removexattr sys_removexattr
234 common lremovexattr sys_lremovexattr
235 common fremovexattr sys_fremovexattr
236 common gettid sys_gettid
237 common tkill sys_tkill
238 common futex sys_futex
239 common sched_setaffinity sys_sched_setaffinity
240 common sched_getaffinity sys_sched_getaffinity
241 common tgkill sys_tgkill
243 common io_setup sys_io_setup
244 common io_destroy sys_io_destroy
245 common io_getevents sys_io_getevents
246 common io_submit sys_io_submit
247 common io_cancel sys_io_cancel
248 common exit_group sys_exit_group
249 common epoll_create sys_epoll_create
250 common epoll_ctl sys_epoll_ctl
251 common epoll_wait sys_epoll_wait
252 common set_tid_address sys_set_tid_address
253 common fadvise64 sys_fadvise64_64
254 common timer_create sys_timer_create
255 common timer_settime sys_timer_settime
256 common timer_gettime sys_timer_gettime
257 common timer_getoverrun sys_timer_getoverrun
258 common timer_delete sys_timer_delete
259 common clock_settime sys_clock_settime
260 common clock_gettime sys_clock_gettime
261 common clock_getres sys_clock_getres
262 common clock_nanosleep sys_clock_nanosleep
265 common statfs64 sys_statfs64
266 common fstatfs64 sys_fstatfs64
267 common remap_file_pages sys_remap_file_pages
268 common mbind sys_mbind
269 common get_mempolicy sys_get_mempolicy
270 common set_mempolicy sys_set_mempolicy
271 common mq_open sys_mq_open
272 common mq_unlink sys_mq_unlink
273 common mq_timedsend sys_mq_timedsend
274 common mq_timedreceive sys_mq_timedreceive
275 common mq_notify sys_mq_notify
276 common mq_getsetattr sys_mq_getsetattr
277 common kexec_load sys_kexec_load
278 common add_key sys_add_key
279 common request_key sys_request_key
280 common keyctl sys_keyctl
281 common waitid sys_waitid
282 common ioprio_set sys_ioprio_set
283 common ioprio_get sys_ioprio_get
284 common inotify_init sys_inotify_init
285 common inotify_add_watch sys_inotify_add_watch
286 common inotify_rm_watch sys_inotify_rm_watch
287 common migrate_pages sys_migrate_pages
288 common openat sys_openat
289 common mkdirat sys_mkdirat
290 common mknodat sys_mknodat
291 common fchownat sys_fchownat
292 common futimesat sys_futimesat
293 common newfstatat sys_newfstatat
294 common unlinkat sys_unlinkat
295 common renameat sys_renameat
296 common linkat sys_linkat
297 common symlinkat sys_symlinkat
298 common readlinkat sys_readlinkat
299 common fchmodat sys_fchmodat
300 common faccessat sys_faccessat
301 common pselect6 sys_pselect6
302 common ppoll sys_ppoll
303 common unshare sys_unshare
304 common set_robust_list sys_set_robust_list
305 common get_robust_list sys_get_robust_list
306 common splice sys_splice
307 common sync_file_range sys_sync_file_range
308 common tee sys_tee
309 common vmsplice sys_vmsplice
310 common move_pages sys_move_pages
311 common getcpu sys_getcpu
312 common epoll_pwait sys_epoll_pwait
313 common utimes sys_utimes
314 common fallocate sys_fallocate
315 common utimensat sys_utimensat
316 common signalfd sys_signalfd
317 common timerfd sys_ni_syscall
318 common eventfd sys_eventfd
319 common timerfd_create sys_timerfd_create
320 common timerfd_settime sys_timerfd_settime
321 common timerfd_gettime sys_timerfd_gettime
322 common signalfd4 sys_signalfd4
323 common eventfd2 sys_eventfd2
324 common inotify_init1 sys_inotify_init1
325 common pipe2 sys_pipe2
326 common dup3 sys_dup3
327 common epoll_create1 sys_epoll_create1
328 common preadv sys_preadv
329 common pwritev sys_pwritev
330 common rt_tgsigqueueinfo sys_rt_tgsigqueueinfo
331 common perf_event_open sys_perf_event_open
332 common fanotify_init sys_fanotify_init
333 common fanotify_mark sys_fanotify_mark
334 common prlimit64 sys_prlimit64
335 common name_to_handle_at sys_name_to_handle_at
336 common open_by_handle_at sys_open_by_handle_at
337 common clock_adjtime sys_clock_adjtime
338 common syncfs sys_syncfs
339 common setns sys_setns
340 common process_vm_readv sys_process_vm_readv
341 common process_vm_writev sys_process_vm_writev
342 common s390_runtime_instr sys_s390_runtime_instr
343 common kcmp sys_kcmp
344 common finit_module sys_finit_module
345 common sched_setattr sys_sched_setattr
346 common sched_getattr sys_sched_getattr
347 common renameat2 sys_renameat2
348 common seccomp sys_seccomp
349 common getrandom sys_getrandom
350 common memfd_create sys_memfd_create
351 common bpf sys_bpf
352 common s390_pci_mmio_write sys_s390_pci_mmio_write
353 common s390_pci_mmio_read sys_s390_pci_mmio_read
354 common execveat sys_execveat
355 common userfaultfd sys_userfaultfd
356 common membarrier sys_membarrier
357 common recvmmsg sys_recvmmsg
358 common sendmmsg sys_sendmmsg
359 common socket sys_socket
360 common socketpair sys_socketpair
361 common bind sys_bind
362 common connect sys_connect
363 common listen sys_listen
364 common accept4 sys_accept4
365 common getsockopt sys_getsockopt
366 common setsockopt sys_setsockopt
367 common getsockname sys_getsockname
368 common getpeername sys_getpeername
369 common sendto sys_sendto
370 common sendmsg sys_sendmsg
371 common recvfrom sys_recvfrom
372 common recvmsg sys_recvmsg
373 common shutdown sys_shutdown
374 common mlock2 sys_mlock2
375 common copy_file_range sys_copy_file_range
376 common preadv2 sys_preadv2
377 common pwritev2 sys_pwritev2
378 common s390_guarded_storage sys_s390_guarded_storage
379 common statx sys_statx
380 common s390_sthyi sys_s390_sthyi
381 common kexec_file_load sys_kexec_file_load
382 common io_pgetevents sys_io_pgetevents
383 common rseq sys_rseq
384 common pkey_mprotect sys_pkey_mprotect
385 common pkey_alloc sys_pkey_alloc
386 common pkey_free sys_pkey_free
# room for arch specific syscalls
392 common semtimedop sys_semtimedop
393 common semget sys_semget
394 common semctl sys_semctl
395 common shmget sys_shmget
396 common shmctl sys_shmctl
397 common shmat sys_shmat
398 common shmdt sys_shmdt
399 common msgget sys_msgget
400 common msgsnd sys_msgsnd
401 common msgrcv sys_msgrcv
402 common msgctl sys_msgctl
424 common pidfd_send_signal sys_pidfd_send_signal
425 common io_uring_setup sys_io_uring_setup
426 common io_uring_enter sys_io_uring_enter
427 common io_uring_register sys_io_uring_register
428 common open_tree sys_open_tree
429 common move_mount sys_move_mount
430 common fsopen sys_fsopen
431 common fsconfig sys_fsconfig
432 common fsmount sys_fsmount
433 common fspick sys_fspick
434 common pidfd_open sys_pidfd_open
435 common clone3 sys_clone3
436 common close_range sys_close_range
437 common openat2 sys_openat2
438 common pidfd_getfd sys_pidfd_getfd
439 common faccessat2 sys_faccessat2
440 common process_madvise sys_process_madvise
441 common epoll_pwait2 sys_epoll_pwait2
442 common mount_setattr sys_mount_setattr
443 common quotactl_fd sys_quotactl_fd
444 common landlock_create_ruleset sys_landlock_create_ruleset
445 common landlock_add_rule sys_landlock_add_rule
446 common landlock_restrict_self sys_landlock_restrict_self
447 common memfd_secret sys_memfd_secret
448 common process_mrelease sys_process_mrelease
449 common futex_waitv sys_futex_waitv
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
451 common cachestat sys_cachestat
452 common fchmodat2 sys_fchmodat2
453 common map_shadow_stack sys_map_shadow_stack
454 common futex_wake sys_futex_wake
455 common futex_wait sys_futex_wait
456 common futex_requeue sys_futex_requeue
457 common statmount sys_statmount
458 common listmount sys_listmount
459 common lsm_get_self_attr sys_lsm_get_self_attr
460 common lsm_set_self_attr sys_lsm_set_self_attr
461 common lsm_list_modules sys_lsm_list_modules
462 common mseal sys_mseal
463 common setxattrat sys_setxattrat
464 common getxattrat sys_getxattrat
465 common listxattrat sys_listxattrat
466 common removexattrat sys_removexattrat
467 common open_tree_attr sys_open_tree_attr
468 common file_getattr sys_file_getattr
469 common file_setattr sys_file_setattr
470 common listns sys_listns
471 common rseq_slice_yield sys_rseq_slice_yield
@@ -0,0 +1,73 @@
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef S390_DWARF_REGS_TABLE_H
#define S390_DWARF_REGS_TABLE_H
#undef REG_DWARFNUM_NAME
#define REG_DWARFNUM_NAME(reg, idx) [idx] = "%" #reg
/*
* For reference, see DWARF register mapping:
* http://refspecs.linuxfoundation.org/ELF/zSeries/lzsabi0_s390/x1542.html
*/
static const char * const s390_dwarf_regs[] = {
"%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
"%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
REG_DWARFNUM_NAME(f0, 16),
REG_DWARFNUM_NAME(f1, 20),
REG_DWARFNUM_NAME(f2, 17),
REG_DWARFNUM_NAME(f3, 21),
REG_DWARFNUM_NAME(f4, 18),
REG_DWARFNUM_NAME(f5, 22),
REG_DWARFNUM_NAME(f6, 19),
REG_DWARFNUM_NAME(f7, 23),
REG_DWARFNUM_NAME(f8, 24),
REG_DWARFNUM_NAME(f9, 28),
REG_DWARFNUM_NAME(f10, 25),
REG_DWARFNUM_NAME(f11, 29),
REG_DWARFNUM_NAME(f12, 26),
REG_DWARFNUM_NAME(f13, 30),
REG_DWARFNUM_NAME(f14, 27),
REG_DWARFNUM_NAME(f15, 31),
REG_DWARFNUM_NAME(c0, 32),
REG_DWARFNUM_NAME(c1, 33),
REG_DWARFNUM_NAME(c2, 34),
REG_DWARFNUM_NAME(c3, 35),
REG_DWARFNUM_NAME(c4, 36),
REG_DWARFNUM_NAME(c5, 37),
REG_DWARFNUM_NAME(c6, 38),
REG_DWARFNUM_NAME(c7, 39),
REG_DWARFNUM_NAME(c8, 40),
REG_DWARFNUM_NAME(c9, 41),
REG_DWARFNUM_NAME(c10, 42),
REG_DWARFNUM_NAME(c11, 43),
REG_DWARFNUM_NAME(c12, 44),
REG_DWARFNUM_NAME(c13, 45),
REG_DWARFNUM_NAME(c14, 46),
REG_DWARFNUM_NAME(c15, 47),
REG_DWARFNUM_NAME(a0, 48),
REG_DWARFNUM_NAME(a1, 49),
REG_DWARFNUM_NAME(a2, 50),
REG_DWARFNUM_NAME(a3, 51),
REG_DWARFNUM_NAME(a4, 52),
REG_DWARFNUM_NAME(a5, 53),
REG_DWARFNUM_NAME(a6, 54),
REG_DWARFNUM_NAME(a7, 55),
REG_DWARFNUM_NAME(a8, 56),
REG_DWARFNUM_NAME(a9, 57),
REG_DWARFNUM_NAME(a10, 58),
REG_DWARFNUM_NAME(a11, 59),
REG_DWARFNUM_NAME(a12, 60),
REG_DWARFNUM_NAME(a13, 61),
REG_DWARFNUM_NAME(a14, 62),
REG_DWARFNUM_NAME(a15, 63),
REG_DWARFNUM_NAME(pswm, 64),
REG_DWARFNUM_NAME(pswa, 65),
};
#ifdef DEFINE_DWARF_REGSTR_TABLE
/* This is included in perf/util/dwarf-regs.c */
#define s390_regstr_tbl s390_dwarf_regs
#endif /* DEFINE_DWARF_REGSTR_TABLE */
#endif /* S390_DWARF_REGS_TABLE_H */
@@ -0,0 +1,14 @@
#ifndef ARCH_PERF_REGS_H
#define ARCH_PERF_REGS_H
#include <stdlib.h>
#include <linux/types.h>
#include "../../../../arch/s390/include/uapi/asm/perf_regs.h"
void perf_regs_load(u64 *regs);
#define PERF_REGS_MASK ((1ULL << PERF_REG_S390_MAX) - 1)
#define PERF_REGS_MAX PERF_REG_S390_MAX
#define PERF_SAMPLE_REGS_ABI PERF_SAMPLE_REGS_ABI_64
#endif /* ARCH_PERF_REGS_H */
@@ -0,0 +1,6 @@
perf-util-y += header.o
perf-util-y += machine.o
perf-util-y += pmu.o
perf-util-y += auxtrace.o
@@ -0,0 +1,125 @@
#include <errno.h>
#include <stdbool.h>
#include <stdlib.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/bitops.h>
#include <linux/log2.h>
#include <linux/zalloc.h>
#include "../../util/evlist.h"
#include "../../util/auxtrace.h"
#include "../../util/evsel.h"
#include "../../util/record.h"
#define PERF_EVENT_CPUM_SF 0xB0000 /* Event: Basic-sampling */
#define PERF_EVENT_CPUM_SF_DIAG 0xBD000 /* Event: Combined-sampling */
#define DEFAULT_AUX_PAGES 128
#define DEFAULT_FREQ 4000
static void cpumsf_free(struct auxtrace_record *itr)
{
free(itr);
}
static size_t cpumsf_info_priv_size(struct auxtrace_record *itr __maybe_unused,
struct evlist *evlist __maybe_unused)
{
return 0;
}
static int
cpumsf_info_fill(struct auxtrace_record *itr __maybe_unused,
struct perf_session *session __maybe_unused,
struct perf_record_auxtrace_info *auxtrace_info __maybe_unused,
size_t priv_size __maybe_unused)
{
auxtrace_info->type = PERF_AUXTRACE_S390_CPUMSF;
return 0;
}
static unsigned long
cpumsf_reference(struct auxtrace_record *itr __maybe_unused)
{
return 0;
}
static int
cpumsf_recording_options(struct auxtrace_record *ar __maybe_unused,
struct evlist *evlist __maybe_unused,
struct record_opts *opts)
{
unsigned int factor = 1;
unsigned int pages;
opts->full_auxtrace = true;
/*
* The AUX buffer size should be set properly to avoid
* overflow of samples if it is not set explicitly.
* DEFAULT_AUX_PAGES is an proper size when sampling frequency
* is DEFAULT_FREQ. It is expected to hold about 1/2 second
* of sampling data. The size used for AUX buffer will scale
* according to the specified frequency and DEFAULT_FREQ.
*/
if (!opts->auxtrace_mmap_pages) {
if (opts->user_freq != UINT_MAX)
factor = (opts->user_freq + DEFAULT_FREQ
- 1) / DEFAULT_FREQ;
pages = DEFAULT_AUX_PAGES * factor;
opts->auxtrace_mmap_pages = roundup_pow_of_two(pages);
}
return 0;
}
static int
cpumsf_parse_snapshot_options(struct auxtrace_record *itr __maybe_unused,
struct record_opts *opts __maybe_unused,
const char *str __maybe_unused)
{
return 0;
}
/*
* auxtrace_record__init is called when perf record
* check if the event really need auxtrace
*/
struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
int *err)
{
struct auxtrace_record *aux;
struct evsel *pos;
int diagnose = 0;
*err = 0;
if (evlist->core.nr_entries == 0)
return NULL;
evlist__for_each_entry(evlist, pos) {
if (pos->core.attr.config == PERF_EVENT_CPUM_SF_DIAG) {
diagnose = 1;
pos->needs_auxtrace_mmap = true;
break;
}
}
if (!diagnose)
return NULL;
/* sampling in diagnose mode. alloc aux buffer */
aux = zalloc(sizeof(*aux));
if (aux == NULL) {
*err = -ENOMEM;
return NULL;
}
aux->parse_snapshot_options = cpumsf_parse_snapshot_options;
aux->recording_options = cpumsf_recording_options;
aux->info_priv_size = cpumsf_info_priv_size;
aux->info_fill = cpumsf_info_fill;
aux->free = cpumsf_free;
aux->reference = cpumsf_reference;
return aux;
}
@@ -0,0 +1,147 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Implementation of get_cpuid().
*
* Copyright IBM Corp. 2014, 2018
* Author(s): Alexander Yarygin <yarygin@linux.vnet.ibm.com>
* Thomas Richter <tmricht@linux.vnet.ibm.com>
*/
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <linux/ctype.h>
#include <linux/kernel.h>
#include <linux/zalloc.h>
#include "../../util/header.h"
#define SYSINFO_MANU "Manufacturer:"
#define SYSINFO_TYPE "Type:"
#define SYSINFO_MODEL "Model:"
#define SRVLVL_CPUMF "CPU-MF:"
#define SRVLVL_VERSION "version="
#define SRVLVL_AUTHORIZATION "authorization="
#define SYSINFO "/proc/sysinfo"
#define SRVLVL "/proc/service_levels"
int get_cpuid(char *buffer, size_t sz, struct perf_cpu cpu __maybe_unused)
{
char *cp, *line = NULL, *line2;
char type[8], model[33], version[8], manufacturer[32], authorization[8];
int tpsize = 0, mdsize = 0, vssize = 0, mfsize = 0, atsize = 0;
int read;
unsigned long line_sz;
size_t nbytes;
FILE *sysinfo;
/*
* Scan /proc/sysinfo line by line and read out values for
* Manufacturer:, Type: and Model:, for example:
* Manufacturer: IBM
* Type: 2964
* Model: 702 N96
* The first word is the Model Capacity and the second word is
* Model (can be omitted). Both words have a maximum size of 16
* bytes.
*/
memset(manufacturer, 0, sizeof(manufacturer));
memset(type, 0, sizeof(type));
memset(model, 0, sizeof(model));
memset(version, 0, sizeof(version));
memset(authorization, 0, sizeof(authorization));
sysinfo = fopen(SYSINFO, "r");
if (sysinfo == NULL)
return errno;
while ((read = getline(&line, &line_sz, sysinfo)) != -1) {
if (!strncmp(line, SYSINFO_MANU, strlen(SYSINFO_MANU))) {
line2 = line + strlen(SYSINFO_MANU);
while ((cp = strtok_r(line2, "\n ", &line2))) {
mfsize += scnprintf(manufacturer + mfsize,
sizeof(manufacturer) - mfsize, "%s", cp);
}
}
if (!strncmp(line, SYSINFO_TYPE, strlen(SYSINFO_TYPE))) {
line2 = line + strlen(SYSINFO_TYPE);
while ((cp = strtok_r(line2, "\n ", &line2))) {
tpsize += scnprintf(type + tpsize,
sizeof(type) - tpsize, "%s", cp);
}
}
if (!strncmp(line, SYSINFO_MODEL, strlen(SYSINFO_MODEL))) {
line2 = line + strlen(SYSINFO_MODEL);
while ((cp = strtok_r(line2, "\n ", &line2))) {
mdsize += scnprintf(model + mdsize, sizeof(model) - mdsize,
"%s%s", model[0] ? "," : "", cp);
}
break;
}
}
fclose(sysinfo);
/* Missing manufacturer, type or model information should not happen */
if (!manufacturer[0] || !type[0] || !model[0])
return EINVAL;
/*
* Scan /proc/service_levels and return the CPU-MF counter facility
* version number and authorization level.
* Optional, does not exist on z/VM guests.
*/
sysinfo = fopen(SRVLVL, "r");
if (sysinfo == NULL)
goto skip_sysinfo;
while ((read = getline(&line, &line_sz, sysinfo)) != -1) {
if (strncmp(line, SRVLVL_CPUMF, strlen(SRVLVL_CPUMF)))
continue;
line2 = line + strlen(SRVLVL_CPUMF);
while ((cp = strtok_r(line2, "\n ", &line2))) {
if (!strncmp(cp, SRVLVL_VERSION,
strlen(SRVLVL_VERSION))) {
char *sep = strchr(cp, '=');
vssize += scnprintf(version + vssize,
sizeof(version) - vssize, "%s", sep + 1);
}
if (!strncmp(cp, SRVLVL_AUTHORIZATION,
strlen(SRVLVL_AUTHORIZATION))) {
char *sep = strchr(cp, '=');
atsize += scnprintf(authorization + atsize,
sizeof(authorization) - atsize, "%s", sep + 1);
}
}
}
fclose(sysinfo);
skip_sysinfo:
free(line);
if (version[0] && authorization[0] )
nbytes = snprintf(buffer, sz, "%s,%s,%s,%s,%s",
manufacturer, type, model, version,
authorization);
else
nbytes = snprintf(buffer, sz, "%s,%s,%s", manufacturer, type,
model);
return (nbytes >= sz) ? ENOBUFS : 0;
}
char *get_cpuid_str(struct perf_cpu cpu)
{
char *buf = malloc(128);
if (buf && get_cpuid(buf, 128, cpu))
zfree(&buf);
return buf;
}
@@ -0,0 +1,37 @@
// SPDX-License-Identifier: GPL-2.0
#include <inttypes.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <internal/lib.h> // page_size
#include "machine.h"
#include "api/fs/fs.h"
#include "debug.h"
#include "symbol.h"
int arch__fix_module_text_start(u64 *start, u64 *size, const char *name)
{
u64 m_start = *start;
char path[PATH_MAX];
snprintf(path, PATH_MAX, "module/%.*s/sections/.text",
(int)strlen(name) - 2, name + 1);
if (sysfs__read_ull(path, (unsigned long long *)start) < 0) {
pr_debug2("Using module %s start:%#lx\n", path, m_start);
*start = m_start;
} else {
/* Successful read of the modules segment text start address.
* Calculate difference between module start address
* in memory and module text segment start address.
* For example module load address is 0x3ff8011b000
* (from /proc/modules) and module text segment start
* address is 0x3ff8011b870 (from file above).
*
* Adjust the module size and subtract the GOT table
* size located at the beginning of the module.
*/
*size -= (*start - m_start);
}
return 0;
}
@@ -0,0 +1,22 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright IBM Corp. 2023
* Author(s): Thomas Richter <tmricht@linux.ibm.com>
*/
#include <string.h>
#include "../../../util/pmu.h"
#define S390_PMUPAI_CRYPTO "pai_crypto"
#define S390_PMUPAI_EXT "pai_ext"
#define S390_PMUCPUM_CF "cpum_cf"
void perf_pmu__arch_init(struct perf_pmu *pmu)
{
if (!strcmp(pmu->name, S390_PMUPAI_CRYPTO) ||
!strcmp(pmu->name, S390_PMUPAI_EXT) ||
!strcmp(pmu->name, S390_PMUCPUM_CF))
pmu->selectable = true;
}