Steven Rostedt
eb4a03780d
function-graph: disable when both x86_32 and optimize for size are configured
...
On x86_32, when optimize for size is set, gcc may align the frame pointer
and make a copy of the the return address inside the stack frame.
The return address that is located in the stack frame may not be
the one used to return to the calling function. This will break the
function graph tracer.
The function graph tracer replaces the return address with a jump to a hook
function that can trace the exit of the function. If it only replaces
a copy, then the hook will not be called when the function returns.
Worse yet, when the parent function returns, the function graph tracer
will return back to the location of the child function which will
easily crash the kernel with weird results.
To see the problem, when i386 is compiled with -Os we get:
c106be03: 57 push %edi
c106be04: 8d 7c 24 08 lea 0x8(%esp),%edi
c106be08: 83 e4 e0 and $0xffffffe0,%esp
c106be0b: ff 77 fc pushl 0xfffffffc(%edi)
c106be0e: 55 push %ebp
c106be0f: 89 e5 mov %esp,%ebp
c106be11: 57 push %edi
c106be12: 56 push %esi
c106be13: 53 push %ebx
c106be14: 81 ec 8c 00 00 00 sub $0x8c,%esp
c106be1a: e8 f5 57 fb ff call c1021614 <mcount>
When it is compiled with -O2 instead we get:
c10896f0: 55 push %ebp
c10896f1: 89 e5 mov %esp,%ebp
c10896f3: 83 ec 28 sub $0x28,%esp
c10896f6: 89 5d f4 mov %ebx,0xfffffff4(%ebp)
c10896f9: 89 75 f8 mov %esi,0xfffffff8(%ebp)
c10896fc: 89 7d fc mov %edi,0xfffffffc(%ebp)
c10896ff: e8 d0 08 fa ff call c1029fd4 <mcount>
The compile with -Os will align the stack pointer then set up the
frame pointer (%ebp), and it copies the return address back into
the stack frame. The change to the return address in mcount is done
to the copy and not the real place holder of the return address.
Then compile with -O2 sets up the frame pointer first, this makes
the change to the return address by mcount affect where the function
will jump on exit.
Reported-by: Jake Edge <jake@lwn.net>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2009-06-18 18:39:30 -04:00
..
irq
irq: slab alloc for default irq_affinity
2009-06-12 13:50:23 +03:00
power
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial
2009-06-14 13:46:25 -07:00
time
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
2009-06-11 09:01:14 +03:00
trace
function-graph: disable when both x86_32 and optimize for size are configured
2009-06-18 18:39:30 -04:00
.gitignore
acct.c
[CVE-2009-0029] System call wrappers part 04
2009-01-14 14:15:19 +01:00
async.c
async: Fix lack of boot-time console due to insufficient synchronization
2009-06-08 12:31:53 -07:00
audit.c
Audit: remove spaces from audit_log_d_path
2009-04-05 13:49:04 -04:00
audit.h
fixing audit rule ordering mess, part 1
2009-01-04 15:14:41 -05:00
audit_tree.c
Switch collect_mounts() to struct path
2009-06-11 21:36:01 -04:00
auditfilter.c
inotify: use GFP_NOFS in kernel_event() to work around a lockdep false-positive
2009-05-06 16:36:09 -07:00
auditsc.c
Audit: remove spaces from audit_log_d_path
2009-04-05 13:49:04 -04:00
backtracetest.c
bounds.c
capability.c
[CVE-2009-0029] System call wrappers part 04
2009-01-14 14:15:19 +01:00
cgroup.c
Push BKL down into ->remount_fs()
2009-06-11 21:36:11 -04:00
cgroup_debug.c
debug cgroup: remove unneeded cgroup_lock
2009-04-02 19:04:54 -07:00
cgroup_freezer.c
compat.c
signals: implement sys_rt_tgsigqueueinfo
2009-04-30 19:24:24 +02:00
configs.c
cpu.c
cpumask: use set_cpu_active in init/main.c
2009-03-30 22:05:12 +10:30
cpuset.c
x86: remove some alloc_bootmem_cpumask_var calling
2009-06-11 19:27:07 +03:00
cred-internals.h
cred.c
CRED: Rename cred_exec_mutex to reflect that it's a guard against ptrace
2009-05-11 08:15:36 +10:00
delayacct.c
dma-coherent.c
dma-coherent: Restore dma_alloc_from_coherent() large alloc fall back policy.
2009-01-21 18:51:53 +09:00
dma.c
exec_domain.c
Get rid of indirect include of fs_struct.h
2009-03-31 23:00:27 -04:00
exit.c
Merge branch 'perfcounters-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-06-11 14:01:07 -07:00
extable.c
Merge branch 'tracing-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-04-05 11:04:19 -07:00
fork.c
Merge branch 'linus' into perfcounters/core
2009-06-11 17:55:42 +02:00
freezer.c
futex.c
futex: fix restart in wait_requeue_pi
2009-05-20 10:34:32 +02:00
futex_compat.c
hrtimer.c
hrtimer: fix rq->lock inversion (again)
2009-03-31 14:52:52 +02:00
hung_task.c
softlockup: ensure the task has been switched out once
2009-02-11 11:04:16 +01:00
itimer.c
timers: split process wide cpu clocks/timers
2009-02-05 13:04:33 +01:00
kallsyms.c
kernel/kallsyms.c: replace deprecated __initcall with device_initcall and fix whitespace
2009-06-09 22:37:52 +02:00
Kconfig.freezer
Kconfig.hz
Kconfig.preempt
rcu: provide RCU options on non-preempt architectures too
2008-12-25 09:31:28 +01:00
kexec.c
PM core: rename suspend and resume functions
2009-06-12 21:32:31 +02:00
kfifo.c
kgdb.c
sysrq, intel_fb: fix sysrq g collision
2009-05-15 07:56:24 -05:00
kmod.c
kmod: Release sub_info on cred allocation failure.
2009-05-26 12:11:19 -07:00
kprobes.c
kprobes: fix to use text_mutex around arm/disarm kprobe
2009-05-08 16:23:48 -07:00
ksysfs.c
kernel/ksysfs.c:fix dependence on CONFIG_NET
2009-01-06 10:44:31 -08:00
kthread.c
tracing/events: move trace point headers into include/trace/events
2009-04-14 22:05:43 -04:00
latencytop.c
sched, latencytop: incorporate review feedback from Andrew Morton
2009-02-11 10:18:04 +01:00
lockdep.c
Merge branch 'linus' into tracing/core
2009-05-07 11:17:34 +02:00
lockdep_internals.h
lockdep: increase MAX_LOCKDEP_ENTRIES and MAX_LOCKDEP_CHAINS
2009-05-12 19:59:52 +02:00
lockdep_proc.c
lockstat: warn about disabled lock debugging
2009-02-14 23:28:28 +01:00
lockdep_states.h
lockdep: move state bit definitions around
2009-02-14 23:27:59 +01:00
Makefile
Merge branch 'linus' into perfcounters/core
2009-06-11 17:55:42 +02:00
marker.c
module.c
module: trim exception table on init free.
2009-06-12 21:47:04 +09:30
mutex-debug.c
mutex: implement adaptive spinning
2009-01-14 18:09:02 +01:00
mutex-debug.h
mutex: implement adaptive spinning
2009-01-14 18:09:02 +01:00
mutex.c
Merge branch 'linus' into perfcounters/core
2009-06-11 17:55:42 +02:00
mutex.h
mutex: implement adaptive spinning
2009-01-14 18:09:02 +01:00
notifier.c
ns_cgroup.c
cgroups: relax ns_can_attach checks to allow attaching to grandchild cgroups
2009-04-02 19:04:53 -07:00
nsproxy.c
panic.c
Fix caller information for warn_slowpath_null
2009-05-16 13:41:28 -07:00
params.c
module_param: allow 'bool' module_params to be bool, not just int.
2009-06-12 21:46:58 +09:30
perf_counter.c
perf_counter: Add forward/backward attribute ABI compatibility
2009-06-12 14:28:52 +02:00
pid.c
pids: refactor vnr/nr_ns helpers to make them safe
2009-04-02 19:05:02 -07:00
pid_namespace.c
signals: zap_pid_ns_process() should use force_sig()
2009-04-02 19:04:58 -07:00
pm_qos_params.c
posix-cpu-timers.c
kernel/posix-cpu-timers.c: fix sparse warning
2009-04-30 08:08:31 +02:00
posix-timers.c
[CVE-2009-0029] System call wrappers part 05
2009-01-14 14:15:20 +01:00
printk.c
Merge branch 'printk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-04-05 10:23:25 -07:00
profile.c
x86: remove some alloc_bootmem_cpumask_var calling
2009-06-11 19:27:07 +03:00
ptrace.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6
2009-06-11 10:01:41 -07:00
rcuclassic.c
kmemtrace, rcu: fix linux/rcutree.h and linux/rcuclassic.h dependencies
2009-04-03 12:23:02 +02:00
rcupdate.c
RCU: Don't try and predeclare inline funcs as it upsets some versions of gcc
2009-04-15 13:55:14 -07:00
rcupreempt.c
rcu: rcu_sched_grace_period(): kill the bogus flush_signals()
2009-05-05 20:28:05 +02:00
rcupreempt_trace.c
rcutorture.c
cpumask: convert rcutorture.c
2009-03-30 22:05:16 +10:30
rcutree.c
rcu: Add __rcu_pending tracing to hierarchical RCU
2009-04-14 11:33:43 +02:00
rcutree.h
kmemtrace, rcu: fix rcu_tree_trace.c data structure dependencies
2009-04-03 12:23:03 +02:00
rcutree_trace.c
rcu: Add __rcu_pending tracing to hierarchical RCU
2009-04-14 11:33:43 +02:00
relay.c
Merge branch 'tracing-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-04-05 11:04:19 -07:00
res_counter.c
memcg: memory cgroup resource counters for hierarchy
2009-01-08 08:31:05 -08:00
resource.c
Remove 'recurse into child resources' logic from 'reserve_region_with_split()'
2009-04-18 21:44:24 -07:00
rtmutex-debug.c
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c
trivial: fix ETIMEOUT -> ETIMEDOUT typos
2009-06-12 18:01:50 +02:00
rtmutex.h
rtmutex_common.h
rt_mutex: add proxy lock routines
2009-04-06 11:14:02 +02:00
rwsem.c
sched.c
sched: export kick_process
2009-06-12 22:27:01 +09:30
sched_clock.c
sched: Fix fallback sched_clock()'s offset when using jiffies
2009-05-09 10:08:19 +02:00
sched_cpupri.c
sched: use slab in cpupri_init()
2009-06-11 19:27:12 +03:00
sched_cpupri.h
cpumask: remove cpumask_t from core
2009-03-30 22:05:17 +10:30
sched_debug.c
sched: remove unused fields from struct rq
2009-03-24 23:16:51 +01:00
sched_fair.c
sched: remove redundant hierarchy walk in check_preempt_wakeup
2009-04-09 08:19:08 +02:00
sched_features.h
Merge branch 'locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-03-30 17:17:35 -07:00
sched_idletask.c
sched, timers: move calc_load() to scheduler
2009-05-15 15:32:45 +02:00
sched_rt.c
cpumask: alloc zeroed cpumask for static cpumask_var_ts
2009-06-09 22:30:27 +09:30
sched_stats.h
sched: remove unused fields from struct rq
2009-03-24 23:16:51 +01:00
seccomp.c
x86-64: seccomp: fix 32/64 syscall hole
2009-03-02 15:41:30 -08:00
semaphore.c
signal.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6
2009-06-11 10:01:41 -07:00
slow-work.c
slow_work_thread() should do the exclusive wait
2009-06-11 11:26:38 -07:00
smp.c
cpumask: alloc zeroed cpumask for static cpumask_var_ts
2009-06-09 22:30:27 +09:30
softirq.c
Merge branch 'tracing-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-06-10 19:53:40 -07:00
softlockup.c
softlockup: decouple hung tasks check from softlockup detection
2009-01-16 14:06:04 +01:00
spinlock.c
Allow rwlocks to re-enable interrupts
2009-04-02 19:05:11 -07:00
srcu.c
stacktrace.c
stacktrace: provide save_stack_trace_tsk() weak alias
2008-12-25 11:44:43 +01:00
stop_machine.c
cpumask: remove cpumask_t from core
2009-03-30 22:05:17 +10:30
sys.c
Merge branch 'linus' into perfcounters/core
2009-04-29 14:47:05 +02:00
sys_ni.c
Merge commit 'v2.6.29-rc2' into perfcounters/core
2009-01-21 16:37:27 +01:00
sysctl.c
Merge branch 'perfcounters-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-06-11 14:01:07 -07:00
sysctl_check.c
net: add ARP notify option for devices
2009-02-01 01:04:33 -08:00
taskstats.c
cpumask: convert rest of files in kernel/
2009-01-01 10:12:28 +10:30
test_kprobes.c
kprobes: add tests for register_kprobes
2009-01-06 15:59:20 -08:00
time.c
[CVE-2009-0029] System call wrappers part 01
2009-01-14 14:15:18 +01:00
timeconst.pl
timer.c
Merge branch 'linus' into x86/mce3
2009-06-11 23:31:52 +02:00
tracepoint.c
tracepoints: dont update zero-sized tracepoint sections
2009-03-18 19:55:00 +01:00
tsacct.c
Fix fixpoint divide exception in acct_update_integrals
2009-03-09 08:13:35 -07:00
uid16.c
[CVE-2009-0029] System call wrappers part 19
2009-01-14 14:15:26 +01:00
up.c
smp_call_function_single(): be slightly less stupid, fix #2
2009-01-12 16:04:37 +01:00
user.c
Merge branch 'master' into next
2009-03-24 10:52:46 +11:00
user_namespace.c
Fix recursive lock in free_uid()/free_user_ns()
2009-02-27 16:26:21 -08:00
utsname.c
utsname_sysctl.c
proc_sysctl: use CONFIG_PROC_SYSCTL around ipc and utsname proc_handlers
2009-04-02 19:05:01 -07:00
wait.c
wait: don't use __wake_up_common()
2009-04-14 17:17:16 +02:00
workqueue.c
ftrace, workqueuetrace: make workqueue tracepoints use TRACE_EVENT macro
2009-06-02 01:10:40 +02:00