perf/core improvements and fixes:

User visible:
 
 - Fix display of data source snoop indication in 'perf mem' (Andi Kleen)
 
 - Fix the code to strip command name from /proc/PID/stat (Jiri Olsa)
 
 Infrastructure:
 
 - Continue the disentanglement of headers, specially util.h (Arnaldo Carvalho de Melo)
 
 - Synchronize some header files with the kernel (Arnaldo Carvalho de Melo)
 
 Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 iQIcBAABCAAGBQJY/lbGAAoJENZQFvNTUqpAbfcQALIS/jQTYHq0FxYs5btEBZ32
 l3o7ZQipOR7zcKIjubSMWb+rrffk7bdjCN/3Tbe/oVVrKUVpdM1jxG4vN2/7g69Q
 z1I0fSigItZduZeXrMICC5jVDQkaUGz8V7xAprA7kryxVgTpSXxLffRYriWeuLl3
 4J7Lco33Tk+OLTN1maT+TWxUNcMBkWcZZeGivn9oCBsfsyUDQpsR6C4HQOhqJqCd
 HHWmKENYE+K6u2zMWQ4jOYByv8MXesBAGUB5CxBKzMFJIWFm5ROBc0HTWPiHTCX6
 FJFEQKxIurJvWpGJncN45cgdUuwYBftv1JbK1W0ProqT7DJ1EdotkxsnrI8/MxNU
 NfYsepMOzLgizRgxYUf3+QeVFxCCXRbjsMP4TNBPeR+Bn7KByQbycDQbNH2eBr+Y
 EGGmXtOW7ZeFkIygczPJLVI73x5S2kLCMAS+2u1zlskwopf5BgwrwX21AFfseR9L
 S8V+JicFGhp6zK3kDeTM7r8atWeSeIQdRli764KDyz+AEgeygKn9yTXdylAS1MCn
 ArefzqGmjWPwH5hsDIoDZIHcIIGNewVSXvgyyyJp4bolLEH/ZyA8Ck4hcwH0jXh6
 1F21yBEh9WtUfsHt1uwiDOhxhYp6Gb5YtX8fTjUgKtsEUoq1MJmtsaHbx7et2ltx
 vrTyuRzJVwQjsA7tsvWf
 =MY6n
 -----END PGP SIGNATURE-----

Merge tag 'perf-core-for-mingo-4.12-20170424' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core

Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:

User visible changes:

 - Fix display of data source snoop indication in 'perf mem' (Andi Kleen)

 - Fix the code to strip command name from /proc/PID/stat (Jiri Olsa)

Infrastructure changes:

 - Continue the disentanglement of headers, specially util.h (Arnaldo Carvalho de Melo)

 - Synchronize some header files with the kernel (Arnaldo Carvalho de Melo)

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Ingo Molnar 2017-04-24 23:31:35 +02:00
commit fd7647979a
229 changed files with 1328 additions and 733 deletions

View File

@ -302,8 +302,8 @@ extern int ignore_sigio_fd(int fd);
extern void maybe_sigio_broken(int fd, int read); extern void maybe_sigio_broken(int fd, int read);
extern void sigio_broken(int fd, int read); extern void sigio_broken(int fd, int read);
/* sys-x86_64/prctl.c */ /* prctl.c */
extern int os_arch_prctl(int pid, int code, unsigned long *addr); extern int os_arch_prctl(int pid, int option, unsigned long *arg2);
/* tty.c */ /* tty.c */
extern int get_pty(void); extern int get_pty(void);

View File

@ -390,3 +390,4 @@
381 i386 pkey_alloc sys_pkey_alloc 381 i386 pkey_alloc sys_pkey_alloc
382 i386 pkey_free sys_pkey_free 382 i386 pkey_free sys_pkey_free
383 i386 statx sys_statx 383 i386 statx sys_statx
384 i386 arch_prctl sys_arch_prctl compat_sys_arch_prctl

View File

@ -187,6 +187,7 @@
* Reuse free bits when adding new feature flags! * Reuse free bits when adding new feature flags!
*/ */
#define X86_FEATURE_RING3MWAIT ( 7*32+ 0) /* Ring 3 MONITOR/MWAIT */ #define X86_FEATURE_RING3MWAIT ( 7*32+ 0) /* Ring 3 MONITOR/MWAIT */
#define X86_FEATURE_CPUID_FAULT ( 7*32+ 1) /* Intel CPUID faulting */
#define X86_FEATURE_CPB ( 7*32+ 2) /* AMD Core Performance Boost */ #define X86_FEATURE_CPB ( 7*32+ 2) /* AMD Core Performance Boost */
#define X86_FEATURE_EPB ( 7*32+ 3) /* IA32_ENERGY_PERF_BIAS support */ #define X86_FEATURE_EPB ( 7*32+ 3) /* IA32_ENERGY_PERF_BIAS support */
#define X86_FEATURE_CAT_L3 ( 7*32+ 4) /* Cache Allocation Technology L3 */ #define X86_FEATURE_CAT_L3 ( 7*32+ 4) /* Cache Allocation Technology L3 */

View File

@ -45,6 +45,8 @@
#define MSR_IA32_PERFCTR1 0x000000c2 #define MSR_IA32_PERFCTR1 0x000000c2
#define MSR_FSB_FREQ 0x000000cd #define MSR_FSB_FREQ 0x000000cd
#define MSR_PLATFORM_INFO 0x000000ce #define MSR_PLATFORM_INFO 0x000000ce
#define MSR_PLATFORM_INFO_CPUID_FAULT_BIT 31
#define MSR_PLATFORM_INFO_CPUID_FAULT BIT_ULL(MSR_PLATFORM_INFO_CPUID_FAULT_BIT)
#define MSR_PKG_CST_CONFIG_CONTROL 0x000000e2 #define MSR_PKG_CST_CONFIG_CONTROL 0x000000e2
#define NHM_C3_AUTO_DEMOTE (1UL << 25) #define NHM_C3_AUTO_DEMOTE (1UL << 25)
@ -127,6 +129,7 @@
/* DEBUGCTLMSR bits (others vary by model): */ /* DEBUGCTLMSR bits (others vary by model): */
#define DEBUGCTLMSR_LBR (1UL << 0) /* last branch recording */ #define DEBUGCTLMSR_LBR (1UL << 0) /* last branch recording */
#define DEBUGCTLMSR_BTF_SHIFT 1
#define DEBUGCTLMSR_BTF (1UL << 1) /* single-step on branches */ #define DEBUGCTLMSR_BTF (1UL << 1) /* single-step on branches */
#define DEBUGCTLMSR_TR (1UL << 6) #define DEBUGCTLMSR_TR (1UL << 6)
#define DEBUGCTLMSR_BTS (1UL << 7) #define DEBUGCTLMSR_BTS (1UL << 7)
@ -552,10 +555,12 @@
#define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE_BIT 39 #define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE_BIT 39
#define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE (1ULL << MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE_BIT) #define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE (1ULL << MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE_BIT)
/* MISC_FEATURE_ENABLES non-architectural features */ /* MISC_FEATURES_ENABLES non-architectural features */
#define MSR_MISC_FEATURE_ENABLES 0x00000140 #define MSR_MISC_FEATURES_ENABLES 0x00000140
#define MSR_MISC_FEATURE_ENABLES_RING3MWAIT_BIT 1 #define MSR_MISC_FEATURES_ENABLES_CPUID_FAULT_BIT 0
#define MSR_MISC_FEATURES_ENABLES_CPUID_FAULT BIT_ULL(MSR_MISC_FEATURES_ENABLES_CPUID_FAULT_BIT)
#define MSR_MISC_FEATURES_ENABLES_RING3MWAIT_BIT 1
#define MSR_IA32_TSC_DEADLINE 0x000006E0 #define MSR_IA32_TSC_DEADLINE 0x000006E0

View File

@ -884,6 +884,8 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
extern int get_tsc_mode(unsigned long adr); extern int get_tsc_mode(unsigned long adr);
extern int set_tsc_mode(unsigned int val); extern int set_tsc_mode(unsigned int val);
DECLARE_PER_CPU(u64, msr_misc_features_shadow);
/* Register/unregister a process' MPX related resource */ /* Register/unregister a process' MPX related resource */
#define MPX_ENABLE_MANAGEMENT() mpx_enable_management() #define MPX_ENABLE_MANAGEMENT() mpx_enable_management()
#define MPX_DISABLE_MANAGEMENT() mpx_disable_management() #define MPX_DISABLE_MANAGEMENT() mpx_disable_management()

View File

@ -9,6 +9,7 @@ void syscall_init(void);
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
void entry_SYSCALL_64(void); void entry_SYSCALL_64(void);
long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2);
#endif #endif
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
@ -30,6 +31,7 @@ void x86_report_nx(void);
extern int reboot_force; extern int reboot_force;
long do_arch_prctl(struct task_struct *task, int code, unsigned long addr); long do_arch_prctl_common(struct task_struct *task, int option,
unsigned long cpuid_enabled);
#endif /* _ASM_X86_PROTO_H */ #endif /* _ASM_X86_PROTO_H */

View File

@ -87,6 +87,7 @@ struct thread_info {
#define TIF_SECCOMP 8 /* secure computing */ #define TIF_SECCOMP 8 /* secure computing */
#define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */ #define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */
#define TIF_UPROBE 12 /* breakpointed or singlestepping */ #define TIF_UPROBE 12 /* breakpointed or singlestepping */
#define TIF_NOCPUID 15 /* CPUID is not accessible in userland */
#define TIF_NOTSC 16 /* TSC is not accessible in userland */ #define TIF_NOTSC 16 /* TSC is not accessible in userland */
#define TIF_IA32 17 /* IA32 compatibility process */ #define TIF_IA32 17 /* IA32 compatibility process */
#define TIF_NOHZ 19 /* in adaptive nohz mode */ #define TIF_NOHZ 19 /* in adaptive nohz mode */
@ -110,6 +111,7 @@ struct thread_info {
#define _TIF_SECCOMP (1 << TIF_SECCOMP) #define _TIF_SECCOMP (1 << TIF_SECCOMP)
#define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY) #define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY)
#define _TIF_UPROBE (1 << TIF_UPROBE) #define _TIF_UPROBE (1 << TIF_UPROBE)
#define _TIF_NOCPUID (1 << TIF_NOCPUID)
#define _TIF_NOTSC (1 << TIF_NOTSC) #define _TIF_NOTSC (1 << TIF_NOTSC)
#define _TIF_IA32 (1 << TIF_IA32) #define _TIF_IA32 (1 << TIF_IA32)
#define _TIF_NOHZ (1 << TIF_NOHZ) #define _TIF_NOHZ (1 << TIF_NOHZ)
@ -138,7 +140,7 @@ struct thread_info {
/* flags to check in __switch_to() */ /* flags to check in __switch_to() */
#define _TIF_WORK_CTXSW \ #define _TIF_WORK_CTXSW \
(_TIF_IO_BITMAP|_TIF_NOTSC|_TIF_BLOCKSTEP) (_TIF_IO_BITMAP|_TIF_NOCPUID|_TIF_NOTSC|_TIF_BLOCKSTEP)
#define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY) #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)
#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW)
@ -239,6 +241,8 @@ static inline int arch_within_stack_frames(const void * const stack,
extern void arch_task_cache_init(void); extern void arch_task_cache_init(void);
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
extern void arch_release_task_struct(struct task_struct *tsk); extern void arch_release_task_struct(struct task_struct *tsk);
extern void arch_setup_new_exec(void);
#define arch_setup_new_exec arch_setup_new_exec
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#endif /* _ASM_X86_THREAD_INFO_H */ #endif /* _ASM_X86_THREAD_INFO_H */

View File

@ -110,6 +110,16 @@ static inline void cr4_clear_bits(unsigned long mask)
} }
} }
static inline void cr4_toggle_bits(unsigned long mask)
{
unsigned long cr4;
cr4 = this_cpu_read(cpu_tlbstate.cr4);
cr4 ^= mask;
this_cpu_write(cpu_tlbstate.cr4, cr4);
__write_cr4(cr4);
}
/* Read the CR4 shadow. */ /* Read the CR4 shadow. */
static inline unsigned long cr4_read_shadow(void) static inline unsigned long cr4_read_shadow(void)
{ {

View File

@ -1,10 +1,13 @@
#ifndef _ASM_X86_PRCTL_H #ifndef _ASM_X86_PRCTL_H
#define _ASM_X86_PRCTL_H #define _ASM_X86_PRCTL_H
#define ARCH_SET_GS 0x1001 #define ARCH_SET_GS 0x1001
#define ARCH_SET_FS 0x1002 #define ARCH_SET_FS 0x1002
#define ARCH_GET_FS 0x1003 #define ARCH_GET_FS 0x1003
#define ARCH_GET_GS 0x1004 #define ARCH_GET_GS 0x1004
#define ARCH_GET_CPUID 0x1011
#define ARCH_SET_CPUID 0x1012
#define ARCH_MAP_VDSO_X32 0x2001 #define ARCH_MAP_VDSO_X32 0x2001
#define ARCH_MAP_VDSO_32 0x2002 #define ARCH_MAP_VDSO_32 0x2002

View File

@ -90,16 +90,12 @@ static void probe_xeon_phi_r3mwait(struct cpuinfo_x86 *c)
return; return;
} }
if (ring3mwait_disabled) { if (ring3mwait_disabled)
msr_clear_bit(MSR_MISC_FEATURE_ENABLES,
MSR_MISC_FEATURE_ENABLES_RING3MWAIT_BIT);
return; return;
}
msr_set_bit(MSR_MISC_FEATURE_ENABLES,
MSR_MISC_FEATURE_ENABLES_RING3MWAIT_BIT);
set_cpu_cap(c, X86_FEATURE_RING3MWAIT); set_cpu_cap(c, X86_FEATURE_RING3MWAIT);
this_cpu_or(msr_misc_features_shadow,
1UL << MSR_MISC_FEATURES_ENABLES_RING3MWAIT_BIT);
if (c == &boot_cpu_data) if (c == &boot_cpu_data)
ELF_HWCAP2 |= HWCAP2_RING3MWAIT; ELF_HWCAP2 |= HWCAP2_RING3MWAIT;
@ -488,6 +484,34 @@ static void intel_bsp_resume(struct cpuinfo_x86 *c)
init_intel_energy_perf(c); init_intel_energy_perf(c);
} }
static void init_cpuid_fault(struct cpuinfo_x86 *c)
{
u64 msr;
if (!rdmsrl_safe(MSR_PLATFORM_INFO, &msr)) {
if (msr & MSR_PLATFORM_INFO_CPUID_FAULT)
set_cpu_cap(c, X86_FEATURE_CPUID_FAULT);
}
}
static void init_intel_misc_features(struct cpuinfo_x86 *c)
{
u64 msr;
if (rdmsrl_safe(MSR_MISC_FEATURES_ENABLES, &msr))
return;
/* Clear all MISC features */
this_cpu_write(msr_misc_features_shadow, 0);
/* Check features and update capabilities and shadow control bits */
init_cpuid_fault(c);
probe_xeon_phi_r3mwait(c);
msr = this_cpu_read(msr_misc_features_shadow);
wrmsrl(MSR_MISC_FEATURES_ENABLES, msr);
}
static void init_intel(struct cpuinfo_x86 *c) static void init_intel(struct cpuinfo_x86 *c)
{ {
unsigned int l2 = 0; unsigned int l2 = 0;
@ -602,7 +626,7 @@ static void init_intel(struct cpuinfo_x86 *c)
init_intel_energy_perf(c); init_intel_energy_perf(c);
probe_xeon_phi_r3mwait(c); init_intel_misc_features(c);
} }
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32

View File

@ -37,6 +37,7 @@
#include <asm/vm86.h> #include <asm/vm86.h>
#include <asm/switch_to.h> #include <asm/switch_to.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/prctl.h>
/* /*
* per-CPU TSS segments. Threads are completely 'soft' on Linux, * per-CPU TSS segments. Threads are completely 'soft' on Linux,
@ -124,11 +125,6 @@ void flush_thread(void)
fpu__clear(&tsk->thread.fpu); fpu__clear(&tsk->thread.fpu);
} }
static void hard_disable_TSC(void)
{
cr4_set_bits(X86_CR4_TSD);
}
void disable_TSC(void) void disable_TSC(void)
{ {
preempt_disable(); preempt_disable();
@ -137,15 +133,10 @@ void disable_TSC(void)
* Must flip the CPU state synchronously with * Must flip the CPU state synchronously with
* TIF_NOTSC in the current running context. * TIF_NOTSC in the current running context.
*/ */
hard_disable_TSC(); cr4_set_bits(X86_CR4_TSD);
preempt_enable(); preempt_enable();
} }
static void hard_enable_TSC(void)
{
cr4_clear_bits(X86_CR4_TSD);
}
static void enable_TSC(void) static void enable_TSC(void)
{ {
preempt_disable(); preempt_disable();
@ -154,7 +145,7 @@ static void enable_TSC(void)
* Must flip the CPU state synchronously with * Must flip the CPU state synchronously with
* TIF_NOTSC in the current running context. * TIF_NOTSC in the current running context.
*/ */
hard_enable_TSC(); cr4_clear_bits(X86_CR4_TSD);
preempt_enable(); preempt_enable();
} }
@ -182,54 +173,129 @@ int set_tsc_mode(unsigned int val)
return 0; return 0;
} }
void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, DEFINE_PER_CPU(u64, msr_misc_features_shadow);
struct tss_struct *tss)
static void set_cpuid_faulting(bool on)
{ {
struct thread_struct *prev, *next; u64 msrval;
prev = &prev_p->thread; msrval = this_cpu_read(msr_misc_features_shadow);
next = &next_p->thread; msrval &= ~MSR_MISC_FEATURES_ENABLES_CPUID_FAULT;
msrval |= (on << MSR_MISC_FEATURES_ENABLES_CPUID_FAULT_BIT);
this_cpu_write(msr_misc_features_shadow, msrval);
wrmsrl(MSR_MISC_FEATURES_ENABLES, msrval);
}
if (test_tsk_thread_flag(prev_p, TIF_BLOCKSTEP) ^ static void disable_cpuid(void)
test_tsk_thread_flag(next_p, TIF_BLOCKSTEP)) { {
unsigned long debugctl = get_debugctlmsr(); preempt_disable();
if (!test_and_set_thread_flag(TIF_NOCPUID)) {
debugctl &= ~DEBUGCTLMSR_BTF; /*
if (test_tsk_thread_flag(next_p, TIF_BLOCKSTEP)) * Must flip the CPU state synchronously with
debugctl |= DEBUGCTLMSR_BTF; * TIF_NOCPUID in the current running context.
*/
update_debugctlmsr(debugctl); set_cpuid_faulting(true);
} }
preempt_enable();
}
if (test_tsk_thread_flag(prev_p, TIF_NOTSC) ^ static void enable_cpuid(void)
test_tsk_thread_flag(next_p, TIF_NOTSC)) { {
/* prev and next are different */ preempt_disable();
if (test_tsk_thread_flag(next_p, TIF_NOTSC)) if (test_and_clear_thread_flag(TIF_NOCPUID)) {
hard_disable_TSC(); /*
else * Must flip the CPU state synchronously with
hard_enable_TSC(); * TIF_NOCPUID in the current running context.
*/
set_cpuid_faulting(false);
} }
preempt_enable();
}
if (test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { static int get_cpuid_mode(void)
{
return !test_thread_flag(TIF_NOCPUID);
}
static int set_cpuid_mode(struct task_struct *task, unsigned long cpuid_enabled)
{
if (!static_cpu_has(X86_FEATURE_CPUID_FAULT))
return -ENODEV;
if (cpuid_enabled)
enable_cpuid();
else
disable_cpuid();
return 0;
}
/*
* Called immediately after a successful exec.
*/
void arch_setup_new_exec(void)
{
/* If cpuid was previously disabled for this task, re-enable it. */
if (test_thread_flag(TIF_NOCPUID))
enable_cpuid();
}
static inline void switch_to_bitmap(struct tss_struct *tss,
struct thread_struct *prev,
struct thread_struct *next,
unsigned long tifp, unsigned long tifn)
{
if (tifn & _TIF_IO_BITMAP) {
/* /*
* Copy the relevant range of the IO bitmap. * Copy the relevant range of the IO bitmap.
* Normally this is 128 bytes or less: * Normally this is 128 bytes or less:
*/ */
memcpy(tss->io_bitmap, next->io_bitmap_ptr, memcpy(tss->io_bitmap, next->io_bitmap_ptr,
max(prev->io_bitmap_max, next->io_bitmap_max)); max(prev->io_bitmap_max, next->io_bitmap_max));
/* /*
* Make sure that the TSS limit is correct for the CPU * Make sure that the TSS limit is correct for the CPU
* to notice the IO bitmap. * to notice the IO bitmap.
*/ */
refresh_tss_limit(); refresh_tss_limit();
} else if (test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)) { } else if (tifp & _TIF_IO_BITMAP) {
/* /*
* Clear any possible leftover bits: * Clear any possible leftover bits:
*/ */
memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); memset(tss->io_bitmap, 0xff, prev->io_bitmap_max);
} }
}
void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
struct tss_struct *tss)
{
struct thread_struct *prev, *next;
unsigned long tifp, tifn;
prev = &prev_p->thread;
next = &next_p->thread;
tifn = READ_ONCE(task_thread_info(next_p)->flags);
tifp = READ_ONCE(task_thread_info(prev_p)->flags);
switch_to_bitmap(tss, prev, next, tifp, tifn);
propagate_user_return_notify(prev_p, next_p); propagate_user_return_notify(prev_p, next_p);
if ((tifp & _TIF_BLOCKSTEP || tifn & _TIF_BLOCKSTEP) &&
arch_has_block_step()) {
unsigned long debugctl, msk;
rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctl);
debugctl &= ~DEBUGCTLMSR_BTF;
msk = tifn & _TIF_BLOCKSTEP;
debugctl |= (msk >> TIF_BLOCKSTEP) << DEBUGCTLMSR_BTF_SHIFT;
wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctl);
}
if ((tifp ^ tifn) & _TIF_NOTSC)
cr4_toggle_bits(X86_CR4_TSD);
if ((tifp ^ tifn) & _TIF_NOCPUID)
set_cpuid_faulting(!!(tifn & _TIF_NOCPUID));
} }
/* /*
@ -550,3 +616,16 @@ unsigned long get_wchan(struct task_struct *p)
put_task_stack(p); put_task_stack(p);
return ret; return ret;
} }
long do_arch_prctl_common(struct task_struct *task, int option,
unsigned long cpuid_enabled)
{
switch (option) {
case ARCH_GET_CPUID:
return get_cpuid_mode();
case ARCH_SET_CPUID:
return set_cpuid_mode(task, cpuid_enabled);
}
return -EINVAL;
}

View File

@ -37,6 +37,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/syscalls.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/ldt.h> #include <asm/ldt.h>
@ -56,6 +57,7 @@
#include <asm/switch_to.h> #include <asm/switch_to.h>
#include <asm/vm86.h> #include <asm/vm86.h>
#include <asm/intel_rdt.h> #include <asm/intel_rdt.h>
#include <asm/proto.h>
void __show_regs(struct pt_regs *regs, int all) void __show_regs(struct pt_regs *regs, int all)
{ {
@ -304,3 +306,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
return prev_p; return prev_p;
} }
SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)
{
return do_arch_prctl_common(current, option, arg2);
}

View File

@ -37,6 +37,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/ftrace.h> #include <linux/ftrace.h>
#include <linux/syscalls.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/processor.h> #include <asm/processor.h>
@ -204,7 +205,7 @@ int copy_thread_tls(unsigned long clone_flags, unsigned long sp,
(struct user_desc __user *)tls, 0); (struct user_desc __user *)tls, 0);
else else
#endif #endif
err = do_arch_prctl(p, ARCH_SET_FS, tls); err = do_arch_prctl_64(p, ARCH_SET_FS, tls);
if (err) if (err)
goto out; goto out;
} }
@ -547,70 +548,72 @@ static long prctl_map_vdso(const struct vdso_image *image, unsigned long addr)
} }
#endif #endif
long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2)
{ {
int ret = 0; int ret = 0;
int doit = task == current; int doit = task == current;
int cpu; int cpu;
switch (code) { switch (option) {
case ARCH_SET_GS: case ARCH_SET_GS:
if (addr >= TASK_SIZE_MAX) if (arg2 >= TASK_SIZE_MAX)
return -EPERM; return -EPERM;
cpu = get_cpu(); cpu = get_cpu();
task->thread.gsindex = 0; task->thread.gsindex = 0;
task->thread.gsbase = addr; task->thread.gsbase = arg2;
if (doit) { if (doit) {
load_gs_index(0); load_gs_index(0);
ret = wrmsrl_safe(MSR_KERNEL_GS_BASE, addr); ret = wrmsrl_safe(MSR_KERNEL_GS_BASE, arg2);
} }
put_cpu(); put_cpu();
break; break;
case ARCH_SET_FS: case ARCH_SET_FS:
/* Not strictly needed for fs, but do it for symmetry /* Not strictly needed for fs, but do it for symmetry
with gs */ with gs */
if (addr >= TASK_SIZE_MAX) if (arg2 >= TASK_SIZE_MAX)
return -EPERM; return -EPERM;
cpu = get_cpu(); cpu = get_cpu();
task->thread.fsindex = 0; task->thread.fsindex = 0;
task->thread.fsbase = addr; task->thread.fsbase = arg2;
if (doit) { if (doit) {
/* set the selector to 0 to not confuse __switch_to */ /* set the selector to 0 to not confuse __switch_to */
loadsegment(fs, 0); loadsegment(fs, 0);
ret = wrmsrl_safe(MSR_FS_BASE, addr); ret = wrmsrl_safe(MSR_FS_BASE, arg2);
} }
put_cpu(); put_cpu();
break; break;
case ARCH_GET_FS: { case ARCH_GET_FS: {
unsigned long base; unsigned long base;
if (doit) if (doit)
rdmsrl(MSR_FS_BASE, base); rdmsrl(MSR_FS_BASE, base);
else else
base = task->thread.fsbase; base = task->thread.fsbase;
ret = put_user(base, (unsigned long __user *)addr); ret = put_user(base, (unsigned long __user *)arg2);
break; break;
} }
case ARCH_GET_GS: { case ARCH_GET_GS: {
unsigned long base; unsigned long base;
if (doit) if (doit)
rdmsrl(MSR_KERNEL_GS_BASE, base); rdmsrl(MSR_KERNEL_GS_BASE, base);
else else
base = task->thread.gsbase; base = task->thread.gsbase;
ret = put_user(base, (unsigned long __user *)addr); ret = put_user(base, (unsigned long __user *)arg2);
break; break;
} }
#ifdef CONFIG_CHECKPOINT_RESTORE #ifdef CONFIG_CHECKPOINT_RESTORE
# ifdef CONFIG_X86_X32_ABI # ifdef CONFIG_X86_X32_ABI
case ARCH_MAP_VDSO_X32: case ARCH_MAP_VDSO_X32:
return prctl_map_vdso(&vdso_image_x32, addr); return prctl_map_vdso(&vdso_image_x32, arg2);
# endif # endif
# if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION # if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
case ARCH_MAP_VDSO_32: case ARCH_MAP_VDSO_32:
return prctl_map_vdso(&vdso_image_32, addr); return prctl_map_vdso(&vdso_image_32, arg2);
# endif # endif
case ARCH_MAP_VDSO_64: case ARCH_MAP_VDSO_64:
return prctl_map_vdso(&vdso_image_64, addr); return prctl_map_vdso(&vdso_image_64, arg2);
#endif #endif
default: default:
@ -621,11 +624,24 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
return ret; return ret;
} }
long sys_arch_prctl(int code, unsigned long addr) SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)
{ {
return do_arch_prctl(current, code, addr); long ret;
ret = do_arch_prctl_64(current, option, arg2);
if (ret == -EINVAL)
ret = do_arch_prctl_common(current, option, arg2);
return ret;
} }
#ifdef CONFIG_IA32_EMULATION
COMPAT_SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)
{
return do_arch_prctl_common(current, option, arg2);
}
#endif
unsigned long KSTK_ESP(struct task_struct *task) unsigned long KSTK_ESP(struct task_struct *task)
{ {
return task_pt_regs(task)->sp; return task_pt_regs(task)->sp;

View File

@ -396,12 +396,12 @@ static int putreg(struct task_struct *child,
if (value >= TASK_SIZE_MAX) if (value >= TASK_SIZE_MAX)
return -EIO; return -EIO;
/* /*
* When changing the segment base, use do_arch_prctl * When changing the segment base, use do_arch_prctl_64
* to set either thread.fs or thread.fsindex and the * to set either thread.fs or thread.fsindex and the
* corresponding GDT slot. * corresponding GDT slot.
*/ */
if (child->thread.fsbase != value) if (child->thread.fsbase != value)
return do_arch_prctl(child, ARCH_SET_FS, value); return do_arch_prctl_64(child, ARCH_SET_FS, value);
return 0; return 0;
case offsetof(struct user_regs_struct,gs_base): case offsetof(struct user_regs_struct,gs_base):
/* /*
@ -410,7 +410,7 @@ static int putreg(struct task_struct *child,
if (value >= TASK_SIZE_MAX) if (value >= TASK_SIZE_MAX)
return -EIO; return -EIO;
if (child->thread.gsbase != value) if (child->thread.gsbase != value)
return do_arch_prctl(child, ARCH_SET_GS, value); return do_arch_prctl_64(child, ARCH_SET_GS, value);
return 0; return 0;
#endif #endif
} }
@ -869,7 +869,7 @@ long arch_ptrace(struct task_struct *child, long request,
Works just like arch_prctl, except that the arguments Works just like arch_prctl, except that the arguments
are reversed. */ are reversed. */
case PTRACE_ARCH_PRCTL: case PTRACE_ARCH_PRCTL:
ret = do_arch_prctl(child, data, addr); ret = do_arch_prctl_64(child, data, addr);
break; break;
#endif #endif

View File

@ -16,7 +16,7 @@ obj-y = bug.o bugs_$(BITS).o delay.o fault.o ldt.o \
ifeq ($(CONFIG_X86_32),y) ifeq ($(CONFIG_X86_32),y)
obj-y += checksum_32.o obj-y += checksum_32.o syscalls_32.o
obj-$(CONFIG_ELF_CORE) += elfcore.o obj-$(CONFIG_ELF_CORE) += elfcore.o
subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o subarch-y = ../lib/string_32.o ../lib/atomic64_32.o ../lib/atomic64_cx8_32.o

View File

@ -78,7 +78,7 @@ static inline int ptrace_set_thread_area(struct task_struct *child, int idx,
return -ENOSYS; return -ENOSYS;
} }
extern long arch_prctl(struct task_struct *task, int code, extern long arch_prctl(struct task_struct *task, int option,
unsigned long __user *addr); unsigned long __user *addr);
#endif #endif

View File

@ -6,7 +6,7 @@
#include <sys/ptrace.h> #include <sys/ptrace.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
int os_arch_prctl(int pid, int code, unsigned long *addr) int os_arch_prctl(int pid, int option, unsigned long *arg2)
{ {
return ptrace(PTRACE_ARCH_PRCTL, pid, (unsigned long) addr, code); return ptrace(PTRACE_ARCH_PRCTL, pid, (unsigned long) arg2, option);
} }

View File

@ -0,0 +1,7 @@
#include <linux/syscalls.h>
#include <os.h>
SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)
{
return -EINVAL;
}

View File

@ -7,13 +7,15 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/sched/mm.h> #include <linux/sched/mm.h>
#include <linux/syscalls.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/prctl.h> /* XXX This should get the constants from libc */ #include <asm/prctl.h> /* XXX This should get the constants from libc */
#include <os.h> #include <os.h>
long arch_prctl(struct task_struct *task, int code, unsigned long __user *addr) long arch_prctl(struct task_struct *task, int option)
unsigned long __user *arg2)
{ {
unsigned long *ptr = addr, tmp; unsigned long *ptr = arg2, tmp;
long ret; long ret;
int pid = task->mm->context.id.u.pid; int pid = task->mm->context.id.u.pid;
@ -30,7 +32,7 @@ long arch_prctl(struct task_struct *task, int code, unsigned long __user *addr)
* arch_prctl is run on the host, then the registers are read * arch_prctl is run on the host, then the registers are read
* back. * back.
*/ */
switch (code) { switch (option) {
case ARCH_SET_FS: case ARCH_SET_FS:
case ARCH_SET_GS: case ARCH_SET_GS:
ret = restore_registers(pid, &current->thread.regs.regs); ret = restore_registers(pid, &current->thread.regs.regs);
@ -50,11 +52,11 @@ long arch_prctl(struct task_struct *task, int code, unsigned long __user *addr)
ptr = &tmp; ptr = &tmp;
} }
ret = os_arch_prctl(pid, code, ptr); ret = os_arch_prctl(pid, option, ptr);
if (ret) if (ret)
return ret; return ret;
switch (code) { switch (option) {
case ARCH_SET_FS: case ARCH_SET_FS:
current->thread.arch.fs = (unsigned long) ptr; current->thread.arch.fs = (unsigned long) ptr;
ret = save_registers(pid, &current->thread.regs.regs); ret = save_registers(pid, &current->thread.regs.regs);
@ -63,19 +65,19 @@ long arch_prctl(struct task_struct *task, int code, unsigned long __user *addr)
ret = save_registers(pid, &current->thread.regs.regs); ret = save_registers(pid, &current->thread.regs.regs);
break; break;
case ARCH_GET_FS: case ARCH_GET_FS:
ret = put_user(tmp, addr); ret = put_user(tmp, arg2);
break; break;
case ARCH_GET_GS: case ARCH_GET_GS:
ret = put_user(tmp, addr); ret = put_user(tmp, arg2);
break; break;
} }
return ret; return ret;
} }
long sys_arch_prctl(int code, unsigned long addr) SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)
{ {
return arch_prctl(current, code, (unsigned long __user *) addr); return arch_prctl(current, option, (unsigned long __user *) arg2);
} }
void arch_switch_to(struct task_struct *to) void arch_switch_to(struct task_struct *to)

View File

@ -1320,6 +1320,7 @@ void setup_new_exec(struct linux_binprm * bprm)
else else
set_dumpable(current->mm, suid_dumpable); set_dumpable(current->mm, suid_dumpable);
arch_setup_new_exec();
perf_event_exec(); perf_event_exec();
__set_task_comm(current, kbasename(bprm->filename), true); __set_task_comm(current, kbasename(bprm->filename), true);

View File

@ -723,6 +723,8 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32, asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32,
int, const char __user *); int, const char __user *);
asmlinkage long compat_sys_arch_prctl(int option, unsigned long arg2);
/* /*
* For most but not all architectures, "am I in a compat syscall?" and * For most but not all architectures, "am I in a compat syscall?" and
* "am I a compat task?" are the same question. For architectures on which * "am I a compat task?" are the same question. For architectures on which

View File

@ -101,6 +101,10 @@ static inline void check_object_size(const void *ptr, unsigned long n,
{ } { }
#endif /* CONFIG_HARDENED_USERCOPY */ #endif /* CONFIG_HARDENED_USERCOPY */
#ifndef arch_setup_new_exec
static inline void arch_setup_new_exec(void) { }
#endif
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _LINUX_THREAD_INFO_H */ #endif /* _LINUX_THREAD_INFO_H */

View File

@ -187,6 +187,7 @@
* Reuse free bits when adding new feature flags! * Reuse free bits when adding new feature flags!
*/ */
#define X86_FEATURE_RING3MWAIT ( 7*32+ 0) /* Ring 3 MONITOR/MWAIT */ #define X86_FEATURE_RING3MWAIT ( 7*32+ 0) /* Ring 3 MONITOR/MWAIT */
#define X86_FEATURE_CPUID_FAULT ( 7*32+ 1) /* Intel CPUID faulting */
#define X86_FEATURE_CPB ( 7*32+ 2) /* AMD Core Performance Boost */ #define X86_FEATURE_CPB ( 7*32+ 2) /* AMD Core Performance Boost */
#define X86_FEATURE_EPB ( 7*32+ 3) /* IA32_ENERGY_PERF_BIAS support */ #define X86_FEATURE_EPB ( 7*32+ 3) /* IA32_ENERGY_PERF_BIAS support */
#define X86_FEATURE_CAT_L3 ( 7*32+ 4) /* Cache Allocation Technology L3 */ #define X86_FEATURE_CAT_L3 ( 7*32+ 4) /* Cache Allocation Technology L3 */

View File

@ -286,7 +286,7 @@ ENDPROC(memcpy_mcsafe_unrolled)
_ASM_EXTABLE_FAULT(.L_copy_leading_bytes, .L_memcpy_mcsafe_fail) _ASM_EXTABLE_FAULT(.L_copy_leading_bytes, .L_memcpy_mcsafe_fail)
_ASM_EXTABLE_FAULT(.L_cache_w0, .L_memcpy_mcsafe_fail) _ASM_EXTABLE_FAULT(.L_cache_w0, .L_memcpy_mcsafe_fail)
_ASM_EXTABLE_FAULT(.L_cache_w1, .L_memcpy_mcsafe_fail) _ASM_EXTABLE_FAULT(.L_cache_w1, .L_memcpy_mcsafe_fail)
_ASM_EXTABLE_FAULT(.L_cache_w3, .L_memcpy_mcsafe_fail) _ASM_EXTABLE_FAULT(.L_cache_w2, .L_memcpy_mcsafe_fail)
_ASM_EXTABLE_FAULT(.L_cache_w3, .L_memcpy_mcsafe_fail) _ASM_EXTABLE_FAULT(.L_cache_w3, .L_memcpy_mcsafe_fail)
_ASM_EXTABLE_FAULT(.L_cache_w4, .L_memcpy_mcsafe_fail) _ASM_EXTABLE_FAULT(.L_cache_w4, .L_memcpy_mcsafe_fail)
_ASM_EXTABLE_FAULT(.L_cache_w5, .L_memcpy_mcsafe_fail) _ASM_EXTABLE_FAULT(.L_cache_w5, .L_memcpy_mcsafe_fail)

10
tools/include/linux/bug.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef _TOOLS_PERF_LINUX_BUG_H
#define _TOOLS_PERF_LINUX_BUG_H
/* Force a compilation error if condition is true, but also produce a
result (of value 0 and type size_t), so the expression can be used
e.g. in a structure initializer (or where-ever else comma expressions
aren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#endif /* _TOOLS_PERF_LINUX_BUG_H */

View File

@ -16,3 +16,6 @@
#if GCC_VERSION >= 40300 #if GCC_VERSION >= 40300
# define __compiletime_error(message) __attribute__((error(message))) # define __compiletime_error(message) __attribute__((error(message)))
#endif /* GCC_VERSION >= 40300 */ #endif /* GCC_VERSION >= 40300 */
/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))

View File

@ -17,6 +17,11 @@
# define __always_inline inline __attribute__((always_inline)) # define __always_inline inline __attribute__((always_inline))
#endif #endif
/* Are two types/vars the same type (ignoring qualifiers)? */
#ifndef __same_type
# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
#endif
#ifdef __ANDROID__ #ifdef __ANDROID__
/* /*
* FIXME: Big hammer to get rid of tons of: * FIXME: Big hammer to get rid of tons of:

View File

@ -13,10 +13,6 @@
#include <linux/hash.h> #include <linux/hash.h>
#include <linux/log2.h> #include <linux/log2.h>
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#endif
#define DEFINE_HASHTABLE(name, bits) \ #define DEFINE_HASHTABLE(name, bits) \
struct hlist_head name[1 << (bits)] = \ struct hlist_head name[1 << (bits)] = \
{ [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT } { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT }

View File

@ -4,6 +4,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <stddef.h> #include <stddef.h>
#include <assert.h> #include <assert.h>
#include <linux/compiler.h>
#ifndef UINT_MAX #ifndef UINT_MAX
#define UINT_MAX (~0U) #define UINT_MAX (~0U)
@ -76,6 +77,8 @@
int vscnprintf(char *buf, size_t size, const char *fmt, va_list args); int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
int scnprintf(char * buf, size_t size, const char * fmt, ...); int scnprintf(char * buf, size_t size, const char * fmt, ...);
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
/* /*
* This looks more complex than it should be. But we need to * This looks more complex than it should be. But we need to
* get the type for the ~ right in round_down (it needs to be * get the type for the ~ right in round_down (it needs to be

View File

@ -12,6 +12,9 @@
#ifndef _TOOLS_LINUX_LOG2_H #ifndef _TOOLS_LINUX_LOG2_H
#define _TOOLS_LINUX_LOG2_H #define _TOOLS_LINUX_LOG2_H
#include <linux/bitops.h>
#include <linux/types.h>
/* /*
* non-constant log of base 2 calculators * non-constant log of base 2 calculators
* - the arch may override these in asm/bitops.h if they can be implemented * - the arch may override these in asm/bitops.h if they can be implemented

View File

@ -114,7 +114,7 @@ struct statx {
__u64 stx_ino; /* Inode number */ __u64 stx_ino; /* Inode number */
__u64 stx_size; /* File size */ __u64 stx_size; /* File size */
__u64 stx_blocks; /* Number of 512-byte blocks allocated */ __u64 stx_blocks; /* Number of 512-byte blocks allocated */
__u64 __spare1[1]; __u64 stx_attributes_mask; /* Mask to show what's supported in stx_attributes */
/* 0x40 */ /* 0x40 */
struct statx_timestamp stx_atime; /* Last access time */ struct statx_timestamp stx_atime; /* Last access time */
struct statx_timestamp stx_btime; /* File creation time */ struct statx_timestamp stx_btime; /* File creation time */
@ -152,9 +152,10 @@ struct statx {
#define STATX_BASIC_STATS 0x000007ffU /* The stuff in the normal stat struct */ #define STATX_BASIC_STATS 0x000007ffU /* The stuff in the normal stat struct */
#define STATX_BTIME 0x00000800U /* Want/got stx_btime */ #define STATX_BTIME 0x00000800U /* Want/got stx_btime */
#define STATX_ALL 0x00000fffU /* All currently supported flags */ #define STATX_ALL 0x00000fffU /* All currently supported flags */
#define STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */
/* /*
* Attributes to be found in stx_attributes * Attributes to be found in stx_attributes and masked in stx_attributes_mask.
* *
* These give information about the features or the state of a file that might * These give information about the features or the state of a file that might
* be of use to ordinary userspace programs such as GUIs or ls rather than * be of use to ordinary userspace programs such as GUIs or ls rather than

View File

@ -2,6 +2,7 @@
#define __SUBCMD_HELP_H #define __SUBCMD_HELP_H
#include <sys/types.h> #include <sys/types.h>
#include <stdio.h>
struct cmdnames { struct cmdnames {
size_t alloc; size_t alloc;

View File

@ -1,3 +1,4 @@
#include <ctype.h>
#include "symbol/kallsyms.h" #include "symbol/kallsyms.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>

View File

@ -36,8 +36,7 @@
#include "warn.h" #include "warn.h"
#include <linux/hashtable.h> #include <linux/hashtable.h>
#include <linux/kernel.h>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#define STATE_FP_SAVED 0x1 #define STATE_FP_SAVED 0x1
#define STATE_FP_SETUP 0x2 #define STATE_FP_SETUP 0x2

View File

@ -31,11 +31,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <subcmd/exec-cmd.h> #include <subcmd/exec-cmd.h>
#include <subcmd/pager.h> #include <subcmd/pager.h>
#include <linux/kernel.h>
#include "builtin.h" #include "builtin.h"
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
struct cmd_struct { struct cmd_struct {
const char *name; const char *name;
int (*fn)(int, const char **); int (*fn)(int, const char **);

View File

@ -64,6 +64,7 @@ tools/include/linux/bitops.h
tools/include/linux/compiler.h tools/include/linux/compiler.h
tools/include/linux/compiler-gcc.h tools/include/linux/compiler-gcc.h
tools/include/linux/coresight-pmu.h tools/include/linux/coresight-pmu.h
tools/include/linux/bug.h
tools/include/linux/filter.h tools/include/linux/filter.h
tools/include/linux/hash.h tools/include/linux/hash.h
tools/include/linux/kernel.h tools/include/linux/kernel.h

View File

@ -33,6 +33,7 @@
#include "../../util/cs-etm.h" #include "../../util/cs-etm.h"
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h>
#define ENABLE_SINK_MAX 128 #define ENABLE_SINK_MAX 128
#define CS_BUS_DEVICE_PATH "/bus/coresight/devices/" #define CS_BUS_DEVICE_PATH "/bus/coresight/devices/"

View File

@ -9,6 +9,7 @@
*/ */
#include <stddef.h> #include <stddef.h>
#include <linux/stringify.h>
#include <dwarf-regs.h> #include <dwarf-regs.h>
struct pt_regs_dwarfnum { struct pt_regs_dwarfnum {
@ -16,10 +17,9 @@ struct pt_regs_dwarfnum {
unsigned int dwarfnum; unsigned int dwarfnum;
}; };
#define STR(s) #s
#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
#define GPR_DWARFNUM_NAME(num) \ #define GPR_DWARFNUM_NAME(num) \
{.name = STR(%r##num), .dwarfnum = num} {.name = __stringify(%r##num), .dwarfnum = num}
#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
/* /*

View File

@ -1,6 +1,7 @@
#include <elfutils/libdwfl.h> #include <elfutils/libdwfl.h>
#include "../../util/unwind-libdw.h" #include "../../util/unwind-libdw.h"
#include "../../util/perf_regs.h" #include "../../util/perf_regs.h"
#include "../../util/event.h"
bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
{ {

View File

@ -8,9 +8,12 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <errno.h>
#include <stddef.h> #include <stddef.h>
#include <string.h>
#include <dwarf-regs.h> #include <dwarf-regs.h>
#include <linux/ptrace.h> /* for struct user_pt_regs */ #include <linux/ptrace.h> /* for struct user_pt_regs */
#include <linux/stringify.h>
#include "util.h" #include "util.h"
struct pt_regs_dwarfnum { struct pt_regs_dwarfnum {
@ -20,7 +23,7 @@ struct pt_regs_dwarfnum {
#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num} #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
#define GPR_DWARFNUM_NAME(num) \ #define GPR_DWARFNUM_NAME(num) \
{.name = STR(%x##num), .dwarfnum = num} {.name = __stringify(%x##num), .dwarfnum = num}
#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0} #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
#define DWARFNUM2OFFSET(index) \ #define DWARFNUM2OFFSET(index) \
(index * sizeof((struct user_pt_regs *)0)->regs[0]) (index * sizeof((struct user_pt_regs *)0)->regs[0])

View File

@ -1,6 +1,6 @@
#include <errno.h>
#ifndef REMOTE_UNWIND_LIBUNWIND #ifndef REMOTE_UNWIND_LIBUNWIND
#include <errno.h>
#include <libunwind.h> #include <libunwind.h>
#include "perf_regs.h" #include "perf_regs.h"
#include "../../util/unwind.h" #include "../../util/unwind.h"

View File

@ -4,6 +4,8 @@
#include "../util/util.h" #include "../util/util.h"
#include "../util/debug.h" #include "../util/debug.h"
#include "sane_ctype.h"
const char *const arm_triplets[] = { const char *const arm_triplets[] = {
"arm-eabi-", "arm-eabi-",
"arm-linux-androideabi-", "arm-linux-androideabi-",

View File

@ -15,6 +15,7 @@
#include <dwarf-regs.h> #include <dwarf-regs.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/stringify.h>
#include "util.h" #include "util.h"
struct pt_regs_dwarfnum { struct pt_regs_dwarfnum {
@ -24,10 +25,10 @@ struct pt_regs_dwarfnum {
}; };
#define REG_DWARFNUM_NAME(r, num) \ #define REG_DWARFNUM_NAME(r, num) \
{.name = STR(%)STR(r), .dwarfnum = num, \ {.name = __stringify(%)__stringify(r), .dwarfnum = num, \
.ptregs_offset = offsetof(struct pt_regs, r)} .ptregs_offset = offsetof(struct pt_regs, r)}
#define GPR_DWARFNUM_NAME(num) \ #define GPR_DWARFNUM_NAME(num) \
{.name = STR(%gpr##num), .dwarfnum = num, \ {.name = __stringify(%gpr##num), .dwarfnum = num, \
.ptregs_offset = offsetof(struct pt_regs, gpr[num])} .ptregs_offset = offsetof(struct pt_regs, gpr[num])}
#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0, .ptregs_offset = 0} #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0, .ptregs_offset = 0}

View File

@ -1,3 +1,4 @@
#include <errno.h>
#include "util/kvm-stat.h" #include "util/kvm-stat.h"
#include "util/parse-events.h" #include "util/parse-events.h"
#include "util/debug.h" #include "util/debug.h"

View File

@ -1,3 +1,4 @@
#include <errno.h>
#include <string.h> #include <string.h>
#include <regex.h> #include <regex.h>

View File

@ -9,6 +9,7 @@
* as published by the Free Software Foundation. * as published by the Free Software Foundation.
*/ */
#include <errno.h>
#include "../../util/kvm-stat.h" #include "../../util/kvm-stat.h"
#include <asm/sie.h> #include <asm/sie.h>

View File

@ -6,7 +6,10 @@
#include "evsel.h" #include "evsel.h"
#include "arch-tests.h" #include "arch-tests.h"
#include <signal.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h> #include <string.h>
static pid_t spawn(void) static pid_t spawn(void)

View File

@ -1,3 +1,5 @@
#include <errno.h>
#include <inttypes.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <linux/types.h> #include <linux/types.h>

View File

@ -13,6 +13,7 @@
* *
*/ */
#include <errno.h>
#include <stdbool.h> #include <stdbool.h>
#include "../../util/header.h" #include "../../util/header.h"

View File

@ -13,6 +13,7 @@
* *
*/ */
#include <errno.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/bitops.h> #include <linux/bitops.h>

View File

@ -13,6 +13,7 @@
* *
*/ */
#include <errno.h>
#include <stdbool.h> #include <stdbool.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>

View File

@ -1,3 +1,4 @@
#include <errno.h>
#include "../../util/kvm-stat.h" #include "../../util/kvm-stat.h"
#include <asm/svm.h> #include <asm/svm.h>
#include <asm/vmx.h> #include <asm/vmx.h>

View File

@ -1,3 +1,4 @@
#include <errno.h>
#include <string.h> #include <string.h>
#include <regex.h> #include <regex.h>

View File

@ -1,6 +1,7 @@
#include <elfutils/libdwfl.h> #include <elfutils/libdwfl.h>
#include "../../util/unwind-libdw.h" #include "../../util/unwind-libdw.h"
#include "../../util/perf_regs.h" #include "../../util/perf_regs.h"
#include "../../util/event.h"
bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
{ {

View File

@ -12,6 +12,7 @@
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>
#include "../util/header.h" #include "../util/header.h"
#include "../util/cloexec.h" #include "../util/cloexec.h"
#include "../util/string2.h"
#include "bench.h" #include "bench.h"
#include "mem-memcpy-arch.h" #include "mem-memcpy-arch.h"
#include "mem-memset-arch.h" #include "mem-memset-arch.h"

View File

@ -4,6 +4,7 @@
* numa: Simulate NUMA-sensitive workload and measure their NUMA performance * numa: Simulate NUMA-sensitive workload and measure their NUMA performance
*/ */
#include <inttypes.h>
/* For the CLR_() macros */ /* For the CLR_() macros */
#include <pthread.h> #include <pthread.h>
@ -30,6 +31,7 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/prctl.h> #include <sys/prctl.h>
#include <sys/types.h> #include <sys/types.h>
#include <linux/kernel.h>
#include <linux/time64.h> #include <linux/time64.h>
#include <numa.h> #include <numa.h>

View File

@ -33,6 +33,7 @@
#include "util/block-range.h" #include "util/block-range.h"
#include <dlfcn.h> #include <dlfcn.h>
#include <errno.h>
#include <linux/bitmap.h> #include <linux/bitmap.h>
struct perf_annotate { struct perf_annotate {

View File

@ -10,6 +10,7 @@
#include <sys/time.h> #include <sys/time.h>
#include <time.h> #include <time.h>
#include <dirent.h> #include <dirent.h>
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include "builtin.h" #include "builtin.h"
#include "perf.h" #include "perf.h"
@ -21,6 +22,7 @@
#include "util/build-id.h" #include "util/build-id.h"
#include "util/session.h" #include "util/session.h"
#include "util/symbol.h" #include "util/symbol.h"
#include "util/time-utils.h"
static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuildid) static int build_id_cache__kcore_buildid(const char *proc_dir, char *sbuildid)
{ {

View File

@ -16,6 +16,7 @@
#include "util/session.h" #include "util/session.h"
#include "util/symbol.h" #include "util/symbol.h"
#include "util/data.h" #include "util/data.h"
#include <errno.h>
static int sysfs__fprintf_build_id(FILE *fp) static int sysfs__fprintf_build_id(FILE *fp)
{ {

View File

@ -9,10 +9,13 @@
* Dick Fowles <fowles@inreach.com> * Dick Fowles <fowles@inreach.com>
* Joe Mario <jmario@redhat.com> * Joe Mario <jmario@redhat.com>
*/ */
#include <errno.h>
#include <inttypes.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/stringify.h> #include <linux/stringify.h>
#include <asm/bug.h> #include <asm/bug.h>
#include <sys/param.h>
#include "util.h" #include "util.h"
#include "debug.h" #include "debug.h"
#include "builtin.h" #include "builtin.h"
@ -29,6 +32,7 @@
#include <asm/bug.h> #include <asm/bug.h>
#include "ui/browsers/hists.h" #include "ui/browsers/hists.h"
#include "evlist.h" #include "evlist.h"
#include "thread.h"
struct c2c_hists { struct c2c_hists {
struct hists hists; struct hists hists;

View File

@ -19,6 +19,8 @@
#include "util/data.h" #include "util/data.h"
#include "util/config.h" #include "util/config.h"
#include <errno.h>
#include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>

View File

@ -9,12 +9,15 @@
#include "builtin.h" #include "builtin.h"
#include "perf.h" #include "perf.h"
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <fcntl.h> #include <fcntl.h>
#include <poll.h>
#include "debug.h" #include "debug.h"
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>
#include <api/fs/tracing_path.h>
#include "evlist.h" #include "evlist.h"
#include "target.h" #include "target.h"
#include "cpumap.h" #include "cpumap.h"

View File

@ -12,16 +12,22 @@
#include <subcmd/run-command.h> #include <subcmd/run-command.h>
#include <subcmd/help.h> #include <subcmd/help.h>
#include "util/debug.h" #include "util/debug.h"
#include <linux/kernel.h>
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
static struct man_viewer_list { static struct man_viewer_list {
struct man_viewer_list *next; struct man_viewer_list *next;
char name[FLEX_ARRAY]; char name[0];
} *man_viewer_list; } *man_viewer_list;
static struct man_viewer_info_list { static struct man_viewer_info_list {
struct man_viewer_info_list *next; struct man_viewer_info_list *next;
const char *info; const char *info;
char name[FLEX_ARRAY]; char name[0];
} *man_viewer_info_list; } *man_viewer_info_list;
enum help_format { enum help_format {

View File

@ -18,10 +18,13 @@
#include "util/data.h" #include "util/data.h"
#include "util/auxtrace.h" #include "util/auxtrace.h"
#include "util/jit.h" #include "util/jit.h"
#include "util/thread.h"
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>
#include <linux/list.h> #include <linux/list.h>
#include <errno.h>
#include <signal.h>
struct perf_inject { struct perf_inject {
struct perf_tool tool; struct perf_tool tool;

View File

@ -7,6 +7,7 @@
* *
* Released under the GPL v2. (and only v2, not any later version) * Released under the GPL v2. (and only v2, not any later version)
*/ */
#include <inttypes.h>
#include "builtin.h" #include "builtin.h"
#include <linux/compiler.h> #include <linux/compiler.h>
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>

View File

@ -20,11 +20,16 @@
#include "util/debug.h" #include "util/debug.h"
#include <linux/kernel.h>
#include <linux/rbtree.h> #include <linux/rbtree.h>
#include <linux/string.h> #include <linux/string.h>
#include <errno.h>
#include <inttypes.h>
#include <locale.h> #include <locale.h>
#include <regex.h> #include <regex.h>
#include "sane_ctype.h"
static int kmem_slab; static int kmem_slab;
static int kmem_page; static int kmem_page;

View File

@ -3,6 +3,7 @@
#include "util/evsel.h" #include "util/evsel.h"
#include "util/evlist.h" #include "util/evlist.h"
#include "util/term.h"
#include "util/util.h" #include "util/util.h"
#include "util/cache.h" #include "util/cache.h"
#include "util/symbol.h" #include "util/symbol.h"
@ -23,13 +24,33 @@
#ifdef HAVE_TIMERFD_SUPPORT #ifdef HAVE_TIMERFD_SUPPORT
#include <sys/timerfd.h> #include <sys/timerfd.h>
#endif #endif
#include <sys/time.h>
#include <linux/kernel.h>
#include <linux/time64.h> #include <linux/time64.h>
#include <errno.h>
#include <inttypes.h>
#include <poll.h>
#include <termios.h> #include <termios.h>
#include <semaphore.h> #include <semaphore.h>
#include <signal.h>
#include <pthread.h> #include <pthread.h>
#include <math.h> #include <math.h>
static const char *get_filename_for_perf_kvm(void)
{
const char *filename;
if (perf_host && !perf_guest)
filename = strdup("perf.data.host");
else if (!perf_host && perf_guest)
filename = strdup("perf.data.guest");
else
filename = strdup("perf.data.kvm");
return filename;
}
#ifdef HAVE_KVM_STAT_SUPPORT #ifdef HAVE_KVM_STAT_SUPPORT
#include "util/kvm-stat.h" #include "util/kvm-stat.h"

View File

@ -1,3 +1,5 @@
#include <errno.h>
#include <inttypes.h>
#include "builtin.h" #include "builtin.h"
#include "perf.h" #include "perf.h"
@ -26,6 +28,7 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/hash.h> #include <linux/hash.h>
#include <linux/kernel.h>
static struct perf_session *session; static struct perf_session *session;

View File

@ -1,3 +1,7 @@
#include <inttypes.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "builtin.h" #include "builtin.h"
#include "perf.h" #include "perf.h"
@ -8,6 +12,7 @@
#include "util/data.h" #include "util/data.h"
#include "util/mem-events.h" #include "util/mem-events.h"
#include "util/debug.h" #include "util/debug.h"
#include "util/symbol.h"
#define MEM_OPERATION_LOAD 0x1 #define MEM_OPERATION_LOAD 0x1
#define MEM_OPERATION_STORE 0x2 #define MEM_OPERATION_STORE 0x2

View File

@ -38,11 +38,18 @@
#include "util/bpf-loader.h" #include "util/bpf-loader.h"
#include "util/trigger.h" #include "util/trigger.h"
#include "util/perf-hooks.h" #include "util/perf-hooks.h"
#include "util/time-utils.h"
#include "util/units.h"
#include "asm/bug.h" #include "asm/bug.h"
#include <errno.h>
#include <inttypes.h>
#include <poll.h>
#include <unistd.h> #include <unistd.h>
#include <sched.h> #include <sched.h>
#include <signal.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/wait.h>
#include <asm/bug.h> #include <asm/bug.h>
#include <linux/time64.h> #include <linux/time64.h>

View File

@ -16,7 +16,6 @@
#include <linux/rbtree.h> #include <linux/rbtree.h>
#include "util/symbol.h" #include "util/symbol.h"
#include "util/callchain.h" #include "util/callchain.h"
#include "util/strlist.h"
#include "util/values.h" #include "util/values.h"
#include "perf.h" #include "perf.h"
@ -38,10 +37,18 @@
#include "arch/common.h" #include "arch/common.h"
#include "util/time-utils.h" #include "util/time-utils.h"
#include "util/auxtrace.h" #include "util/auxtrace.h"
#include "util/units.h"
#include <dlfcn.h> #include <dlfcn.h>
#include <errno.h>
#include <inttypes.h>
#include <regex.h>
#include <signal.h>
#include <linux/bitmap.h> #include <linux/bitmap.h>
#include <linux/stringify.h> #include <linux/stringify.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
struct report { struct report {
struct perf_tool tool; struct perf_tool tool;

View File

@ -22,16 +22,21 @@
#include "util/debug.h" #include "util/debug.h"
#include <linux/kernel.h>
#include <linux/log2.h> #include <linux/log2.h>
#include <sys/prctl.h> #include <sys/prctl.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <inttypes.h>
#include <errno.h>
#include <semaphore.h> #include <semaphore.h>
#include <pthread.h> #include <pthread.h>
#include <math.h> #include <math.h>
#include <api/fs/fs.h> #include <api/fs/fs.h>
#include <linux/time64.h> #include <linux/time64.h>
#include "sane_ctype.h"
#define PR_SET_NAME 15 /* Set process name */ #define PR_SET_NAME 15 /* Set process name */
#define MAX_CPUS 4096 #define MAX_CPUS 4096
#define COMM_LEN 20 #define COMM_LEN 20

View File

@ -21,14 +21,27 @@
#include "util/cpumap.h" #include "util/cpumap.h"
#include "util/thread_map.h" #include "util/thread_map.h"
#include "util/stat.h" #include "util/stat.h"
#include "util/string2.h"
#include "util/thread-stack.h" #include "util/thread-stack.h"
#include "util/time-utils.h" #include "util/time-utils.h"
#include "print_binary.h"
#include <linux/bitmap.h> #include <linux/bitmap.h>
#include <linux/kernel.h>
#include <linux/stringify.h> #include <linux/stringify.h>
#include <linux/time64.h> #include <linux/time64.h>
#include "asm/bug.h" #include "asm/bug.h"
#include "util/mem-events.h" #include "util/mem-events.h"
#include "util/dump-insn.h" #include "util/dump-insn.h"
#include <dirent.h>
#include <errno.h>
#include <inttypes.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "sane_ctype.h"
static char const *script_name; static char const *script_name;
static char const *generate_script_lang; static char const *generate_script_lang;

View File

@ -64,14 +64,24 @@
#include "util/session.h" #include "util/session.h"
#include "util/tool.h" #include "util/tool.h"
#include "util/group.h" #include "util/group.h"
#include "util/string2.h"
#include "asm/bug.h" #include "asm/bug.h"
#include <linux/time64.h> #include <linux/time64.h>
#include <api/fs/fs.h> #include <api/fs/fs.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/prctl.h> #include <sys/prctl.h>
#include <inttypes.h>
#include <locale.h> #include <locale.h>
#include <math.h> #include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include "sane_ctype.h"
#define DEFAULT_SEPARATOR " " #define DEFAULT_SEPARATOR " "
#define CNTR_NOT_SUPPORTED "<not supported>" #define CNTR_NOT_SUPPORTED "<not supported>"

View File

@ -12,6 +12,8 @@
* of the License. * of the License.
*/ */
#include <errno.h>
#include <inttypes.h>
#include <traceevent/event-parse.h> #include <traceevent/event-parse.h>
#include "builtin.h" #include "builtin.h"
@ -23,11 +25,12 @@
#include "util/cache.h" #include "util/cache.h"
#include "util/evlist.h" #include "util/evlist.h"
#include "util/evsel.h" #include "util/evsel.h"
#include <linux/kernel.h>
#include <linux/rbtree.h> #include <linux/rbtree.h>
#include <linux/time64.h> #include <linux/time64.h>
#include "util/symbol.h" #include "util/symbol.h"
#include "util/thread.h"
#include "util/callchain.h" #include "util/callchain.h"
#include "util/strlist.h"
#include "perf.h" #include "perf.h"
#include "util/header.h" #include "util/header.h"

View File

@ -40,6 +40,7 @@
#include "util/cpumap.h" #include "util/cpumap.h"
#include "util/xyarray.h" #include "util/xyarray.h"
#include "util/sort.h" #include "util/sort.h"
#include "util/term.h"
#include "util/intlist.h" #include "util/intlist.h"
#include "util/parse-branch-options.h" #include "util/parse-branch-options.h"
#include "arch/common.h" #include "arch/common.h"
@ -58,6 +59,7 @@
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
#include <sched.h> #include <sched.h>
#include <signal.h>
#include <sys/syscall.h> #include <sys/syscall.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -72,6 +74,8 @@
#include <linux/time64.h> #include <linux/time64.h>
#include <linux/types.h> #include <linux/types.h>
#include "sane_ctype.h"
static volatile int done; static volatile int done;
#define HEADER_LINE_NR 5 #define HEADER_LINE_NR 5

View File

@ -24,6 +24,7 @@
#include "util/evlist.h" #include "util/evlist.h"
#include <subcmd/exec-cmd.h> #include <subcmd/exec-cmd.h>
#include "util/machine.h" #include "util/machine.h"
#include "util/path.h"
#include "util/session.h" #include "util/session.h"
#include "util/thread.h" #include "util/thread.h"
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>
@ -36,19 +37,28 @@
#include "util/parse-events.h" #include "util/parse-events.h"
#include "util/bpf-loader.h" #include "util/bpf-loader.h"
#include "callchain.h" #include "callchain.h"
#include "print_binary.h"
#include "string2.h"
#include "syscalltbl.h" #include "syscalltbl.h"
#include "rb_resort.h" #include "rb_resort.h"
#include <errno.h>
#include <inttypes.h>
#include <libaudit.h> /* FIXME: Still needed for audit_errno_to_name */ #include <libaudit.h> /* FIXME: Still needed for audit_errno_to_name */
#include <poll.h>
#include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/filter.h> #include <linux/filter.h>
#include <linux/audit.h> #include <linux/audit.h>
#include <linux/kernel.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/stringify.h> #include <linux/stringify.h>
#include <linux/time64.h> #include <linux/time64.h>
#include "sane_ctype.h"
#ifndef O_CLOEXEC #ifndef O_CLOEXEC
# define O_CLOEXEC 02000000 # define O_CLOEXEC 02000000
#endif #endif

View File

@ -1,6 +1,7 @@
#include "util/util.h"
#include "builtin.h" #include "builtin.h"
#include "perf.h" #include "perf.h"
#include <linux/compiler.h>
#include <stdio.h>
int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused) int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
{ {

View File

@ -2,16 +2,12 @@
#define BUILTIN_H #define BUILTIN_H
#include "util/util.h" #include "util/util.h"
#include "util/strbuf.h"
extern const char perf_usage_string[]; extern const char perf_usage_string[];
extern const char perf_more_info_string[]; extern const char perf_more_info_string[];
void list_common_cmds_help(void); void list_common_cmds_help(void);
const char *help_unknown_cmd(const char *cmd); const char *help_unknown_cmd(const char *cmd);
void prune_packed_objects(int);
int read_line_with_nul(char *buf, int size, FILE *file);
int check_pager_config(const char *cmd);
int cmd_annotate(int argc, const char **argv); int cmd_annotate(int argc, const char **argv);
int cmd_bench(int argc, const char **argv); int cmd_bench(int argc, const char **argv);

View File

@ -19,9 +19,15 @@
#include "util/debug.h" #include "util/debug.h"
#include <api/fs/fs.h> #include <api/fs/fs.h>
#include <api/fs/tracing_path.h> #include <api/fs/tracing_path.h>
#include <errno.h>
#include <pthread.h> #include <pthread.h>
#include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/kernel.h>
const char perf_usage_string[] = const char perf_usage_string[] =
"perf [--version] [--help] [OPTIONS] COMMAND [ARGS]"; "perf [--version] [--help] [OPTIONS] COMMAND [ARGS]";
@ -88,7 +94,7 @@ static int pager_command_config(const char *var, const char *value, void *data)
} }
/* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */ /* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
int check_pager_config(const char *cmd) static int check_pager_config(const char *cmd)
{ {
int err; int err;
struct pager_config c; struct pager_config c;
@ -327,16 +333,6 @@ static void handle_internal_command(int argc, const char **argv)
{ {
const char *cmd = argv[0]; const char *cmd = argv[0];
unsigned int i; unsigned int i;
static const char ext[] = STRIP_EXTENSION;
if (sizeof(ext) > 1) {
i = strlen(argv[0]) - strlen(ext);
if (i > 0 && !strcmp(argv[0] + i, ext)) {
char *argv0 = strdup(argv[0]);
argv[0] = cmd = argv0;
argv0[i] = '\0';
}
}
/* Turn "perf cmd --help" into "perf help cmd" */ /* Turn "perf cmd --help" into "perf help cmd" */
if (argc > 1 && !strcmp(argv[1], "--help")) { if (argc > 1 && !strcmp(argv[1], "--help")) {

View File

@ -18,10 +18,16 @@
* permissions. All the event text files are stored there. * permissions. All the event text files are stored there.
*/ */
#include <errno.h>
#include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "../perf.h" #include "../perf.h"
#include "util.h" #include "util.h"
#include <subcmd/exec-cmd.h> #include <subcmd/exec-cmd.h>

View File

@ -8,6 +8,7 @@
#include <sys/prctl.h> #include <sys/prctl.h>
#include "tests.h" #include "tests.h"
#include "debug.h" #include "debug.h"
#include <errno.h>
#define NR_ITERS 111 #define NR_ITERS 111

View File

@ -1,10 +1,14 @@
#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <util/util.h> #include <util/util.h>
#include <util/bpf-loader.h> #include <util/bpf-loader.h>
#include <util/evlist.h> #include <util/evlist.h>
#include <linux/bpf.h> #include <linux/bpf.h>
#include <linux/filter.h> #include <linux/filter.h>
#include <linux/kernel.h>
#include <api/fs/fs.h> #include <api/fs/fs.h>
#include <bpf/bpf.h> #include <bpf/bpf.h>
#include "tests.h" #include "tests.h"

View File

@ -3,8 +3,10 @@
* *
* Builtin regression testing command: ever growing number of sanity tests * Builtin regression testing command: ever growing number of sanity tests
*/ */
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <sys/wait.h>
#include "builtin.h" #include "builtin.h"
#include "hist.h" #include "hist.h"
#include "intlist.h" #include "intlist.h"
@ -13,6 +15,7 @@
#include "color.h" #include "color.h"
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>
#include "symbol.h" #include "symbol.h"
#include <linux/kernel.h>
static bool dont_fork; static bool dont_fork;

View File

@ -2,6 +2,7 @@
#include "debug.h" #include "debug.h"
#include "util.h" #include "util.h"
#include "c++/clang-c.h" #include "c++/clang-c.h"
#include <linux/kernel.h>
static struct { static struct {
int (*func)(void); int (*func)(void);

View File

@ -1,9 +1,12 @@
#include <errno.h>
#include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h>
#include <string.h> #include <string.h>
#include <sys/param.h>
#include "parse-events.h" #include "parse-events.h"
#include "evlist.h" #include "evlist.h"
@ -16,6 +19,8 @@
#include "tests.h" #include "tests.h"
#include "sane_ctype.h"
#define BUFSZ 1024 #define BUFSZ 1024
#define READLEN 128 #define READLEN 128

View File

@ -1,4 +1,6 @@
#include <dirent.h>
#include <stdlib.h> #include <stdlib.h>
#include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>

View File

@ -1,5 +1,6 @@
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/types.h> #include <linux/types.h>
#include <inttypes.h>
#include <unistd.h> #include <unistd.h>
#include "tests.h" #include "tests.h"
#include "debug.h" #include "debug.h"

View File

@ -1,5 +1,8 @@
#include <linux/compiler.h> #include <linux/compiler.h>
#include <errno.h>
#include <inttypes.h>
#include <string.h> #include <string.h>
#include <sys/wait.h>
#include "tests.h" #include "tests.h"
#include "evlist.h" #include "evlist.h"
#include "evsel.h" #include "evsel.h"

View File

@ -3,6 +3,8 @@
#include "parse-events.h" #include "parse-events.h"
#include "tests.h" #include "tests.h"
#include "debug.h" #include "debug.h"
#include <errno.h>
#include <linux/kernel.h>
static int perf_evsel__roundtrip_cache_name_test(void) static int perf_evsel__roundtrip_cache_name_test(void)
{ {

View File

@ -1,3 +1,4 @@
#include <inttypes.h>
#include "perf.h" #include "perf.h"
#include "util/debug.h" #include "util/debug.h"
#include "util/symbol.h" #include "util/symbol.h"
@ -7,6 +8,7 @@
#include "util/machine.h" #include "util/machine.h"
#include "util/thread.h" #include "util/thread.h"
#include "tests/hists_common.h" #include "tests/hists_common.h"
#include <linux/kernel.h>
static struct { static struct {
u32 pid; u32 pid;

View File

@ -9,6 +9,7 @@
#include "util/parse-events.h" #include "util/parse-events.h"
#include "tests/tests.h" #include "tests/tests.h"
#include "tests/hists_common.h" #include "tests/hists_common.h"
#include <linux/kernel.h>
struct sample { struct sample {
u32 pid; u32 pid;

View File

@ -9,6 +9,7 @@
#include "util/parse-events.h" #include "util/parse-events.h"
#include "tests/tests.h" #include "tests/tests.h"
#include "tests/hists_common.h" #include "tests/hists_common.h"
#include <linux/kernel.h>
struct sample { struct sample {
u32 pid; u32 pid;

View File

@ -9,6 +9,8 @@
#include "thread.h" #include "thread.h"
#include "parse-events.h" #include "parse-events.h"
#include "hists_common.h" #include "hists_common.h"
#include <errno.h>
#include <linux/kernel.h>
struct sample { struct sample {
u32 pid; u32 pid;

View File

@ -9,6 +9,7 @@
#include "util/parse-events.h" #include "util/parse-events.h"
#include "tests/tests.h" #include "tests/tests.h"
#include "tests/hists_common.h" #include "tests/hists_common.h"
#include <linux/kernel.h>
struct sample { struct sample {
u32 cpu; u32 cpu;

View File

@ -1,7 +1,8 @@
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/kernel.h>
#include "tests.h" #include "tests.h"
#include "debug.h" #include "debug.h"
#include "util.h" #include "print_binary.h"
int test__is_printable_array(int subtest __maybe_unused) int test__is_printable_array(int subtest __maybe_unused)
{ {

View File

@ -1,3 +1,5 @@
#include <errno.h>
#include <inttypes.h>
/* For the CLR_() macros */ /* For the CLR_() macros */
#include <pthread.h> #include <pthread.h>
@ -7,6 +9,7 @@
#include "cpumap.h" #include "cpumap.h"
#include "tests.h" #include "tests.h"
#include <linux/err.h> #include <linux/err.h>
#include <linux/kernel.h>
/* /*
* This test will generate random numbers of calls to some getpid syscalls, * This test will generate random numbers of calls to some getpid syscalls,

View File

@ -1,3 +1,4 @@
#include <inttypes.h>
#include <unistd.h> #include <unistd.h>
#include <sys/syscall.h> #include <sys/syscall.h>
#include <sys/types.h> #include <sys/types.h>
@ -11,6 +12,7 @@
#include "thread_map.h" #include "thread_map.h"
#include "symbol.h" #include "symbol.h"
#include "thread.h" #include "thread.h"
#include "util.h"
#define THREADS 4 #define THREADS 4

View File

@ -1,8 +1,14 @@
#include <errno.h>
#include <inttypes.h>
/* For the CPU_* macros */ /* For the CPU_* macros */
#include <pthread.h> #include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <api/fs/fs.h> #include <api/fs/fs.h>
#include <linux/err.h> #include <linux/err.h>
#include <api/fs/tracing_path.h>
#include "evsel.h" #include "evsel.h"
#include "tests.h" #include "tests.h"
#include "thread_map.h" #include "thread_map.h"

View File

@ -5,6 +5,7 @@
#include "thread_map.h" #include "thread_map.h"
#include "tests.h" #include "tests.h"
#include "debug.h" #include "debug.h"
#include <errno.h>
#ifndef O_DIRECTORY #ifndef O_DIRECTORY
#define O_DIRECTORY 00200000 #define O_DIRECTORY 00200000

Some files were not shown because too many files have changed in this diff Show More