提交 fd764797 编写于 作者: I Ingo Molnar

Merge tag 'perf-core-for-mingo-4.12-20170424' of...

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: NArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: NIngo Molnar <mingo@kernel.org>
...@@ -302,8 +302,8 @@ extern int ignore_sigio_fd(int fd); ...@@ -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);
......
...@@ -390,3 +390,4 @@ ...@@ -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
...@@ -187,6 +187,7 @@ ...@@ -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 */
......
...@@ -45,6 +45,8 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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
......
...@@ -884,6 +884,8 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip, ...@@ -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()
......
...@@ -9,6 +9,7 @@ void syscall_init(void); ...@@ -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); ...@@ -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 */
...@@ -87,6 +87,7 @@ struct thread_info { ...@@ -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 { ...@@ -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 { ...@@ -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, ...@@ -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 */
...@@ -110,6 +110,16 @@ static inline void cr4_clear_bits(unsigned long mask) ...@@ -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)
{ {
......
#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
......
...@@ -90,16 +90,12 @@ static void probe_xeon_phi_r3mwait(struct cpuinfo_x86 *c) ...@@ -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) ...@@ -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) ...@@ -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
......
...@@ -37,6 +37,7 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
{
struct thread_struct *prev, *next;
prev = &prev_p->thread;
next = &next_p->thread;
if (test_tsk_thread_flag(prev_p, TIF_BLOCKSTEP) ^ static void set_cpuid_faulting(bool on)
test_tsk_thread_flag(next_p, TIF_BLOCKSTEP)) { {
unsigned long debugctl = get_debugctlmsr(); u64 msrval;
debugctl &= ~DEBUGCTLMSR_BTF; msrval = this_cpu_read(msr_misc_features_shadow);
if (test_tsk_thread_flag(next_p, TIF_BLOCKSTEP)) msrval &= ~MSR_MISC_FEATURES_ENABLES_CPUID_FAULT;
debugctl |= DEBUGCTLMSR_BTF; msrval |= (on << MSR_MISC_FEATURES_ENABLES_CPUID_FAULT_BIT);
this_cpu_write(msr_misc_features_shadow, msrval);
wrmsrl(MSR_MISC_FEATURES_ENABLES, msrval);
}
update_debugctlmsr(debugctl); static void disable_cpuid(void)
{
preempt_disable();
if (!test_and_set_thread_flag(TIF_NOCPUID)) {
/*
* Must flip the CPU state synchronously with
* TIF_NOCPUID in the current running context.
*/
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();
}
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();
}
if (test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { 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) ...@@ -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;
}
...@@ -37,6 +37,7 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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);
}
...@@ -37,6 +37,7 @@ ...@@ -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, ...@@ -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) ...@@ -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,10 +624,23 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) ...@@ -621,10 +624,23 @@ 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)
{
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(current, code, addr); 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)
{ {
......
...@@ -396,12 +396,12 @@ static int putreg(struct task_struct *child, ...@@ -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, ...@@ -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, ...@@ -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
......
...@@ -16,7 +16,7 @@ obj-y = bug.o bugs_$(BITS).o delay.o fault.o ldt.o \ ...@@ -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
......
...@@ -78,7 +78,7 @@ static inline int ptrace_set_thread_area(struct task_struct *child, int idx, ...@@ -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
......
...@@ -6,7 +6,7 @@ ...@@ -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);
} }
#include <linux/syscalls.h>
#include <os.h>
SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)
{
return -EINVAL;
}
...@@ -7,13 +7,15 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -1320,6 +1320,7 @@ void setup_new_exec(struct linux_binprm * bprm) ...@@ -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);
......
...@@ -723,6 +723,8 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, ...@@ -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
......
...@@ -101,6 +101,10 @@ static inline void check_object_size(const void *ptr, unsigned long n, ...@@ -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 */
...@@ -187,6 +187,7 @@ ...@@ -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 */
......
...@@ -286,7 +286,7 @@ ENDPROC(memcpy_mcsafe_unrolled) ...@@ -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)
......
#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 */
...@@ -16,3 +16,6 @@ ...@@ -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]))
...@@ -17,6 +17,11 @@ ...@@ -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:
......
...@@ -13,10 +13,6 @@ ...@@ -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 }
......
...@@ -4,6 +4,7 @@ ...@@ -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 @@ ...@@ -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
......
...@@ -12,6 +12,9 @@ ...@@ -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
......
...@@ -114,7 +114,7 @@ struct statx { ...@@ -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 { ...@@ -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
......
...@@ -2,6 +2,7 @@ ...@@ -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;
......
#include <ctype.h>
#include "symbol/kallsyms.h" #include "symbol/kallsyms.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
......
...@@ -36,8 +36,7 @@ ...@@ -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
......
...@@ -31,11 +31,10 @@ ...@@ -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 **);
......
...@@ -64,6 +64,7 @@ tools/include/linux/bitops.h ...@@ -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
......
...@@ -33,6 +33,7 @@ ...@@ -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/"
......
...@@ -9,6 +9,7 @@ ...@@ -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 { ...@@ -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}
/* /*
......
#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)
{ {
......
...@@ -8,9 +8,12 @@ ...@@ -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 { ...@@ -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])
......
#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"
......
...@@ -4,6 +4,8 @@ ...@@ -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-",
......
...@@ -15,6 +15,7 @@ ...@@ -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 { ...@@ -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}
......
#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"
......
#include <errno.h>
#include <string.h> #include <string.h>
#include <regex.h> #include <regex.h>
......
...@@ -9,6 +9,7 @@ ...@@ -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>
......
...@@ -6,7 +6,10 @@ ...@@ -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)
......
#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>
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
* *
*/ */
#include <errno.h>
#include <stdbool.h> #include <stdbool.h>
#include "../../util/header.h" #include "../../util/header.h"
......
...@@ -13,6 +13,7 @@ ...@@ -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>
......
...@@ -13,6 +13,7 @@ ...@@ -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>
......
#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>
......
#include <errno.h>
#include <string.h> #include <string.h>
#include <regex.h> #include <regex.h>
......
#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)
{ {
......
...@@ -12,6 +12,7 @@ ...@@ -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"
......
...@@ -4,6 +4,7 @@ ...@@ -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 @@ ...@@ -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>
......
...@@ -33,6 +33,7 @@ ...@@ -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 {
......
...@@ -10,6 +10,7 @@ ...@@ -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 @@ ...@@ -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)
{ {
......
...@@ -16,6 +16,7 @@ ...@@ -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)
{ {
......
...@@ -9,10 +9,13 @@ ...@@ -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 @@ ...@@ -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;
......
...@@ -19,6 +19,8 @@ ...@@ -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>
......
...@@ -9,12 +9,15 @@ ...@@ -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"
......
...@@ -12,16 +12,22 @@ ...@@ -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 {
......
...@@ -18,10 +18,13 @@ ...@@ -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;
......
...@@ -7,6 +7,7 @@ ...@@ -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>
......
...@@ -20,11 +20,16 @@ ...@@ -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;
......
...@@ -3,6 +3,7 @@ ...@@ -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 @@ ...@@ -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"
......
#include <errno.h>
#include <inttypes.h>
#include "builtin.h" #include "builtin.h"
#include "perf.h" #include "perf.h"
...@@ -26,6 +28,7 @@ ...@@ -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;
......
#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 @@ ...@@ -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
......
...@@ -38,11 +38,18 @@ ...@@ -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>
......
...@@ -16,7 +16,6 @@ ...@@ -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 @@ ...@@ -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;
......
...@@ -22,16 +22,21 @@ ...@@ -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
......
...@@ -21,14 +21,27 @@ ...@@ -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;
......
...@@ -64,14 +64,24 @@ ...@@ -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>"
......
...@@ -12,6 +12,8 @@ ...@@ -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 @@ ...@@ -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"
......
...@@ -40,6 +40,7 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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
......
...@@ -24,6 +24,7 @@ ...@@ -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 @@ ...@@ -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
......
#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)
{ {
......
...@@ -2,16 +2,12 @@ ...@@ -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);
......
...@@ -19,9 +19,15 @@ ...@@ -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) ...@@ -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) ...@@ -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")) {
......
...@@ -18,10 +18,16 @@ ...@@ -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>
......
...@@ -8,6 +8,7 @@ ...@@ -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
......
#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"
......
...@@ -3,8 +3,10 @@ ...@@ -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 @@ ...@@ -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;
......
...@@ -2,6 +2,7 @@ ...@@ -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);
......
#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 @@ ...@@ -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
......
#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>
......
#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"
......
#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"
......
...@@ -3,6 +3,8 @@ ...@@ -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)
{ {
......
#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 @@ ...@@ -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;
......
...@@ -9,6 +9,7 @@ ...@@ -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;
......
...@@ -9,6 +9,7 @@ ...@@ -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;
......
...@@ -9,6 +9,8 @@ ...@@ -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;
......
...@@ -9,6 +9,7 @@ ...@@ -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;
......
#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)
{ {
......
#include <errno.h>
#include <inttypes.h>
/* For the CLR_() macros */ /* For the CLR_() macros */
#include <pthread.h> #include <pthread.h>
...@@ -7,6 +9,7 @@ ...@@ -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,
......
#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 @@ ...@@ -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
......
#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"
......
...@@ -5,6 +5,7 @@ ...@@ -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
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册