linux/arch/x86/kernel
Oleg Nesterov 9bd1190a11 uprobes/x86: Do not (ab)use TIF_SINGLESTEP/user_*_single_step() for single-stepping
user_enable/disable_single_step() was designed for ptrace, it assumes
a single user and does unnecessary and wrong things for uprobes. For
example:

	- arch_uprobe_enable_step() can't trust TIF_SINGLESTEP, an
	  application itself can set X86_EFLAGS_TF which must be
	  preserved after arch_uprobe_disable_step().

	- we do not want to set TIF_SINGLESTEP/TIF_FORCED_TF in
	  arch_uprobe_enable_step(), this only makes sense for ptrace.

	- otoh we leak TIF_SINGLESTEP if arch_uprobe_disable_step()
	  doesn't do user_disable_single_step(), the application will
	  be killed after the next syscall.

	- arch_uprobe_enable_step() does access_process_vm() we do
	  not need/want.

Change arch_uprobe_enable/disable_step() to set/clear X86_EFLAGS_TF
directly, this is much simpler and more correct. However, we need to
clear TIF_BLOCKSTEP/DEBUGCTLMSR_BTF before executing the probed insn,
add set_task_blockstep(false).

Note: with or without this patch, there is another (hopefully minor)
problem. A probed "pushf" insn can see the wrong X86_EFLAGS_TF set by
uprobes. Perhaps we should change _disable to update the stack, or
teach arch_uprobe_skip_sstep() to emulate this insn.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
2012-09-15 17:37:30 +02:00
..
acpi
apic
cpu
.gitignore
alternative.c
amd_gart_64.c
amd_nb.c
apb_timer.c
aperture_64.c
apm_32.c
asm-offsets_32.c
asm-offsets_64.c
asm-offsets.c
audit_64.c
bootflag.c
check.c
cpuid.c
crash_dump_32.c
crash_dump_64.c
crash.c
devicetree.c
doublefault_32.c
dumpstack_32.c
dumpstack_64.c
dumpstack.c
e820.c
early_printk.c
early-quirks.c
entry_32.S
entry_64.S
ftrace.c
head32.c
head64.c
head_32.S
head_64.S
head.c
hpet.c
hw_breakpoint.c
i386_ksyms_32.c
i387.c
i8237.c
i8253.c
i8259.c
io_delay.c
ioport.c
irq_32.c
irq_64.c
irq_work.c
irq.c
irqinit.c
jump_label.c
kdebugfs.c
kgdb.c
kprobes-common.h
kprobes-opt.c
kprobes.c
kvm.c
kvmclock.c
ldt.c
machine_kexec_32.c
machine_kexec_64.c
Makefile
microcode_amd.c
microcode_core.c perf/x86: Fix microcode revision check for SNB-PEBS 2012-08-27 08:48:19 +02:00
microcode_intel.c
mmconf-fam10h_64.c
module.c
mpparse.c
msr.c
nmi_selftest.c
nmi.c
paravirt_patch_32.c
paravirt_patch_64.c
paravirt-spinlocks.c
paravirt.c
pci-calgary_64.c
pci-dma.c
pci-iommu_table.c
pci-nommu.c
pci-swiotlb.c
pcspeaker.c
perf_regs.c
probe_roms.c
process_32.c
process_64.c
process.c
ptrace.c
pvclock.c
quirks.c
reboot_fixups_32.c
reboot.c
relocate_kernel_32.S
relocate_kernel_64.S
resource.c
rtc.c
setup_percpu.c
setup.c
signal.c
smp.c
smpboot.c
stacktrace.c
step.c uprobes/x86: Do not (ab)use TIF_SINGLESTEP/user_*_single_step() for single-stepping 2012-09-15 17:37:30 +02:00
sys_i386_32.c
sys_x86_64.c
syscall_32.c
syscall_64.c
tboot.c
tce_64.c
test_nx.c
test_rodata.c
time.c
tls.c
tls.h
topology.c
traps.c
tsc_sync.c
tsc.c
uprobes.c uprobes/x86: Do not (ab)use TIF_SINGLESTEP/user_*_single_step() for single-stepping 2012-09-15 17:37:30 +02:00
verify_cpu.S
vm86_32.c
vmlinux.lds.S
vsmp_64.c
vsyscall_64.c
vsyscall_emu_64.S
vsyscall_trace.h
x86_init.c
x8664_ksyms_64.c
xsave.c